1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <algorithm> 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/command_line.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/histogram_base.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/histogram_samples.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/statistics_recorder.h" 15a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/net/network_portal_detector_impl.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/net/network_portal_detector_test_utils.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/chromeos_switches.h" 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/dbus/shill_device_client.h" 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/dbus/shill_service_client.h" 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_state.h" 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_state_handler.h" 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/portal_detector/network_portal_detector_strategy.h" 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "components/captive_portal/captive_portal_detector.h" 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "components/captive_portal/captive_portal_testing_utils.h" 28a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "dbus/object_path.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using testing::AnyNumber; 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using testing::Mock; 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using testing::_; 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace { 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Service path / guid for stub networks. 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kStubEthernet[] = "stub_ethernet"; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kStubWireless1[] = "stub_wifi1"; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kStubWireless2[] = "stub_wifi2"; 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kStubCellular[] = "stub_cellular"; 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ErrorCallbackFunction(const std::string& error_name, 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string& error_message) { 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class MockObserver : public NetworkPortalDetector::Observer { 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~MockObserver() {} 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MOCK_METHOD2(OnPortalDetectionCompleted, 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void(const NetworkState* network, 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const NetworkPortalDetector::CaptivePortalState& state)); 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NetworkPortalDetectorImplTest 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public testing::Test, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public captive_portal::CaptivePortalDetectorTestBase { 68a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch protected: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CommandLine* cl = CommandLine::ForCurrentProcess(); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cl->AppendSwitch(switches::kDisableNetworkPortalNotification); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DBusThreadManager::Initialize(); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StatisticsRecorder::Initialize(); 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetupNetworkHandler(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(new TestingProfile()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_portal_detector_.reset( 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new NetworkPortalDetectorImpl(profile_->GetRequestContext())); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_portal_detector_->Enable(false); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_detector(network_portal_detector_->captive_portal_detector_.get()); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prevents flakiness due to message loop delays. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_time_ticks(base::TimeTicks::Now()); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (base::HistogramBase* histogram = 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::StatisticsRecorder::FindHistogram( 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "CaptivePortal.OOBE.DetectionResult")) { 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) original_samples_.reset(histogram->SnapshotSamples().release()); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) network_portal_detector_.reset(); 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile_.reset(); 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkHandler::Shutdown(); 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DBusThreadManager::Shutdown(); 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PortalDetectorStrategy::reset_fields_for_testing(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CheckPortalState(NetworkPortalDetector::CaptivePortalStatus status, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int response_code, 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& guid) { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkPortalDetector::CaptivePortalState state = 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch network_portal_detector()->GetCaptivePortalState(guid); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(status, state.status); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(response_code, state.response_code); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void CheckRequestTimeoutAndCompleteAttempt( 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int expected_same_detection_result_count, 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int expected_no_response_result_count, 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int expected_request_timeout_sec, 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int net_error, 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int status_code) { 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(expected_same_detection_result_count, 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) same_detection_result_count()); 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(expected_no_response_result_count, no_response_result_count()); 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(base::TimeDelta::FromSeconds(expected_request_timeout_sec), 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) get_next_attempt_timeout()); 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CompleteURLFetch(net_error, status_code, NULL); 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile() { return profile_.get(); } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkPortalDetectorImpl* network_portal_detector() { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return network_portal_detector_.get(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkPortalDetectorImpl::State state() { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return network_portal_detector()->state(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool start_detection_if_idle() { 13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return network_portal_detector()->StartDetectionIfIdle(); 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void enable_error_screen_strategy() { 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) network_portal_detector()->SetStrategy( 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PortalDetectorStrategy::STRATEGY_ID_ERROR_SCREEN); 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void disable_error_screen_strategy() { 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) network_portal_detector()->SetStrategy( 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void stop_detection() { network_portal_detector()->StopDetection(); } 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool attempt_timeout_is_cancelled() { 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return network_portal_detector()->AttemptTimeoutIsCancelledForTesting(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta get_next_attempt_timeout() { 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return network_portal_detector()->strategy_->GetNextAttemptTimeout(); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_next_attempt_timeout(const base::TimeDelta& timeout) { 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PortalDetectorStrategy::set_next_attempt_timeout_for_testing(timeout); 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_state_idle() { 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (NetworkPortalDetectorImpl::STATE_IDLE == state()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_state_portal_detection_pending() { 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (NetworkPortalDetectorImpl::STATE_PORTAL_CHECK_PENDING == state()); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_state_checking_for_portal() { 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (NetworkPortalDetectorImpl::STATE_CHECKING_FOR_PORTAL == state()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta& next_attempt_delay() { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return network_portal_detector()->next_attempt_delay_for_testing(); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int same_detection_result_count() { 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return network_portal_detector()->same_detection_result_count_for_testing(); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int no_response_result_count() { 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return network_portal_detector()->no_response_result_count_for_testing(); 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void set_no_response_result_count(int count) { 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) network_portal_detector()->set_no_response_result_count_for_testing(count); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_delay_till_next_attempt(const base::TimeDelta& delta) { 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PortalDetectorStrategy::set_delay_till_next_attempt_for_testing(delta); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_time_ticks(const base::TimeTicks& time_ticks) { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_portal_detector()->set_time_ticks_for_testing(time_ticks); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetBehindPortal(const std::string& service_path) { 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) dbus::ObjectPath(service_path), 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) shill::kStateProperty, 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::StringValue(shill::kStatePortal), 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&base::DoNothing), 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&ErrorCallbackFunction)); 207a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetNetworkDeviceEnabled(const std::string& type, bool enabled) { 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled( 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NetworkTypePattern::Primitive(type), 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) enabled, 21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) network_handler::ErrorCallback()); 215a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetConnected(const std::string& service_path) { 2193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch DBusThreadManager::Get()->GetShillServiceClient()->Connect( 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) dbus::ObjectPath(service_path), 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&base::DoNothing), 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&ErrorCallbackFunction)); 223a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetDisconnected(const std::string& service_path) { 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()->Disconnect( 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dbus::ObjectPath(service_path), 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&*base::DoNothing), 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&ErrorCallbackFunction)); 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<EnumHistogramChecker> MakeResultHistogramChecker() { 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return scoped_ptr<EnumHistogramChecker>( 236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new EnumHistogramChecker( 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "CaptivePortal.OOBE.DetectionResult", 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT, 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch original_samples_.get())); 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void AddService(const std::string& network_id, 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& type) { 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface()-> 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddService(network_id /* service_path */, 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch network_id /* guid */, 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch network_id /* name */, 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch type, 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch shill::kStateIdle, 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true /* add_to_visible */); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetupDefaultShillState() { 255a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface()-> 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ClearServices(); 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddService(kStubEthernet, shill::kTypeEthernet); 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddService(kStubWireless1, shill::kTypeWifi); 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddService(kStubWireless2, shill::kTypeWifi); 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AddService(kStubCellular, shill::kTypeCellular); 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetupNetworkHandler() { 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetupDefaultShillState(); 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkHandler::Initialize(); 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 269a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch content::TestBrowserThreadBundle thread_bundle_; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<NetworkPortalDetectorImpl> network_portal_detector_; 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::HistogramSamples> original_samples_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, NoPortal) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_idle()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1); 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, Portal) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_idle()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check HTTP 200 response code. 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 200, NULL); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check HTTP 301 response code. 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless2); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 301, NULL); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 301, kStubWireless2); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check HTTP 302 response code. 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubEthernet); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 302, NULL); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 302, kStubEthernet); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 3) 331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, Online2Offline) { 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(is_state_idle()); 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MockObserver observer; 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) network_portal_detector()->AddObserver(&observer); 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CaptivePortalState offline_state; 341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) offline_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE; 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // WiFi is in online state. 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // When transitioning to a connected state, the network will transition to 346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // connecting states which will set the default network to NULL. This may 347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // get triggered multiple times. 348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(observer, OnPortalDetectionCompleted(_, offline_state)) 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .Times(AnyNumber()); 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Expect a single transition to an online state. 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CaptivePortalState online_state; 353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE; 354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) online_state.response_code = 204; 355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(observer, OnPortalDetectionCompleted(_, online_state)).Times(1); 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetConnected(kStubWireless1); 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check that observer was notified about online state. 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer); 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // WiFi is turned off. 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(observer, OnPortalDetectionCompleted(NULL, offline_state)) 370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .Times(1); 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetDisconnected(kStubWireless1); 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(is_state_idle()); 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check that observer was notified about offline state. 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer); 377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) network_portal_detector()->RemoveObserver(&observer); 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, TwoNetworks) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_idle()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // WiFi is in portal state. 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 200, NULL); 3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubEthernet); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ethernet is in online state. 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubEthernet); 405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1); 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1) 412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_idle()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WiFi is in portal state. 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fetcher()->set_response_code(200); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Active network is changed during portal detection for WiFi. 42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubEthernet); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Portal detection for WiFi is cancelled, portal detection for 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ethernet is initiated. 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ethernet is in online state. 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubEthernet); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // As active network was changed during portal detection for wifi 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // network, it's state must be unknown. 439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1); 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, NetworkStateNotChanged) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_idle()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(is_state_idle()); 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, NetworkStateChanged) { 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test for Portal -> Online -> Portal network state transitions. 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetBehindPortal(kStubWireless1); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 200, NULL); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 49190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetBehindPortal(kStubWireless1); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 200, NULL); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1); 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 2) 504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, PortalDetectionTimeout) { 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For instantaneous timeout. 511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_next_attempt_timeout(base::TimeDelta::FromSeconds(0)); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(0, same_detection_result_count()); 5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(0, no_response_result_count()); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 518a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First portal detection timeouts, next portal detection is 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // scheduled. 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1, no_response_result_count()); 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(MakeResultHistogramChecker()->Check()); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, PortalDetectionRetryAfter) { 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 101\n\n"; 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(0, no_response_result_count()); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 53690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 503, retry_after); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First portal detection completed, next portal detection is 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // scheduled after 101 seconds. 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 5435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1, no_response_result_count()); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(base::TimeDelta::FromSeconds(101), next_attempt_delay()); 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(MakeResultHistogramChecker()->Check()); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, PortalDetectorRetryAfterIsSmall) { 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 1\n\n"; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(0, no_response_result_count()); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 503, retry_after); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First portal detection completed, next portal detection is 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // scheduled after 3 seconds (due to minimum time between detection 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // attemps). 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1, no_response_result_count()); 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(MakeResultHistogramChecker()->Check()); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, FirstAttemptFailed) { 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n"; 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(0, no_response_result_count()); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 503, retry_after); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1, no_response_result_count()); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay()); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 586a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(0, no_response_result_count()); 591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1); 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, AllAttemptsFailed) { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n"; 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(0, no_response_result_count()); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 503, retry_after); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1, no_response_result_count()); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay()); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 617a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 503, retry_after); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(2, no_response_result_count()); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay()); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 625a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 503, retry_after); 6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(3, no_response_result_count()); 630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 503, 63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kStubWireless1); 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1) 637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, ProxyAuthRequired) { 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 407, NULL); 6465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1, no_response_result_count()); 647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CompleteURLFetch(net::OK, 407, NULL); 6515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(2, no_response_result_count()); 652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CompleteURLFetch(net::OK, 407, NULL); 6565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(3, no_response_result_count()); 6575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckPortalState( 660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 407, 66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kStubWireless1); 6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(MakeResultHistogramChecker() 665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector:: 666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1) 668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, NoResponseButBehindPortal) { 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetBehindPortal(kStubWireless1); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CompleteURLFetch( 679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL); 6805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1, no_response_result_count()); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 684a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CompleteURLFetch( 687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL); 6885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(2, no_response_result_count()); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 692a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CompleteURLFetch( 695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL); 6965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(3, no_response_result_count()); 6975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLFetcher::RESPONSE_CODE_INVALID, 70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kStubWireless1); 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 703a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1) 706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, 710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DisableErrorScreenStrategyWhilePendingRequest) { 711ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(is_state_idle()); 7125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) set_no_response_result_count(3); 713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enable_error_screen_strategy(); 714ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(is_state_portal_detection_pending()); 715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) disable_error_screen_strategy(); 716ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 717ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // To run CaptivePortalDetector::DetectCaptivePortal(). 718ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::MessageLoop::current()->RunUntilIdle(); 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(MakeResultHistogramChecker()->Check()); 721ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 722ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, ErrorScreenStrategyForOnlineNetwork) { 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enable_error_screen_strategy(); 729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckPortalState( 735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 738a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckPortalState( 744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 747a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) disable_error_screen_strategy(); 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckPortalState( 758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1); 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, ErrorScreenStrategyForPortalNetwork) { 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enable_error_screen_strategy(); 77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CompleteURLFetch( 774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL); 7755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(1, no_response_result_count()); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 777a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 778a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1); 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 781a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CompleteURLFetch( 784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL); 7855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(2, no_response_result_count()); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 791a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteURLFetch(net::OK, 200, NULL); 7945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(0, no_response_result_count()); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1); 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // To run CaptivePortalDetector::DetectCaptivePortal(). 800a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) disable_error_screen_strategy(); 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 806a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1); 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1) 811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, DetectionTimeoutIsCancelled) { 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 821a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) stop_detection(); 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(attempt_timeout_is_cancelled()); 827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1); 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(MakeResultHistogramChecker()->Check()); 83190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 83290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 83390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, TestDetectionRestart) { 83490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 83790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // First portal detection attempts determines ONLINE state. 83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 83990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 84090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(start_detection_if_idle()); 84190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 84290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CompleteURLFetch(net::OK, 204, NULL); 84390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1); 8465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 84790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 84890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // First portal detection attempts determines PORTAL state. 84990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 85090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 851a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_checking_for_portal()); 85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CompleteURLFetch(net::OK, 200, NULL); 85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 855a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckPortalState( 856a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1); 8575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 861a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 862a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1) 863a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 86590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 86690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts) { 86790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 86990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 87068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SetNetworkDeviceEnabled(shill::kTypeWifi, false); 87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubCellular); 87290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 87390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // First portal detection attempt for cellular1 uses 5sec timeout. 874a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 8755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_same_detection_result_count */, 8765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_no_response_result_count */, 8775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5 /* expected_request_timeout_sec */, 8785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::ERR_CONNECTION_CLOSED, 8795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLFetcher::RESPONSE_CODE_INVALID); 88090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 88190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Second portal detection attempt for cellular1 uses 10sec timeout. 88290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 883a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 8845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 8855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1 /* expected_same_detection_result_count */, 8865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1 /* expected_no_response_result_count */, 8875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 10 /* expected_request_timeout_sec */, 8885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::ERR_CONNECTION_CLOSED, 8895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLFetcher::RESPONSE_CODE_INVALID); 89090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Third portal detection attempt for cellular1 uses 15sec timeout. 89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 893a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 8945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 8955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2 /* expected_same_detection_result_count */, 8965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2 /* expected_no_response_result_count */, 8975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 15 /* expected_request_timeout_sec */, 8985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::ERR_CONNECTION_CLOSED, 8995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLFetcher::RESPONSE_CODE_INVALID); 90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 90290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Check that on the error screen 15sec timeout is used. 904a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enable_error_screen_strategy(); 90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 906a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 9075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 9085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_same_detection_result_count */, 9095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_no_response_result_count */, 9105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 15 /* expected_request_timeout_sec */, 9115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::ERR_CONNECTION_CLOSED, 9125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLFetcher::RESPONSE_CODE_INVALID); 913a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) disable_error_screen_strategy(); 914a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 91590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 91668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SetNetworkDeviceEnabled(shill::kTypeWifi, true); 91790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 91990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // First portal detection attempt for wifi1 uses 5sec timeout. 920a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 9215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_same_detection_result_count */, 9225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_no_response_result_count */, 9235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5 /* expected_request_timeout_sec */, 9245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::ERR_CONNECTION_CLOSED, 9255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLFetcher::RESPONSE_CODE_INVALID); 92690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 92790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Second portal detection attempt for wifi1 also uses 5sec timeout. 92890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 929a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 9305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 9315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1 /* expected_same_detection_result_count */, 9325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1 /* expected_no_response_result_count */, 9335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 10 /* expected_request_timeout_sec */, 9345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::OK, 9355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 204); 9365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 93790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 938a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Check that in error screen strategy detection for wifi1 15sec 939a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // timeout is used. 940a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enable_error_screen_strategy(); 94190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 942a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 9435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 9445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_same_detection_result_count */, 9455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_no_response_result_count */, 9465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 15 /* expected_request_timeout_sec */, 9475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::OK, 9485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 204); 949a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) disable_error_screen_strategy(); 950a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 952a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 953a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 954a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1) 955a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 956a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 95790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 95890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts2) { 96090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_idle()); 961a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_delay_till_next_attempt(base::TimeDelta()); 96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetConnected(kStubWireless1); 96390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // First portal detection attempt for wifi1 uses 5sec timeout. 965a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 9665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_same_detection_result_count */, 9675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_no_response_result_count */, 9685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5 /* expected_request_timeout_sec */, 9695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::ERR_CONNECTION_CLOSED, 9705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLFetcher::RESPONSE_CODE_INVALID); 97190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 972a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 97490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Second portal detection attempt for wifi1 uses 10sec timeout. 9755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 9765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1 /* expected_same_detection_result_count */, 9775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1 /* expected_no_response_result_count */, 9785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 10 /* expected_request_timeout_sec */, 9795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::ERR_CONNECTION_CLOSED, 9805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLFetcher::RESPONSE_CODE_INVALID); 98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 982a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 98490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Second portal detection attempt for wifi1 uses 15sec timeout. 9855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 9865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2 /* expected_same_detection_result_count */, 9875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2 /* expected_no_response_result_count */, 9885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 15 /* expected_request_timeout_sec */, 9895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::ERR_CONNECTION_CLOSED, 9905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::URLFetcher::RESPONSE_CODE_INVALID); 9915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(is_state_portal_detection_pending()); 99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Third portal detection attempt for wifi1 uses 20sec timeout. 995a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 9965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 9975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3 /* expected_same_detection_result_count */, 9985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3 /* expected_no_response_result_count */, 9995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 20 /* expected_request_timeout_sec */, 10005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::OK, 10015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 204); 10025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 10035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 10045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Fourth portal detection attempt for wifi1 uses 5sec timeout. 10055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 10065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckRequestTimeoutAndCompleteAttempt( 10075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1 /* expected_same_detection_result_count */, 10085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 0 /* expected_no_response_result_count */, 10095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5 /* expected_request_timeout_sec */, 10105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::OK, 10115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 204); 10125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(is_state_idle()); 10135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1014a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE( 1015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MakeResultHistogramChecker() 1016a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1) 1017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) 1018a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ->Check()); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 1022