1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/sync/one_click_signin_sync_observer.h"
6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/bind.h"
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/callback.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/signin/signin_manager_factory.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/signin/signin_promo.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/profile_sync_service_factory.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/startup_controller.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/test_profile_sync_service.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/chrome_render_view_host_test_harness.h"
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_profile.h"
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/signin/core/browser/signin_manager.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/render_view_host.h"
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/web_contents.h"
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/test/test_utils.h"
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing testing::_;
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace {
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char kContinueUrl[] = "https://www.example.com/";
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MockWebContentsObserver : public content::WebContentsObserver {
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  explicit MockWebContentsObserver(content::WebContents* web_contents)
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : content::WebContentsObserver(web_contents) {}
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~MockWebContentsObserver() {}
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // A hook to verify that the OneClickSigninSyncObserver initiated a redirect
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // to the continue URL. Navigations in unit_tests never complete, but a
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // navigation start is a sufficient signal for the purposes of this test.
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Listening for this call also has the advantage of being synchronous.
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  MOCK_METHOD1(AboutToNavigateRenderView, void(content::RenderViewHost*));
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass OneClickTestProfileSyncService : public TestProfileSyncService {
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~OneClickTestProfileSyncService() {}
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Helper routine to be used in conjunction with
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // BrowserContextKeyedServiceFactory::SetTestingFactory().
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  static KeyedService* Build(content::BrowserContext* profile) {
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return new OneClickTestProfileSyncService(static_cast<Profile*>(profile));
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool FirstSetupInProgress() const OVERRIDE {
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return first_setup_in_progress_;
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool sync_initialized() const OVERRIDE { return sync_initialized_; }
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void set_first_setup_in_progress(bool in_progress) {
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    first_setup_in_progress_ = in_progress;
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void set_sync_initialized(bool initialized) {
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    sync_initialized_ = initialized;
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  explicit OneClickTestProfileSyncService(Profile* profile)
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : TestProfileSyncService(
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          scoped_ptr<ProfileSyncComponentsFactory>(
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              new ProfileSyncComponentsFactoryMock()),
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          profile,
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          SigninManagerFactory::GetForProfile(profile),
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          browser_sync::MANUAL_START),
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        first_setup_in_progress_(false),
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        sync_initialized_(false) {}
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool first_setup_in_progress_;
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool sync_initialized_;
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass TestOneClickSigninSyncObserver : public OneClickSigninSyncObserver {
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  typedef base::Callback<void(TestOneClickSigninSyncObserver*)>
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      DestructionCallback;
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  TestOneClickSigninSyncObserver(content::WebContents* web_contents,
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 const GURL& continue_url,
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 const DestructionCallback& callback)
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : OneClickSigninSyncObserver(web_contents, continue_url),
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        destruction_callback_(callback) {}
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~TestOneClickSigninSyncObserver() { destruction_callback_.Run(this); }
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DestructionCallback destruction_callback_;
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TestOneClickSigninSyncObserver);
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// A trivial factory to build a null service.
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochKeyedService* BuildNullService(content::BrowserContext* context) {
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return NULL;
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass OneClickSigninSyncObserverTest : public ChromeRenderViewHostTestHarness {
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  OneClickSigninSyncObserverTest()
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : sync_service_(NULL),
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        sync_observer_(NULL),
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        sync_observer_destroyed_(true) {}
115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetUp() OVERRIDE {
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ChromeRenderViewHostTestHarness::SetUp();
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    web_contents_observer_.reset(new MockWebContentsObserver(web_contents()));
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    sync_service_ =
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        static_cast<OneClickTestProfileSyncService*>(
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                profile(), OneClickTestProfileSyncService::Build));
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void TearDown() OVERRIDE {
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Verify that the |sync_observer_| unregistered as an observer from the
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // sync service and freed its memory.
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(sync_observer_destroyed_);
129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (sync_service_)
130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EXPECT_FALSE(sync_service_->HasObserver(sync_observer_));
131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ChromeRenderViewHostTestHarness::TearDown();
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void CreateSyncObserver(const std::string& url) {
136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    sync_observer_ = new TestOneClickSigninSyncObserver(
137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      web_contents(), GURL(url),
138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      base::Bind(&OneClickSigninSyncObserverTest::OnSyncObserverDestroyed,
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                 base::Unretained(this)));
140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (sync_service_)
141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EXPECT_TRUE(sync_service_->HasObserver(sync_observer_));
142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(sync_observer_destroyed_);
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    sync_observer_destroyed_ = false;
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  OneClickTestProfileSyncService* sync_service_;
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<MockWebContentsObserver> web_contents_observer_;
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnSyncObserverDestroyed(TestOneClickSigninSyncObserver* observer) {
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(sync_observer_, observer);
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(sync_observer_destroyed_);
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    sync_observer_destroyed_ = true;
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  TestOneClickSigninSyncObserver* sync_observer_;
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool sync_observer_destroyed_;
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that if no Sync service is present, e.g. because Sync is disabled, the
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// observer immediately loads the continue URL.
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest, NoSyncService_RedirectsImmediately) {
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Simulate disabling Sync.
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_ =
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      static_cast<OneClickTestProfileSyncService*>(
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              profile(), BuildNullService));
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The observer should immediately redirect to the continue URL.
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_));
171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CreateSyncObserver(kContinueUrl);
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(GURL(kContinueUrl), web_contents()->GetVisibleURL());
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The |sync_observer_| will be destroyed asynchronously, so manually pump
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // the message loop to wait for the destruction.
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  content::RunAllPendingInMessageLoop();
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that when the WebContents is destroyed without any Sync notifications
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// firing, the observer cleans up its memory without loading the continue URL.
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest, WebContentsDestroyed) {
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)).Times(0);
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CreateSyncObserver(kContinueUrl);
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetContents(NULL);
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that when Sync is configured successfully, the observer loads the
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// continue URL and cleans up after itself.
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest,
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       OnSyncStateChanged_SyncConfiguredSuccessfully) {
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CreateSyncObserver(kContinueUrl);
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->set_first_setup_in_progress(false);
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->set_sync_initialized(true);
194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_));
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->NotifyObservers();
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(GURL(kContinueUrl), web_contents()->GetVisibleURL());
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that when Sync configuration fails, the observer does not load the
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// continue URL, but still cleans up after itself.
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest,
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       OnSyncStateChanged_SyncConfigurationFailed) {
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CreateSyncObserver(kContinueUrl);
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->set_first_setup_in_progress(false);
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->set_sync_initialized(false);
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)).Times(0);
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->NotifyObservers();
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_NE(GURL(kContinueUrl), web_contents()->GetVisibleURL());
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that when Sync sends a notification while setup is not yet complete,
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// the observer does not load the continue URL, and continues to wait.
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest,
216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       OnSyncStateChanged_SyncConfigurationInProgress) {
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CreateSyncObserver(kContinueUrl);
218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->set_first_setup_in_progress(true);
219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->set_sync_initialized(false);
220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)).Times(0);
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->NotifyObservers();
223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_NE(GURL(kContinueUrl), web_contents()->GetVisibleURL());
224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Trigger an event to force state to be cleaned up.
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetContents(NULL);
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Verify that if the continue_url is to the settings page, no navigation is
230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// triggered, since it would be redundant.
231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(OneClickSigninSyncObserverTest,
232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       OnSyncStateChanged_SyncConfiguredSuccessfully_SourceIsSettings) {
233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GURL continue_url = signin::GetPromoURL(signin::SOURCE_SETTINGS, false);
234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CreateSyncObserver(continue_url.spec());
235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->set_first_setup_in_progress(false);
236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->set_sync_initialized(true);
237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*web_contents_observer_, AboutToNavigateRenderView(_)).Times(0);
239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  sync_service_->NotifyObservers();
240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_NE(GURL(kContinueUrl), web_contents()->GetVisibleURL());
241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
242