1 // Copyright 2016 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 #include "components/signin/core/browser/signin_header_helper.h"
6
7 #include <memory>
8 #include <string>
9
10 #include "base/command_line.h"
11 #include "base/strings/stringprintf.h"
12 #include "base/test/scoped_feature_list.h"
13 #include "base/test/task_environment.h"
14 #include "build/build_config.h"
15 #include "components/content_settings/core/browser/cookie_settings.h"
16 #include "components/prefs/pref_member.h"
17 #include "components/signin/core/browser/chrome_connected_header_helper.h"
18 #include "components/signin/public/base/account_consistency_method.h"
19 #include "components/signin/public/base/signin_buildflags.h"
20 #include "components/sync_preferences/testing_pref_service_syncable.h"
21 #include "google_apis/gaia/gaia_urls.h"
22 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
23 #include "net/url_request/url_request_test_util.h"
24 #include "testing/gtest/include/gtest/gtest.h"
25 #include "url/gurl.h"
26
27 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
28 #include "components/signin/core/browser/dice_header_helper.h"
29 #endif
30
31 namespace {
32 constexpr char kTestDeviceId[] = "DeviceID";
33 }
34
35 namespace signin {
36
37 class SigninHeaderHelperTest : public testing::Test {
38 protected:
SetUp()39 void SetUp() override {
40 content_settings::CookieSettings::RegisterProfilePrefs(prefs_.registry());
41 HostContentSettingsMap::RegisterProfilePrefs(prefs_.registry());
42
43 settings_map_ = new HostContentSettingsMap(
44 &prefs_, false /* is_off_the_record */, false /* store_last_modified */,
45 false /* migrate_requesting_and_top_level_origin_settings */);
46 cookie_settings_ = new content_settings::CookieSettings(settings_map_.get(),
47 &prefs_, false, "");
48 }
49
TearDown()50 void TearDown() override { settings_map_->ShutdownOnUIThread(); }
51
CheckMirrorCookieRequest(const GURL & url,const std::string & gaia_id,const std::string & expected_request)52 void CheckMirrorCookieRequest(const GURL& url,
53 const std::string& gaia_id,
54 const std::string& expected_request) {
55 EXPECT_EQ(BuildMirrorRequestCookieIfPossible(
56 url, gaia_id, account_consistency_, cookie_settings_.get(),
57 PROFILE_MODE_DEFAULT),
58 expected_request);
59 }
60
CreateRequest(const GURL & url,const std::string & account_id)61 std::unique_ptr<net::URLRequest> CreateRequest(
62 const GURL& url,
63 const std::string& account_id) {
64 std::unique_ptr<net::URLRequest> url_request =
65 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr,
66 TRAFFIC_ANNOTATION_FOR_TESTS);
67 RequestAdapter request_adapter(url_request.get());
68 AppendOrRemoveMirrorRequestHeader(
69 &request_adapter, GURL(), account_id, account_consistency_,
70 cookie_settings_.get(), PROFILE_MODE_DEFAULT);
71 AppendOrRemoveDiceRequestHeader(&request_adapter, GURL(), account_id,
72 sync_enabled_, account_consistency_,
73 cookie_settings_.get(), device_id_);
74 return url_request;
75 }
76
CheckAccountConsistencyHeaderRequest(net::URLRequest * url_request,const char * header_name,const std::string & expected_request)77 void CheckAccountConsistencyHeaderRequest(
78 net::URLRequest* url_request,
79 const char* header_name,
80 const std::string& expected_request) {
81 bool expected_result = !expected_request.empty();
82 std::string request;
83 EXPECT_EQ(
84 url_request->extra_request_headers().GetHeader(header_name, &request),
85 expected_result)
86 << header_name << ": " << request;
87 if (expected_result) {
88 EXPECT_EQ(expected_request, request);
89 }
90 }
91
CheckMirrorHeaderRequest(const GURL & url,const std::string & account_id,const std::string & expected_request)92 void CheckMirrorHeaderRequest(const GURL& url,
93 const std::string& account_id,
94 const std::string& expected_request) {
95 std::unique_ptr<net::URLRequest> url_request =
96 CreateRequest(url, account_id);
97 CheckAccountConsistencyHeaderRequest(
98 url_request.get(), kChromeConnectedHeader, expected_request);
99 }
100
101 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
CheckDiceHeaderRequest(const GURL & url,const std::string & account_id,const std::string & expected_mirror_request,const std::string & expected_dice_request)102 void CheckDiceHeaderRequest(const GURL& url,
103 const std::string& account_id,
104 const std::string& expected_mirror_request,
105 const std::string& expected_dice_request) {
106 std::unique_ptr<net::URLRequest> url_request =
107 CreateRequest(url, account_id);
108 CheckAccountConsistencyHeaderRequest(
109 url_request.get(), kChromeConnectedHeader, expected_mirror_request);
110 CheckAccountConsistencyHeaderRequest(url_request.get(), kDiceRequestHeader,
111 expected_dice_request);
112 }
113 #endif
114
115 base::test::SingleThreadTaskEnvironment task_environment_;
116
117 bool sync_enabled_ = false;
118 std::string device_id_ = kTestDeviceId;
119 AccountConsistencyMethod account_consistency_ =
120 AccountConsistencyMethod::kDisabled;
121
122 sync_preferences::TestingPrefServiceSyncable prefs_;
123 net::TestURLRequestContext url_request_context_;
124
125 scoped_refptr<HostContentSettingsMap> settings_map_;
126 scoped_refptr<content_settings::CookieSettings> cookie_settings_;
127 };
128
129 #if defined(OS_CHROMEOS)
130 // Tests that Mirror request is returned on Chrome OS for Public Sessions (no
131 // account id).
TEST_F(SigninHeaderHelperTest,TestMirrorRequestNoAccountIdChromeOS)132 TEST_F(SigninHeaderHelperTest, TestMirrorRequestNoAccountIdChromeOS) {
133 account_consistency_ = AccountConsistencyMethod::kMirror;
134 CheckMirrorHeaderRequest(GURL("https://docs.google.com"), "",
135 "mode=0,enable_account_consistency=true,"
136 "consistency_enabled_by_default=false");
137 CheckMirrorCookieRequest(GURL("https://docs.google.com"), "",
138 "mode=0:enable_account_consistency=true:"
139 "consistency_enabled_by_default=false");
140 }
141 #else // !defined(OS_CHROMEOS)
142 // Tests that no Mirror request is returned when the user is not signed in (no
143 // account id), for non Chrome OS platforms.
TEST_F(SigninHeaderHelperTest,TestNoMirrorRequestNoAccountId)144 TEST_F(SigninHeaderHelperTest, TestNoMirrorRequestNoAccountId) {
145 account_consistency_ = AccountConsistencyMethod::kMirror;
146 CheckMirrorHeaderRequest(GURL("https://docs.google.com"), "", "");
147 CheckMirrorCookieRequest(GURL("https://docs.google.com"), "", "");
148 }
149 #endif
150
151 // Tests that no Mirror request is returned when the cookies aren't allowed to
152 // be set.
TEST_F(SigninHeaderHelperTest,TestNoMirrorRequestCookieSettingBlocked)153 TEST_F(SigninHeaderHelperTest, TestNoMirrorRequestCookieSettingBlocked) {
154 account_consistency_ = AccountConsistencyMethod::kMirror;
155 cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
156 CheckMirrorHeaderRequest(GURL("https://docs.google.com"), "0123456789", "");
157 CheckMirrorCookieRequest(GURL("https://docs.google.com"), "0123456789", "");
158 }
159
160 // Tests that no Mirror request is returned when the target is a non-Google URL.
TEST_F(SigninHeaderHelperTest,TestNoMirrorRequestExternalURL)161 TEST_F(SigninHeaderHelperTest, TestNoMirrorRequestExternalURL) {
162 account_consistency_ = AccountConsistencyMethod::kMirror;
163 CheckMirrorHeaderRequest(GURL("https://foo.com"), "0123456789", "");
164 CheckMirrorCookieRequest(GURL("https://foo.com"), "0123456789", "");
165 }
166
167 // Tests that the Mirror request is returned without the GAIA Id when the target
168 // is a google TLD domain.
TEST_F(SigninHeaderHelperTest,TestMirrorRequestGoogleTLD)169 TEST_F(SigninHeaderHelperTest, TestMirrorRequestGoogleTLD) {
170 account_consistency_ = AccountConsistencyMethod::kMirror;
171 CheckMirrorHeaderRequest(GURL("https://google.fr"), "0123456789",
172 "mode=0,enable_account_consistency=true,"
173 "consistency_enabled_by_default=false");
174 CheckMirrorCookieRequest(GURL("https://google.de"), "0123456789",
175 "mode=0:enable_account_consistency=true:"
176 "consistency_enabled_by_default=false");
177 }
178
179 // Tests that the Mirror request is returned when the target is the domain
180 // google.com, and that the GAIA Id is only attached for the cookie.
TEST_F(SigninHeaderHelperTest,TestMirrorRequestGoogleCom)181 TEST_F(SigninHeaderHelperTest, TestMirrorRequestGoogleCom) {
182 account_consistency_ = AccountConsistencyMethod::kMirror;
183 CheckMirrorHeaderRequest(GURL("https://www.google.com"), "0123456789",
184 "mode=0,enable_account_consistency=true,"
185 "consistency_enabled_by_default=false");
186 CheckMirrorCookieRequest(
187 GURL("https://www.google.com"), "0123456789",
188 "id=0123456789:mode=0:enable_account_consistency=true:"
189 "consistency_enabled_by_default=false");
190 }
191
192 // Tests that no header sent when mirror account consistency is nor requested.
TEST_F(SigninHeaderHelperTest,TestMirrorRequestGoogleComNoProfileConsistency)193 TEST_F(SigninHeaderHelperTest, TestMirrorRequestGoogleComNoProfileConsistency) {
194 std::unique_ptr<net::URLRequest> url_request =
195 url_request_context_.CreateRequest(GURL("https://www.google.com"),
196 net::DEFAULT_PRIORITY, nullptr,
197 TRAFFIC_ANNOTATION_FOR_TESTS);
198 RequestAdapter request_adapter(url_request.get());
199 AppendOrRemoveMirrorRequestHeader(
200 &request_adapter, GURL(), "0123456789", account_consistency_,
201 cookie_settings_.get(), PROFILE_MODE_DEFAULT);
202 CheckAccountConsistencyHeaderRequest(url_request.get(),
203 kChromeConnectedHeader, "");
204 }
205
206 // Tests that header sent when mirror account consistency is requested.
TEST_F(SigninHeaderHelperTest,TestMirrorRequestGoogleComProfileConsistency)207 TEST_F(SigninHeaderHelperTest, TestMirrorRequestGoogleComProfileConsistency) {
208 account_consistency_ = AccountConsistencyMethod::kMirror;
209 std::unique_ptr<net::URLRequest> url_request =
210 url_request_context_.CreateRequest(GURL("https://www.google.com"),
211 net::DEFAULT_PRIORITY, nullptr,
212 TRAFFIC_ANNOTATION_FOR_TESTS);
213 RequestAdapter request_adapter(url_request.get());
214 AppendOrRemoveMirrorRequestHeader(
215 &request_adapter, GURL(), "0123456789", account_consistency_,
216 cookie_settings_.get(), PROFILE_MODE_DEFAULT);
217 CheckAccountConsistencyHeaderRequest(url_request.get(),
218 kChromeConnectedHeader,
219 "mode=0,enable_account_consistency=true,"
220 "consistency_enabled_by_default=false");
221 }
222
223 // Mirror is always enabled on Android and iOS, so these tests are only relevant
224 // on Desktop.
225 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
226
227 // Tests that the Mirror request is returned when the target is a Gaia URL, even
228 // if account consistency is disabled.
TEST_F(SigninHeaderHelperTest,TestMirrorRequestGaiaURL)229 TEST_F(SigninHeaderHelperTest, TestMirrorRequestGaiaURL) {
230 CheckMirrorHeaderRequest(GURL("https://accounts.google.com"), "0123456789",
231 "mode=0,enable_account_consistency=false,"
232 "consistency_enabled_by_default=false");
233 CheckMirrorCookieRequest(
234 GURL("https://accounts.google.com"), "0123456789",
235 "id=0123456789:mode=0:enable_account_consistency=false:"
236 "consistency_enabled_by_default=false");
237 }
238
239 // Tests Dice requests.
TEST_F(SigninHeaderHelperTest,TestDiceRequest)240 TEST_F(SigninHeaderHelperTest, TestDiceRequest) {
241 account_consistency_ = AccountConsistencyMethod::kDice;
242 // ChromeConnected but no Dice for Docs URLs.
243 CheckDiceHeaderRequest(
244 GURL("https://docs.google.com"), "0123456789",
245 "id=0123456789,mode=0,enable_account_consistency=false,"
246 "consistency_enabled_by_default=false",
247 "");
248
249 // ChromeConnected and Dice for Gaia URLs.
250 // Sync disabled.
251 std::string client_id = GaiaUrls::GetInstance()->oauth2_chrome_client_id();
252 ASSERT_FALSE(client_id.empty());
253 CheckDiceHeaderRequest(
254 GURL("https://accounts.google.com"), "0123456789",
255 "mode=0,enable_account_consistency=false,"
256 "consistency_enabled_by_default=false",
257 base::StringPrintf(
258 "version=%s,client_id=%s,device_id=DeviceID,signin_mode=all_accounts,"
259 "signout_mode=show_confirmation",
260 kDiceProtocolVersion, client_id.c_str()));
261 // Sync enabled: check that the Dice header has the Sync account ID and that
262 // the mirror header is not modified.
263 sync_enabled_ = true;
264 CheckDiceHeaderRequest(
265 GURL("https://accounts.google.com"), "0123456789",
266 "mode=0,enable_account_consistency=false,"
267 "consistency_enabled_by_default=false",
268 base::StringPrintf("version=%s,client_id=%s,device_id=DeviceID,"
269 "sync_account_id=0123456789,signin_mode=all_accounts,"
270 "signout_mode=show_confirmation",
271 kDiceProtocolVersion, client_id.c_str()));
272 sync_enabled_ = false;
273
274 // No ChromeConnected and no Dice for other URLs.
275 CheckDiceHeaderRequest(GURL("https://www.google.com"), "0123456789", "", "");
276 }
277
278 // When cookies are blocked, only the Dice header is sent.
TEST_F(SigninHeaderHelperTest,DiceCookiesBlocked)279 TEST_F(SigninHeaderHelperTest, DiceCookiesBlocked) {
280 account_consistency_ = AccountConsistencyMethod::kDice;
281 cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
282
283 std::string client_id = GaiaUrls::GetInstance()->oauth2_chrome_client_id();
284 ASSERT_FALSE(client_id.empty());
285 CheckDiceHeaderRequest(
286 GURL("https://accounts.google.com"), "0123456789", "",
287 base::StringPrintf(
288 "version=%s,client_id=%s,device_id=DeviceID,signin_mode=all_accounts,"
289 "signout_mode=show_confirmation",
290 kDiceProtocolVersion, client_id.c_str()));
291 }
292
293 // Tests that no Dice request is returned when Dice is not enabled.
TEST_F(SigninHeaderHelperTest,TestNoDiceRequestWhenDisabled)294 TEST_F(SigninHeaderHelperTest, TestNoDiceRequestWhenDisabled) {
295 account_consistency_ = AccountConsistencyMethod::kMirror;
296 CheckDiceHeaderRequest(GURL("https://accounts.google.com"), "0123456789",
297 "mode=0,enable_account_consistency=true,"
298 "consistency_enabled_by_default=false",
299 "");
300 }
301
TEST_F(SigninHeaderHelperTest,TestDiceEmptyDeviceID)302 TEST_F(SigninHeaderHelperTest, TestDiceEmptyDeviceID) {
303 account_consistency_ = AccountConsistencyMethod::kDice;
304 std::string client_id = GaiaUrls::GetInstance()->oauth2_chrome_client_id();
305 ASSERT_FALSE(client_id.empty());
306
307 device_id_.clear();
308
309 CheckDiceHeaderRequest(
310 GURL("https://accounts.google.com"), "0123456789",
311 "mode=0,enable_account_consistency=false,"
312 "consistency_enabled_by_default=false",
313 base::StringPrintf("version=%s,client_id=%s,signin_mode=all_accounts,"
314 "signout_mode=show_confirmation",
315 kDiceProtocolVersion, client_id.c_str()));
316 }
317
318 // Tests that the signout confirmation is requested.
TEST_F(SigninHeaderHelperTest,TestSignoutConfirmation)319 TEST_F(SigninHeaderHelperTest, TestSignoutConfirmation) {
320 account_consistency_ = AccountConsistencyMethod::kDice;
321 std::string client_id = GaiaUrls::GetInstance()->oauth2_chrome_client_id();
322 ASSERT_FALSE(client_id.empty());
323
324 CheckDiceHeaderRequest(
325 GURL("https://accounts.google.com"), "0123456789",
326 "mode=0,enable_account_consistency=false,"
327 "consistency_enabled_by_default=false",
328 base::StringPrintf(
329 "version=%s,client_id=%s,device_id=DeviceID,signin_mode=all_accounts,"
330 "signout_mode=show_confirmation",
331 kDiceProtocolVersion, client_id.c_str()));
332 }
333
334 // Tests that the Mirror request is returned with the GAIA Id on Drive origin,
335 // even if account consistency is disabled.
TEST_F(SigninHeaderHelperTest,TestMirrorRequestDrive)336 TEST_F(SigninHeaderHelperTest, TestMirrorRequestDrive) {
337 CheckMirrorHeaderRequest(
338 GURL("https://docs.google.com/document"), "0123456789",
339 "id=0123456789,mode=0,enable_account_consistency=false,"
340 "consistency_enabled_by_default=false");
341 CheckMirrorCookieRequest(
342 GURL("https://drive.google.com/drive"), "0123456789",
343 "id=0123456789:mode=0:enable_account_consistency=false:"
344 "consistency_enabled_by_default=false");
345
346 // Enable Account Consistency will override the disable.
347 account_consistency_ = AccountConsistencyMethod::kMirror;
348 CheckMirrorHeaderRequest(
349 GURL("https://docs.google.com/document"), "0123456789",
350 "id=0123456789,mode=0,enable_account_consistency=true,"
351 "consistency_enabled_by_default=false");
352 CheckMirrorCookieRequest(
353 GURL("https://drive.google.com/drive"), "0123456789",
354 "id=0123456789:mode=0:enable_account_consistency=true:"
355 "consistency_enabled_by_default=false");
356 }
357
TEST_F(SigninHeaderHelperTest,TestDiceInvalidResponseParams)358 TEST_F(SigninHeaderHelperTest, TestDiceInvalidResponseParams) {
359 DiceResponseParams params = BuildDiceSigninResponseParams("blah");
360 EXPECT_EQ(DiceAction::NONE, params.user_intention);
361 params = BuildDiceSignoutResponseParams("blah");
362 EXPECT_EQ(DiceAction::NONE, params.user_intention);
363 }
364
TEST_F(SigninHeaderHelperTest,TestBuildDiceResponseParams)365 TEST_F(SigninHeaderHelperTest, TestBuildDiceResponseParams) {
366 const char kAuthorizationCode[] = "authorization_code";
367 const char kEmail[] = "foo@example.com";
368 const char kGaiaID[] = "gaia_id";
369 const int kSessionIndex = 42;
370
371 {
372 // Signin response.
373 DiceResponseParams params =
374 BuildDiceSigninResponseParams(base::StringPrintf(
375 "action=SIGNIN,id=%s,email=%s,authuser=%i,authorization_code=%s",
376 kGaiaID, kEmail, kSessionIndex, kAuthorizationCode));
377 EXPECT_EQ(DiceAction::SIGNIN, params.user_intention);
378 ASSERT_TRUE(params.signin_info);
379 EXPECT_EQ(kGaiaID, params.signin_info->account_info.gaia_id);
380 EXPECT_EQ(kEmail, params.signin_info->account_info.email);
381 EXPECT_EQ(kSessionIndex, params.signin_info->account_info.session_index);
382 EXPECT_EQ(kAuthorizationCode, params.signin_info->authorization_code);
383 }
384
385 {
386 // EnableSync response.
387 DiceResponseParams params = BuildDiceSigninResponseParams(
388 base::StringPrintf("action=ENABLE_SYNC,id=%s,email=%s,authuser=%i",
389 kGaiaID, kEmail, kSessionIndex));
390 EXPECT_EQ(DiceAction::ENABLE_SYNC, params.user_intention);
391 ASSERT_TRUE(params.enable_sync_info);
392 EXPECT_EQ(kGaiaID, params.enable_sync_info->account_info.gaia_id);
393 EXPECT_EQ(kEmail, params.enable_sync_info->account_info.email);
394 EXPECT_EQ(kSessionIndex,
395 params.enable_sync_info->account_info.session_index);
396 }
397
398 {
399 // Signout response.
400 // Note: Gaia responses typically have a whitespace after the commas, and
401 // some fields are wrapped in quotes.
402 DiceResponseParams params = BuildDiceSignoutResponseParams(
403 base::StringPrintf("email=\"%s\", sessionindex=%i, obfuscatedid=\"%s\"",
404 kEmail, kSessionIndex, kGaiaID));
405 ASSERT_EQ(DiceAction::SIGNOUT, params.user_intention);
406 ASSERT_TRUE(params.signout_info);
407 EXPECT_EQ(1u, params.signout_info->account_infos.size());
408 EXPECT_EQ(kGaiaID, params.signout_info->account_infos[0].gaia_id);
409 EXPECT_EQ(kEmail, params.signout_info->account_infos[0].email);
410 EXPECT_EQ(kSessionIndex,
411 params.signout_info->account_infos[0].session_index);
412 }
413
414 {
415 // Multi-Signout response.
416 const char kEmail2[] = "bar@example.com";
417 const char kGaiaID2[] = "gaia_id_2";
418 const int kSessionIndex2 = 2;
419 DiceResponseParams params =
420 BuildDiceSignoutResponseParams(base::StringPrintf(
421 "email=\"%s\", sessionindex=%i, obfuscatedid=\"%s\", "
422 "email=\"%s\", sessionindex=%i, obfuscatedid=\"%s\"",
423 kEmail, kSessionIndex, kGaiaID, kEmail2, kSessionIndex2, kGaiaID2));
424 ASSERT_EQ(DiceAction::SIGNOUT, params.user_intention);
425 ASSERT_TRUE(params.signout_info);
426 EXPECT_EQ(2u, params.signout_info->account_infos.size());
427 EXPECT_EQ(kGaiaID, params.signout_info->account_infos[0].gaia_id);
428 EXPECT_EQ(kEmail, params.signout_info->account_infos[0].email);
429 EXPECT_EQ(kSessionIndex,
430 params.signout_info->account_infos[0].session_index);
431 EXPECT_EQ(kGaiaID2, params.signout_info->account_infos[1].gaia_id);
432 EXPECT_EQ(kEmail2, params.signout_info->account_infos[1].email);
433 EXPECT_EQ(kSessionIndex2,
434 params.signout_info->account_infos[1].session_index);
435 }
436
437 {
438 // Missing authorization code.
439 DiceResponseParams params = BuildDiceSigninResponseParams(
440 base::StringPrintf("action=SIGNIN,id=%s,email=%s,authuser=%i", kGaiaID,
441 kEmail, kSessionIndex));
442 EXPECT_EQ(DiceAction::NONE, params.user_intention);
443 }
444
445 {
446 // Missing email in SIGNIN.
447 DiceResponseParams params =
448 BuildDiceSigninResponseParams(base::StringPrintf(
449 "action=SIGNIN,id=%s,authuser=%i,authorization_code=%s", kGaiaID,
450 kSessionIndex, kAuthorizationCode));
451 EXPECT_EQ(DiceAction::NONE, params.user_intention);
452 }
453
454 {
455 // Missing email in signout.
456 DiceResponseParams params = BuildDiceSignoutResponseParams(
457 base::StringPrintf("email=%s, sessionindex=%i, obfuscatedid=%s, "
458 "sessionindex=2, obfuscatedid=bar",
459 kEmail, kSessionIndex, kGaiaID));
460 EXPECT_EQ(DiceAction::NONE, params.user_intention);
461 }
462 }
463
464 #endif // BUILDFLAG(ENABLE_DICE_SUPPORT)
465
466 // Tests that the Mirror header request is returned normally when the redirect
467 // URL is eligible.
TEST_F(SigninHeaderHelperTest,TestMirrorHeaderEligibleRedirectURL)468 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderEligibleRedirectURL) {
469 account_consistency_ = AccountConsistencyMethod::kMirror;
470 const GURL url("https://docs.google.com/document");
471 const GURL redirect_url("https://www.google.com");
472 const std::string account_id = "0123456789";
473 std::unique_ptr<net::URLRequest> url_request =
474 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr,
475 TRAFFIC_ANNOTATION_FOR_TESTS);
476 RequestAdapter request_adapter(url_request.get());
477 AppendOrRemoveMirrorRequestHeader(
478 &request_adapter, redirect_url, account_id, account_consistency_,
479 cookie_settings_.get(), PROFILE_MODE_DEFAULT);
480 EXPECT_TRUE(
481 url_request->extra_request_headers().HasHeader(kChromeConnectedHeader));
482 }
483
484 // Tests that the Mirror header request is stripped when the redirect URL is not
485 // eligible.
TEST_F(SigninHeaderHelperTest,TestMirrorHeaderNonEligibleRedirectURL)486 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderNonEligibleRedirectURL) {
487 account_consistency_ = AccountConsistencyMethod::kMirror;
488 const GURL url("https://docs.google.com/document");
489 const GURL redirect_url("http://www.foo.com");
490 const std::string account_id = "0123456789";
491 std::unique_ptr<net::URLRequest> url_request =
492 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr,
493 TRAFFIC_ANNOTATION_FOR_TESTS);
494 RequestAdapter request_adapter(url_request.get());
495 AppendOrRemoveMirrorRequestHeader(
496 &request_adapter, redirect_url, account_id, account_consistency_,
497 cookie_settings_.get(), PROFILE_MODE_DEFAULT);
498 EXPECT_FALSE(
499 url_request->extra_request_headers().HasHeader(kChromeConnectedHeader));
500 }
501
502 // Tests that the Mirror header, whatever its value is, is untouched when both
503 // the current and the redirect URL are non-eligible.
TEST_F(SigninHeaderHelperTest,TestIgnoreMirrorHeaderNonEligibleURLs)504 TEST_F(SigninHeaderHelperTest, TestIgnoreMirrorHeaderNonEligibleURLs) {
505 account_consistency_ = AccountConsistencyMethod::kMirror;
506 const GURL url("https://www.bar.com");
507 const GURL redirect_url("http://www.foo.com");
508 const std::string account_id = "0123456789";
509 const std::string fake_header = "foo,bar";
510 std::unique_ptr<net::URLRequest> url_request =
511 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr,
512 TRAFFIC_ANNOTATION_FOR_TESTS);
513 url_request->SetExtraRequestHeaderByName(kChromeConnectedHeader, fake_header,
514 false);
515 RequestAdapter request_adapter(url_request.get());
516 AppendOrRemoveMirrorRequestHeader(
517 &request_adapter, redirect_url, account_id, account_consistency_,
518 cookie_settings_.get(), PROFILE_MODE_DEFAULT);
519 std::string header;
520 EXPECT_TRUE(url_request->extra_request_headers().GetHeader(
521 kChromeConnectedHeader, &header));
522 EXPECT_EQ(fake_header, header);
523 }
524
TEST_F(SigninHeaderHelperTest,TestInvalidManageAccountsParams)525 TEST_F(SigninHeaderHelperTest, TestInvalidManageAccountsParams) {
526 ManageAccountsParams params = BuildManageAccountsParams("blah");
527 EXPECT_EQ(GAIA_SERVICE_TYPE_NONE, params.service_type);
528 }
529
TEST_F(SigninHeaderHelperTest,TestBuildManageAccountsParams)530 TEST_F(SigninHeaderHelperTest, TestBuildManageAccountsParams) {
531 const char kContinueURL[] = "https://www.example.com/continue";
532 const char kEmail[] = "foo@example.com";
533
534 ManageAccountsParams params = BuildManageAccountsParams(
535 base::StringPrintf("action=ADDSESSION,email=%s,is_saml=true,is_same_tab="
536 "true,continue_url=%s",
537 kEmail, kContinueURL));
538 EXPECT_EQ(GAIA_SERVICE_TYPE_ADDSESSION, params.service_type);
539 EXPECT_EQ(kEmail, params.email);
540 EXPECT_EQ(true, params.is_saml);
541 EXPECT_EQ(true, params.is_same_tab);
542 EXPECT_EQ(GURL(kContinueURL), params.continue_url);
543 }
544
545 } // namespace signin
546