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