Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / login / merge_session_load_page_unittest.cc
1 // Copyright (c) 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 "base/run_loop.h"
6 #include "base/time/time.h"
7 #include "chrome/browser/chromeos/login/merge_session_load_page.h"
8 #include "chrome/browser/chromeos/login/oauth2_login_manager.h"
9 #include "chrome/browser/chromeos/login/oauth2_login_manager_factory.h"
10 #include "chrome/browser/chromeos/login/user_manager.h"
11 #include "chrome/browser/chromeos/settings/cros_settings.h"
12 #include "chrome/browser/chromeos/settings/device_settings_service.h"
13 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
14 #include "content/public/browser/interstitial_page.h"
15 #include "content/public/browser/navigation_controller.h"
16 #include "content/public/browser/web_contents.h"
17 #include "content/public/test/web_contents_tester.h"
18
19 using content::InterstitialPage;
20 using content::WebContents;
21 using content::WebContentsTester;
22
23 namespace {
24
25 const char kURL1[] = "http://www.google.com/";
26 const char kURL2[] = "http://mail.google.com/";
27
28 const int64 kSessionMergeTimeout = 60;
29
30 }  // namespace
31
32 namespace chromeos {
33
34 class MergeSessionLoadPageTest;
35
36 // An MergeSessionLoadPage class that does not create windows.
37 class TestMergeSessionLoadPage :  public MergeSessionLoadPage {
38  public:
39   TestMergeSessionLoadPage(WebContents* web_contents,
40                            const GURL& url,
41                            MergeSessionLoadPageTest* test_page)
42     : MergeSessionLoadPage(web_contents,
43                            url,
44                            MergeSessionThrottle::CompletionCallback()),
45       test_page_(test_page) {
46     interstitial_page_->DontCreateViewForTesting();
47   }
48
49  private:
50   MergeSessionLoadPageTest* test_page_;
51
52   DISALLOW_COPY_AND_ASSIGN(TestMergeSessionLoadPage);
53 };
54
55 class MergeSessionLoadPageTest : public ChromeRenderViewHostTestHarness {
56  protected:
57   virtual void SetUp() OVERRIDE {
58     ChromeRenderViewHostTestHarness::SetUp();
59 #if defined OS_CHROMEOS
60   test_user_manager_.reset(new chromeos::ScopedTestUserManager());
61 #endif
62   }
63
64   virtual void TearDown() OVERRIDE {
65 #if defined OS_CHROMEOS
66     // Clean up pending tasks that might depend on the user manager.
67     base::RunLoop().RunUntilIdle();
68     test_user_manager_.reset();
69 #endif
70     ChromeRenderViewHostTestHarness::TearDown();
71   }
72
73   void Navigate(const char* url, int page_id) {
74     WebContentsTester::For(web_contents())->TestDidNavigate(
75         web_contents()->GetRenderViewHost(), page_id, GURL(url),
76         content::PAGE_TRANSITION_TYPED);
77   }
78
79   void ShowInterstitial(const char* url) {
80     (new TestMergeSessionLoadPage(web_contents(), GURL(url), this))->Show();
81   }
82
83   // Returns the MergeSessionLoadPage currently showing or NULL if none is
84   // showing.
85   InterstitialPage* GetMergeSessionLoadPage() {
86     return InterstitialPage::GetInterstitialPage(web_contents());
87   }
88
89   OAuth2LoginManager* GetOAuth2LoginManager() {
90     content::BrowserContext* browser_context =
91         web_contents()->GetBrowserContext();
92     if (!browser_context)
93       return NULL;
94
95     Profile* profile = Profile::FromBrowserContext(browser_context);
96     if (!profile)
97       return NULL;
98
99     OAuth2LoginManager* login_manager =
100         OAuth2LoginManagerFactory::GetInstance()->GetForProfile(
101             profile);
102     return login_manager;
103   }
104
105   void SetMergeSessionState(OAuth2LoginManager::SessionRestoreState state) {
106     OAuth2LoginManager* login_manager = GetOAuth2LoginManager();
107     ASSERT_TRUE(login_manager);
108     login_manager->SetSessionRestoreState(state);
109   }
110
111   void SetSessionRestoreStart(const base::Time& time) {
112     OAuth2LoginManager* login_manager = GetOAuth2LoginManager();
113     ASSERT_TRUE(login_manager);
114     login_manager->SetSessionRestoreStartForTesting(time);
115   }
116
117  private:
118   ScopedTestDeviceSettingsService test_device_settings_service_;
119   ScopedTestCrosSettings test_cros_settings_;
120   scoped_ptr<chromeos::ScopedTestUserManager> test_user_manager_;
121 };
122
123 TEST_F(MergeSessionLoadPageTest, MergeSessionPageNotShown) {
124   SetMergeSessionState(OAuth2LoginManager::SESSION_RESTORE_DONE);
125   // Start a load.
126   Navigate(kURL1, 1);
127   // Load next page.
128   controller().LoadURL(GURL(kURL2), content::Referrer(),
129                        content::PAGE_TRANSITION_TYPED, std::string());
130
131   // Simulate the load causing an merge session interstitial page
132   // to be shown.
133   InterstitialPage* interstitial = GetMergeSessionLoadPage();
134   EXPECT_FALSE(interstitial);
135 }
136
137 TEST_F(MergeSessionLoadPageTest, MergeSessionPageNotShownOnTimeout) {
138   SetMergeSessionState(OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS);
139   SetSessionRestoreStart(
140       base::Time::Now() +
141       base::TimeDelta::FromSeconds(kSessionMergeTimeout + 1));
142
143   // Start a load.
144   Navigate(kURL1, 1);
145   // Load next page.
146   controller().LoadURL(GURL(kURL2), content::Referrer(),
147                        content::PAGE_TRANSITION_TYPED, std::string());
148
149   // Simulate the load causing an merge session interstitial page
150   // to be shown.
151   InterstitialPage* interstitial = GetMergeSessionLoadPage();
152   EXPECT_FALSE(interstitial);
153 }
154
155 TEST_F(MergeSessionLoadPageTest, MergeSessionPageShown) {
156   SetMergeSessionState(OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS);
157
158   // Start a load.
159   Navigate(kURL1, 1);
160   // Load next page.
161   controller().LoadURL(GURL(kURL2), content::Referrer(),
162                        content::PAGE_TRANSITION_TYPED, std::string());
163
164   // Simulate the load causing an merge session interstitial page
165   // to be shown.
166   ShowInterstitial(kURL2);
167   InterstitialPage* interstitial = GetMergeSessionLoadPage();
168   ASSERT_TRUE(interstitial);
169   base::RunLoop().RunUntilIdle();
170
171   // Simulate merge session completion.
172   SetMergeSessionState(OAuth2LoginManager::SESSION_RESTORE_DONE);
173   base::RunLoop().RunUntilIdle();
174
175   // The URL remains to be URL2.
176   EXPECT_EQ(kURL2, web_contents()->GetVisibleURL().spec());
177
178   // Commit navigation and the interstitial page is gone.
179   Navigate(kURL2, 2);
180   EXPECT_FALSE(GetMergeSessionLoadPage());
181 }
182
183 }  // namespace chromeos