| 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 |