1 // Copyright 2013 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 "chrome/browser/ui/sync/one_click_signin_sync_starter.h"
6
7 #include "base/basictypes.h"
8 #include "base/command_line.h"
9 #include "base/compiler_specific.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "chrome/browser/signin/fake_signin_manager.h"
12 #include "chrome/browser/signin/signin_manager_factory.h"
13 #include "chrome/common/chrome_switches.h"
14 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
15 #include "chrome/test/base/testing_profile.h"
16 #include "content/public/browser/navigation_entry.h"
17 #include "content/public/browser/web_contents.h"
18 #include "content/public/test/test_browser_thread_bundle.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 namespace {
22 const char* kTestingUsername = "fake_username";
23 } // namespace
24
25 class OneClickSigninSyncStarterTest : public ChromeRenderViewHostTestHarness {
26 public:
OneClickSigninSyncStarterTest()27 OneClickSigninSyncStarterTest()
28 : sync_starter_(NULL),
29 failed_count_(0),
30 succeeded_count_(0) {}
31
32 // ChromeRenderViewHostTestHarness:
SetUp()33 virtual void SetUp() OVERRIDE {
34 ChromeRenderViewHostTestHarness::SetUp();
35
36 // Disable sync to simplify the creation of a OneClickSigninSyncStarter.
37 CommandLine::ForCurrentProcess()->AppendSwitch(switches::kDisableSync);
38
39 SigninManagerBase* signin_manager = static_cast<FakeSigninManager*>(
40 SigninManagerFactory::GetForProfile(profile()));
41
42 signin_manager->Initialize(NULL);
43 signin_manager->SetAuthenticatedUsername(kTestingUsername);
44 }
45
Callback(OneClickSigninSyncStarter::SyncSetupResult result)46 void Callback(OneClickSigninSyncStarter::SyncSetupResult result) {
47 if (result == OneClickSigninSyncStarter::SYNC_SETUP_SUCCESS)
48 ++succeeded_count_;
49 else
50 ++failed_count_;
51 }
52
53 // ChromeRenderViewHostTestHarness:
CreateBrowserContext()54 virtual content::BrowserContext* CreateBrowserContext() OVERRIDE {
55 // Create the sign in manager required by OneClickSigninSyncStarter.
56 TestingProfile::Builder builder;
57 builder.AddTestingFactory(
58 SigninManagerFactory::GetInstance(),
59 &OneClickSigninSyncStarterTest::BuildSigninManager);
60 return builder.Build().release();
61 }
62
63 protected:
CreateSyncStarter(OneClickSigninSyncStarter::Callback callback,const GURL & continue_url)64 void CreateSyncStarter(OneClickSigninSyncStarter::Callback callback,
65 const GURL& continue_url) {
66 sync_starter_ = new OneClickSigninSyncStarter(
67 profile(),
68 NULL,
69 kTestingUsername,
70 std::string(),
71 "refresh_token",
72 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS,
73 web_contents(),
74 OneClickSigninSyncStarter::NO_CONFIRMATION,
75 continue_url,
76 callback);
77 }
78
79 // Deletes itself when SigninFailed() or SigninSuccess() is called.
80 OneClickSigninSyncStarter* sync_starter_;
81
82 // Number of times that the callback is called with SYNC_SETUP_FAILURE.
83 int failed_count_;
84
85 // Number of times that the callback is called with SYNC_SETUP_SUCCESS.
86 int succeeded_count_;
87
88 private:
BuildSigninManager(content::BrowserContext * profile)89 static KeyedService* BuildSigninManager(content::BrowserContext* profile) {
90 return new FakeSigninManager(static_cast<Profile*>(profile));
91 }
92
93 DISALLOW_COPY_AND_ASSIGN(OneClickSigninSyncStarterTest);
94 };
95
96 // Verifies that the callback is invoked when sync setup fails.
TEST_F(OneClickSigninSyncStarterTest,CallbackSigninFailed)97 TEST_F(OneClickSigninSyncStarterTest, CallbackSigninFailed) {
98 CreateSyncStarter(base::Bind(&OneClickSigninSyncStarterTest::Callback,
99 base::Unretained(this)),
100 GURL());
101 sync_starter_->SigninFailed(GoogleServiceAuthError(
102 GoogleServiceAuthError::REQUEST_CANCELED));
103 EXPECT_EQ(1, failed_count_);
104 EXPECT_EQ(0, succeeded_count_);
105 }
106
107 // Verifies that there is no crash when the callback is NULL.
TEST_F(OneClickSigninSyncStarterTest,CallbackNull)108 TEST_F(OneClickSigninSyncStarterTest, CallbackNull) {
109 CreateSyncStarter(OneClickSigninSyncStarter::Callback(), GURL());
110 sync_starter_->SigninFailed(GoogleServiceAuthError(
111 GoogleServiceAuthError::REQUEST_CANCELED));
112 EXPECT_EQ(0, failed_count_);
113 EXPECT_EQ(0, succeeded_count_);
114 }
115
116 // Verifies that the continue URL is loaded once signin completes.
TEST_F(OneClickSigninSyncStarterTest,LoadContinueUrl)117 TEST_F(OneClickSigninSyncStarterTest, LoadContinueUrl) {
118 content::NavigationController& controller = web_contents()->GetController();
119 EXPECT_FALSE(controller.GetPendingEntry());
120
121 const GURL kTestURL = GURL("http://www.example.com");
122 CreateSyncStarter(base::Bind(&OneClickSigninSyncStarterTest::Callback,
123 base::Unretained(this)),
124 kTestURL);
125 sync_starter_->MergeSessionComplete(
126 GoogleServiceAuthError(GoogleServiceAuthError::NONE));
127 EXPECT_EQ(1, succeeded_count_);
128 EXPECT_EQ(kTestURL, controller.GetPendingEntry()->GetURL());
129 }
130