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