gaia_auth_fetcher_unittest.cc 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. //
  5. // A complete set of unit tests for GaiaAuthFetcher.
  6. // Originally ported from GoogleAuthenticator tests.
  7. #include "google_apis/gaia/gaia_auth_fetcher.h"
  8. #include <string>
  9. #include <vector>
  10. #include "base/bind.h"
  11. #include "base/json/json_reader.h"
  12. #include "base/memory/ref_counted.h"
  13. #include "base/strings/string_number_conversions.h"
  14. #include "base/test/bind.h"
  15. #include "base/test/task_environment.h"
  16. #include "base/values.h"
  17. #include "build/build_config.h"
  18. #include "google_apis/gaia/gaia_auth_consumer.h"
  19. #include "google_apis/gaia/gaia_constants.h"
  20. #include "google_apis/gaia/gaia_urls.h"
  21. #include "google_apis/gaia/google_service_auth_error.h"
  22. #include "google_apis/gaia/oauth_multilogin_result.h"
  23. #include "google_apis/google_api_keys.h"
  24. #include "net/base/net_errors.h"
  25. #include "net/http/http_response_headers.h"
  26. #include "net/http/http_status_code.h"
  27. #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
  28. #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
  29. #include "services/network/public/mojom/fetch_api.mojom.h"
  30. #include "services/network/test/test_url_loader_factory.h"
  31. #include "testing/gmock/include/gmock/gmock.h"
  32. #include "testing/gtest/include/gtest/gtest.h"
  33. #include "url/gurl.h"
  34. using ::testing::Invoke;
  35. using ::testing::_;
  36. namespace {
  37. const char kGetTokenPairValidResponse[] =
  38. R"({
  39. "refresh_token": "rt1",
  40. "access_token": "at1",
  41. "expires_in": 3600,
  42. "token_type": "Bearer",
  43. "id_token": "it1"
  44. })";
  45. std::string GetRequestBodyAsString(const network::ResourceRequest* request) {
  46. if (!request->request_body || !request->request_body->elements() ||
  47. !request->request_body->elements()->size()) {
  48. return "";
  49. }
  50. const network::DataElement& elem = request->request_body->elements()->at(0);
  51. if (elem.type() != network::DataElement::Tag::kBytes) {
  52. return "";
  53. }
  54. return std::string(elem.As<network::DataElementBytes>().AsStringPiece());
  55. }
  56. } // namespace
  57. class GaiaAuthFetcherTest : public testing::Test {
  58. protected:
  59. GaiaAuthFetcherTest()
  60. : oauth2_token_source_(GaiaUrls::GetInstance()->oauth2_token_url()),
  61. token_auth_source_(GaiaUrls::GetInstance()->token_auth_url()),
  62. merge_session_source_(GaiaUrls::GetInstance()->merge_session_url()),
  63. uberauth_token_source_(
  64. GaiaUrls::GetInstance()->oauth1_login_url().Resolve(
  65. "?source=&issueuberauth=1")),
  66. oauth_login_gurl_(GaiaUrls::GetInstance()->oauth1_login_url()),
  67. task_environment_(base::test::TaskEnvironment::MainThreadType::UI),
  68. test_shared_loader_factory_(
  69. base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
  70. &test_url_loader_factory_)) {
  71. test_url_loader_factory_.SetInterceptor(base::BindRepeating(
  72. &GaiaAuthFetcherTest::OnResourceIntercepted, base::Unretained(this)));
  73. }
  74. void RunParsingTest(const std::string& data,
  75. const std::string& sid,
  76. const std::string& lsid,
  77. const std::string& token) {
  78. std::string out_sid;
  79. std::string out_lsid;
  80. std::string out_token;
  81. GaiaAuthFetcher::ParseClientLoginResponse(data,
  82. &out_sid,
  83. &out_lsid,
  84. &out_token);
  85. EXPECT_EQ(lsid, out_lsid);
  86. EXPECT_EQ(sid, out_sid);
  87. EXPECT_EQ(token, out_token);
  88. }
  89. void RunErrorParsingTest(const std::string& data,
  90. const std::string& error,
  91. const std::string& error_url) {
  92. std::string out_error;
  93. std::string out_error_url;
  94. GaiaAuthFetcher::ParseClientLoginFailure(data, &out_error, &out_error_url);
  95. EXPECT_EQ(error, out_error);
  96. EXPECT_EQ(error_url, out_error_url);
  97. }
  98. GURL oauth2_token_source_;
  99. GURL token_auth_source_;
  100. GURL merge_session_source_;
  101. GURL uberauth_token_source_;
  102. GURL oauth_login_gurl_;
  103. protected:
  104. void OnResourceIntercepted(const network::ResourceRequest& resource) {
  105. received_requests_.push_back(resource);
  106. }
  107. scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() {
  108. return test_shared_loader_factory_;
  109. }
  110. base::test::TaskEnvironment task_environment_;
  111. network::TestURLLoaderFactory test_url_loader_factory_;
  112. scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
  113. std::vector<network::ResourceRequest> received_requests_;
  114. };
  115. class MockGaiaConsumer : public GaiaAuthConsumer {
  116. public:
  117. MockGaiaConsumer() {}
  118. ~MockGaiaConsumer() override {}
  119. MOCK_METHOD1(OnClientLoginSuccess, void(const ClientLoginResult& result));
  120. MOCK_METHOD1(OnClientOAuthCode, void(const std::string& data));
  121. MOCK_METHOD1(OnClientOAuthSuccess,
  122. void(const GaiaAuthConsumer::ClientOAuthResult& result));
  123. MOCK_METHOD1(OnMergeSessionSuccess, void(const std::string& data));
  124. MOCK_METHOD1(OnOAuthMultiloginFinished,
  125. void(const OAuthMultiloginResult& result));
  126. MOCK_METHOD1(OnUberAuthTokenSuccess, void(const std::string& data));
  127. MOCK_METHOD1(OnClientLoginFailure,
  128. void(const GoogleServiceAuthError& error));
  129. MOCK_METHOD1(OnClientOAuthFailure,
  130. void(const GoogleServiceAuthError& error));
  131. MOCK_METHOD1(OnOAuth2RevokeTokenCompleted,
  132. void(GaiaAuthConsumer::TokenRevocationStatus status));
  133. MOCK_METHOD1(OnMergeSessionFailure, void(
  134. const GoogleServiceAuthError& error));
  135. MOCK_METHOD1(OnUberAuthTokenFailure, void(
  136. const GoogleServiceAuthError& error));
  137. MOCK_METHOD1(OnListAccountsSuccess, void(const std::string& data));
  138. MOCK_METHOD0(OnLogOutSuccess, void());
  139. MOCK_METHOD1(OnLogOutFailure, void(const GoogleServiceAuthError& error));
  140. MOCK_METHOD1(OnGetCheckConnectionInfoSuccess, void(const std::string& data));
  141. MOCK_METHOD1(OnReAuthProofTokenSuccess, void(const std::string& rapt_token));
  142. MOCK_METHOD1(OnReAuthProofTokenFailure,
  143. void(GaiaAuthConsumer::ReAuthProofTokenStatus status));
  144. };
  145. #if BUILDFLAG(IS_WIN)
  146. #define MAYBE_ErrorComparator DISABLED_ErrorComparator
  147. #else
  148. #define MAYBE_ErrorComparator ErrorComparator
  149. #endif
  150. TEST_F(GaiaAuthFetcherTest, MAYBE_ErrorComparator) {
  151. GoogleServiceAuthError expected_error =
  152. GoogleServiceAuthError::FromConnectionError(-101);
  153. GoogleServiceAuthError matching_error =
  154. GoogleServiceAuthError::FromConnectionError(-101);
  155. EXPECT_TRUE(expected_error == matching_error);
  156. expected_error = GoogleServiceAuthError::FromConnectionError(6);
  157. EXPECT_FALSE(expected_error == matching_error);
  158. expected_error = GoogleServiceAuthError(GoogleServiceAuthError::NONE);
  159. EXPECT_FALSE(expected_error == matching_error);
  160. matching_error = GoogleServiceAuthError(GoogleServiceAuthError::NONE);
  161. EXPECT_TRUE(expected_error == matching_error);
  162. }
  163. // A version of GaiaAuthFetcher that exposes some of the protected methods.
  164. class TestGaiaAuthFetcher : public GaiaAuthFetcher {
  165. public:
  166. TestGaiaAuthFetcher(
  167. GaiaAuthConsumer* consumer,
  168. scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
  169. : GaiaAuthFetcher(consumer,
  170. gaia::GaiaSource::kChrome,
  171. url_loader_factory) {}
  172. void CreateAndStartGaiaFetcherForTesting(
  173. const std::string& body,
  174. const std::string& headers,
  175. const GURL& gaia_gurl,
  176. network::mojom::CredentialsMode credentials_mode,
  177. const net::NetworkTrafficAnnotationTag& traffic_annotation) {
  178. CreateAndStartGaiaFetcher(body, /*content_type=*/"", headers, gaia_gurl,
  179. credentials_mode, traffic_annotation);
  180. }
  181. void TestOnURLLoadCompleteInternal(
  182. net::Error net_error,
  183. int response_code = net::HTTP_OK,
  184. std::string response_body = "") {
  185. OnURLLoadCompleteInternal(net_error, response_code, response_body);
  186. }
  187. };
  188. TEST_F(GaiaAuthFetcherTest, ParseRequest) {
  189. RunParsingTest("SID=sid\nLSID=lsid\nAuth=auth\n", "sid", "lsid", "auth");
  190. RunParsingTest("LSID=lsid\nSID=sid\nAuth=auth\n", "sid", "lsid", "auth");
  191. RunParsingTest("SID=sid\nLSID=lsid\nAuth=auth", "sid", "lsid", "auth");
  192. RunParsingTest("SID=sid\nAuth=auth\n", "sid", std::string(), "auth");
  193. RunParsingTest("LSID=lsid\nAuth=auth\n", std::string(), "lsid", "auth");
  194. RunParsingTest("\nAuth=auth\n", std::string(), std::string(), "auth");
  195. RunParsingTest("SID=sid", "sid", std::string(), std::string());
  196. }
  197. TEST_F(GaiaAuthFetcherTest, ParseErrorRequest) {
  198. RunErrorParsingTest(
  199. "Url=U\n"
  200. "Error=E\n",
  201. "E", "U");
  202. RunErrorParsingTest(
  203. "Error=E\n"
  204. "Url=U\n",
  205. "E", "U");
  206. RunErrorParsingTest(
  207. "\n\n\nError=E\n"
  208. "\nUrl=U\n",
  209. "E", "U");
  210. }
  211. TEST_F(GaiaAuthFetcherTest, BadAuthenticationError) {
  212. std::string data = "Error=BadAuthentication\n";
  213. GoogleServiceAuthError error =
  214. GaiaAuthFetcher::GenerateAuthError(data, net::OK);
  215. EXPECT_EQ(error.state(), GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
  216. }
  217. TEST_F(GaiaAuthFetcherTest, BadAuthenticationShortError) {
  218. std::string data = "Error=badauth\n";
  219. GoogleServiceAuthError error =
  220. GaiaAuthFetcher::GenerateAuthError(data, net::OK);
  221. EXPECT_EQ(error.state(), GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
  222. }
  223. TEST_F(GaiaAuthFetcherTest, IncomprehensibleError) {
  224. std::string data = "Error=Gobbledygook\n";
  225. GoogleServiceAuthError error =
  226. GaiaAuthFetcher::GenerateAuthError(data, net::OK);
  227. EXPECT_EQ(error.state(), GoogleServiceAuthError::SERVICE_UNAVAILABLE);
  228. }
  229. TEST_F(GaiaAuthFetcherTest, ServiceUnavailableError) {
  230. std::string data = "Error=ServiceUnavailable\n";
  231. GoogleServiceAuthError error =
  232. GaiaAuthFetcher::GenerateAuthError(data, net::OK);
  233. EXPECT_EQ(error.state(), GoogleServiceAuthError::SERVICE_UNAVAILABLE);
  234. }
  235. TEST_F(GaiaAuthFetcherTest, ServiceUnavailableShortError) {
  236. std::string data = "Error=ire\n";
  237. GoogleServiceAuthError error =
  238. GaiaAuthFetcher::GenerateAuthError(data, net::OK);
  239. EXPECT_EQ(error.state(), GoogleServiceAuthError::SERVICE_UNAVAILABLE);
  240. }
  241. TEST_F(GaiaAuthFetcherTest, StartAuthCodeForOAuth2TokenExchange_Success) {
  242. MockGaiaConsumer consumer;
  243. EXPECT_CALL(consumer, OnClientOAuthCode("test-code")).Times(0);
  244. EXPECT_CALL(consumer,
  245. OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
  246. "rt1", "at1", 3600, false /* is_child_account */,
  247. false /* is_advanced_protection */)))
  248. .Times(1);
  249. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  250. auth.StartAuthCodeForOAuth2TokenExchange("auth_code");
  251. ASSERT_EQ(received_requests_.size(), 1U);
  252. EXPECT_EQ(network::mojom::CredentialsMode::kOmit,
  253. received_requests_.at(0).credentials_mode);
  254. std::string body = GetRequestBodyAsString(&received_requests_.at(0));
  255. EXPECT_EQ(std::string::npos, body.find("device_type=chrome"));
  256. EXPECT_TRUE(auth.HasPendingFetch());
  257. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK,
  258. kGetTokenPairValidResponse);
  259. EXPECT_FALSE(auth.HasPendingFetch());
  260. }
  261. TEST_F(GaiaAuthFetcherTest, StartAuthCodeForOAuth2TokenExchange_DeviceId) {
  262. MockGaiaConsumer consumer;
  263. GaiaAuthFetcher auth(&consumer, gaia::GaiaSource::kChrome,
  264. GetURLLoaderFactory());
  265. auth.StartAuthCodeForOAuth2TokenExchangeWithDeviceId("auth_code",
  266. "device_ABCDE_1");
  267. ASSERT_EQ(1U, received_requests_.size());
  268. EXPECT_EQ(network::mojom::CredentialsMode::kOmit,
  269. received_requests_.at(0).credentials_mode);
  270. std::string body = GetRequestBodyAsString(&received_requests_.at(0));
  271. EXPECT_NE(std::string::npos, body.find("device_type=chrome"));
  272. EXPECT_NE(std::string::npos, body.find("device_id=device_ABCDE_1"));
  273. }
  274. TEST_F(GaiaAuthFetcherTest, StartAuthCodeForOAuth2TokenExchange_Failure) {
  275. MockGaiaConsumer consumer;
  276. EXPECT_CALL(consumer, OnClientOAuthFailure(_)).Times(1);
  277. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  278. auth.StartAuthCodeForOAuth2TokenExchange("auth_code");
  279. EXPECT_TRUE(auth.HasPendingFetch());
  280. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_FORBIDDEN);
  281. EXPECT_FALSE(auth.HasPendingFetch());
  282. }
  283. TEST_F(GaiaAuthFetcherTest, MergeSessionSuccess) {
  284. MockGaiaConsumer consumer;
  285. EXPECT_CALL(consumer, OnMergeSessionSuccess("<html></html>")).Times(1);
  286. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  287. auth.StartMergeSession("myubertoken", std::string());
  288. EXPECT_TRUE(auth.HasPendingFetch());
  289. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK, "<html></html>");
  290. EXPECT_FALSE(auth.HasPendingFetch());
  291. }
  292. TEST_F(GaiaAuthFetcherTest, MultiloginRequestFormat) {
  293. MockGaiaConsumer consumer;
  294. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  295. std::vector<GaiaAuthFetcher::MultiloginTokenIDPair> accounts;
  296. accounts.push_back({"token1", "id1"});
  297. accounts.push_back({"token2", "id2"});
  298. auth.StartOAuthMultilogin(
  299. gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER, accounts,
  300. "cc_result");
  301. ASSERT_TRUE(auth.HasPendingFetch());
  302. const network::ResourceRequest& request0 = received_requests_.at(0);
  303. EXPECT_EQ("POST", request0.method);
  304. std::string header;
  305. request0.headers.GetHeader("Authorization", &header);
  306. EXPECT_EQ("MultiBearer id1:token1,id2:token2", header);
  307. EXPECT_EQ("source=ChromiumBrowser&reuseCookies=0&externalCcResult=cc_result",
  308. request0.url.query());
  309. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK, std::string());
  310. EXPECT_FALSE(auth.HasPendingFetch());
  311. auth.StartOAuthMultilogin(
  312. gaia::MultiloginMode::MULTILOGIN_PRESERVE_COOKIE_ACCOUNTS_ORDER, accounts,
  313. "cc_result");
  314. ASSERT_TRUE(auth.HasPendingFetch());
  315. const network::ResourceRequest& request1 = received_requests_.at(1);
  316. EXPECT_EQ("source=ChromiumBrowser&reuseCookies=1&externalCcResult=cc_result",
  317. request1.url.query());
  318. }
  319. TEST_F(GaiaAuthFetcherTest, MultiloginSuccess) {
  320. MockGaiaConsumer consumer;
  321. EXPECT_CALL(consumer, OnOAuthMultiloginFinished(::testing::Property(
  322. &OAuthMultiloginResult::status,
  323. ::testing::Eq(OAuthMultiloginResponseStatus::kOk))))
  324. .Times(1);
  325. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  326. auth.StartOAuthMultilogin(
  327. gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
  328. std::vector<GaiaAuthFetcher::MultiloginTokenIDPair>(), std::string());
  329. EXPECT_TRUE(auth.HasPendingFetch());
  330. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK,
  331. R"()]}'
  332. {
  333. "status": "OK",
  334. "cookies":[
  335. {
  336. "name":"SID",
  337. "value":"vAlUe1",
  338. "domain":".google.ru",
  339. "path":"/",
  340. "isSecure":true,
  341. "isHttpOnly":false,
  342. "priority":"HIGH",
  343. "maxAge":63070000
  344. }
  345. ]
  346. }
  347. )");
  348. EXPECT_FALSE(auth.HasPendingFetch());
  349. }
  350. TEST_F(GaiaAuthFetcherTest, MultiloginFailureNetError) {
  351. MockGaiaConsumer consumer;
  352. EXPECT_CALL(consumer,
  353. OnOAuthMultiloginFinished(::testing::Property(
  354. &OAuthMultiloginResult::status,
  355. ::testing::Eq(OAuthMultiloginResponseStatus::kRetry))))
  356. .Times(1);
  357. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  358. auth.StartOAuthMultilogin(
  359. gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
  360. std::vector<GaiaAuthFetcher::MultiloginTokenIDPair>(), std::string());
  361. EXPECT_TRUE(auth.HasPendingFetch());
  362. auth.TestOnURLLoadCompleteInternal(net::ERR_ABORTED, net::HTTP_OK,
  363. R"()]}'
  364. {
  365. "status": "OK",
  366. "cookies":[
  367. {
  368. "name":"SID",
  369. "value":"vAlUe1",
  370. "domain":".google.ru",
  371. "path":"/",
  372. "isSecure":true,
  373. "isHttpOnly":false,
  374. "priority":"HIGH",
  375. "maxAge":63070000
  376. }
  377. ]
  378. }
  379. )");
  380. EXPECT_FALSE(auth.HasPendingFetch());
  381. }
  382. TEST_F(GaiaAuthFetcherTest, MultiloginFailureServerError) {
  383. MockGaiaConsumer consumer;
  384. EXPECT_CALL(consumer,
  385. OnOAuthMultiloginFinished(::testing::Property(
  386. &OAuthMultiloginResult::status,
  387. ::testing::Eq(OAuthMultiloginResponseStatus::kError))))
  388. .Times(1);
  389. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  390. auth.StartOAuthMultilogin(
  391. gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
  392. std::vector<GaiaAuthFetcher::MultiloginTokenIDPair>(), std::string());
  393. EXPECT_TRUE(auth.HasPendingFetch());
  394. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK,
  395. "\n{\"status\": \"ERROR\"}");
  396. EXPECT_FALSE(auth.HasPendingFetch());
  397. }
  398. TEST_F(GaiaAuthFetcherTest, UberAuthTokenSuccess) {
  399. MockGaiaConsumer consumer;
  400. EXPECT_CALL(consumer, OnUberAuthTokenSuccess("uberToken")).Times(1);
  401. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  402. auth.StartTokenFetchForUberAuthExchange("myAccessToken");
  403. EXPECT_TRUE(auth.HasPendingFetch());
  404. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK, "uberToken");
  405. EXPECT_FALSE(auth.HasPendingFetch());
  406. }
  407. TEST_F(GaiaAuthFetcherTest, StartOAuthLogin) {
  408. // OAuthLogin returns the same as the ClientLogin endpoint.
  409. std::string data("SID=sid\nLSID=lsid\nAuth=auth\n");
  410. GaiaAuthConsumer::ClientLoginResult result;
  411. result.lsid = "lsid";
  412. result.sid = "sid";
  413. result.token = "auth";
  414. result.data = data;
  415. MockGaiaConsumer consumer;
  416. EXPECT_CALL(consumer, OnClientLoginSuccess(result)).Times(1);
  417. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  418. auth.CreateAndStartGaiaFetcherForTesting(
  419. /*body=*/"", /*headers=*/"", oauth_login_gurl_,
  420. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  421. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK, data);
  422. }
  423. TEST_F(GaiaAuthFetcherTest, ListAccounts) {
  424. std::string data(
  425. R"(["gaia.l.a.r",
  426. [
  427. ["gaia.l.a", 1, "First Last", "user@gmail.com",
  428. "//googleusercontent.com/A/B/C/D/photo.jpg", 1, 1, 0
  429. ]
  430. ]
  431. ])");
  432. MockGaiaConsumer consumer;
  433. EXPECT_CALL(consumer, OnListAccountsSuccess(data)).Times(1);
  434. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  435. auth.CreateAndStartGaiaFetcherForTesting(
  436. /*body=*/"", /*headers=*/"",
  437. GaiaUrls::GetInstance()->ListAccountsURLWithSource(
  438. GaiaConstants::kChromeSource),
  439. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  440. ASSERT_EQ(received_requests_.size(), 1U);
  441. EXPECT_EQ(network::mojom::CredentialsMode::kInclude,
  442. received_requests_.at(0).credentials_mode);
  443. EXPECT_TRUE(received_requests_.at(0).site_for_cookies.IsEquivalent(
  444. net::SiteForCookies::FromUrl(GaiaUrls::GetInstance()->gaia_url())));
  445. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK, data);
  446. }
  447. TEST_F(GaiaAuthFetcherTest, LogOutSuccess) {
  448. MockGaiaConsumer consumer;
  449. EXPECT_CALL(consumer, OnLogOutSuccess()).Times(1);
  450. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  451. auth.CreateAndStartGaiaFetcherForTesting(
  452. /*body=*/"", /*headers=*/"",
  453. GaiaUrls::GetInstance()->LogOutURLWithSource(
  454. GaiaConstants::kChromeSource),
  455. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  456. auth.TestOnURLLoadCompleteInternal(net::OK);
  457. }
  458. TEST_F(GaiaAuthFetcherTest, LogOutFailure) {
  459. net::Error error_no = net::ERR_CONNECTION_RESET;
  460. GoogleServiceAuthError expected_error =
  461. GoogleServiceAuthError::FromConnectionError(error_no);
  462. MockGaiaConsumer consumer;
  463. EXPECT_CALL(consumer, OnLogOutFailure(expected_error)).Times(1);
  464. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  465. auth.CreateAndStartGaiaFetcherForTesting(
  466. /*body=*/"", /*headers=*/"",
  467. GaiaUrls::GetInstance()->LogOutURLWithSource(
  468. GaiaConstants::kChromeSource),
  469. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  470. auth.TestOnURLLoadCompleteInternal(error_no);
  471. }
  472. TEST_F(GaiaAuthFetcherTest, GetCheckConnectionInfo) {
  473. std::string data(R"(
  474. [{"carryBackToken": "token1", "url": "http://www.google.com"}])");
  475. MockGaiaConsumer consumer;
  476. EXPECT_CALL(consumer, OnGetCheckConnectionInfoSuccess(data)).Times(1);
  477. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  478. auth.CreateAndStartGaiaFetcherForTesting(
  479. /*body=*/"", /*headers=*/"",
  480. GaiaUrls::GetInstance()->GetCheckConnectionInfoURLWithSource(
  481. GaiaConstants::kChromeSource),
  482. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  483. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK, data);
  484. }
  485. TEST_F(GaiaAuthFetcherTest, RevokeOAuth2TokenSuccess) {
  486. std::string data("{}");
  487. MockGaiaConsumer consumer;
  488. EXPECT_CALL(consumer, OnOAuth2RevokeTokenCompleted(
  489. GaiaAuthConsumer::TokenRevocationStatus::kSuccess))
  490. .Times(1);
  491. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  492. auth.CreateAndStartGaiaFetcherForTesting(
  493. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->oauth2_revoke_url(),
  494. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  495. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK, data);
  496. }
  497. TEST_F(GaiaAuthFetcherTest, RevokeOAuth2TokenCanceled) {
  498. MockGaiaConsumer consumer;
  499. EXPECT_CALL(consumer,
  500. OnOAuth2RevokeTokenCompleted(
  501. GaiaAuthConsumer::TokenRevocationStatus::kConnectionCanceled))
  502. .Times(1);
  503. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  504. auth.CreateAndStartGaiaFetcherForTesting(
  505. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->oauth2_revoke_url(),
  506. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  507. auth.TestOnURLLoadCompleteInternal(net::ERR_ABORTED);
  508. }
  509. TEST_F(GaiaAuthFetcherTest, RevokeOAuth2TokenFailed) {
  510. MockGaiaConsumer consumer;
  511. EXPECT_CALL(consumer,
  512. OnOAuth2RevokeTokenCompleted(
  513. GaiaAuthConsumer::TokenRevocationStatus::kConnectionFailed))
  514. .Times(1);
  515. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  516. auth.CreateAndStartGaiaFetcherForTesting(
  517. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->oauth2_revoke_url(),
  518. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  519. auth.TestOnURLLoadCompleteInternal(net::ERR_CERT_CONTAINS_ERRORS);
  520. }
  521. TEST_F(GaiaAuthFetcherTest, RevokeOAuth2TokenTimeout) {
  522. MockGaiaConsumer consumer;
  523. EXPECT_CALL(consumer,
  524. OnOAuth2RevokeTokenCompleted(
  525. GaiaAuthConsumer::TokenRevocationStatus::kConnectionTimeout))
  526. .Times(1);
  527. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  528. auth.CreateAndStartGaiaFetcherForTesting(
  529. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->oauth2_revoke_url(),
  530. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  531. auth.TestOnURLLoadCompleteInternal(net::ERR_TIMED_OUT);
  532. }
  533. TEST_F(GaiaAuthFetcherTest, RevokeOAuth2TokenInvalidToken) {
  534. std::string data("{\"error\" : \"invalid_token\"}");
  535. MockGaiaConsumer consumer;
  536. EXPECT_CALL(consumer,
  537. OnOAuth2RevokeTokenCompleted(
  538. GaiaAuthConsumer::TokenRevocationStatus::kInvalidToken))
  539. .Times(1);
  540. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  541. auth.CreateAndStartGaiaFetcherForTesting(
  542. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->oauth2_revoke_url(),
  543. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  544. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_BAD_REQUEST, data);
  545. }
  546. TEST_F(GaiaAuthFetcherTest, RevokeOAuth2TokenInvalidRequest) {
  547. std::string data("{\"error\" : \"invalid_request\"}");
  548. MockGaiaConsumer consumer;
  549. EXPECT_CALL(consumer,
  550. OnOAuth2RevokeTokenCompleted(
  551. GaiaAuthConsumer::TokenRevocationStatus::kInvalidRequest))
  552. .Times(1);
  553. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  554. auth.CreateAndStartGaiaFetcherForTesting(
  555. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->oauth2_revoke_url(),
  556. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  557. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_BAD_REQUEST, data);
  558. }
  559. TEST_F(GaiaAuthFetcherTest, RevokeOAuth2TokenServerError) {
  560. std::string data("{}");
  561. MockGaiaConsumer consumer;
  562. EXPECT_CALL(consumer,
  563. OnOAuth2RevokeTokenCompleted(
  564. GaiaAuthConsumer::TokenRevocationStatus::kServerError))
  565. .Times(1);
  566. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  567. auth.CreateAndStartGaiaFetcherForTesting(
  568. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->oauth2_revoke_url(),
  569. network::mojom::CredentialsMode::kInclude, TRAFFIC_ANNOTATION_FOR_TESTS);
  570. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_INTERNAL_SERVER_ERROR,
  571. data);
  572. }
  573. TEST_F(GaiaAuthFetcherTest, ReAuthTokenSuccess) {
  574. std::string data("{\"encodedRapt\" : \"rapt_token\"}");
  575. MockGaiaConsumer consumer;
  576. EXPECT_CALL(consumer, OnReAuthProofTokenSuccess("rapt_token")).Times(1);
  577. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  578. auth.CreateAndStartGaiaFetcherForTesting(
  579. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->reauth_api_url(),
  580. network::mojom::CredentialsMode ::kOmit, TRAFFIC_ANNOTATION_FOR_TESTS);
  581. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_OK, data);
  582. }
  583. TEST_F(GaiaAuthFetcherTest, ReAuthTokenInvalidRequest) {
  584. std::string data("{\"error\" : { \"message\" : \"INVALID_REQUEST\"} }");
  585. MockGaiaConsumer consumer;
  586. EXPECT_CALL(consumer,
  587. OnReAuthProofTokenFailure(
  588. GaiaAuthConsumer::ReAuthProofTokenStatus::kInvalidRequest))
  589. .Times(1);
  590. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  591. auth.CreateAndStartGaiaFetcherForTesting(
  592. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->reauth_api_url(),
  593. network::mojom::CredentialsMode ::kOmit, TRAFFIC_ANNOTATION_FOR_TESTS);
  594. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_BAD_REQUEST, data);
  595. }
  596. TEST_F(GaiaAuthFetcherTest, ReAuthTokenInvalidGrant) {
  597. std::string data("{\"error\" : { \"message\" : \"INVALID_GRANT\"} }");
  598. MockGaiaConsumer consumer;
  599. EXPECT_CALL(consumer,
  600. OnReAuthProofTokenFailure(
  601. GaiaAuthConsumer::ReAuthProofTokenStatus::kInvalidGrant))
  602. .Times(1);
  603. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  604. auth.CreateAndStartGaiaFetcherForTesting(
  605. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->reauth_api_url(),
  606. network::mojom::CredentialsMode ::kOmit, TRAFFIC_ANNOTATION_FOR_TESTS);
  607. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_BAD_REQUEST, data);
  608. }
  609. TEST_F(GaiaAuthFetcherTest, ReAuthTokenUnauthorizedClient) {
  610. std::string data("{\"error\" : { \"message\" : \"UNAUTHORIZED_CLIENT\"} }");
  611. MockGaiaConsumer consumer;
  612. EXPECT_CALL(
  613. consumer,
  614. OnReAuthProofTokenFailure(
  615. GaiaAuthConsumer::ReAuthProofTokenStatus::kUnauthorizedClient))
  616. .Times(1);
  617. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  618. auth.CreateAndStartGaiaFetcherForTesting(
  619. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->reauth_api_url(),
  620. network::mojom::CredentialsMode ::kOmit, TRAFFIC_ANNOTATION_FOR_TESTS);
  621. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_FORBIDDEN, data);
  622. }
  623. TEST_F(GaiaAuthFetcherTest, ReAuthTokenInsufficientScope) {
  624. std::string data("{\"error\" : { \"message\" : \"INSUFFICIENT_SCOPE\"} }");
  625. MockGaiaConsumer consumer;
  626. EXPECT_CALL(consumer,
  627. OnReAuthProofTokenFailure(
  628. GaiaAuthConsumer::ReAuthProofTokenStatus::kInsufficientScope))
  629. .Times(1);
  630. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  631. auth.CreateAndStartGaiaFetcherForTesting(
  632. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->reauth_api_url(),
  633. network::mojom::CredentialsMode ::kOmit, TRAFFIC_ANNOTATION_FOR_TESTS);
  634. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_FORBIDDEN, data);
  635. }
  636. TEST_F(GaiaAuthFetcherTest, ReAuthTokenCredentialNotSet) {
  637. std::string data("{\"error\" : { \"message\" : \"CREDENTIAL_NOT_SET\"} }");
  638. MockGaiaConsumer consumer;
  639. EXPECT_CALL(consumer,
  640. OnReAuthProofTokenFailure(
  641. GaiaAuthConsumer::ReAuthProofTokenStatus::kCredentialNotSet))
  642. .Times(1);
  643. TestGaiaAuthFetcher auth(&consumer, GetURLLoaderFactory());
  644. auth.CreateAndStartGaiaFetcherForTesting(
  645. /*body=*/"", /*headers=*/"", GaiaUrls::GetInstance()->reauth_api_url(),
  646. network::mojom::CredentialsMode ::kOmit, TRAFFIC_ANNOTATION_FOR_TESTS);
  647. auth.TestOnURLLoadCompleteInternal(net::OK, net::HTTP_FORBIDDEN, data);
  648. }