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 #include "base/prefs/pref_service.h"
6 #include "base/prefs/scoped_user_pref_update.h"
7 #include "base/run_loop.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/values.h"
10 #include "chrome/browser/chrome_notification_types.h"
11 #include "chrome/browser/content_settings/cookie_settings.h"
12 #include "chrome/browser/custom_handlers/protocol_handler_registry.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/profiles/profile_info_cache.h"
15 #include "chrome/browser/profiles/profile_io_data.h"
16 #include "chrome/browser/profiles/profile_manager.h"
17 #include "chrome/browser/signin/chrome_signin_client.h"
18 #include "chrome/browser/signin/chrome_signin_client_factory.h"
19 #include "chrome/browser/signin/fake_profile_oauth2_token_service.h"
20 #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h"
21 #include "chrome/browser/signin/fake_signin_manager.h"
22 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
23 #include "chrome/browser/signin/signin_manager_factory.h"
24 #include "chrome/browser/signin/signin_names_io_thread.h"
25 #include "chrome/browser/signin/signin_promo.h"
26 #include "chrome/browser/sync/profile_sync_service_factory.h"
27 #include "chrome/browser/sync/test_profile_sync_service.h"
28 #include "chrome/browser/ui/sync/one_click_signin_helper.h"
29 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
30 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
31 #include "chrome/common/pref_names.h"
32 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
33 #include "chrome/test/base/testing_browser_process.h"
34 #include "chrome/test/base/testing_pref_service_syncable.h"
35 #include "chrome/test/base/testing_profile.h"
36 #include "chrome/test/base/testing_profile_manager.h"
37 #include "components/autofill/core/common/password_form.h"
38 #include "components/signin/core/browser/profile_oauth2_token_service.h"
39 #include "components/signin/core/browser/signin_manager.h"
40 #include "components/sync_driver/pref_names.h"
41 #include "content/public/browser/browser_context.h"
42 #include "content/public/browser/navigation_details.h"
43 #include "content/public/browser/navigation_entry.h"
44 #include "content/public/browser/web_contents.h"
45 #include "content/public/browser/web_contents_delegate.h"
46 #include "content/public/common/frame_navigate_params.h"
47 #include "content/public/common/url_constants.h"
48 #include "content/public/test/mock_render_process_host.h"
49 #include "grit/chromium_strings.h"
50 #include "grit/generated_resources.h"
51 #include "testing/gmock/include/gmock/gmock.h"
52 #include "testing/gtest/include/gtest/gtest.h"
53 #include "ui/base/l10n/l10n_util.h"
54
55 using ::testing::_;
56 using ::testing::AtLeast;
57 using ::testing::Return;
58
59 namespace {
60
61 // Used to confirm OneClickSigninHelper does not trigger redirect when there is
62 // a pending navigation.
63 class MockWebContentsDelegate : public content::WebContentsDelegate {
64 public:
65 MOCK_METHOD2(OpenURLFromTab,
66 content::WebContents*(content::WebContents* source,
67 const content::OpenURLParams& params));
68 };
69
70 class SigninManagerMock : public FakeSigninManager {
71 public:
SigninManagerMock(Profile * profile)72 explicit SigninManagerMock(Profile* profile) : FakeSigninManager(profile) {
73 Initialize(NULL);
74 }
75 MOCK_CONST_METHOD1(IsAllowedUsername, bool(const std::string& username));
76 };
77
BuildSigninManagerMock(content::BrowserContext * profile)78 static KeyedService* BuildSigninManagerMock(content::BrowserContext* profile) {
79 return new SigninManagerMock(static_cast<Profile*>(profile));
80 }
81
82 class TestProfileIOData : public ProfileIOData {
83 public:
TestProfileIOData(Profile::ProfileType profile_type,PrefService * pref_service,PrefService * local_state,CookieSettings * cookie_settings)84 TestProfileIOData(Profile::ProfileType profile_type,
85 PrefService* pref_service, PrefService* local_state,
86 CookieSettings* cookie_settings)
87 : ProfileIOData(profile_type) {
88 // Initialize the IO members required for these tests, but keep them on
89 // this thread since we don't use a background thread here.
90 google_services_username()->Init(prefs::kGoogleServicesUsername,
91 pref_service);
92 reverse_autologin_enabled()->Init(prefs::kReverseAutologinEnabled,
93 pref_service);
94 one_click_signin_rejected_email_list()->Init(
95 prefs::kReverseAutologinRejectedEmailList, pref_service);
96
97 google_services_username_pattern()->Init(
98 prefs::kGoogleServicesUsernamePattern, local_state);
99
100 sync_disabled()->Init(sync_driver::prefs::kSyncManaged, pref_service);
101
102 signin_allowed()->Init(prefs::kSigninAllowed, pref_service);
103
104 set_signin_names_for_testing(new SigninNamesOnIOThread());
105 SetCookieSettingsForTesting(cookie_settings);
106 }
107
~TestProfileIOData()108 virtual ~TestProfileIOData() {
109 signin_names()->ReleaseResourcesOnUIThread();
110 }
111
112 // ProfileIOData overrides:
InitializeInternal(ProfileParams * profile_params,content::ProtocolHandlerMap * protocol_handlers,content::URLRequestInterceptorScopedVector request_interceptors) const113 virtual void InitializeInternal(
114 ProfileParams* profile_params,
115 content::ProtocolHandlerMap* protocol_handlers,
116 content::URLRequestInterceptorScopedVector request_interceptors)
117 const OVERRIDE {
118 NOTREACHED();
119 }
InitializeExtensionsRequestContext(ProfileParams * profile_params) const120 virtual void InitializeExtensionsRequestContext(
121 ProfileParams* profile_params) const OVERRIDE {
122 NOTREACHED();
123 }
InitializeAppRequestContext(ChromeURLRequestContext * main_context,const StoragePartitionDescriptor & details,scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> protocol_handler_interceptor,content::ProtocolHandlerMap * protocol_handlers,content::URLRequestInterceptorScopedVector request_interceptors) const124 virtual ChromeURLRequestContext* InitializeAppRequestContext(
125 ChromeURLRequestContext* main_context,
126 const StoragePartitionDescriptor& details,
127 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
128 protocol_handler_interceptor,
129 content::ProtocolHandlerMap* protocol_handlers,
130 content::URLRequestInterceptorScopedVector request_interceptors)
131 const OVERRIDE {
132 NOTREACHED();
133 return NULL;
134 }
InitializeMediaRequestContext(ChromeURLRequestContext * original_context,const StoragePartitionDescriptor & details) const135 virtual ChromeURLRequestContext* InitializeMediaRequestContext(
136 ChromeURLRequestContext* original_context,
137 const StoragePartitionDescriptor& details) const OVERRIDE {
138 NOTREACHED();
139 return NULL;
140 }
141 virtual ChromeURLRequestContext*
AcquireMediaRequestContext() const142 AcquireMediaRequestContext() const OVERRIDE {
143 NOTREACHED();
144 return NULL;
145 }
AcquireIsolatedAppRequestContext(ChromeURLRequestContext * main_context,const StoragePartitionDescriptor & partition_descriptor,scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory> protocol_handler_interceptor,content::ProtocolHandlerMap * protocol_handlers,content::URLRequestInterceptorScopedVector request_interceptors) const146 virtual ChromeURLRequestContext* AcquireIsolatedAppRequestContext(
147 ChromeURLRequestContext* main_context,
148 const StoragePartitionDescriptor& partition_descriptor,
149 scoped_ptr<ProtocolHandlerRegistry::JobInterceptorFactory>
150 protocol_handler_interceptor,
151 content::ProtocolHandlerMap* protocol_handlers,
152 content::URLRequestInterceptorScopedVector request_interceptors)
153 const OVERRIDE {
154 NOTREACHED();
155 return NULL;
156 }
157 virtual ChromeURLRequestContext*
AcquireIsolatedMediaRequestContext(ChromeURLRequestContext * app_context,const StoragePartitionDescriptor & partition_descriptor) const158 AcquireIsolatedMediaRequestContext(
159 ChromeURLRequestContext* app_context,
160 const StoragePartitionDescriptor& partition_descriptor)
161 const OVERRIDE {
162 NOTREACHED();
163 return NULL;
164 }
165 };
166
167 class TestURLRequest : public base::SupportsUserData {
168 public:
TestURLRequest()169 TestURLRequest() {}
~TestURLRequest()170 virtual ~TestURLRequest() {}
171 };
172
173 class OneClickTestProfileSyncService : public TestProfileSyncService {
174 public:
~OneClickTestProfileSyncService()175 virtual ~OneClickTestProfileSyncService() {}
176
177 // Helper routine to be used in conjunction with
178 // BrowserContextKeyedServiceFactory::SetTestingFactory().
Build(content::BrowserContext * profile)179 static KeyedService* Build(content::BrowserContext* profile) {
180 return new OneClickTestProfileSyncService(static_cast<Profile*>(profile));
181 }
182
183 // Need to control this for certain tests.
FirstSetupInProgress() const184 virtual bool FirstSetupInProgress() const OVERRIDE {
185 return first_setup_in_progress_;
186 }
187
sync_initialized() const188 virtual bool sync_initialized() const OVERRIDE { return sync_initialized_; }
189
190 // Controls return value of FirstSetupInProgress. Because some bits
191 // of UI depend on that value, it's useful to control it separately
192 // from the internal work and components that are triggered (such as
193 // ReconfigureDataTypeManager) to facilitate unit tests.
set_first_setup_in_progress(bool in_progress)194 void set_first_setup_in_progress(bool in_progress) {
195 first_setup_in_progress_ = in_progress;
196 }
197
set_sync_initialized(bool initialized)198 void set_sync_initialized(bool initialized) {
199 sync_initialized_ = initialized;
200 }
201
202 private:
OneClickTestProfileSyncService(Profile * profile)203 explicit OneClickTestProfileSyncService(Profile* profile)
204 : TestProfileSyncService(
205 NULL,
206 profile,
207 SigninManagerFactory::GetForProfile(profile),
208 ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
209 browser_sync::MANUAL_START),
210 first_setup_in_progress_(false),
211 sync_initialized_(false) {}
212
213 bool first_setup_in_progress_;
214 bool sync_initialized_;
215 };
216
217 } // namespace
218
219 class OneClickSigninHelperTest : public ChromeRenderViewHostTestHarness {
220 public:
221 OneClickSigninHelperTest();
222
223 virtual void SetUp() OVERRIDE;
224 virtual void TearDown() OVERRIDE;
225
226 // Sets up the sign-in manager for tests. If |username| is
227 // is not empty, the profile of the mock WebContents will be connected to
228 // the given account.
229 void SetUpSigninManager(const std::string& username);
230
231 // Set the ID of the signin process that the test will assume to be the
232 // only process allowed to sign the user in to Chrome.
233 void SetTrustedSigninProcessID(int id);
234
235 void AddEmailToOneClickRejectedList(const std::string& email);
236 void EnableOneClick(bool enable);
237 void AllowSigninCookies(bool enable);
238 void SetAllowedUsernamePattern(const std::string& pattern);
239 void SubmitGAIAPassword(OneClickSigninHelper* helper);
240
241 SigninManagerMock* signin_manager_;
242 FakeProfileOAuth2TokenService* fake_oauth2_token_service_;
243
244 protected:
245 GoogleServiceAuthError no_error_;
246
247 private:
248 // ChromeRenderViewHostTestHarness overrides:
249 virtual content::BrowserContext* CreateBrowserContext() OVERRIDE;
250
251 // The ID of the signin process the test will assume to be trusted.
252 // By default, set to the test RenderProcessHost's process ID, but
253 // overridden by SetTrustedSigninProcessID.
254 int trusted_signin_process_id_;
255
256 DISALLOW_COPY_AND_ASSIGN(OneClickSigninHelperTest);
257 };
258
OneClickSigninHelperTest()259 OneClickSigninHelperTest::OneClickSigninHelperTest()
260 : signin_manager_(NULL),
261 fake_oauth2_token_service_(NULL),
262 no_error_(GoogleServiceAuthError::NONE),
263 trusted_signin_process_id_(-1) {
264 }
265
SetUp()266 void OneClickSigninHelperTest::SetUp() {
267 signin::ForceWebBasedSigninFlowForTesting(true);
268 content::RenderViewHostTestHarness::SetUp();
269 SetTrustedSigninProcessID(process()->GetID());
270 }
271
TearDown()272 void OneClickSigninHelperTest::TearDown() {
273 signin::ForceWebBasedSigninFlowForTesting(false);
274 content::RenderViewHostTestHarness::TearDown();
275 }
276
SetTrustedSigninProcessID(int id)277 void OneClickSigninHelperTest::SetTrustedSigninProcessID(int id) {
278 trusted_signin_process_id_ = id;
279 }
280
SetUpSigninManager(const std::string & username)281 void OneClickSigninHelperTest::SetUpSigninManager(const std::string& username) {
282 SigninClient* signin_client =
283 ChromeSigninClientFactory::GetForProfile(profile());
284 if (signin_client)
285 signin_client->SetSigninProcess(trusted_signin_process_id_);
286
287 signin_manager_ = static_cast<SigninManagerMock*>(
288 SigninManagerFactory::GetForProfile(profile()));
289 if (!username.empty()) {
290 ASSERT_TRUE(signin_manager_);
291 signin_manager_->SetAuthenticatedUsername(username);
292 }
293 }
294
EnableOneClick(bool enable)295 void OneClickSigninHelperTest::EnableOneClick(bool enable) {
296 PrefService* pref_service = profile()->GetPrefs();
297 pref_service->SetBoolean(prefs::kReverseAutologinEnabled, enable);
298 }
299
AddEmailToOneClickRejectedList(const std::string & email)300 void OneClickSigninHelperTest::AddEmailToOneClickRejectedList(
301 const std::string& email) {
302 PrefService* pref_service = profile()->GetPrefs();
303 ListPrefUpdate updater(pref_service,
304 prefs::kReverseAutologinRejectedEmailList);
305 updater->AppendIfNotPresent(new base::StringValue(email));
306 }
307
AllowSigninCookies(bool enable)308 void OneClickSigninHelperTest::AllowSigninCookies(bool enable) {
309 CookieSettings* cookie_settings =
310 CookieSettings::Factory::GetForProfile(profile()).get();
311 cookie_settings->SetDefaultCookieSetting(enable ? CONTENT_SETTING_ALLOW
312 : CONTENT_SETTING_BLOCK);
313 }
314
SetAllowedUsernamePattern(const std::string & pattern)315 void OneClickSigninHelperTest::SetAllowedUsernamePattern(
316 const std::string& pattern) {
317 PrefService* local_state = g_browser_process->local_state();
318 local_state->SetString(prefs::kGoogleServicesUsernamePattern, pattern);
319 }
320
SubmitGAIAPassword(OneClickSigninHelper * helper)321 void OneClickSigninHelperTest::SubmitGAIAPassword(
322 OneClickSigninHelper* helper) {
323 autofill::PasswordForm password_form;
324 password_form.origin = GURL("https://accounts.google.com");
325 password_form.signon_realm = "https://accounts.google.com";
326 password_form.password_value = base::UTF8ToUTF16("password");
327 helper->PasswordSubmitted(password_form);
328 }
329
CreateBrowserContext()330 content::BrowserContext* OneClickSigninHelperTest::CreateBrowserContext() {
331 TestingProfile::Builder builder;
332 builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(),
333 BuildFakeProfileOAuth2TokenService);
334 builder.AddTestingFactory(SigninManagerFactory::GetInstance(),
335 BuildSigninManagerMock);
336 scoped_ptr<TestingProfile> profile = builder.Build();
337
338 fake_oauth2_token_service_ =
339 static_cast<FakeProfileOAuth2TokenService*>(
340 ProfileOAuth2TokenServiceFactory::GetForProfile(profile.get()));
341
342 return profile.release();
343 }
344
345 class OneClickSigninHelperIOTest : public OneClickSigninHelperTest {
346 public:
347 OneClickSigninHelperIOTest();
348
349 virtual void SetUp() OVERRIDE;
350
351 TestProfileIOData* CreateTestProfileIOData(Profile::ProfileType profile_type);
352
353 protected:
354 TestingProfileManager testing_profile_manager_;
355 TestURLRequest request_;
356 const GURL valid_gaia_url_;
357
358 private:
359 DISALLOW_COPY_AND_ASSIGN(OneClickSigninHelperIOTest);
360 };
361
OneClickSigninHelperIOTest()362 OneClickSigninHelperIOTest::OneClickSigninHelperIOTest()
363 : testing_profile_manager_(
364 TestingBrowserProcess::GetGlobal()),
365 valid_gaia_url_("https://accounts.google.com/") {
366 }
367
SetUp()368 void OneClickSigninHelperIOTest::SetUp() {
369 OneClickSigninHelperTest::SetUp();
370 ASSERT_TRUE(testing_profile_manager_.SetUp());
371 }
372
CreateTestProfileIOData(Profile::ProfileType profile_type)373 TestProfileIOData* OneClickSigninHelperIOTest::CreateTestProfileIOData(
374 Profile::ProfileType profile_type) {
375 PrefService* pref_service = profile()->GetPrefs();
376 PrefService* local_state = g_browser_process->local_state();
377 CookieSettings* cookie_settings =
378 CookieSettings::Factory::GetForProfile(profile()).get();
379 TestProfileIOData* io_data = new TestProfileIOData(
380 profile_type, pref_service, local_state, cookie_settings);
381 io_data->set_reverse_autologin_pending_email("user@gmail.com");
382 return io_data;
383 }
384
385 class OneClickSigninHelperIncognitoTest : public OneClickSigninHelperTest {
386 protected:
387 // content::RenderViewHostTestHarness.
388 virtual content::BrowserContext* CreateBrowserContext() OVERRIDE;
389 };
390
391 content::BrowserContext*
CreateBrowserContext()392 OneClickSigninHelperIncognitoTest::CreateBrowserContext() {
393 // Builds an incognito profile to run this test.
394 TestingProfile::Builder builder;
395 builder.SetIncognito();
396 return builder.Build().release();
397 }
398
TEST_F(OneClickSigninHelperTest,CanOfferNoContents)399 TEST_F(OneClickSigninHelperTest, CanOfferNoContents) {
400 std::string error_message;
401 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
402 NULL, OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
403 "user@gmail.com", &error_message));
404 EXPECT_EQ("", error_message);
405 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
406 NULL, OneClickSigninHelper::CAN_OFFER_FOR_ALL,
407 "user@gmail.com", &error_message));
408 EXPECT_EQ("", error_message);
409 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
410 NULL,
411 OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
412 std::string(),
413 &error_message));
414 EXPECT_EQ("", error_message);
415 }
416
TEST_F(OneClickSigninHelperTest,CanOffer)417 TEST_F(OneClickSigninHelperTest, CanOffer) {
418 SetUpSigninManager(std::string());
419
420 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_)).
421 WillRepeatedly(Return(true));
422
423 EnableOneClick(true);
424 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
425 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
426 "user@gmail.com", NULL));
427 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
428 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
429 "user@gmail.com", NULL));
430 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
431 web_contents(),
432 OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
433 std::string(),
434 NULL));
435
436 EnableOneClick(false);
437
438 std::string error_message;
439 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
440 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
441 "user@gmail.com", &error_message));
442 EXPECT_EQ("", error_message);
443
444 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
445 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
446 "user@gmail.com", &error_message));
447 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
448 web_contents(),
449 OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
450 std::string(),
451 &error_message));
452 EXPECT_EQ("", error_message);
453 }
454
TEST_F(OneClickSigninHelperTest,CanOfferFirstSetup)455 TEST_F(OneClickSigninHelperTest, CanOfferFirstSetup) {
456 SetUpSigninManager(std::string());
457
458 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_)).
459 WillRepeatedly(Return(true));
460
461 // Invoke OneClickTestProfileSyncService factory function and grab result.
462 OneClickTestProfileSyncService* sync =
463 static_cast<OneClickTestProfileSyncService*>(
464 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
465 profile(), OneClickTestProfileSyncService::Build));
466 sync->set_sync_initialized(false);
467 sync->Initialize();
468 sync->set_sync_initialized(true);
469 sync->set_first_setup_in_progress(true);
470
471 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
472 web_contents(),
473 OneClickSigninHelper::CAN_OFFER_FOR_ALL,
474 "foo@gmail.com", NULL));
475 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
476 web_contents(),
477 OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
478 "foo@gmail.com", NULL));
479 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
480 web_contents(),
481 OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
482 std::string(),
483 NULL));
484 }
485
TEST_F(OneClickSigninHelperTest,CanOfferProfileConnected)486 TEST_F(OneClickSigninHelperTest, CanOfferProfileConnected) {
487 SetUpSigninManager("foo@gmail.com");
488
489 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_)).
490 WillRepeatedly(Return(true));
491
492 std::string error_message;
493 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
494 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
495 "foo@gmail.com", &error_message));
496 EXPECT_EQ("", error_message);
497 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
498 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
499 "foo", &error_message));
500 EXPECT_EQ("", error_message);
501 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
502 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
503 "user@gmail.com", &error_message));
504 EXPECT_EQ(l10n_util::GetStringFUTF8(IDS_SYNC_WRONG_EMAIL,
505 base::UTF8ToUTF16("foo@gmail.com")),
506 error_message);
507 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
508 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
509 "foo@gmail.com", &error_message));
510 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
511 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
512 "foo", &error_message));
513 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
514 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
515 "user@gmail.com", &error_message));
516 EXPECT_EQ(l10n_util::GetStringFUTF8(IDS_SYNC_WRONG_EMAIL,
517 base::UTF8ToUTF16("foo@gmail.com")),
518 error_message);
519 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
520 web_contents(),
521 OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
522 std::string(),
523 &error_message));
524 }
525
TEST_F(OneClickSigninHelperTest,CanOfferUsernameNotAllowed)526 TEST_F(OneClickSigninHelperTest, CanOfferUsernameNotAllowed) {
527 SetUpSigninManager(std::string());
528
529 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_)).
530 WillRepeatedly(Return(false));
531
532 std::string error_message;
533 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
534 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
535 "foo@gmail.com", &error_message));
536 EXPECT_EQ(l10n_util::GetStringUTF8(IDS_SYNC_LOGIN_NAME_PROHIBITED),
537 error_message);
538 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
539 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
540 "foo@gmail.com", &error_message));
541 EXPECT_EQ(l10n_util::GetStringUTF8(IDS_SYNC_LOGIN_NAME_PROHIBITED),
542 error_message);
543 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
544 web_contents(),
545 OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
546 std::string(),
547 &error_message));
548 }
549
TEST_F(OneClickSigninHelperTest,CanOfferWithRejectedEmail)550 TEST_F(OneClickSigninHelperTest, CanOfferWithRejectedEmail) {
551 SetUpSigninManager(std::string());
552
553 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_)).
554 WillRepeatedly(Return(true));
555
556 AddEmailToOneClickRejectedList("foo@gmail.com");
557 AddEmailToOneClickRejectedList("user@gmail.com");
558
559 std::string error_message;
560 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
561 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
562 "foo@gmail.com", &error_message));
563 EXPECT_EQ("", error_message);
564 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
565 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
566 "user@gmail.com", &error_message));
567 EXPECT_EQ("", error_message);
568 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
569 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
570 "foo@gmail.com", &error_message));
571 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
572 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
573 "user@gmail.com", &error_message));
574 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
575 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
576 "john@gmail.com", &error_message));
577 }
578
TEST_F(OneClickSigninHelperIncognitoTest,CanOfferIncognito)579 TEST_F(OneClickSigninHelperIncognitoTest, CanOfferIncognito) {
580 SetUpSigninManager(std::string());
581
582 std::string error_message;
583 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
584 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
585 "user@gmail.com", &error_message));
586 EXPECT_EQ("", error_message);
587 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
588 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
589 "user@gmail.com", &error_message));
590 EXPECT_EQ("", error_message);
591 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
592 web_contents(),
593 OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
594 std::string(),
595 &error_message));
596 EXPECT_EQ("", error_message);
597 }
598
TEST_F(OneClickSigninHelperTest,CanOfferNoSigninCookies)599 TEST_F(OneClickSigninHelperTest, CanOfferNoSigninCookies) {
600 SetUpSigninManager(std::string());
601 AllowSigninCookies(false);
602
603 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_)).
604 WillRepeatedly(Return(true));
605
606 std::string error_message;
607 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
608 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
609 "user@gmail.com", &error_message));
610 EXPECT_EQ("", error_message);
611 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
612 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
613 "user@gmail.com", &error_message));
614 EXPECT_EQ("", error_message);
615 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
616 web_contents(),
617 OneClickSigninHelper::CAN_OFFER_FOR_INTERSTITAL_ONLY,
618 std::string(),
619 &error_message));
620 EXPECT_EQ("", error_message);
621 }
622
TEST_F(OneClickSigninHelperTest,CanOfferDisabledByPolicy)623 TEST_F(OneClickSigninHelperTest, CanOfferDisabledByPolicy) {
624 SetUpSigninManager(std::string());
625
626 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_)).
627 WillRepeatedly(Return(true));
628
629 EnableOneClick(true);
630 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
631 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
632 "user@gmail.com", NULL));
633
634 // Simulate a policy disabling signin by writing kSigninAllowed directly.
635 profile()->GetTestingPrefService()->SetManagedPref(
636 prefs::kSigninAllowed, base::Value::CreateBooleanValue(false));
637
638 EXPECT_FALSE(OneClickSigninHelper::CanOffer(
639 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
640 "user@gmail.com", NULL));
641
642 // Reset the preference value to true.
643 profile()->GetTestingPrefService()->SetManagedPref(
644 prefs::kSigninAllowed, base::Value::CreateBooleanValue(true));
645
646 // Simulate a policy disabling sync by writing kSyncManaged directly.
647 profile()->GetTestingPrefService()->SetManagedPref(
648 sync_driver::prefs::kSyncManaged, base::Value::CreateBooleanValue(true));
649
650 // Should still offer even if sync is disabled by policy.
651 EXPECT_TRUE(OneClickSigninHelper::CanOffer(
652 web_contents(), OneClickSigninHelper::CAN_OFFER_FOR_ALL,
653 "user@gmail.com", NULL));
654 }
655
656 // Should not crash if a helper instance is not associated with an incognito
657 // web contents.
TEST_F(OneClickSigninHelperIncognitoTest,ShowInfoBarUIThreadIncognito)658 TEST_F(OneClickSigninHelperIncognitoTest, ShowInfoBarUIThreadIncognito) {
659 SetUpSigninManager(std::string());
660 OneClickSigninHelper* helper =
661 OneClickSigninHelper::FromWebContents(web_contents());
662 EXPECT_EQ(NULL, helper);
663
664 OneClickSigninHelper::ShowInfoBarUIThread(
665 "session_index", "email", OneClickSigninHelper::AUTO_ACCEPT_ACCEPTED,
666 signin::SOURCE_UNKNOWN, GURL(), process()->GetID(),
667 rvh()->GetRoutingID());
668 }
669
670 // If Chrome signin is triggered from a webstore install, and user chooses to
671 // config sync, then Chrome should redirect immediately to sync settings page,
672 // and upon successful setup, redirect back to webstore.
TEST_F(OneClickSigninHelperTest,SigninFromWebstoreWithConfigSyncfirst)673 TEST_F(OneClickSigninHelperTest, SigninFromWebstoreWithConfigSyncfirst) {
674 SetUpSigninManager(std::string());
675 EXPECT_CALL(*signin_manager_, IsAllowedUsername(_))
676 .WillRepeatedly(Return(true));
677
678 OneClickTestProfileSyncService* sync_service =
679 static_cast<OneClickTestProfileSyncService*>(
680 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
681 profile(), OneClickTestProfileSyncService::Build));
682 sync_service->set_sync_initialized(true);
683
684 content::WebContents* contents = web_contents();
685
686 OneClickSigninHelper::CreateForWebContentsWithPasswordManager(contents, NULL);
687 OneClickSigninHelper* helper =
688 OneClickSigninHelper::FromWebContents(contents);
689 helper->SetDoNotClearPendingEmailForTesting();
690 helper->set_do_not_start_sync_for_testing();
691
692 GURL continueUrl("https://chrome.google.com/webstore?source=5");
693 OneClickSigninHelper::ShowInfoBarUIThread(
694 "session_index", "user@gmail.com",
695 OneClickSigninHelper::AUTO_ACCEPT_EXPLICIT,
696 signin::SOURCE_WEBSTORE_INSTALL,
697 continueUrl, process()->GetID(), rvh()->GetRoutingID());
698
699 SubmitGAIAPassword(helper);
700
701 NavigateAndCommit(GURL("https://chrome.google.com/webstore?source=3"));
702 helper->DidStopLoading(rvh());
703 sync_service->NotifyObservers();
704 EXPECT_EQ(GURL(continueUrl), contents->GetVisibleURL());
705 }
706
707 // Checks that the state of OneClickSigninHelper is cleaned when there is a
708 // navigation away from the sign in flow that is not triggered by the
709 // web contents.
TEST_F(OneClickSigninHelperTest,CleanTransientStateOnNavigate)710 TEST_F(OneClickSigninHelperTest, CleanTransientStateOnNavigate) {
711 content::WebContents* contents = web_contents();
712
713 OneClickSigninHelper::CreateForWebContentsWithPasswordManager(contents, NULL);
714 OneClickSigninHelper* helper =
715 OneClickSigninHelper::FromWebContents(contents);
716 helper->SetDoNotClearPendingEmailForTesting();
717 helper->auto_accept_ = OneClickSigninHelper::AUTO_ACCEPT_EXPLICIT;
718
719 content::LoadCommittedDetails details;
720 content::FrameNavigateParams params;
721 params.url = GURL("http://crbug.com");
722 params.transition = content::PAGE_TRANSITION_TYPED;
723 helper->DidNavigateMainFrame(details, params);
724
725 EXPECT_EQ(OneClickSigninHelper::AUTO_ACCEPT_NONE, helper->auto_accept_);
726 }
727
TEST_F(OneClickSigninHelperTest,NoRedirectToNTPWithPendingEntry)728 TEST_F(OneClickSigninHelperTest, NoRedirectToNTPWithPendingEntry) {
729 content::NavigationController& controller = web_contents()->GetController();
730 EXPECT_FALSE(controller.GetPendingEntry());
731
732 const GURL fooWebUIURL("chrome://foo");
733 controller.LoadURL(fooWebUIURL, content::Referrer(),
734 content::PAGE_TRANSITION_TYPED, std::string());
735 EXPECT_EQ(fooWebUIURL, controller.GetPendingEntry()->GetURL());
736
737 MockWebContentsDelegate delegate;
738 EXPECT_CALL(delegate, OpenURLFromTab(_, _)).Times(0);
739 web_contents()->SetDelegate(&delegate);
740 OneClickSigninHelper::RedirectToNtpOrAppsPage(
741 web_contents(), signin::SOURCE_UNKNOWN);
742
743 EXPECT_EQ(fooWebUIURL, controller.GetPendingEntry()->GetURL());
744 }
745
746 // I/O thread tests
747
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThread)748 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThread) {
749 scoped_ptr<TestProfileIOData> io_data(
750 CreateTestProfileIOData(Profile::REGULAR_PROFILE));
751 EXPECT_EQ(OneClickSigninHelper::CAN_OFFER,
752 OneClickSigninHelper::CanOfferOnIOThreadImpl(
753 valid_gaia_url_, &request_, io_data.get()));
754 }
755
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadIncognito)756 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadIncognito) {
757 scoped_ptr<TestProfileIOData> io_data(
758 CreateTestProfileIOData(Profile::INCOGNITO_PROFILE));
759 EXPECT_EQ(OneClickSigninHelper::DONT_OFFER,
760 OneClickSigninHelper::CanOfferOnIOThreadImpl(
761 valid_gaia_url_, &request_, io_data.get()));
762 }
763
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadNoIOData)764 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadNoIOData) {
765 EXPECT_EQ(OneClickSigninHelper::DONT_OFFER,
766 OneClickSigninHelper::CanOfferOnIOThreadImpl(
767 valid_gaia_url_, &request_, NULL));
768 }
769
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadBadURL)770 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadBadURL) {
771 scoped_ptr<TestProfileIOData> io_data(
772 CreateTestProfileIOData(Profile::REGULAR_PROFILE));
773 EXPECT_EQ(
774 OneClickSigninHelper::IGNORE_REQUEST,
775 OneClickSigninHelper::CanOfferOnIOThreadImpl(
776 GURL("https://foo.com/"), &request_, io_data.get()));
777 EXPECT_EQ(OneClickSigninHelper::IGNORE_REQUEST,
778 OneClickSigninHelper::CanOfferOnIOThreadImpl(
779 GURL("http://accounts.google.com/"),
780 &request_,
781 io_data.get()));
782 }
783
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadDisabled)784 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadDisabled) {
785 EnableOneClick(false);
786 scoped_ptr<TestProfileIOData> io_data(
787 CreateTestProfileIOData(Profile::REGULAR_PROFILE));
788 EXPECT_EQ(OneClickSigninHelper::DONT_OFFER,
789 OneClickSigninHelper::CanOfferOnIOThreadImpl(
790 valid_gaia_url_, &request_, io_data.get()));
791 }
792
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadSignedIn)793 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadSignedIn) {
794 PrefService* pref_service = profile()->GetPrefs();
795 pref_service->SetString(prefs::kGoogleServicesUsername, "user@gmail.com");
796
797 scoped_ptr<TestProfileIOData> io_data(
798 CreateTestProfileIOData(Profile::REGULAR_PROFILE));
799 EXPECT_EQ(OneClickSigninHelper::DONT_OFFER,
800 OneClickSigninHelper::CanOfferOnIOThreadImpl(
801 valid_gaia_url_, &request_, io_data.get()));
802 }
803
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadEmailNotAllowed)804 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadEmailNotAllowed) {
805 SetAllowedUsernamePattern("*@example.com");
806 scoped_ptr<TestProfileIOData> io_data(
807 CreateTestProfileIOData(Profile::REGULAR_PROFILE));
808 EXPECT_EQ(OneClickSigninHelper::DONT_OFFER,
809 OneClickSigninHelper::CanOfferOnIOThreadImpl(
810 valid_gaia_url_, &request_, io_data.get()));
811 }
812
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadEmailAlreadyUsed)813 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadEmailAlreadyUsed) {
814 ProfileInfoCache* cache = testing_profile_manager_.profile_info_cache();
815 const base::FilePath& user_data_dir = cache->GetUserDataDir();
816 cache->AddProfileToCache(user_data_dir.Append(FILE_PATH_LITERAL("user")),
817 base::UTF8ToUTF16("user"),
818 base::UTF8ToUTF16("user@gmail.com"), 0,
819 std::string());
820
821 scoped_ptr<TestProfileIOData> io_data(
822 CreateTestProfileIOData(Profile::REGULAR_PROFILE));
823 EXPECT_EQ(OneClickSigninHelper::DONT_OFFER,
824 OneClickSigninHelper::CanOfferOnIOThreadImpl(
825 valid_gaia_url_, &request_, io_data.get()));
826 }
827
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadWithRejectedEmail)828 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadWithRejectedEmail) {
829 AddEmailToOneClickRejectedList("user@gmail.com");
830 scoped_ptr<TestProfileIOData> io_data(
831 CreateTestProfileIOData(Profile::REGULAR_PROFILE));
832 EXPECT_EQ(OneClickSigninHelper::DONT_OFFER,
833 OneClickSigninHelper::CanOfferOnIOThreadImpl(
834 valid_gaia_url_, &request_, io_data.get()));
835 }
836
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadNoSigninCookies)837 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadNoSigninCookies) {
838 AllowSigninCookies(false);
839 scoped_ptr<TestProfileIOData> io_data(
840 CreateTestProfileIOData(Profile::REGULAR_PROFILE));
841 EXPECT_EQ(OneClickSigninHelper::DONT_OFFER,
842 OneClickSigninHelper::CanOfferOnIOThreadImpl(
843 valid_gaia_url_, &request_, io_data.get()));
844 }
845
TEST_F(OneClickSigninHelperIOTest,CanOfferOnIOThreadDisabledByPolicy)846 TEST_F(OneClickSigninHelperIOTest, CanOfferOnIOThreadDisabledByPolicy) {
847 scoped_ptr<TestProfileIOData> io_data(
848 CreateTestProfileIOData(Profile::REGULAR_PROFILE));
849 EXPECT_EQ(OneClickSigninHelper::CAN_OFFER,
850 OneClickSigninHelper::CanOfferOnIOThreadImpl(
851 valid_gaia_url_, &request_, io_data.get()));
852
853 // Simulate a policy disabling signin by writing kSigninAllowed directly.
854 // We should not offer to sign in the browser.
855 profile()->GetTestingPrefService()->SetManagedPref(
856 prefs::kSigninAllowed, base::Value::CreateBooleanValue(false));
857 EXPECT_EQ(OneClickSigninHelper::DONT_OFFER,
858 OneClickSigninHelper::CanOfferOnIOThreadImpl(
859 valid_gaia_url_, &request_, io_data.get()));
860
861 // Reset the preference.
862 profile()->GetTestingPrefService()->SetManagedPref(
863 prefs::kSigninAllowed, base::Value::CreateBooleanValue(true));
864
865 // Simulate a policy disabling sync by writing kSyncManaged directly.
866 // We should still offer to sign in the browser.
867 profile()->GetTestingPrefService()->SetManagedPref(
868 sync_driver::prefs::kSyncManaged, base::Value::CreateBooleanValue(true));
869 EXPECT_EQ(OneClickSigninHelper::CAN_OFFER,
870 OneClickSigninHelper::CanOfferOnIOThreadImpl(
871 valid_gaia_url_, &request_, io_data.get()));
872 }
873
874
875 class MockStarterWrapper
876 : public testing::StrictMock<OneClickSigninHelper::SyncStarterWrapper> {
877 public:
878 MockStarterWrapper(
879 const OneClickSigninHelper::StartSyncArgs& args,
880 OneClickSigninSyncStarter::StartSyncMode start_mode);
881
882 MOCK_METHOD1(DisplayErrorBubble, void(const std::string& error_message));
883 MOCK_METHOD0(StartSigninOAuthHelper, void());
884 MOCK_METHOD2(StartOneClickSigninSyncStarter,
885 void(const std::string& email,
886 const std::string& refresh_token));
887 };
888
MockStarterWrapper(const OneClickSigninHelper::StartSyncArgs & args,OneClickSigninSyncStarter::StartSyncMode start_mode)889 MockStarterWrapper::MockStarterWrapper(
890 const OneClickSigninHelper::StartSyncArgs& args,
891 OneClickSigninSyncStarter::StartSyncMode start_mode)
892 : testing::StrictMock<OneClickSigninHelper::SyncStarterWrapper>(
893 args, start_mode) {
894 }
895
896 class OneClickSyncStarterWrapperTest : public testing::Test {
897 public:
SetUp()898 virtual void SetUp() OVERRIDE {
899 TestingProfile::Builder builder;
900 profile_ = builder.Build();
901 }
902
TearDown()903 virtual void TearDown() OVERRIDE {
904 // Let the SyncStarterWrapper delete itself.
905 base::RunLoop().RunUntilIdle();
906 }
907
SetCookie(const std::string & value)908 void SetCookie(const std::string& value) {
909 // Set a valid LSID cookie in the test cookie store.
910 scoped_refptr<net::CookieMonster> cookie_monster =
911 profile()->GetCookieMonster();
912 net::CookieOptions options;
913 options.set_include_httponly();
914 cookie_monster->SetCookieWithOptionsAsync(
915 GURL("https://accounts.google.com"),
916 value, options,
917 net::CookieMonster::SetCookiesCallback());
918 }
919
SimulateRefreshTokenFetched(SigninOAuthHelper::Consumer * consumer,const std::string & email,const std::string & display_email,const std::string & refresh_token)920 void SimulateRefreshTokenFetched(
921 SigninOAuthHelper::Consumer* consumer,
922 const std::string& email,
923 const std::string& display_email,
924 const std::string& refresh_token) {
925 consumer->OnSigninOAuthInformationAvailable(
926 email, display_email, refresh_token);
927 }
928
profile()929 TestingProfile* profile() { return profile_.get(); }
930
931 private:
932 content::TestBrowserThreadBundle thread_bundle_;
933 scoped_ptr<TestingProfile> profile_;
934 };
935
TEST_F(OneClickSyncStarterWrapperTest,SignInWithRefreshToken)936 TEST_F(OneClickSyncStarterWrapperTest, SignInWithRefreshToken) {
937 OneClickSigninHelper::StartSyncArgs args;
938 args.email = "foo@gmail.com";
939 args.password = "password";
940 args.refresh_token = "refresh_token";
941 MockStarterWrapper* wrapper = new MockStarterWrapper(
942 args, OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
943
944 EXPECT_CALL(*wrapper,
945 StartOneClickSigninSyncStarter("foo@gmail.com",
946 "refresh_token"));
947 wrapper->Start();
948 }
949
TEST_F(OneClickSyncStarterWrapperTest,SignInWithPasswordNoRefreshToken)950 TEST_F(OneClickSyncStarterWrapperTest, SignInWithPasswordNoRefreshToken) {
951 OneClickSigninHelper::StartSyncArgs args;
952 args.email = "foo@gmail.com";
953 args.password = "password";
954 MockStarterWrapper* wrapper = new MockStarterWrapper(
955 args, OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
956
957 EXPECT_CALL(*wrapper, StartSigninOAuthHelper());
958 EXPECT_CALL(*wrapper,
959 StartOneClickSigninSyncStarter("foo@gmail.com",
960 "refresh_token"));
961 wrapper->Start();
962 SimulateRefreshTokenFetched(wrapper, "foo@gmail.com", "foo@gmail.com",
963 "refresh_token");
964 }
965
TEST_F(OneClickSyncStarterWrapperTest,SignInWithWrongEmail)966 TEST_F(OneClickSyncStarterWrapperTest, SignInWithWrongEmail) {
967 OneClickSigninHelper::StartSyncArgs args;
968 args.email = "foo@gmail.com";
969 args.password = "password";
970 MockStarterWrapper* wrapper = new MockStarterWrapper(
971 args, OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
972
973 EXPECT_CALL(*wrapper, StartSigninOAuthHelper());
974 EXPECT_CALL(*wrapper, DisplayErrorBubble(_));
975 wrapper->Start();
976 SimulateRefreshTokenFetched(wrapper, "bar@gmail.com", "bar@gmail.com",
977 "refresh_token");
978 }
979
TEST_F(OneClickSyncStarterWrapperTest,SignInWithEmptyPasswordValidCookie)980 TEST_F(OneClickSyncStarterWrapperTest, SignInWithEmptyPasswordValidCookie) {
981 OneClickSigninHelper::StartSyncArgs args;
982 args.email = "foo@gmail.com";
983 args.profile = profile();
984 MockStarterWrapper* wrapper = new MockStarterWrapper(
985 args, OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
986 SetCookie("LSID=1234; secure; httponly");
987
988 EXPECT_CALL(*wrapper, StartSigninOAuthHelper());
989 EXPECT_CALL(*wrapper,
990 StartOneClickSigninSyncStarter("foo@gmail.com",
991 "refresh_token"));
992 wrapper->Start();
993 base::RunLoop().RunUntilIdle();
994 SimulateRefreshTokenFetched(wrapper, "foo@gmail.com", "foo@gmail.com",
995 "refresh_token");
996 }
997
TEST_F(OneClickSyncStarterWrapperTest,SignInWithEmptyPasswordNoCookie)998 TEST_F(OneClickSyncStarterWrapperTest, SignInWithEmptyPasswordNoCookie) {
999 OneClickSigninHelper::StartSyncArgs args;
1000 args.email = "foo@gmail.com";
1001 args.profile = profile();
1002 MockStarterWrapper* wrapper = new MockStarterWrapper(
1003 args, OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
1004
1005 EXPECT_CALL(*wrapper, DisplayErrorBubble(_));
1006 wrapper->Start();
1007 base::RunLoop().RunUntilIdle();
1008 }
1009
TEST_F(OneClickSyncStarterWrapperTest,SignInWithEmptyPasswordInvalidCookie)1010 TEST_F(OneClickSyncStarterWrapperTest, SignInWithEmptyPasswordInvalidCookie) {
1011 OneClickSigninHelper::StartSyncArgs args;
1012 args.email = "foo@gmail.com";
1013 args.profile = profile();
1014 MockStarterWrapper* wrapper = new MockStarterWrapper(
1015 args, OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS);
1016 SetCookie("LSID=1234; domain=google.com; secure; httponly");
1017
1018 EXPECT_CALL(*wrapper, DisplayErrorBubble(_));
1019 wrapper->Start();
1020 base::RunLoop().RunUntilIdle();
1021 }
1022