captive_portal_tab_reloader_unittest.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey// Copyright (c) 2012 The Chromium Authors. All rights reserved. 278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey// Use of this source code is governed by a BSD-style license that can be 378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey// found in the LICENSE file. 478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "chrome/browser/captive_portal/captive_portal_tab_reloader.h" 678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "base/callback.h" 878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "base/message_loop/message_loop.h" 978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "chrome/browser/captive_portal/captive_portal_service.h" 1078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "chrome/test/base/chrome_render_view_host_test_harness.h" 1178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "content/public/browser/browser_thread.h" 1278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "content/public/browser/interstitial_page.h" 1378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "content/public/browser/interstitial_page_delegate.h" 1478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "content/public/browser/web_contents.h" 1578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "net/base/net_errors.h" 1678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "net/cert/cert_status_flags.h" 1778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "net/ssl/ssl_info.h" 1878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "testing/gmock/include/gmock/gmock.h" 1978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "testing/gtest/include/gtest/gtest.h" 2078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey#include "url/gurl.h" 2178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 2278cc340c2de873d6995c283b777476f7237d690fJeff Sharkeynamespace captive_portal { 2378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 2478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey// Used for testing CaptivePortalTabReloader in isolation from the observer. 2578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey// Exposes a number of private functions and mocks out others. 2678cc340c2de873d6995c283b777476f7237d690fJeff Sharkeyclass TestCaptivePortalTabReloader : public CaptivePortalTabReloader { 2778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey public: 2878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey explicit TestCaptivePortalTabReloader(content::WebContents* web_contents) 2978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey : CaptivePortalTabReloader(NULL, 3078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey web_contents, 3178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey base::Callback<void(void)>()) { 3278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey } 3378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 3478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey virtual ~TestCaptivePortalTabReloader() { 3578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey } 3678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 3778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey bool TimerRunning() { 3878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey return slow_ssl_load_timer_.IsRunning(); 3978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey } 4078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 4178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey // The following methods are aliased so they can be publicly accessed by the 4278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey // unit tests. 4378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 4478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey State state() const { 4578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey return CaptivePortalTabReloader::state(); 4678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey } 4778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 4878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey void set_slow_ssl_load_time(base::TimeDelta slow_ssl_load_time) { 4978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_FALSE(TimerRunning()); 5078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey CaptivePortalTabReloader::set_slow_ssl_load_time(slow_ssl_load_time); 5178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey } 5278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 5378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey // CaptivePortalTabReloader: 5478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey MOCK_METHOD0(ReloadTab, void()); 5578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey MOCK_METHOD0(MaybeOpenCaptivePortalLoginTab, void()); 56ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey MOCK_METHOD0(CheckForCaptivePortal, void()); 57ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 5878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey private: 5978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey DISALLOW_COPY_AND_ASSIGN(TestCaptivePortalTabReloader); 6078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey}; 6178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 6278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey// Used to test behavior when a WebContents is showing an interstitial page. 6378cc340c2de873d6995c283b777476f7237d690fJeff Sharkeyclass MockInterstitialPageDelegate : public content::InterstitialPageDelegate { 6478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey public: 6578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey // The newly created MockInterstitialPageDelegate will be owned by the 6678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey // WebContents' InterstitialPage, and cleaned up when the WebContents 6778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey // destroys it. 6878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey explicit MockInterstitialPageDelegate( 6978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey content::WebContents* web_contents) { 7078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey content::InterstitialPage* interstitial_page = 7178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey content::InterstitialPage::Create( 7278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey web_contents, true, GURL("http://blah"), this); 7378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey interstitial_page->DontCreateViewForTesting(); 7478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey interstitial_page->Show(); 7578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey } 7678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 7778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey virtual ~MockInterstitialPageDelegate() { 7878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey } 7978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 8078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey private: 8178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey // InterstitialPageDelegate implementation: 8278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey virtual std::string GetHTMLContents() OVERRIDE { 8378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey return "HTML Contents"; 8478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey } 8578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 8678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey DISALLOW_COPY_AND_ASSIGN(MockInterstitialPageDelegate); 8778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey}; 8878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 8978cc340c2de873d6995c283b777476f7237d690fJeff Sharkeyclass CaptivePortalTabReloaderTest : public ChromeRenderViewHostTestHarness { 9078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey public: 9178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey // testing::Test: 9278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey virtual void SetUp() OVERRIDE { 9378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey ChromeRenderViewHostTestHarness::SetUp(); 9478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader_.reset(new testing::StrictMock<TestCaptivePortalTabReloader>( 9578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey web_contents())); 9678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 9778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey // Most tests don't run the message loop, so don't use a timer for them. 985f1ed727e27cc00267539974372f062104052f56Jeff Sharkey tab_reloader_->set_slow_ssl_load_time(base::TimeDelta()); 995f1ed727e27cc00267539974372f062104052f56Jeff Sharkey } 1005f1ed727e27cc00267539974372f062104052f56Jeff Sharkey 1015f1ed727e27cc00267539974372f062104052f56Jeff Sharkey virtual void TearDown() OVERRIDE { 10278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_FALSE(tab_reloader().TimerRunning()); 10378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader_.reset(NULL); 10478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey ChromeRenderViewHostTestHarness::TearDown(); 10578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey } 10678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 10778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey TestCaptivePortalTabReloader& tab_reloader() { return *tab_reloader_.get(); } 10878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 10978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey private: 110ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey scoped_ptr<TestCaptivePortalTabReloader> tab_reloader_; 111ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey}; 112ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 113ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey// Simulates a slow SSL load when the Internet is connected. 114ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff SharkeyTEST_F(CaptivePortalTabReloaderTest, InternetConnected) { 115ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 116ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 117ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey tab_reloader().OnLoadStart(true); 11878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 11978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader().state()); 12078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_TRUE(tab_reloader().TimerRunning()); 12178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 122d3ca9917003a5e0650b559d58cf1eacf3b52bf34Jeff Sharkey EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 12378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey base::MessageLoop::current()->RunUntilIdle(); 124d3ca9917003a5e0650b559d58cf1eacf3b52bf34Jeff Sharkey EXPECT_FALSE(tab_reloader().TimerRunning()); 12578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 12678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader().state()); 12778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 12878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 12978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey RESULT_INTERNET_CONNECTED); 13078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 13178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 13278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_FALSE(tab_reloader().TimerRunning()); 13378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 1349a1507aa10577badabcbe00396613a967302e456Jeff Sharkey tab_reloader().OnLoadCommitted(net::OK); 13578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 13678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey} 13778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 1389a1507aa10577badabcbe00396613a967302e456Jeff Sharkey// Simulates a slow SSL load when the Internet is connected. In this case, 1399a1507aa10577badabcbe00396613a967302e456Jeff Sharkey// the timeout error occurs before the timer triggers. Unlikely to happen 1409a1507aa10577badabcbe00396613a967302e456Jeff Sharkey// in practice, but best if it still works. 14178cc340c2de873d6995c283b777476f7237d690fJeff SharkeyTEST_F(CaptivePortalTabReloaderTest, InternetConnectedTimeout) { 14278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 14378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 14478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader().OnLoadStart(true); 145ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 146ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey tab_reloader().state()); 147ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey EXPECT_TRUE(tab_reloader().TimerRunning()); 148ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 149ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 15078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 15178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_FALSE(tab_reloader().TimerRunning()); 152a10311434778ea1be1621c2251c0c8c2966f337bJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 153ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey tab_reloader().state()); 154ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 155ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 156ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey RESULT_INTERNET_CONNECTED); 157ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 15878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 15978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey} 16078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 16178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey// Simulates a slow SSL load when captive portal checks return no response. 162ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff SharkeyTEST_F(CaptivePortalTabReloaderTest, NoResponse) { 16378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 16478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 16578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader().OnLoadStart(true); 16678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 167ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey tab_reloader().state()); 16878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_TRUE(tab_reloader().TimerRunning()); 16978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 17078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 17178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey base::MessageLoop::current()->RunUntilIdle(); 17278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_FALSE(tab_reloader().TimerRunning()); 17378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 17478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader().state()); 17578cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 17678cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader().OnCaptivePortalResults(RESULT_NO_RESPONSE, RESULT_NO_RESPONSE); 17778cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 17878cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 17978cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_FALSE(tab_reloader().TimerRunning()); 18078cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 18178cc340c2de873d6995c283b777476f7237d690fJeff Sharkey tab_reloader().OnLoadCommitted(net::OK); 18278cc340c2de873d6995c283b777476f7237d690fJeff Sharkey EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 18378cc340c2de873d6995c283b777476f7237d690fJeff Sharkey} 18478cc340c2de873d6995c283b777476f7237d690fJeff Sharkey 185// Simulates a slow HTTP load when behind a captive portal, that eventually. 186// tiems out. Since it's HTTP, the TabReloader should do nothing. 187TEST_F(CaptivePortalTabReloaderTest, DoesNothingOnHttp) { 188 tab_reloader().OnLoadStart(false); 189 EXPECT_FALSE(tab_reloader().TimerRunning()); 190 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 191 192 tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 193 RESULT_BEHIND_CAPTIVE_PORTAL); 194 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 195 196 // The user logs in. 197 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 198 RESULT_INTERNET_CONNECTED); 199 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 200 201 // The page times out. 202 tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 203 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 204} 205 206// Simulate the normal login process. The user logs in before the error page 207// in the original tab commits. 208TEST_F(CaptivePortalTabReloaderTest, Login) { 209 tab_reloader().OnLoadStart(true); 210 211 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 212 base::MessageLoop::current()->RunUntilIdle(); 213 EXPECT_FALSE(tab_reloader().TimerRunning()); 214 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 215 tab_reloader().state()); 216 217 // The captive portal service detects a captive portal. The TabReloader 218 // should try and create a new login tab in response. 219 EXPECT_CALL(tab_reloader(), MaybeOpenCaptivePortalLoginTab()).Times(1); 220 tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 221 RESULT_BEHIND_CAPTIVE_PORTAL); 222 EXPECT_EQ(CaptivePortalTabReloader::STATE_BROKEN_BY_PORTAL, 223 tab_reloader().state()); 224 EXPECT_FALSE(tab_reloader().TimerRunning()); 225 226 // The user logs on from another tab, and a captive portal check is triggered. 227 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 228 RESULT_INTERNET_CONNECTED); 229 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 230 tab_reloader().state()); 231 232 // The error page commits, which should start an asynchronous reload. 233 tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 234 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 235 tab_reloader().state()); 236 237 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 238 base::MessageLoop::current()->RunUntilIdle(); 239 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 240} 241 242// Simulate the normal login process. The user logs in after the tab finishes 243// loading the error page. 244TEST_F(CaptivePortalTabReloaderTest, LoginLate) { 245 tab_reloader().OnLoadStart(true); 246 247 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 248 base::MessageLoop::current()->RunUntilIdle(); 249 EXPECT_FALSE(tab_reloader().TimerRunning()); 250 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 251 tab_reloader().state()); 252 253 // The captive portal service detects a captive portal. The TabReloader 254 // should try and create a new login tab in response. 255 EXPECT_CALL(tab_reloader(), MaybeOpenCaptivePortalLoginTab()).Times(1); 256 tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 257 RESULT_BEHIND_CAPTIVE_PORTAL); 258 EXPECT_EQ(CaptivePortalTabReloader::STATE_BROKEN_BY_PORTAL, 259 tab_reloader().state()); 260 EXPECT_FALSE(tab_reloader().TimerRunning()); 261 262 // The error page commits. 263 tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 264 EXPECT_EQ(CaptivePortalTabReloader::STATE_BROKEN_BY_PORTAL, 265 tab_reloader().state()); 266 267 // The user logs on from another tab, and a captive portal check is triggered. 268 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 269 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 270 RESULT_INTERNET_CONNECTED); 271 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 272} 273 274// Simulate a login after the tab times out unexpectedly quickly. 275TEST_F(CaptivePortalTabReloaderTest, TimeoutFast) { 276 tab_reloader().OnLoadStart(true); 277 278 // The error page commits, which should trigger a captive portal check, 279 // since the timer's still running. 280 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 281 tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 282 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 283 tab_reloader().state()); 284 285 // The captive portal service detects a captive portal. The TabReloader 286 // should try and create a new login tab in response. 287 EXPECT_CALL(tab_reloader(), MaybeOpenCaptivePortalLoginTab()).Times(1); 288 tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 289 RESULT_BEHIND_CAPTIVE_PORTAL); 290 EXPECT_EQ(CaptivePortalTabReloader::STATE_BROKEN_BY_PORTAL, 291 tab_reloader().state()); 292 EXPECT_FALSE(tab_reloader().TimerRunning()); 293 294 // The user logs on from another tab, and a captive portal check is triggered. 295 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 296 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 297 RESULT_INTERNET_CONNECTED); 298 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 299} 300 301// An SSL protocol error triggers a captive portal check behind a captive 302// portal. The user then logs in. 303TEST_F(CaptivePortalTabReloaderTest, SSLProtocolError) { 304 tab_reloader().OnLoadStart(true); 305 306 // The error page commits, which should trigger a captive portal check, 307 // since the timer's still running. 308 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 309 tab_reloader().OnLoadCommitted(net::ERR_SSL_PROTOCOL_ERROR); 310 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 311 tab_reloader().state()); 312 313 // The captive portal service detects a captive portal. The TabReloader 314 // should try and create a new login tab in response. 315 EXPECT_CALL(tab_reloader(), MaybeOpenCaptivePortalLoginTab()).Times(1); 316 tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 317 RESULT_BEHIND_CAPTIVE_PORTAL); 318 EXPECT_EQ(CaptivePortalTabReloader::STATE_BROKEN_BY_PORTAL, 319 tab_reloader().state()); 320 EXPECT_FALSE(tab_reloader().TimerRunning()); 321 322 // The user logs on from another tab, and a captive portal check is triggered. 323 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 324 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 325 RESULT_INTERNET_CONNECTED); 326 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 327} 328 329// An SSL protocol error triggers a captive portal check behind a captive 330// portal. The user logs in before the results from the captive portal check 331// completes. 332TEST_F(CaptivePortalTabReloaderTest, SSLProtocolErrorFastLogin) { 333 tab_reloader().OnLoadStart(true); 334 335 // The error page commits, which should trigger a captive portal check, 336 // since the timer's still running. 337 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 338 tab_reloader().OnLoadCommitted(net::ERR_SSL_PROTOCOL_ERROR); 339 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 340 tab_reloader().state()); 341 342 // The user has logged in from another tab. The tab automatically reloads. 343 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 344 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 345 RESULT_INTERNET_CONNECTED); 346 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 347} 348 349// An SSL protocol error triggers a captive portal check behind a captive 350// portal. The user logs in before the results from the captive portal check 351// completes. This case is probably not too likely, but should be handled. 352TEST_F(CaptivePortalTabReloaderTest, SSLProtocolErrorAlreadyLoggedIn) { 353 tab_reloader().OnLoadStart(true); 354 355 // The user logs in from another tab before the tab errors out. 356 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 357 RESULT_INTERNET_CONNECTED); 358 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 359 tab_reloader().state()); 360 361 // The error page commits, which should trigger a reload. 362 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 363 tab_reloader().OnLoadCommitted(net::ERR_SSL_PROTOCOL_ERROR); 364 base::MessageLoop::current()->RunUntilIdle(); 365 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 366} 367 368// Simulate the case that a user has already logged in before the tab receives a 369// captive portal result, but a RESULT_BEHIND_CAPTIVE_PORTAL was received 370// before the tab started loading. 371TEST_F(CaptivePortalTabReloaderTest, AlreadyLoggedIn) { 372 tab_reloader().OnLoadStart(true); 373 374 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 375 base::MessageLoop::current()->RunUntilIdle(); 376 EXPECT_FALSE(tab_reloader().TimerRunning()); 377 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 378 tab_reloader().state()); 379 380 // The user has already logged in. Since the last result found a captive 381 // portal, the tab will be reloaded if a timeout is committed. 382 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 383 RESULT_INTERNET_CONNECTED); 384 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 385 tab_reloader().state()); 386 387 // The error page commits, which should start an asynchronous reload. 388 tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 389 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 390 tab_reloader().state()); 391 392 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 393 base::MessageLoop::current()->RunUntilIdle(); 394 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 395} 396 397// Same as above, except the result is received even before the timer triggers, 398// due to a captive portal test request from some external source, like a login 399// tab. 400TEST_F(CaptivePortalTabReloaderTest, AlreadyLoggedInBeforeTimerTriggers) { 401 tab_reloader().OnLoadStart(true); 402 403 // The user has already logged in. Since the last result indicated there is 404 // a captive portal, the tab will be reloaded if it times out. 405 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 406 RESULT_INTERNET_CONNECTED); 407 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 408 tab_reloader().state()); 409 EXPECT_FALSE(tab_reloader().TimerRunning()); 410 411 // The error page commits, which should start an asynchronous reload. 412 tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 413 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 414 tab_reloader().state()); 415 416 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 417 base::MessageLoop::current()->RunUntilIdle(); 418 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 419} 420 421// Simulate the user logging in while the timer is still running. May happen 422// if the tab is reloaded just before logging in on another tab. 423TEST_F(CaptivePortalTabReloaderTest, LoginWhileTimerRunning) { 424 tab_reloader().OnLoadStart(true); 425 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 426 tab_reloader().state()); 427 EXPECT_TRUE(tab_reloader().TimerRunning()); 428 429 // The user has already logged in. 430 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 431 RESULT_INTERNET_CONNECTED); 432 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 433 tab_reloader().state()); 434 435 // The error page commits, which should start an asynchronous reload. 436 tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 437 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 438 tab_reloader().state()); 439 440 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 441 base::MessageLoop::current()->RunUntilIdle(); 442 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 443} 444 445// Simulate a captive portal being detected while the time is still running. 446// The captive portal check triggered by the timer detects the captive portal 447// again, and then the user logs in. 448TEST_F(CaptivePortalTabReloaderTest, BehindPortalResultWhileTimerRunning) { 449 tab_reloader().OnLoadStart(true); 450 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 451 tab_reloader().state()); 452 EXPECT_TRUE(tab_reloader().TimerRunning()); 453 454 // The user is behind a captive portal, but since the tab hasn't timed out, 455 // the message is ignored. 456 tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 457 RESULT_BEHIND_CAPTIVE_PORTAL); 458 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 459 tab_reloader().state()); 460 461 // The rest proceeds as normal. 462 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 463 base::MessageLoop::current()->RunUntilIdle(); 464 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 465 tab_reloader().state()); 466 467 // The captive portal service detects a captive portal, and this time the 468 // tab tries to create a login tab. 469 EXPECT_CALL(tab_reloader(), MaybeOpenCaptivePortalLoginTab()).Times(1); 470 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 471 RESULT_BEHIND_CAPTIVE_PORTAL); 472 EXPECT_EQ(CaptivePortalTabReloader::STATE_BROKEN_BY_PORTAL, 473 tab_reloader().state()); 474 EXPECT_FALSE(tab_reloader().TimerRunning()); 475 476 // The user logs on from another tab, and a captive portal check is triggered. 477 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 478 RESULT_INTERNET_CONNECTED); 479 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 480 tab_reloader().state()); 481 482 // The error page commits, which should start an asynchronous reload. 483 tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 484 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 485 tab_reloader().state()); 486 487 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 488 base::MessageLoop::current()->RunUntilIdle(); 489 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 490} 491 492// The CaptivePortalService detects the user has logged in to a captive portal 493// while the timer is still running, but the original load succeeds, so no 494// reload is done. 495TEST_F(CaptivePortalTabReloaderTest, LogInWhileTimerRunningNoError) { 496 tab_reloader().OnLoadStart(true); 497 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 498 tab_reloader().state()); 499 EXPECT_TRUE(tab_reloader().TimerRunning()); 500 501 // The user has already logged in. 502 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 503 RESULT_INTERNET_CONNECTED); 504 EXPECT_FALSE(tab_reloader().TimerRunning()); 505 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 506 tab_reloader().state()); 507 508 // The page successfully commits, so no reload is triggered. 509 tab_reloader().OnLoadCommitted(net::OK); 510 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 511} 512 513// Simulate the login process when there's an SSL certificate error. 514TEST_F(CaptivePortalTabReloaderTest, SSLCertErrorLogin) { 515 tab_reloader().OnLoadStart(true); 516 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 517 tab_reloader().state()); 518 519 // The load is interrupted by an interstitial page. The interstitial page 520 // is created after the TabReloader is notified. 521 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()); 522 net::SSLInfo ssl_info; 523 ssl_info.SetCertError(net::CERT_STATUS_COMMON_NAME_INVALID); 524 tab_reloader().OnSSLCertError(ssl_info); 525 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 526 tab_reloader().state()); 527 EXPECT_FALSE(tab_reloader().TimerRunning()); 528 // The MockInterstitialPageDelegate will cleaned up by the WebContents. 529 new MockInterstitialPageDelegate(web_contents()); 530 531 // Captive portal probe finds a captive portal. 532 EXPECT_CALL(tab_reloader(), MaybeOpenCaptivePortalLoginTab()).Times(1); 533 tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 534 RESULT_BEHIND_CAPTIVE_PORTAL); 535 536 // The user logs in. Since the interstitial is showing, the page should 537 // be reloaded, despite still having a provisional load. 538 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 539 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 540 RESULT_INTERNET_CONNECTED); 541} 542 543// Simulate an HTTP redirect to HTTPS, when the Internet is connected. 544TEST_F(CaptivePortalTabReloaderTest, HttpToHttpsRedirectInternetConnected) { 545 tab_reloader().OnLoadStart(false); 546 // There should be no captive portal check pending. 547 base::MessageLoop::current()->RunUntilIdle(); 548 549 // HTTP to HTTPS redirect. 550 tab_reloader().OnRedirect(true); 551 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 552 tab_reloader().state()); 553 EXPECT_TRUE(tab_reloader().TimerRunning()); 554 555 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 556 base::MessageLoop::current()->RunUntilIdle(); 557 EXPECT_FALSE(tab_reloader().TimerRunning()); 558 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 559 tab_reloader().state()); 560 561 tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 562 RESULT_INTERNET_CONNECTED); 563 564 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 565 EXPECT_FALSE(tab_reloader().TimerRunning()); 566 567 tab_reloader().OnLoadCommitted(net::OK); 568 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 569} 570 571// Simulate an HTTP redirect to HTTPS and subsequent Login, when the user logs 572// in before the original page commits. 573TEST_F(CaptivePortalTabReloaderTest, HttpToHttpsRedirectLogin) { 574 tab_reloader().OnLoadStart(false); 575 // There should be no captive portal check pending. 576 base::MessageLoop::current()->RunUntilIdle(); 577 578 // HTTP to HTTPS redirect. 579 tab_reloader().OnRedirect(true); 580 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 581 tab_reloader().state()); 582 583 EXPECT_CALL(tab_reloader(), CheckForCaptivePortal()).Times(1); 584 base::MessageLoop::current()->RunUntilIdle(); 585 EXPECT_FALSE(tab_reloader().TimerRunning()); 586 EXPECT_EQ(CaptivePortalTabReloader::STATE_MAYBE_BROKEN_BY_PORTAL, 587 tab_reloader().state()); 588 589 // The captive portal service detects a captive portal. The TabReloader 590 // should try and create a new login tab in response. 591 EXPECT_CALL(tab_reloader(), MaybeOpenCaptivePortalLoginTab()).Times(1); 592 tab_reloader().OnCaptivePortalResults(RESULT_INTERNET_CONNECTED, 593 RESULT_BEHIND_CAPTIVE_PORTAL); 594 EXPECT_EQ(CaptivePortalTabReloader::STATE_BROKEN_BY_PORTAL, 595 tab_reloader().state()); 596 EXPECT_FALSE(tab_reloader().TimerRunning()); 597 598 // The user logs on from another tab, and a captive portal check is triggered. 599 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 600 RESULT_INTERNET_CONNECTED); 601 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 602 tab_reloader().state()); 603 604 // The error page commits, which should start an asynchronous reload. 605 tab_reloader().OnLoadCommitted(net::ERR_CONNECTION_TIMED_OUT); 606 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 607 tab_reloader().state()); 608 609 EXPECT_CALL(tab_reloader(), ReloadTab()).Times(1); 610 base::MessageLoop::current()->RunUntilIdle(); 611 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 612} 613 614// Simulate the case where an HTTPs page redirects to an HTTPS page, before 615// the timer triggers. 616TEST_F(CaptivePortalTabReloaderTest, HttpsToHttpRedirect) { 617 tab_reloader().OnLoadStart(true); 618 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 619 tab_reloader().state()); 620 621 tab_reloader().OnRedirect(false); 622 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 623 EXPECT_FALSE(tab_reloader().TimerRunning()); 624 625 // There should be no captive portal check pending after the redirect. 626 base::MessageLoop::current()->RunUntilIdle(); 627 628 // Logging in shouldn't do anything. 629 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 630 RESULT_INTERNET_CONNECTED); 631 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 632} 633 634// Check that an HTTPS to HTTPS redirect results in no timer running. 635TEST_F(CaptivePortalTabReloaderTest, HttpsToHttpsRedirect) { 636 tab_reloader().OnLoadStart(true); 637 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 638 tab_reloader().state()); 639 640 tab_reloader().OnRedirect(true); 641 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, 642 tab_reloader().state()); 643 EXPECT_FALSE(tab_reloader().TimerRunning()); 644 // Nothing should happen. 645 base::MessageLoop::current()->RunUntilIdle(); 646} 647 648// Check that an HTTPS to HTTP to HTTPS redirect results in no timer running. 649TEST_F(CaptivePortalTabReloaderTest, HttpsToHttpToHttpsRedirect) { 650 tab_reloader().OnLoadStart(true); 651 EXPECT_EQ(CaptivePortalTabReloader::STATE_TIMER_RUNNING, 652 tab_reloader().state()); 653 654 tab_reloader().OnRedirect(false); 655 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 656 EXPECT_FALSE(tab_reloader().TimerRunning()); 657 658 tab_reloader().OnRedirect(true); 659 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, 660 tab_reloader().state()); 661 EXPECT_FALSE(tab_reloader().TimerRunning()); 662 // Nothing should happen. 663 base::MessageLoop::current()->RunUntilIdle(); 664} 665 666// Check that an HTTP to HTTP redirect results in the timer not running. 667TEST_F(CaptivePortalTabReloaderTest, HttpToHttpRedirect) { 668 tab_reloader().OnLoadStart(false); 669 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 670 671 tab_reloader().OnRedirect(false); 672 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 673 EXPECT_FALSE(tab_reloader().TimerRunning()); 674 675 // There should be no captive portal check pending after the redirect. 676 base::MessageLoop::current()->RunUntilIdle(); 677 678 // Logging in shouldn't do anything. 679 tab_reloader().OnCaptivePortalResults(RESULT_BEHIND_CAPTIVE_PORTAL, 680 RESULT_INTERNET_CONNECTED); 681 EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE, tab_reloader().state()); 682} 683 684} // namespace captive_portal 685