14ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/mutable_profile_oauth2_token_service.h"
64ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
74ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "base/run_loop.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_error_controller.h"
104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "components/signin/core/browser/test_signin_client.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/webdata/token_web_data.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service_test_util.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/http/http_status_code.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/os_crypt/os_crypt.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Defining constant here to handle backward compatiblity tests, but this
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// constant is no longer used in current versions of chrome.
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static const char kLSOService[] = "lso";
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static const char kEmail[] = "user@gmail.com";
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochclass MutableProfileOAuth2TokenServiceTest
294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    : public testing::Test,
304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      public OAuth2TokenService::Observer {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MutableProfileOAuth2TokenServiceTest()
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : factory_(NULL),
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        token_available_count_(0),
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        token_revoked_count_(0),
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        tokens_loaded_count_(0),
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        start_batch_changes_(0),
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        end_batch_changes_(0) {}
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX)
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    OSCrypt::UseMockKeychain(true);
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_revoke_url(),
464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                             "",
474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                             net::HTTP_OK,
484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                             net::URLRequestStatus::SUCCESS);
494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    oauth2_service_.Initialize(&client_);
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Make sure PO2TS has a chance to load itself before continuing.
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    oauth2_service_.AddObserver(this);
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    oauth2_service_.RemoveObserver(this);
574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    oauth2_service_.Shutdown();
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void AddAuthTokenManually(const std::string& service,
614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                            const std::string& value) {
624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    scoped_refptr<TokenWebData> token_web_data = client_.GetDatabase();
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (token_web_data.get())
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      token_web_data->SetTokenForService(service, value);
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // OAuth2TokenService::Observer implementation.
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE {
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ++token_available_count_;
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE {
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ++token_revoked_count_;
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  virtual void OnRefreshTokensLoaded() OVERRIDE { ++tokens_loaded_count_; }
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnStartBatchChanges() OVERRIDE {
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ++start_batch_changes_;
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnEndBatchChanges() OVERRIDE {
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ++end_batch_changes_;
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ResetObserverCounts() {
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    token_available_count_ = 0;
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    token_revoked_count_ = 0;
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    tokens_loaded_count_ = 0;
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    start_batch_changes_ = 0;
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    end_batch_changes_ = 0;
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ExpectNoNotifications() {
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(0, token_available_count_);
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(0, token_revoked_count_);
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(0, tokens_loaded_count_);
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ResetObserverCounts();
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ExpectOneTokenAvailableNotification() {
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(1, token_available_count_);
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(0, token_revoked_count_);
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(0, tokens_loaded_count_);
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ResetObserverCounts();
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ExpectOneTokenRevokedNotification() {
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(0, token_available_count_);
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(1, token_revoked_count_);
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(0, tokens_loaded_count_);
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ResetObserverCounts();
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ExpectOneTokensLoadedNotification() {
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(0, token_available_count_);
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(0, token_revoked_count_);
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_EQ(1, tokens_loaded_count_);
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ResetObserverCounts();
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
1214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  base::MessageLoop message_loop_;
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  net::FakeURLFetcherFactory factory_;
1234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  TestSigninClient client_;
1244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  MutableProfileOAuth2TokenService oauth2_service_;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestingOAuth2TokenServiceConsumer consumer_;
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int token_available_count_;
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int token_revoked_count_;
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int tokens_loaded_count_;
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int start_batch_changes_;
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int end_batch_changes_;
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, PersistenceDBUpgrade) {
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string main_account_id(kEmail);
135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string main_refresh_token("old_refresh_token");
136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Populate DB with legacy tokens.
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddAuthTokenManually(GaiaConstants::kSyncService, "syncServiceToken");
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddAuthTokenManually(kLSOService, "lsoToken");
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddAuthTokenManually(GaiaConstants::kGaiaOAuth2LoginRefreshToken,
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       main_refresh_token);
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Force LoadCredentials.
1444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.LoadCredentials(main_account_id);
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Legacy tokens get discarded, but the old refresh token is kept.
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, tokens_loaded_count_);
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, token_available_count_);
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, start_batch_changes_);
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, end_batch_changes_);
1524ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable(main_account_id));
1534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(1U, oauth2_service_.refresh_tokens().size());
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(main_refresh_token,
1554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch            oauth2_service_.refresh_tokens()[main_account_id]->refresh_token());
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Add an old legacy token to the DB, to ensure it will not overwrite existing
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // credentials for main account.
1594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  AddAuthTokenManually(GaiaConstants::kGaiaOAuth2LoginRefreshToken,
1604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                       "secondOldRefreshToken");
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Add some other legacy token. (Expected to get discarded).
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddAuthTokenManually(kLSOService, "lsoToken");
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Also add a token using PO2TS.UpdateCredentials and make sure upgrade does
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // not wipe it.
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string other_account_id("other_account_id");
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string other_refresh_token("other_refresh_token");
1674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials(other_account_id, other_refresh_token);
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ResetObserverCounts();
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Force LoadCredentials.
1714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.LoadCredentials(main_account_id);
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Again legacy tokens get discarded, but since the main porfile account
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // token is present it is not overwritten.
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(2, token_available_count_);
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, tokens_loaded_count_);
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, start_batch_changes_);
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, end_batch_changes_);
1804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable(main_account_id));
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // TODO(fgorski): cover both using RefreshTokenIsAvailable() and then get the
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // tokens using GetRefreshToken()
1834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(2U, oauth2_service_.refresh_tokens().size());
184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(main_refresh_token,
1854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch            oauth2_service_.refresh_tokens()[main_account_id]->refresh_token());
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      other_refresh_token,
1884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      oauth2_service_.refresh_tokens()[other_account_id]->refresh_token());
189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.RevokeAllCredentials();
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2, start_batch_changes_);
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2, end_batch_changes_);
193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, PersistenceRevokeCredentials) {
196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string account_id_1 = "account_id_1";
197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string refresh_token_1 = "refresh_token_1";
198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string account_id_2 = "account_id_2";
199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string refresh_token_2 = "refresh_token_2";
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(fgorski): Enable below when implemented:
202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // EXPECT_FALSE(oauth2_servive_->RefreshTokenIsAvailable(account_id_1));
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // EXPECT_FALSE(oauth2_servive_->RefreshTokenIsAvailable(account_id_2));
204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2054ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials(account_id_1, refresh_token_1);
2064ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials(account_id_2, refresh_token_2);
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2, start_batch_changes_);
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2, end_batch_changes_);
209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(fgorski): Enable below when implemented:
211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // EXPECT_TRUE(oauth2_servive_->RefreshTokenIsAvailable(account_id_1));
2124ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable(account_id_2));
213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ResetObserverCounts();
2154ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.RevokeCredentials(account_id_1);
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, start_batch_changes_);
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, end_batch_changes_);
218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExpectOneTokenRevokedNotification();
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(fgorski): Enable below when implemented:
221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // EXPECT_FALSE(oauth2_servive_->RefreshTokenIsAvailable(account_id_1));
2224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable(account_id_2));
223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.RevokeAllCredentials();
225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, token_available_count_);
226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, token_revoked_count_);
227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, tokens_loaded_count_);
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, start_batch_changes_);
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, end_batch_changes_);
230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ResetObserverCounts();
231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, PersistenceLoadCredentials) {
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Ensure DB is clean.
2354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.RevokeAllCredentials();
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ResetObserverCounts();
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Perform a load from an empty DB.
2384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.LoadCredentials("account_id");
239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, start_batch_changes_);
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, end_batch_changes_);
242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExpectOneTokensLoadedNotification();
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // LoadCredentials() guarantees that the account given to it as argument
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // is in the refresh_token map.
2454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(1U, oauth2_service_.refresh_tokens().size());
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(
2474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      oauth2_service_.refresh_tokens()["account_id"]->refresh_token().empty());
248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Setup a DB with tokens that don't require upgrade and clear memory.
2494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials("account_id", "refresh_token");
2504ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials("account_id2", "refresh_token2");
2514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.refresh_tokens().clear();
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2, start_batch_changes_);
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2, end_batch_changes_);
254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ResetObserverCounts();
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.LoadCredentials("account_id");
257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(2, token_available_count_);
259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, token_revoked_count_);
260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, tokens_loaded_count_);
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, start_batch_changes_);
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, end_batch_changes_);
263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ResetObserverCounts();
264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(fgorski): Enable below when implemented:
266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // EXPECT_TRUE(oauth2_servive_->RefreshTokenIsAvailable("account_id"));
2674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // EXPECT_TRUE(oauth2_service_.RefreshTokenIsAvailable("account_id2"));
268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.RevokeAllCredentials();
270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, token_available_count_);
271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(2, token_revoked_count_);
272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, tokens_loaded_count_);
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, start_batch_changes_);
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1, end_batch_changes_);
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ResetObserverCounts();
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, PersistanceNotifications) {
2794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(0, oauth2_service_.cache_size_for_testing());
2804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials("account_id", "refresh_token");
281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExpectOneTokenAvailableNotification();
282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials("account_id", "refresh_token");
284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExpectNoNotifications();
285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials("account_id", "refresh_token2");
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExpectOneTokenAvailableNotification();
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.RevokeCredentials("account_id");
290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExpectOneTokenRevokedNotification();
291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2924ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials("account_id", "refresh_token2");
293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExpectOneTokenAvailableNotification();
294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2954ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.RevokeAllCredentials();
296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ResetObserverCounts();
297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, GetAccounts) {
3004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_TRUE(oauth2_service_.GetAccounts().empty());
3014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials("account_id1", "refresh_token1");
3024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials("account_id2", "refresh_token2");
3034ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  std::vector<std::string> accounts = oauth2_service_.GetAccounts();
30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(2u, accounts.size());
30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1, count(accounts.begin(), accounts.end(), "account_id1"));
30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1, count(accounts.begin(), accounts.end(), "account_id2"));
3074ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.RevokeCredentials("account_id2");
3084ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  accounts = oauth2_service_.GetAccounts();
3094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(1u, oauth2_service_.GetAccounts().size());
31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1, count(accounts.begin(), accounts.end(), "account_id1"));
31168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, TokenServiceUpdateClearsCache) {
3144ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(0, oauth2_service_.cache_size_for_testing());
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::set<std::string> scope_list;
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scope_list.insert("scope");
3174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials(kEmail, "refreshToken");
3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ExpectOneTokenAvailableNotification();
319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_token_url(),
320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           GetValidTokenResponse("token", 3600),
3214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                           net::HTTP_OK,
3224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                           net::URLRequestStatus::SUCCESS);
32368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<OAuth2TokenService::Request> request(
3254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      oauth2_service_.StartRequest(kEmail, scope_list, &consumer_));
326a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop().RunUntilIdle();
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, consumer_.number_of_successful_tokens_);
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, consumer_.number_of_errors_);
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("token", consumer_.last_token_);
3304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(1, oauth2_service_.cache_size_for_testing());
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Signs out and signs in
3334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.RevokeCredentials(kEmail);
33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ExpectOneTokenRevokedNotification();
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(0, oauth2_service_.cache_size_for_testing());
3374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials(kEmail, "refreshToken");
3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ExpectOneTokenAvailableNotification();
339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_token_url(),
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           GetValidTokenResponse("another token", 3600),
3414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                           net::HTTP_OK,
3424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                           net::URLRequestStatus::SUCCESS);
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  request = oauth2_service_.StartRequest(kEmail, scope_list, &consumer_);
345a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop().RunUntilIdle();
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(2, consumer_.number_of_successful_tokens_);
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, consumer_.number_of_errors_);
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("another token", consumer_.last_token_);
3494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(1, oauth2_service_.cache_size_for_testing());
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(MutableProfileOAuth2TokenServiceTest, FetchTransientError) {
353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_token_url(),
3544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                           "",
3554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch                           net::HTTP_FORBIDDEN,
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           net::URLRequestStatus::FAILED);
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  EXPECT_EQ(0, oauth2_service_.cache_size_for_testing());
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::set<std::string> scope_list;
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scope_list.insert("scope");
3614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.set_max_authorization_token_fetch_retries_for_testing(0);
3624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  oauth2_service_.UpdateCredentials(kEmail, "refreshToken");
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ExpectOneTokenAvailableNotification();
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<OAuth2TokenService::Request> request(
3664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      oauth2_service_.StartRequest(kEmail, scope_list, &consumer_));
367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
3694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch            oauth2_service_.signin_error_controller()->auth_error());
370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
371