15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gaia/ubertoken_fetcher.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h" 858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/memory/scoped_ptr.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gaia/fake_oauth2_token_service.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace { 1758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kTestAccountId[] = "test@gmail.com"; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockUbertokenConsumer : public UbertokenConsumer { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockUbertokenConsumer() 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : nb_correct_token_(0), 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_error_(GoogleServiceAuthError::AuthErrorNone()), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nb_error_(0) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockUbertokenConsumer() {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnUbertokenSuccess(const std::string& token) OVERRIDE { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_token_ = token; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++ nb_correct_token_; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnUbertokenFailure(const GoogleServiceAuthError& error) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERRIDE { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_error_ = error; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++nb_error_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string last_token_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nb_correct_token_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError last_error_; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nb_error_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace 4758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class UbertokenFetcherTest : public testing::Test { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_context_getter_ = new net::TestURLRequestContextGetter( 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopProxy::current()); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher_.reset(new UbertokenFetcher(&token_service_, 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &consumer_, 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_context_getter_.get())); 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 5958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch fetcher_.reset(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop message_loop_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcherFactory factory_; 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeOAuth2TokenService token_service_; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context_getter_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockUbertokenConsumer consumer_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<UbertokenFetcher> fetcher_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochTEST_F(UbertokenFetcherTest, Basic) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochTEST_F(UbertokenFetcherTest, Success) { 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher_->StartFetchingToken(kTestAccountId); 7658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch fetcher_->OnGetTokenSuccess(NULL, "accessToken", base::Time()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher_->OnUberAuthTokenSuccess("uberToken"); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, consumer_.nb_error_); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, consumer_.nb_correct_token_); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("uberToken", consumer_.last_token_); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochTEST_F(UbertokenFetcherTest, NoRefreshToken) { 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher_->StartFetchingToken(kTestAccountId); 8658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch GoogleServiceAuthError error(GoogleServiceAuthError::USER_NOT_SIGNED_UP); 8758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch fetcher_->OnGetTokenFailure(NULL, error); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EXPECT_EQ(1, consumer_.nb_error_); 9058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EXPECT_EQ(0, consumer_.nb_correct_token_); 9158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochTEST_F(UbertokenFetcherTest, FailureToGetAccessToken) { 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher_->StartFetchingToken(kTestAccountId); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::USER_NOT_SIGNED_UP); 9658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch fetcher_->OnGetTokenFailure(NULL, error); 9758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, consumer_.nb_error_); 9958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EXPECT_EQ(0, consumer_.nb_correct_token_); 10058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EXPECT_EQ("", consumer_.last_token_); 10158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 10258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(UbertokenFetcherTest, TransientFailureEventualFailure) { 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->StartFetchingToken(kTestAccountId); 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnGetTokenSuccess(NULL, "accessToken", base::Time()); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (int i = 0; i < UbertokenFetcher::kMaxRetries; ++i) { 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnUberAuthTokenFailure(error); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_error_); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_correct_token_); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("", consumer_.last_token_); 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnUberAuthTokenFailure(error); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, consumer_.nb_error_); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_correct_token_); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("", consumer_.last_token_); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(UbertokenFetcherTest, TransientFailureEventualSuccess) { 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->StartFetchingToken(kTestAccountId); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GoogleServiceAuthError error(GoogleServiceAuthError::CONNECTION_FAILED); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnGetTokenSuccess(NULL, "accessToken", base::Time()); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (int i = 0; i < UbertokenFetcher::kMaxRetries; ++i) { 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnUberAuthTokenFailure(error); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_error_); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_correct_token_); 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("", consumer_.last_token_); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnUberAuthTokenSuccess("uberToken"); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_error_); 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, consumer_.nb_correct_token_); 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("uberToken", consumer_.last_token_); 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(UbertokenFetcherTest, PermanentFailureEventualFailure) { 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher_->StartFetchingToken(kTestAccountId); 14158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch fetcher_->OnGetTokenSuccess(NULL, "accessToken", base::Time()); 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GoogleServiceAuthError error(GoogleServiceAuthError::USER_NOT_SIGNED_UP); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetcher_->OnUberAuthTokenFailure(error); 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_error_); 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_correct_token_); 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("", consumer_.last_token_); 14858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnGetTokenSuccess(NULL, "accessToken", base::Time()); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnUberAuthTokenFailure(error); 15158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EXPECT_EQ(1, consumer_.nb_error_); 15258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EXPECT_EQ(0, consumer_.nb_correct_token_); 15358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch EXPECT_EQ("", consumer_.last_token_); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(UbertokenFetcherTest, PermanentFailureEventualSuccess) { 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->StartFetchingToken(kTestAccountId); 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GoogleServiceAuthError error(GoogleServiceAuthError::USER_NOT_SIGNED_UP); 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnGetTokenSuccess(NULL, "accessToken", base::Time()); 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnUberAuthTokenFailure(error); 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_error_); 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_correct_token_); 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("", consumer_.last_token_); 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnGetTokenSuccess(NULL, "accessToken", base::Time()); 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_->OnUberAuthTokenSuccess("uberToken"); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, consumer_.nb_error_); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, consumer_.nb_correct_token_); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("uberToken", consumer_.last_token_); 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 172