OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" | 5 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 } | 84 } |
85 | 85 |
86 void SetRobotAccountId(const std::string& account_id) { | 86 void SetRobotAccountId(const std::string& account_id) { |
87 device_policy_.policy_data().set_service_account_identity(account_id); | 87 device_policy_.policy_data().set_service_account_identity(account_id); |
88 device_policy_.Build(); | 88 device_policy_.Build(); |
89 device_settings_test_helper_.set_policy_blob(device_policy_.GetBlob()); | 89 device_settings_test_helper_.set_policy_blob(device_policy_.GetBlob()); |
90 DeviceSettingsService::Get()->Load(); | 90 DeviceSettingsService::Get()->Load(); |
91 device_settings_test_helper_.Flush(); | 91 device_settings_test_helper_.Flush(); |
92 } | 92 } |
93 | 93 |
94 scoped_ptr<OAuth2TokenService::Request> StartTokenRequest() { | 94 std::unique_ptr<OAuth2TokenService::Request> StartTokenRequest() { |
95 return oauth2_service_->StartRequest(oauth2_service_->GetRobotAccountId(), | 95 return oauth2_service_->StartRequest(oauth2_service_->GetRobotAccountId(), |
96 std::set<std::string>(), | 96 std::set<std::string>(), |
97 &consumer_); | 97 &consumer_); |
98 } | 98 } |
99 | 99 |
100 void SetUp() override { | 100 void SetUp() override { |
101 fake_cryptohome_client_ = new FakeCryptohomeClient; | 101 fake_cryptohome_client_ = new FakeCryptohomeClient; |
102 fake_cryptohome_client_->SetServiceIsAvailable(true); | 102 fake_cryptohome_client_->SetServiceIsAvailable(true); |
103 fake_cryptohome_client_->set_system_salt( | 103 fake_cryptohome_client_->set_system_salt( |
104 FakeCryptohomeClient::GetStubSystemSalt()); | 104 FakeCryptohomeClient::GetStubSystemSalt()); |
105 chromeos::DBusThreadManager::GetSetterForTesting()->SetCryptohomeClient( | 105 chromeos::DBusThreadManager::GetSetterForTesting()->SetCryptohomeClient( |
106 scoped_ptr<CryptohomeClient>(fake_cryptohome_client_)); | 106 std::unique_ptr<CryptohomeClient>(fake_cryptohome_client_)); |
107 | 107 |
108 SystemSaltGetter::Initialize(); | 108 SystemSaltGetter::Initialize(); |
109 | 109 |
110 DeviceSettingsService::Initialize(); | 110 DeviceSettingsService::Initialize(); |
111 scoped_refptr<ownership::MockOwnerKeyUtil> owner_key_util_( | 111 scoped_refptr<ownership::MockOwnerKeyUtil> owner_key_util_( |
112 new ownership::MockOwnerKeyUtil()); | 112 new ownership::MockOwnerKeyUtil()); |
113 owner_key_util_->SetPublicKeyFromPrivateKey( | 113 owner_key_util_->SetPublicKeyFromPrivateKey( |
114 *device_policy_.GetSigningKey()); | 114 *device_policy_.GetSigningKey()); |
115 DeviceSettingsService::Get()->SetSessionManager( | 115 DeviceSettingsService::Get()->SetSessionManager( |
116 &device_settings_test_helper_, owner_key_util_); | 116 &device_settings_test_helper_, owner_key_util_); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 } | 204 } |
205 }; | 205 }; |
206 | 206 |
207 base::MessageLoop message_loop_; | 207 base::MessageLoop message_loop_; |
208 ScopedTestingLocalState scoped_testing_local_state_; | 208 ScopedTestingLocalState scoped_testing_local_state_; |
209 scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; | 209 scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; |
210 net::TestURLFetcherFactory factory_; | 210 net::TestURLFetcherFactory factory_; |
211 FakeCryptohomeClient* fake_cryptohome_client_; | 211 FakeCryptohomeClient* fake_cryptohome_client_; |
212 DeviceSettingsTestHelper device_settings_test_helper_; | 212 DeviceSettingsTestHelper device_settings_test_helper_; |
213 policy::DevicePolicyBuilder device_policy_; | 213 policy::DevicePolicyBuilder device_policy_; |
214 scoped_ptr<DeviceOAuth2TokenService, TokenServiceDeleter> oauth2_service_; | 214 std::unique_ptr<DeviceOAuth2TokenService, TokenServiceDeleter> |
| 215 oauth2_service_; |
215 TestingOAuth2TokenServiceConsumer consumer_; | 216 TestingOAuth2TokenServiceConsumer consumer_; |
216 }; | 217 }; |
217 | 218 |
218 void DeviceOAuth2TokenServiceTest::ReturnOAuthUrlFetchResults( | 219 void DeviceOAuth2TokenServiceTest::ReturnOAuthUrlFetchResults( |
219 int fetcher_id, | 220 int fetcher_id, |
220 net::HttpStatusCode response_code, | 221 net::HttpStatusCode response_code, |
221 const std::string& response_string) { | 222 const std::string& response_string) { |
222 net::TestURLFetcher* fetcher = factory_.GetFetcherByID(fetcher_id); | 223 net::TestURLFetcher* fetcher = factory_.GetFetcherByID(fetcher_id); |
223 if (fetcher) { | 224 if (fetcher) { |
224 factory_.RemoveFetcherFromMap(fetcher_id); | 225 factory_.RemoveFetcherFromMap(fetcher_id); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 EXPECT_EQ("test-token", GetRefreshToken()); | 293 EXPECT_EQ("test-token", GetRefreshToken()); |
293 | 294 |
294 // Reloading shouldn't change the token either. | 295 // Reloading shouldn't change the token either. |
295 CreateService(); | 296 CreateService(); |
296 base::RunLoop().RunUntilIdle(); | 297 base::RunLoop().RunUntilIdle(); |
297 EXPECT_EQ("test-token", GetRefreshToken()); | 298 EXPECT_EQ("test-token", GetRefreshToken()); |
298 } | 299 } |
299 | 300 |
300 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_Success) { | 301 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_Success) { |
301 SetUpDefaultValues(); | 302 SetUpDefaultValues(); |
302 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 303 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
303 | 304 |
304 PerformURLFetches(); | 305 PerformURLFetches(); |
305 AssertConsumerTokensAndErrors(1, 0); | 306 AssertConsumerTokensAndErrors(1, 0); |
306 | 307 |
307 EXPECT_EQ("scoped_access_token", consumer_.last_token_); | 308 EXPECT_EQ("scoped_access_token", consumer_.last_token_); |
308 } | 309 } |
309 | 310 |
310 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_SuccessAsyncLoad) { | 311 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_SuccessAsyncLoad) { |
311 SetUpWithPendingSalt(); | 312 SetUpWithPendingSalt(); |
312 | 313 |
313 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 314 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
314 PerformURLFetches(); | 315 PerformURLFetches(); |
315 AssertConsumerTokensAndErrors(0, 0); | 316 AssertConsumerTokensAndErrors(0, 0); |
316 | 317 |
317 fake_cryptohome_client_->set_system_salt( | 318 fake_cryptohome_client_->set_system_salt( |
318 FakeCryptohomeClient::GetStubSystemSalt()); | 319 FakeCryptohomeClient::GetStubSystemSalt()); |
319 fake_cryptohome_client_->SetServiceIsAvailable(true); | 320 fake_cryptohome_client_->SetServiceIsAvailable(true); |
320 base::RunLoop().RunUntilIdle(); | 321 base::RunLoop().RunUntilIdle(); |
321 | 322 |
322 PerformURLFetches(); | 323 PerformURLFetches(); |
323 AssertConsumerTokensAndErrors(1, 0); | 324 AssertConsumerTokensAndErrors(1, 0); |
324 | 325 |
325 EXPECT_EQ("scoped_access_token", consumer_.last_token_); | 326 EXPECT_EQ("scoped_access_token", consumer_.last_token_); |
326 } | 327 } |
327 | 328 |
328 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_Cancel) { | 329 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_Cancel) { |
329 SetUpDefaultValues(); | 330 SetUpDefaultValues(); |
330 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 331 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
331 request.reset(); | 332 request.reset(); |
332 | 333 |
333 PerformURLFetches(); | 334 PerformURLFetches(); |
334 | 335 |
335 // Test succeeds if this line is reached without a crash. | 336 // Test succeeds if this line is reached without a crash. |
336 } | 337 } |
337 | 338 |
338 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_NoSalt) { | 339 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_NoSalt) { |
339 fake_cryptohome_client_->set_system_salt(std::vector<uint8_t>()); | 340 fake_cryptohome_client_->set_system_salt(std::vector<uint8_t>()); |
340 fake_cryptohome_client_->SetServiceIsAvailable(true); | 341 fake_cryptohome_client_->SetServiceIsAvailable(true); |
341 SetUpDefaultValues(); | 342 SetUpDefaultValues(); |
342 | 343 |
343 EXPECT_FALSE(RefreshTokenIsAvailable()); | 344 EXPECT_FALSE(RefreshTokenIsAvailable()); |
344 | 345 |
345 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 346 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
346 base::RunLoop().RunUntilIdle(); | 347 base::RunLoop().RunUntilIdle(); |
347 | 348 |
348 AssertConsumerTokensAndErrors(0, 1); | 349 AssertConsumerTokensAndErrors(0, 1); |
349 } | 350 } |
350 | 351 |
351 TEST_F(DeviceOAuth2TokenServiceTest, | 352 TEST_F(DeviceOAuth2TokenServiceTest, |
352 RefreshTokenValidation_Failure_TokenInfoAccessTokenHttpError) { | 353 RefreshTokenValidation_Failure_TokenInfoAccessTokenHttpError) { |
353 SetUpDefaultValues(); | 354 SetUpDefaultValues(); |
354 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 355 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
355 | 356 |
356 PerformURLFetchesWithResults( | 357 PerformURLFetchesWithResults( |
357 net::HTTP_UNAUTHORIZED, "", | 358 net::HTTP_UNAUTHORIZED, "", |
358 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), | 359 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), |
359 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); | 360 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); |
360 | 361 |
361 AssertConsumerTokensAndErrors(0, 1); | 362 AssertConsumerTokensAndErrors(0, 1); |
362 } | 363 } |
363 | 364 |
364 TEST_F(DeviceOAuth2TokenServiceTest, | 365 TEST_F(DeviceOAuth2TokenServiceTest, |
365 RefreshTokenValidation_Failure_TokenInfoAccessTokenInvalidResponse) { | 366 RefreshTokenValidation_Failure_TokenInfoAccessTokenInvalidResponse) { |
366 SetUpDefaultValues(); | 367 SetUpDefaultValues(); |
367 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 368 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
368 | 369 |
369 PerformURLFetchesWithResults( | 370 PerformURLFetchesWithResults( |
370 net::HTTP_OK, "invalid response", | 371 net::HTTP_OK, "invalid response", |
371 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), | 372 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), |
372 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); | 373 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); |
373 | 374 |
374 AssertConsumerTokensAndErrors(0, 1); | 375 AssertConsumerTokensAndErrors(0, 1); |
375 } | 376 } |
376 | 377 |
377 TEST_F(DeviceOAuth2TokenServiceTest, | 378 TEST_F(DeviceOAuth2TokenServiceTest, |
378 RefreshTokenValidation_Failure_TokenInfoApiCallHttpError) { | 379 RefreshTokenValidation_Failure_TokenInfoApiCallHttpError) { |
379 SetUpDefaultValues(); | 380 SetUpDefaultValues(); |
380 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 381 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
381 | 382 |
382 PerformURLFetchesWithResults( | 383 PerformURLFetchesWithResults( |
383 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), | 384 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), |
384 net::HTTP_INTERNAL_SERVER_ERROR, "", | 385 net::HTTP_INTERNAL_SERVER_ERROR, "", |
385 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); | 386 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); |
386 | 387 |
387 AssertConsumerTokensAndErrors(0, 1); | 388 AssertConsumerTokensAndErrors(0, 1); |
388 } | 389 } |
389 | 390 |
390 TEST_F(DeviceOAuth2TokenServiceTest, | 391 TEST_F(DeviceOAuth2TokenServiceTest, |
391 RefreshTokenValidation_Failure_TokenInfoApiCallInvalidResponse) { | 392 RefreshTokenValidation_Failure_TokenInfoApiCallInvalidResponse) { |
392 SetUpDefaultValues(); | 393 SetUpDefaultValues(); |
393 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 394 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
394 | 395 |
395 PerformURLFetchesWithResults( | 396 PerformURLFetchesWithResults( |
396 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), | 397 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), |
397 net::HTTP_OK, "invalid response", | 398 net::HTTP_OK, "invalid response", |
398 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); | 399 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); |
399 | 400 |
400 AssertConsumerTokensAndErrors(0, 1); | 401 AssertConsumerTokensAndErrors(0, 1); |
401 } | 402 } |
402 | 403 |
403 TEST_F(DeviceOAuth2TokenServiceTest, | 404 TEST_F(DeviceOAuth2TokenServiceTest, |
404 RefreshTokenValidation_Failure_CloudPrintAccessTokenHttpError) { | 405 RefreshTokenValidation_Failure_CloudPrintAccessTokenHttpError) { |
405 SetUpDefaultValues(); | 406 SetUpDefaultValues(); |
406 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 407 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
407 | 408 |
408 PerformURLFetchesWithResults( | 409 PerformURLFetchesWithResults( |
409 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), | 410 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), |
410 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), | 411 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), |
411 net::HTTP_BAD_REQUEST, ""); | 412 net::HTTP_BAD_REQUEST, ""); |
412 | 413 |
413 AssertConsumerTokensAndErrors(0, 1); | 414 AssertConsumerTokensAndErrors(0, 1); |
414 } | 415 } |
415 | 416 |
416 TEST_F(DeviceOAuth2TokenServiceTest, | 417 TEST_F(DeviceOAuth2TokenServiceTest, |
417 RefreshTokenValidation_Failure_CloudPrintAccessTokenInvalidResponse) { | 418 RefreshTokenValidation_Failure_CloudPrintAccessTokenInvalidResponse) { |
418 SetUpDefaultValues(); | 419 SetUpDefaultValues(); |
419 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 420 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
420 | 421 |
421 PerformURLFetchesWithResults( | 422 PerformURLFetchesWithResults( |
422 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), | 423 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), |
423 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), | 424 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), |
424 net::HTTP_OK, "invalid request"); | 425 net::HTTP_OK, "invalid request"); |
425 | 426 |
426 AssertConsumerTokensAndErrors(0, 1); | 427 AssertConsumerTokensAndErrors(0, 1); |
427 } | 428 } |
428 | 429 |
429 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_Failure_BadOwner) { | 430 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_Failure_BadOwner) { |
430 SetUpDefaultValues(); | 431 SetUpDefaultValues(); |
431 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 432 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
432 | 433 |
433 SetRobotAccountId("WRONG_service_acct@g.com"); | 434 SetRobotAccountId("WRONG_service_acct@g.com"); |
434 | 435 |
435 PerformURLFetchesWithResults( | 436 PerformURLFetchesWithResults( |
436 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), | 437 net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), |
437 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), | 438 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), |
438 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); | 439 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); |
439 | 440 |
440 AssertConsumerTokensAndErrors(0, 1); | 441 AssertConsumerTokensAndErrors(0, 1); |
441 } | 442 } |
442 | 443 |
443 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_Retry) { | 444 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_Retry) { |
444 SetUpDefaultValues(); | 445 SetUpDefaultValues(); |
445 scoped_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); | 446 std::unique_ptr<OAuth2TokenService::Request> request = StartTokenRequest(); |
446 | 447 |
447 PerformURLFetchesWithResults( | 448 PerformURLFetchesWithResults( |
448 net::HTTP_INTERNAL_SERVER_ERROR, "", | 449 net::HTTP_INTERNAL_SERVER_ERROR, "", |
449 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), | 450 net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"), |
450 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); | 451 net::HTTP_OK, GetValidTokenResponse("ignored", 3600)); |
451 | 452 |
452 AssertConsumerTokensAndErrors(0, 1); | 453 AssertConsumerTokensAndErrors(0, 1); |
453 | 454 |
454 // Retry should succeed. | 455 // Retry should succeed. |
455 request = StartTokenRequest(); | 456 request = StartTokenRequest(); |
(...skipping 16 matching lines...) Expand all Loading... |
472 // Also make the robot account ID available. Verify that the token is | 473 // Also make the robot account ID available. Verify that the token is |
473 // announced now. | 474 // announced now. |
474 EXPECT_CALL(observer, OnRefreshTokenAvailable("robot@example.com")); | 475 EXPECT_CALL(observer, OnRefreshTokenAvailable("robot@example.com")); |
475 SetRobotAccountId("robot@example.com"); | 476 SetRobotAccountId("robot@example.com"); |
476 testing::Mock::VerifyAndClearExpectations(&observer); | 477 testing::Mock::VerifyAndClearExpectations(&observer); |
477 | 478 |
478 oauth2_service_->RemoveObserver(&observer); | 479 oauth2_service_->RemoveObserver(&observer); |
479 } | 480 } |
480 | 481 |
481 } // namespace chromeos | 482 } // namespace chromeos |
OLD | NEW |