Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / net / network_portal_detector_impl_unittest.cc
index 1635c3e..6835bb4 100644 (file)
@@ -5,6 +5,7 @@
 #include <algorithm>
 #include <vector>
 
+#include "base/command_line.h"
 #include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/metrics/histogram_samples.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/run_loop.h"
-#include "chrome/browser/captive_portal/captive_portal_detector.h"
-#include "chrome/browser/captive_portal/testing_utils.h"
 #include "chrome/browser/chromeos/net/network_portal_detector_impl.h"
+#include "chrome/browser/chromeos/net/network_portal_detector_test_utils.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/chromeos_switches.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/shill_device_client.h"
 #include "chromeos/dbus/shill_service_client.h"
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
-#include "chromeos/network/shill_property_util.h"
+#include "chromeos/network/portal_detector/network_portal_detector_strategy.h"
+#include "components/captive_portal/captive_portal_detector.h"
+#include "components/captive_portal/captive_portal_testing_utils.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "dbus/object_path.h"
 #include "net/base/net_errors.h"
@@ -29,6 +32,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
+using testing::AnyNumber;
 using testing::Mock;
 using testing::_;
 
@@ -36,7 +40,7 @@ namespace chromeos {
 
 namespace {
 
-// Service paths for stub network devices.
+// Service path / guid for stub networks.
 const char kStubEthernet[] = "stub_ethernet";
 const char kStubWireless1[] = "stub_wifi1";
 const char kStubWireless2[] = "stub_wifi2";
@@ -56,68 +60,6 @@ class MockObserver : public NetworkPortalDetector::Observer {
                     const NetworkPortalDetector::CaptivePortalState& state));
 };
 
-class ResultHistogramChecker {
- public:
-  explicit ResultHistogramChecker(base::HistogramSamples* base)
-      : base_(base),
-        count_(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT) {
-  }
-  virtual ~ResultHistogramChecker() {}
-
-  ResultHistogramChecker* Expect(
-      NetworkPortalDetector::CaptivePortalStatus status,
-      int count) {
-    count_[status] = count;
-    return this;
-  }
-
-  bool Check() const {
-    base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram(
-        NetworkPortalDetectorImpl::kDetectionResultHistogram);
-    bool empty = false;
-    if (static_cast<size_t>(std::count(count_.begin(), count_.end(), 0)) ==
-        count_.size()) {
-      empty = true;
-    }
-
-    if (!histogram) {
-      if (empty)
-        return true;
-      LOG(ERROR) << "Can't get histogram for "
-                 << NetworkPortalDetectorImpl::kDetectionResultHistogram;
-      return false;
-    }
-    scoped_ptr<base::HistogramSamples> samples = histogram->SnapshotSamples();
-    if (!samples.get()) {
-      if (empty)
-        return true;
-      LOG(ERROR) << "Can't get samples for "
-                 << NetworkPortalDetectorImpl::kDetectionResultHistogram;
-      return false;
-    }
-    bool ok = true;
-    for (size_t i = 0; i < count_.size(); ++i) {
-      const int base = base_ ? base_->GetCount(i) : 0;
-      const int actual = samples->GetCount(i) - base;
-      const NetworkPortalDetector::CaptivePortalStatus status =
-          static_cast<NetworkPortalDetector::CaptivePortalStatus>(i);
-      if (actual != count_[i]) {
-        LOG(ERROR) << "Expected: " << count_[i] << ", "
-                   << "actual: " << actual << " for "
-                   << NetworkPortalDetector::CaptivePortalStatusString(status);
-        ok = false;
-      }
-    }
-    return ok;
-  }
-
- private:
-  base::HistogramSamples* base_;
-  std::vector<int> count_;
-
-  DISALLOW_COPY_AND_ASSIGN(ResultHistogramChecker);
-};
-
 }  // namespace
 
 class NetworkPortalDetectorImplTest
@@ -125,6 +67,9 @@ class NetworkPortalDetectorImplTest
       public captive_portal::CaptivePortalDetectorTestBase {
  protected:
   virtual void SetUp() {
+    CommandLine* cl = CommandLine::ForCurrentProcess();
+    cl->AppendSwitch(switches::kDisableNetworkPortalNotification);
+
     DBusThreadManager::InitializeWithStub();
     base::StatisticsRecorder::Initialize();
     SetupNetworkHandler();
@@ -140,8 +85,8 @@ class NetworkPortalDetectorImplTest
     set_time_ticks(base::TimeTicks::Now());
 
     if (base::HistogramBase* histogram =
-        base::StatisticsRecorder::FindHistogram(
-            NetworkPortalDetectorImpl::kDetectionResultHistogram)) {
+            base::StatisticsRecorder::FindHistogram(
+                "CaptivePortal.OOBE.DetectionResult")) {
       original_samples_.reset(histogram->SnapshotSamples().release());
     }
   }
@@ -151,28 +96,30 @@ class NetworkPortalDetectorImplTest
     profile_.reset();
     NetworkHandler::Shutdown();
     DBusThreadManager::Shutdown();
+    PortalDetectorStrategy::reset_fields_for_testing();
   }
 
   void CheckPortalState(NetworkPortalDetector::CaptivePortalStatus status,
                         int response_code,
-                        const std::string& network_service_path) {
-    const NetworkState* network =
-        NetworkHandler::Get()->network_state_handler()->GetNetworkState(
-            network_service_path);
+                        const std::string& guid) {
     NetworkPortalDetector::CaptivePortalState state =
-        network_portal_detector()->GetCaptivePortalState(network);
+        network_portal_detector()->GetCaptivePortalState(guid);
     ASSERT_EQ(status, state.status);
     ASSERT_EQ(response_code, state.response_code);
   }
 
   void CheckRequestTimeoutAndCompleteAttempt(
-      int expected_attempt_count,
+      int expected_same_detection_result_count,
+      int expected_no_response_result_count,
       int expected_request_timeout_sec,
       int net_error,
       int status_code) {
     ASSERT_TRUE(is_state_checking_for_portal());
-    ASSERT_EQ(expected_attempt_count, attempt_count());
-    ASSERT_EQ(expected_request_timeout_sec, get_request_timeout_sec());
+    ASSERT_EQ(expected_same_detection_result_count,
+              same_detection_result_count());
+    ASSERT_EQ(expected_no_response_result_count, no_response_result_count());
+    ASSERT_EQ(base::TimeDelta::FromSeconds(expected_request_timeout_sec),
+              get_next_attempt_timeout());
     CompleteURLFetch(net_error, status_code, NULL);
   }
 
@@ -190,25 +137,28 @@ class NetworkPortalDetectorImplTest
     return network_portal_detector()->StartDetectionIfIdle();
   }
 
-  void enable_lazy_detection() {
-    network_portal_detector()->EnableLazyDetection();
+  void enable_error_screen_strategy() {
+    network_portal_detector()->SetStrategy(
+        PortalDetectorStrategy::STRATEGY_ID_ERROR_SCREEN);
   }
 
-  void disable_lazy_detection() {
-    network_portal_detector()->DisableLazyDetection();
+  void disable_error_screen_strategy() {
+    network_portal_detector()->SetStrategy(
+        PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN);
   }
 
-  void cancel_portal_detection() {
-    network_portal_detector()->CancelPortalDetection();
+  void stop_detection() { network_portal_detector()->StopDetection(); }
+
+  bool attempt_timeout_is_cancelled() {
+    return network_portal_detector()->AttemptTimeoutIsCancelledForTesting();
   }
 
-  bool detection_timeout_is_cancelled() {
-    return
-        network_portal_detector()->DetectionTimeoutIsCancelledForTesting();
+  base::TimeDelta get_next_attempt_timeout() {
+    return network_portal_detector()->strategy_->GetNextAttemptTimeout();
   }
 
-  int get_request_timeout_sec() {
-    return network_portal_detector()->GetRequestTimeoutSec();
+  void set_next_attempt_timeout(const base::TimeDelta& timeout) {
+    PortalDetectorStrategy::set_next_attempt_timeout_for_testing(timeout);
   }
 
   bool is_state_idle() {
@@ -223,28 +173,24 @@ class NetworkPortalDetectorImplTest
     return (NetworkPortalDetectorImpl::STATE_CHECKING_FOR_PORTAL == state());
   }
 
-  void set_request_timeout(const base::TimeDelta& timeout) {
-    network_portal_detector()->set_request_timeout_for_testing(timeout);
-  }
-
   const base::TimeDelta& next_attempt_delay() {
     return network_portal_detector()->next_attempt_delay_for_testing();
   }
 
-  int attempt_count() {
-    return network_portal_detector()->attempt_count_for_testing();
+  int same_detection_result_count() {
+    return network_portal_detector()->same_detection_result_count_for_testing();
   }
 
-  void set_attempt_count(int ac) {
-    return network_portal_detector()->set_attempt_count_for_testing(ac);
+  int no_response_result_count() {
+    return network_portal_detector()->no_response_result_count_for_testing();
   }
 
-  void set_min_time_between_attempts(const base::TimeDelta& delta) {
-    network_portal_detector()->set_min_time_between_attempts_for_testing(delta);
+  void set_no_response_result_count(int count) {
+    network_portal_detector()->set_no_response_result_count_for_testing(count);
   }
 
-  void set_lazy_check_interval(const base::TimeDelta& delta) {
-    network_portal_detector()->set_lazy_check_interval_for_testing(delta);
+  void set_delay_till_next_attempt(const base::TimeDelta& delta) {
+    PortalDetectorStrategy::set_delay_till_next_attempt_for_testing(delta);
   }
 
   void set_time_ticks(const base::TimeTicks& time_ticks) {
@@ -254,8 +200,10 @@ class NetworkPortalDetectorImplTest
   void SetBehindPortal(const std::string& service_path) {
     DBusThreadManager::Get()->GetShillServiceClient()->SetProperty(
         dbus::ObjectPath(service_path),
-        shill::kStateProperty, base::StringValue(shill::kStatePortal),
-        base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction));
+        shill::kStateProperty,
+        base::StringValue(shill::kStatePortal),
+        base::Bind(&base::DoNothing),
+        base::Bind(&ErrorCallbackFunction));
     base::RunLoop().RunUntilIdle();
   }
 
@@ -270,46 +218,47 @@ class NetworkPortalDetectorImplTest
   void SetConnected(const std::string& service_path) {
     DBusThreadManager::Get()->GetShillServiceClient()->Connect(
         dbus::ObjectPath(service_path),
-        base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction));
+        base::Bind(&base::DoNothing),
+        base::Bind(&ErrorCallbackFunction));
     base::RunLoop().RunUntilIdle();
   }
 
   void SetDisconnected(const std::string& service_path) {
     DBusThreadManager::Get()->GetShillServiceClient()->Disconnect(
         dbus::ObjectPath(service_path),
-        base::Bind(&*base::DoNothing), base::Bind(&ErrorCallbackFunction));
+        base::Bind(&*base::DoNothing),
+        base::Bind(&ErrorCallbackFunction));
     base::RunLoop().RunUntilIdle();
   }
 
-  scoped_ptr<ResultHistogramChecker> MakeResultHistogramChecker() {
-    return scoped_ptr<ResultHistogramChecker>(
-        new ResultHistogramChecker(original_samples_.get())).Pass();
+  scoped_ptr<EnumHistogramChecker> MakeResultHistogramChecker() {
+    return scoped_ptr<EnumHistogramChecker>(
+               new EnumHistogramChecker(
+                   "CaptivePortal.OOBE.DetectionResult",
+                   NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT,
+                   original_samples_.get()));
   }
 
  private:
+  void AddService(const std::string& network_id,
+                  const std::string& type) {
+    DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface()->
+        AddService(network_id /* service_path */,
+                   network_id /* guid */,
+                   network_id /* name */,
+                   type,
+                   shill::kStateIdle,
+                   true /* add_to_visible */);
+  }
+
   void SetupDefaultShillState() {
     base::RunLoop().RunUntilIdle();
-    ShillServiceClient::TestInterface* service_test =
-        DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface();
-    service_test->ClearServices();
-    const bool add_to_visible = true;
-    const bool add_to_watchlist = true;
-    service_test->AddService(kStubEthernet,
-                             kStubEthernet,
-                             shill::kTypeEthernet, shill::kStateIdle,
-                             add_to_visible, add_to_watchlist);
-    service_test->AddService(kStubWireless1,
-                             kStubWireless1,
-                             shill::kTypeWifi, shill::kStateIdle,
-                             add_to_visible, add_to_watchlist);
-    service_test->AddService(kStubWireless2,
-                             kStubWireless2,
-                             shill::kTypeWifi, shill::kStateIdle,
-                             add_to_visible, add_to_watchlist);
-    service_test->AddService(kStubCellular,
-                             kStubCellular,
-                             shill::kTypeCellular, shill::kStateIdle,
-                             add_to_visible, add_to_watchlist);
+    DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface()->
+        ClearServices();
+    AddService(kStubEthernet, shill::kTypeEthernet);
+    AddService(kStubWireless1, shill::kTypeWifi);
+    AddService(kStubWireless2, shill::kTypeWifi);
+    AddService(kStubCellular, shill::kTypeCellular);
   }
 
   void SetupNetworkHandler() {
@@ -329,17 +278,18 @@ TEST_F(NetworkPortalDetectorImplTest, NoPortal) {
   SetConnected(kStubWireless1);
 
   ASSERT_TRUE(is_state_checking_for_portal());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
-                   kStubWireless1);
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1);
 
   CompleteURLFetch(net::OK, 204, NULL);
 
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-                   kStubWireless1);
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Check());
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1);
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, Portal) {
@@ -351,9 +301,9 @@ TEST_F(NetworkPortalDetectorImplTest, Portal) {
 
   CompleteURLFetch(net::OK, 200, NULL);
 
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
-                   kStubWireless1);
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1);
 
   // Check HTTP 301 response code.
   SetConnected(kStubWireless2);
@@ -361,9 +311,9 @@ TEST_F(NetworkPortalDetectorImplTest, Portal) {
 
   CompleteURLFetch(net::OK, 301, NULL);
 
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 301,
-                   kStubWireless2);
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 301, kStubWireless2);
 
   // Check HTTP 302 response code.
   SetConnected(kStubEthernet);
@@ -371,13 +321,14 @@ TEST_F(NetworkPortalDetectorImplTest, Portal) {
 
   CompleteURLFetch(net::OK, 302, NULL);
 
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 302,
-                   kStubEthernet);
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 302, kStubEthernet);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 3)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 3)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, Online2Offline) {
@@ -386,18 +337,28 @@ TEST_F(NetworkPortalDetectorImplTest, Online2Offline) {
   MockObserver observer;
   network_portal_detector()->AddObserver(&observer);
 
+  NetworkPortalDetector::CaptivePortalState offline_state;
+  offline_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE;
+
   // WiFi is in online state.
   {
-    NetworkPortalDetector::CaptivePortalState state;
-    state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
-    state.response_code = 204;
-    EXPECT_CALL(observer, OnPortalDetectionCompleted(_, state)).Times(1);
+    // When transitioning to a connected state, the network will transition to
+    // connecting states which will set the default network to NULL. This may
+    // get triggered multiple times.
+    EXPECT_CALL(observer, OnPortalDetectionCompleted(_, offline_state))
+        .Times(AnyNumber());
+
+    // Expect a single transition to an online state.
+    NetworkPortalDetector::CaptivePortalState online_state;
+    online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
+    online_state.response_code = 204;
+    EXPECT_CALL(observer, OnPortalDetectionCompleted(_, online_state)).Times(1);
 
     SetConnected(kStubWireless1);
     ASSERT_TRUE(is_state_checking_for_portal());
 
     CompleteURLFetch(net::OK, 204, NULL);
-    ASSERT_TRUE(is_state_idle());
+    ASSERT_FALSE(is_state_idle());
 
     // Check that observer was notified about online state.
     Mock::VerifyAndClearExpectations(&observer);
@@ -405,9 +366,8 @@ TEST_F(NetworkPortalDetectorImplTest, Online2Offline) {
 
   // WiFi is turned off.
   {
-    NetworkPortalDetector::CaptivePortalState state;
-    state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE;
-    EXPECT_CALL(observer, OnPortalDetectionCompleted(NULL, state)).Times(1);
+    EXPECT_CALL(observer, OnPortalDetectionCompleted(NULL, offline_state))
+        .Times(1);
 
     SetDisconnected(kStubWireless1);
     ASSERT_TRUE(is_state_idle());
@@ -418,9 +378,10 @@ TEST_F(NetworkPortalDetectorImplTest, Online2Offline) {
 
   network_portal_detector()->RemoveObserver(&observer);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, TwoNetworks) {
@@ -431,23 +392,24 @@ TEST_F(NetworkPortalDetectorImplTest, TwoNetworks) {
 
   // WiFi is in portal state.
   CompleteURLFetch(net::OK, 200, NULL);
-  ASSERT_TRUE(is_state_idle());
+  ASSERT_FALSE(is_state_idle());
 
   SetConnected(kStubEthernet);
   ASSERT_TRUE(is_state_checking_for_portal());
 
   // ethernet is in online state.
   CompleteURLFetch(net::OK, 204, NULL);
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-                   kStubEthernet);
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
-                   kStubWireless1);
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubEthernet);
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) {
@@ -468,18 +430,19 @@ TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) {
 
   // ethernet is in online state.
   CompleteURLFetch(net::OK, 204, NULL);
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-                   kStubEthernet);
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubEthernet);
 
   // As active network was changed during portal detection for wifi
   // network, it's state must be unknown.
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
-                   kStubWireless1);
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, NetworkStateNotChanged) {
@@ -490,16 +453,17 @@ TEST_F(NetworkPortalDetectorImplTest, NetworkStateNotChanged) {
 
   CompleteURLFetch(net::OK, 204, NULL);
 
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-                   kStubWireless1);
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1);
 
   SetConnected(kStubWireless1);
   ASSERT_TRUE(is_state_idle());
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, NetworkStateChanged) {
@@ -511,42 +475,44 @@ TEST_F(NetworkPortalDetectorImplTest, NetworkStateChanged) {
 
   CompleteURLFetch(net::OK, 200, NULL);
 
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
-                   kStubWireless1);
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1);
 
   SetConnected(kStubWireless1);
   ASSERT_TRUE(is_state_checking_for_portal());
 
   CompleteURLFetch(net::OK, 204, NULL);
 
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-                   kStubWireless1);
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1);
 
   SetBehindPortal(kStubWireless1);
   ASSERT_TRUE(is_state_checking_for_portal());
 
   CompleteURLFetch(net::OK, 200, NULL);
 
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
-                   kStubWireless1);
+  ASSERT_FALSE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 2)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 2)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, PortalDetectionTimeout) {
   ASSERT_TRUE(is_state_idle());
 
   // For instantaneous timeout.
-  set_request_timeout(base::TimeDelta::FromSeconds(0));
+  set_next_attempt_timeout(base::TimeDelta::FromSeconds(0));
 
   ASSERT_TRUE(is_state_idle());
-  ASSERT_EQ(0, attempt_count());
+  ASSERT_EQ(0, same_detection_result_count());
+  ASSERT_EQ(0, no_response_result_count());
 
   SetConnected(kStubWireless1);
   base::RunLoop().RunUntilIdle();
@@ -554,8 +520,7 @@ TEST_F(NetworkPortalDetectorImplTest, PortalDetectionTimeout) {
   // First portal detection timeouts, next portal detection is
   // scheduled.
   ASSERT_TRUE(is_state_portal_detection_pending());
-  ASSERT_EQ(1, attempt_count());
-  ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay());
+  ASSERT_EQ(1, no_response_result_count());
 
   ASSERT_TRUE(MakeResultHistogramChecker()->Check());
 }
@@ -566,15 +531,16 @@ TEST_F(NetworkPortalDetectorImplTest, PortalDetectionRetryAfter) {
   const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 101\n\n";
 
   ASSERT_TRUE(is_state_idle());
-  ASSERT_EQ(0, attempt_count());
+  ASSERT_EQ(0, no_response_result_count());
 
   SetConnected(kStubWireless1);
+  ASSERT_TRUE(is_state_checking_for_portal());
   CompleteURLFetch(net::OK, 503, retry_after);
 
   // First portal detection completed, next portal detection is
   // scheduled after 101 seconds.
   ASSERT_TRUE(is_state_portal_detection_pending());
-  ASSERT_EQ(1, attempt_count());
+  ASSERT_EQ(1, no_response_result_count());
   ASSERT_EQ(base::TimeDelta::FromSeconds(101), next_attempt_delay());
 
   ASSERT_TRUE(MakeResultHistogramChecker()->Check());
@@ -586,7 +552,7 @@ TEST_F(NetworkPortalDetectorImplTest, PortalDetectorRetryAfterIsSmall) {
   const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 1\n\n";
 
   ASSERT_TRUE(is_state_idle());
-  ASSERT_EQ(0, attempt_count());
+  ASSERT_EQ(0, no_response_result_count());
 
   SetConnected(kStubWireless1);
   CompleteURLFetch(net::OK, 503, retry_after);
@@ -595,8 +561,7 @@ TEST_F(NetworkPortalDetectorImplTest, PortalDetectorRetryAfterIsSmall) {
   // scheduled after 3 seconds (due to minimum time between detection
   // attemps).
   ASSERT_TRUE(is_state_portal_detection_pending());
-  ASSERT_EQ(1, attempt_count());
-  ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay());
+  ASSERT_EQ(1, no_response_result_count());
 
   ASSERT_TRUE(MakeResultHistogramChecker()->Check());
 }
@@ -604,47 +569,48 @@ TEST_F(NetworkPortalDetectorImplTest, PortalDetectorRetryAfterIsSmall) {
 TEST_F(NetworkPortalDetectorImplTest, FirstAttemptFailed) {
   ASSERT_TRUE(is_state_idle());
 
-  set_min_time_between_attempts(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
   const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n";
 
   ASSERT_TRUE(is_state_idle());
-  ASSERT_EQ(0, attempt_count());
+  ASSERT_EQ(0, no_response_result_count());
 
   SetConnected(kStubWireless1);
 
   CompleteURLFetch(net::OK, 503, retry_after);
   ASSERT_TRUE(is_state_portal_detection_pending());
-  ASSERT_EQ(1, attempt_count());
+  ASSERT_EQ(1, no_response_result_count());
   ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay());
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::RunLoop().RunUntilIdle();
 
   CompleteURLFetch(net::OK, 204, NULL);
-  ASSERT_TRUE(is_state_idle());
-  ASSERT_EQ(2, attempt_count());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-                   kStubWireless1);
+  ASSERT_FALSE(is_state_idle());
+  ASSERT_EQ(0, no_response_result_count());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, AllAttemptsFailed) {
   ASSERT_TRUE(is_state_idle());
 
-  set_min_time_between_attempts(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
   const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n";
 
   ASSERT_TRUE(is_state_idle());
-  ASSERT_EQ(0, attempt_count());
+  ASSERT_EQ(0, no_response_result_count());
 
   SetConnected(kStubWireless1);
 
   CompleteURLFetch(net::OK, 503, retry_after);
   ASSERT_TRUE(is_state_portal_detection_pending());
-  ASSERT_EQ(1, attempt_count());
+  ASSERT_EQ(1, no_response_result_count());
   ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay());
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
@@ -652,88 +618,101 @@ TEST_F(NetworkPortalDetectorImplTest, AllAttemptsFailed) {
 
   CompleteURLFetch(net::OK, 503, retry_after);
   ASSERT_TRUE(is_state_portal_detection_pending());
-  ASSERT_EQ(2, attempt_count());
+  ASSERT_EQ(2, no_response_result_count());
   ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay());
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::RunLoop().RunUntilIdle();
 
   CompleteURLFetch(net::OK, 503, retry_after);
-  ASSERT_TRUE(is_state_idle());
-  ASSERT_EQ(3, attempt_count());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 503,
+  ASSERT_FALSE(is_state_idle());
+  ASSERT_EQ(3, no_response_result_count());
+  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE,
+                   503,
                    kStubWireless1);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, ProxyAuthRequired) {
   ASSERT_TRUE(is_state_idle());
-  set_min_time_between_attempts(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
 
   SetConnected(kStubWireless1);
   CompleteURLFetch(net::OK, 407, NULL);
-  ASSERT_EQ(1, attempt_count());
-  ASSERT_TRUE(is_state_idle());
+  ASSERT_EQ(1, no_response_result_count());
+  ASSERT_TRUE(is_state_portal_detection_pending());
+
+  base::RunLoop().RunUntilIdle();
+  CompleteURLFetch(net::OK, 407, NULL);
+  ASSERT_EQ(2, no_response_result_count());
+  ASSERT_TRUE(is_state_portal_detection_pending());
+
+  base::RunLoop().RunUntilIdle();
+  CompleteURLFetch(net::OK, 407, NULL);
+  ASSERT_EQ(3, no_response_result_count());
+  ASSERT_FALSE(is_state_idle());
+
   CheckPortalState(
-      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 407,
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED,
+      407,
       kStubWireless1);
 
-  ASSERT_TRUE(
-      MakeResultHistogramChecker()
-      ->Expect(
-          NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 1)
-      ->Check());
+  ASSERT_TRUE(MakeResultHistogramChecker()
+                  ->Expect(NetworkPortalDetector::
+                               CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED,
+                           1)
+                  ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, NoResponseButBehindPortal) {
   ASSERT_TRUE(is_state_idle());
-  set_min_time_between_attempts(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
 
   SetBehindPortal(kStubWireless1);
   ASSERT_TRUE(is_state_checking_for_portal());
 
-  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
-                   net::URLFetcher::RESPONSE_CODE_INVALID,
-                   NULL);
-  ASSERT_EQ(1, attempt_count());
+  CompleteURLFetch(
+      net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL);
+  ASSERT_EQ(1, no_response_result_count());
   ASSERT_TRUE(is_state_portal_detection_pending());
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::RunLoop().RunUntilIdle();
 
-  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
-                   net::URLFetcher::RESPONSE_CODE_INVALID,
-                   NULL);
-  ASSERT_EQ(2, attempt_count());
+  CompleteURLFetch(
+      net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL);
+  ASSERT_EQ(2, no_response_result_count());
   ASSERT_TRUE(is_state_portal_detection_pending());
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::RunLoop().RunUntilIdle();
 
-  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
-                   net::URLFetcher::RESPONSE_CODE_INVALID,
-                   NULL);
-  ASSERT_EQ(3, attempt_count());
-  ASSERT_TRUE(is_state_idle());
+  CompleteURLFetch(
+      net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL);
+  ASSERT_EQ(3, no_response_result_count());
+  ASSERT_FALSE(is_state_idle());
 
   CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL,
                    net::URLFetcher::RESPONSE_CODE_INVALID,
                    kStubWireless1);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1)
+          ->Check());
 }
 
-TEST_F(NetworkPortalDetectorImplTest, DisableLazyDetectionWhilePendingRequest) {
+TEST_F(NetworkPortalDetectorImplTest,
+       DisableErrorScreenStrategyWhilePendingRequest) {
   ASSERT_TRUE(is_state_idle());
-  set_attempt_count(3);
-  enable_lazy_detection();
+  set_no_response_result_count(3);
+  enable_error_screen_strategy();
   ASSERT_TRUE(is_state_portal_detection_pending());
-  disable_lazy_detection();
+  disable_error_screen_strategy();
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::MessageLoop::current()->RunUntilIdle();
@@ -741,127 +720,119 @@ TEST_F(NetworkPortalDetectorImplTest, DisableLazyDetectionWhilePendingRequest) {
   ASSERT_TRUE(MakeResultHistogramChecker()->Check());
 }
 
-TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForOnlineNetwork) {
+TEST_F(NetworkPortalDetectorImplTest, ErrorScreenStrategyForOnlineNetwork) {
   ASSERT_TRUE(is_state_idle());
-  set_min_time_between_attempts(base::TimeDelta());
-  set_lazy_check_interval(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
 
   SetConnected(kStubWireless1);
-  enable_lazy_detection();
+  enable_error_screen_strategy();
+  // To run CaptivePortalDetector::DetectCaptivePortal().
+  base::RunLoop().RunUntilIdle();
   CompleteURLFetch(net::OK, 204, NULL);
 
-  ASSERT_EQ(1, attempt_count());
   ASSERT_TRUE(is_state_portal_detection_pending());
   CheckPortalState(
-      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-      kStubWireless1);
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1);
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::RunLoop().RunUntilIdle();
 
   CompleteURLFetch(net::OK, 204, NULL);
 
-  ASSERT_EQ(2, attempt_count());
   ASSERT_TRUE(is_state_portal_detection_pending());
   CheckPortalState(
-      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-      kStubWireless1);
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1);
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::RunLoop().RunUntilIdle();
 
-  disable_lazy_detection();
+  disable_error_screen_strategy();
 
-  // One more detection result, because DizableLazyDetection() doesn't
-  // cancel last detection request.
+  ASSERT_TRUE(is_state_portal_detection_pending());
+  // To run CaptivePortalDetector::DetectCaptivePortal().
+  base::RunLoop().RunUntilIdle();
+  ASSERT_TRUE(is_state_checking_for_portal());
   CompleteURLFetch(net::OK, 204, NULL);
-  ASSERT_EQ(3, attempt_count());
-  ASSERT_TRUE(is_state_idle());
+
   CheckPortalState(
-      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-      kStubWireless1);
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Check());
 }
 
-TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForPortalNetwork) {
+TEST_F(NetworkPortalDetectorImplTest, ErrorScreenStrategyForPortalNetwork) {
   ASSERT_TRUE(is_state_idle());
-  set_min_time_between_attempts(base::TimeDelta());
-  set_lazy_check_interval(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
 
+  enable_error_screen_strategy();
   SetConnected(kStubWireless1);
-  enable_lazy_detection();
 
-  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
-                   net::URLFetcher::RESPONSE_CODE_INVALID,
-                   NULL);
-  ASSERT_EQ(1, attempt_count());
+  CompleteURLFetch(
+      net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL);
+  ASSERT_EQ(1, no_response_result_count());
   ASSERT_TRUE(is_state_portal_detection_pending());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
-                   kStubWireless1);
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1);
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::RunLoop().RunUntilIdle();
 
-  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
-                   net::URLFetcher::RESPONSE_CODE_INVALID,
-                   NULL);
-  ASSERT_EQ(2, attempt_count());
+  CompleteURLFetch(
+      net::ERR_CONNECTION_CLOSED, net::URLFetcher::RESPONSE_CODE_INVALID, NULL);
+  ASSERT_EQ(2, no_response_result_count());
   ASSERT_TRUE(is_state_portal_detection_pending());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
-                   kStubWireless1);
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1);
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::RunLoop().RunUntilIdle();
 
   CompleteURLFetch(net::OK, 200, NULL);
-  ASSERT_EQ(3, attempt_count());
+  ASSERT_EQ(0, no_response_result_count());
   ASSERT_TRUE(is_state_portal_detection_pending());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
-                   kStubWireless1);
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1);
 
   // To run CaptivePortalDetector::DetectCaptivePortal().
   base::RunLoop().RunUntilIdle();
 
-  disable_lazy_detection();
+  disable_error_screen_strategy();
 
-  // One more detection result, because DizableLazyDetection() doesn't
-  // cancel last detection request.
-  CompleteURLFetch(net::OK, 200, NULL);
-  ASSERT_EQ(3, attempt_count());
-  ASSERT_TRUE(is_state_idle());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
-                   kStubWireless1);
+  ASSERT_TRUE(is_state_portal_detection_pending());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1);
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, DetectionTimeoutIsCancelled) {
   ASSERT_TRUE(is_state_idle());
-  set_min_time_between_attempts(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
 
   SetConnected(kStubWireless1);
   ASSERT_TRUE(is_state_checking_for_portal());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
-                   kStubWireless1);
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1);
 
-  cancel_portal_detection();
+  stop_detection();
 
   ASSERT_TRUE(is_state_idle());
-  ASSERT_TRUE(detection_timeout_is_cancelled());
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
-                   kStubWireless1);
+  ASSERT_TRUE(attempt_timeout_is_cancelled());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1);
 
   ASSERT_TRUE(MakeResultHistogramChecker()->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, TestDetectionRestart) {
   ASSERT_TRUE(is_state_idle());
-  set_min_time_between_attempts(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
 
   // First portal detection attempts determines ONLINE state.
   SetConnected(kStubWireless1);
@@ -870,125 +841,181 @@ TEST_F(NetworkPortalDetectorImplTest, TestDetectionRestart) {
 
   CompleteURLFetch(net::OK, 204, NULL);
 
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
-                   kStubWireless1);
-  ASSERT_TRUE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1);
+  ASSERT_FALSE(is_state_idle());
 
   // First portal detection attempts determines PORTAL state.
-  ASSERT_TRUE(start_detection_if_idle());
   ASSERT_TRUE(is_state_portal_detection_pending());
-  ASSERT_FALSE(start_detection_if_idle());
 
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(is_state_checking_for_portal());
   CompleteURLFetch(net::OK, 200, NULL);
 
-  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
-                   kStubWireless1);
-  ASSERT_TRUE(is_state_idle());
+  CheckPortalState(
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1);
+  ASSERT_FALSE(is_state_idle());
 
-  ASSERT_TRUE(MakeResultHistogramChecker()->
-              Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)->
-              Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1)->
-              Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1)
+          ->Check());
 }
 
 TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts) {
   ASSERT_TRUE(is_state_idle());
-  set_min_time_between_attempts(base::TimeDelta());
-  set_lazy_check_interval(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
 
   SetNetworkDeviceEnabled(shill::kTypeWifi, false);
   SetConnected(kStubCellular);
 
   // First portal detection attempt for cellular1 uses 5sec timeout.
-  CheckRequestTimeoutAndCompleteAttempt(1, 5, net::ERR_CONNECTION_CLOSED,
-                                        net::URLFetcher::RESPONSE_CODE_INVALID);
+  CheckRequestTimeoutAndCompleteAttempt(
+      0 /* expected_same_detection_result_count */,
+      0 /* expected_no_response_result_count */,
+      5 /* expected_request_timeout_sec */,
+      net::ERR_CONNECTION_CLOSED,
+      net::URLFetcher::RESPONSE_CODE_INVALID);
 
   // Second portal detection attempt for cellular1 uses 10sec timeout.
   ASSERT_TRUE(is_state_portal_detection_pending());
   base::RunLoop().RunUntilIdle();
-  CheckRequestTimeoutAndCompleteAttempt(2, 10, net::ERR_CONNECTION_CLOSED,
-                                        net::URLFetcher::RESPONSE_CODE_INVALID);
+  CheckRequestTimeoutAndCompleteAttempt(
+      1 /* expected_same_detection_result_count */,
+      1 /* expected_no_response_result_count */,
+      10 /* expected_request_timeout_sec */,
+      net::ERR_CONNECTION_CLOSED,
+      net::URLFetcher::RESPONSE_CODE_INVALID);
 
   // Third portal detection attempt for cellular1 uses 15sec timeout.
   ASSERT_TRUE(is_state_portal_detection_pending());
   base::RunLoop().RunUntilIdle();
-  CheckRequestTimeoutAndCompleteAttempt(3, 15, net::ERR_CONNECTION_CLOSED,
-                                        net::URLFetcher::RESPONSE_CODE_INVALID);
+  CheckRequestTimeoutAndCompleteAttempt(
+      2 /* expected_same_detection_result_count */,
+      2 /* expected_no_response_result_count */,
+      15 /* expected_request_timeout_sec */,
+      net::ERR_CONNECTION_CLOSED,
+      net::URLFetcher::RESPONSE_CODE_INVALID);
 
-  ASSERT_TRUE(is_state_idle());
+  ASSERT_FALSE(is_state_idle());
 
-  // Check that in lazy detection for cellular1 15sec timeout is used.
-  enable_lazy_detection();
+  // Check that on the error screen 15sec timeout is used.
+  enable_error_screen_strategy();
   ASSERT_TRUE(is_state_portal_detection_pending());
   base::RunLoop().RunUntilIdle();
-  disable_lazy_detection();
-  CheckRequestTimeoutAndCompleteAttempt(3, 15, net::ERR_CONNECTION_CLOSED,
-                                        net::URLFetcher::RESPONSE_CODE_INVALID);
-  ASSERT_TRUE(is_state_idle());
+  CheckRequestTimeoutAndCompleteAttempt(
+      0 /* expected_same_detection_result_count */,
+      0 /* expected_no_response_result_count */,
+      15 /* expected_request_timeout_sec */,
+      net::ERR_CONNECTION_CLOSED,
+      net::URLFetcher::RESPONSE_CODE_INVALID);
+  disable_error_screen_strategy();
+  ASSERT_TRUE(is_state_portal_detection_pending());
 
   SetNetworkDeviceEnabled(shill::kTypeWifi, true);
   SetConnected(kStubWireless1);
 
   // First portal detection attempt for wifi1 uses 5sec timeout.
-  CheckRequestTimeoutAndCompleteAttempt(1, 5, net::ERR_CONNECTION_CLOSED,
-                                        net::URLFetcher::RESPONSE_CODE_INVALID);
+  CheckRequestTimeoutAndCompleteAttempt(
+      0 /* expected_same_detection_result_count */,
+      0 /* expected_no_response_result_count */,
+      5 /* expected_request_timeout_sec */,
+      net::ERR_CONNECTION_CLOSED,
+      net::URLFetcher::RESPONSE_CODE_INVALID);
 
   // Second portal detection attempt for wifi1 also uses 5sec timeout.
   ASSERT_TRUE(is_state_portal_detection_pending());
   base::RunLoop().RunUntilIdle();
-  CheckRequestTimeoutAndCompleteAttempt(2, 10, net::OK, 204);
-  ASSERT_TRUE(is_state_idle());
-
-  // Check that in lazy detection for wifi1 5sec timeout is used.
-  enable_lazy_detection();
+  CheckRequestTimeoutAndCompleteAttempt(
+      1 /* expected_same_detection_result_count */,
+      1 /* expected_no_response_result_count */,
+      10 /* expected_request_timeout_sec */,
+      net::OK,
+      204);
+  ASSERT_FALSE(is_state_idle());
+
+  // Check that in error screen strategy detection for wifi1 15sec
+  // timeout is used.
+  enable_error_screen_strategy();
   ASSERT_TRUE(is_state_portal_detection_pending());
   base::RunLoop().RunUntilIdle();
-  disable_lazy_detection();
-  CheckRequestTimeoutAndCompleteAttempt(3, 15, net::OK, 204);
-  ASSERT_TRUE(is_state_idle());
+  CheckRequestTimeoutAndCompleteAttempt(
+      0 /* expected_same_detection_result_count */,
+      0 /* expected_no_response_result_count */,
+      15 /* expected_request_timeout_sec */,
+      net::OK,
+      204);
+  disable_error_screen_strategy();
+  ASSERT_TRUE(is_state_portal_detection_pending());
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1)
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1)
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Check());
 }
 
-TEST_F(NetworkPortalDetectorImplTest, StartDetectionIfIdle) {
+TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts2) {
   ASSERT_TRUE(is_state_idle());
-  set_min_time_between_attempts(base::TimeDelta());
+  set_delay_till_next_attempt(base::TimeDelta());
   SetConnected(kStubWireless1);
 
   // First portal detection attempt for wifi1 uses 5sec timeout.
-  CheckRequestTimeoutAndCompleteAttempt(1, 5, net::ERR_CONNECTION_CLOSED,
-                                        net::URLFetcher::RESPONSE_CODE_INVALID);
+  CheckRequestTimeoutAndCompleteAttempt(
+      0 /* expected_same_detection_result_count */,
+      0 /* expected_no_response_result_count */,
+      5 /* expected_request_timeout_sec */,
+      net::ERR_CONNECTION_CLOSED,
+      net::URLFetcher::RESPONSE_CODE_INVALID);
   ASSERT_TRUE(is_state_portal_detection_pending());
   base::RunLoop().RunUntilIdle();
 
   // Second portal detection attempt for wifi1 uses 10sec timeout.
-  CheckRequestTimeoutAndCompleteAttempt(2, 10, net::ERR_CONNECTION_CLOSED,
-                                        net::URLFetcher::RESPONSE_CODE_INVALID);
+  CheckRequestTimeoutAndCompleteAttempt(
+      1 /* expected_same_detection_result_count */,
+      1 /* expected_no_response_result_count */,
+      10 /* expected_request_timeout_sec */,
+      net::ERR_CONNECTION_CLOSED,
+      net::URLFetcher::RESPONSE_CODE_INVALID);
   ASSERT_TRUE(is_state_portal_detection_pending());
   base::RunLoop().RunUntilIdle();
 
   // Second portal detection attempt for wifi1 uses 15sec timeout.
-  CheckRequestTimeoutAndCompleteAttempt(3, 15, net::ERR_CONNECTION_CLOSED,
-                                        net::URLFetcher::RESPONSE_CODE_INVALID);
-  ASSERT_TRUE(is_state_idle());
-  start_detection_if_idle();
-
+  CheckRequestTimeoutAndCompleteAttempt(
+      2 /* expected_same_detection_result_count */,
+      2 /* expected_no_response_result_count */,
+      15 /* expected_request_timeout_sec */,
+      net::ERR_CONNECTION_CLOSED,
+      net::URLFetcher::RESPONSE_CODE_INVALID);
+  ASSERT_FALSE(is_state_idle());
   ASSERT_TRUE(is_state_portal_detection_pending());
 
-  // First portal detection attempt for wifi1 uses 5sec timeout.
+  // Third portal detection attempt for wifi1 uses 20sec timeout.
   base::RunLoop().RunUntilIdle();
-  CheckRequestTimeoutAndCompleteAttempt(1, 5, net::OK, 204);
-  ASSERT_TRUE(is_state_idle());
+  CheckRequestTimeoutAndCompleteAttempt(
+      3 /* expected_same_detection_result_count */,
+      3 /* expected_no_response_result_count */,
+      20 /* expected_request_timeout_sec */,
+      net::OK,
+      204);
+  ASSERT_FALSE(is_state_idle());
+
+  // Fourth portal detection attempt for wifi1 uses 5sec timeout.
+  base::RunLoop().RunUntilIdle();
+  CheckRequestTimeoutAndCompleteAttempt(
+      1 /* expected_same_detection_result_count */,
+      0 /* expected_no_response_result_count */,
+      5 /* expected_request_timeout_sec */,
+      net::OK,
+      204);
+  ASSERT_FALSE(is_state_idle());
 
-  ASSERT_TRUE(MakeResultHistogramChecker()
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1)
-              ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
-              ->Check());
+  ASSERT_TRUE(
+      MakeResultHistogramChecker()
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1)
+          ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)
+          ->Check());
 }
 
 }  // namespace chromeos