network_portal_detector_impl_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/compiler_specific.h"
6#include "base/logging.h"
7#include "base/memory/scoped_ptr.h"
8#include "base/message_loop.h"
9#include "chrome/browser/captive_portal/captive_portal_detector.h"
10#include "chrome/browser/captive_portal/testing_utils.h"
11#include "chrome/browser/chromeos/cros/cros_library.h"
12#include "chrome/browser/chromeos/cros/network_library.h"
13#include "chrome/browser/chromeos/cros/network_library_impl_base.h"
14#include "chrome/browser/chromeos/net/network_portal_detector_impl.h"
15#include "chrome/test/base/testing_profile.h"
16#include "net/base/net_errors.h"
17#include "testing/gtest/include/gtest/gtest.h"
18
19namespace chromeos {
20
21class NetworkPortalDetectorImplTest
22    : public testing::Test,
23      public captive_portal::CaptivePortalDetectorTestBase {
24 public:
25  NetworkPortalDetectorImplTest() {}
26  virtual ~NetworkPortalDetectorImplTest() {}
27
28  virtual void SetUp() {
29    CrosLibrary::Initialize(true);
30    network_library_ = CrosLibrary::Get()->GetNetworkLibrary();
31    DCHECK(network_library_);
32
33    ethernet_network_ = network_library_->FindNetworkByPath("eth1");
34    DCHECK(ethernet_network_);
35
36    wifi1_network_ = network_library_->FindNetworkByPath("wifi1");
37    DCHECK(wifi1_network_);
38
39    wifi2_network_ = network_library_->FindNetworkByPath("wifi2");
40    DCHECK(wifi2_network_);
41
42    profile_.reset(new TestingProfile());
43    network_portal_detector_.reset(
44        new NetworkPortalDetectorImpl(profile_->GetRequestContext()));
45    network_portal_detector_->Init();
46    network_portal_detector_->Enable(false);
47
48    set_detector(network_portal_detector_->captive_portal_detector_.get());
49
50    // Prevents flakiness due to message loop delays.
51    set_time_ticks(base::TimeTicks::Now());
52  }
53
54  virtual void TearDown() {
55    network_portal_detector_->Shutdown();
56    CrosLibrary::Shutdown();
57  }
58
59  void CheckPortalState(NetworkPortalDetector::CaptivePortalStatus status,
60                        int response_code,
61                        const Network* network) {
62    NetworkPortalDetector::CaptivePortalState state =
63        network_portal_detector()->GetCaptivePortalState(network);
64    ASSERT_EQ(status, state.status);
65    ASSERT_EQ(response_code, state.response_code);
66  }
67
68  NetworkLibrary* network_library() { return network_library_; }
69  Network* ethernet_network() { return ethernet_network_; }
70  Network* wifi1_network() { return wifi1_network_; }
71  Network* wifi2_network() { return wifi2_network_; }
72
73  Profile* profile() { return profile_.get(); }
74
75  NetworkPortalDetectorImpl* network_portal_detector() {
76    return network_portal_detector_.get();
77  }
78
79  NetworkPortalDetectorImpl::State state() {
80    return network_portal_detector()->state();
81  }
82
83  void enable_lazy_detection() {
84    network_portal_detector()->EnableLazyDetection();
85  }
86
87  void disable_lazy_detection() {
88    network_portal_detector()->DisableLazyDetection();
89  }
90
91  void cancel_portal_detection() {
92    network_portal_detector()->CancelPortalDetection();
93  }
94
95  bool detection_timeout_is_cancelled() {
96    return
97        network_portal_detector()->DetectionTimeoutIsCancelledForTesting();
98  }
99
100  bool is_state_idle() {
101    return (NetworkPortalDetectorImpl::STATE_IDLE == state());
102  }
103
104  bool is_state_portal_detection_pending() {
105    return (NetworkPortalDetectorImpl::STATE_PORTAL_CHECK_PENDING == state());
106  }
107
108  bool is_state_checking_for_portal() {
109    return (NetworkPortalDetectorImpl::STATE_CHECKING_FOR_PORTAL == state());
110  }
111
112  void set_request_timeout(const base::TimeDelta& timeout) {
113    network_portal_detector()->set_request_timeout_for_testing(timeout);
114  }
115
116  const base::TimeDelta& next_attempt_delay() {
117    return network_portal_detector()->next_attempt_delay_for_testing();
118  }
119
120  int attempt_count() {
121    return network_portal_detector()->attempt_count_for_testing();
122  }
123
124  void set_min_time_between_attempts(const base::TimeDelta& delta) {
125    network_portal_detector()->set_min_time_between_attempts_for_testing(delta);
126  }
127
128  void set_lazy_check_interval(const base::TimeDelta& delta) {
129    network_portal_detector()->set_lazy_check_interval_for_testing(delta);
130  }
131
132  void set_time_ticks(const base::TimeTicks& time_ticks) {
133    network_portal_detector()->set_time_ticks_for_testing(time_ticks);
134  }
135
136  void SetBehindPortal(Network* network) {
137    Network::TestApi test_api(network);
138        test_api.SetBehindPortal();
139    static_cast<NetworkLibraryImplBase*>(
140        network_library())->CallConnectToNetwork(network);
141    MessageLoop::current()->RunUntilIdle();
142  }
143
144  void SetConnected(Network* network) {
145    Network::TestApi test_api(network);
146    test_api.SetConnected();
147    static_cast<NetworkLibraryImplBase*>(
148        network_library())->CallConnectToNetwork(network);
149    MessageLoop::current()->RunUntilIdle();
150  }
151
152 private:
153  NetworkLibrary* network_library_;
154
155  // Pointer to a fake ethernet network.
156  Network* ethernet_network_;
157
158  // Pointer to a fake wifi1 network.
159  Network* wifi1_network_;
160
161  // Pointer to a fake wifi2 network.
162  Network* wifi2_network_;
163
164  MessageLoop message_loop_;
165
166  scoped_ptr<TestingProfile> profile_;
167  scoped_ptr<NetworkPortalDetectorImpl> network_portal_detector_;
168};
169
170TEST_F(NetworkPortalDetectorImplTest, NoPortal) {
171  ASSERT_TRUE(is_state_idle());
172
173  SetConnected(wifi1_network());
174
175  ASSERT_TRUE(is_state_checking_for_portal());
176  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
177                   wifi1_network());
178
179  CompleteURLFetch(net::OK, 204, NULL);
180
181  ASSERT_TRUE(is_state_idle());
182  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
183                   wifi1_network());
184}
185
186TEST_F(NetworkPortalDetectorImplTest, Portal) {
187  ASSERT_TRUE(is_state_idle());
188
189  // Check HTTP 200 response code.
190  SetConnected(wifi1_network());
191  ASSERT_TRUE(is_state_checking_for_portal());
192
193  CompleteURLFetch(net::OK, 200, NULL);
194
195  ASSERT_TRUE(is_state_idle());
196  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
197                   wifi1_network());
198
199  // Check HTTP 301 response code.
200  SetConnected(wifi2_network());
201  ASSERT_TRUE(is_state_checking_for_portal());
202
203  CompleteURLFetch(net::OK, 301, NULL);
204
205  ASSERT_TRUE(is_state_idle());
206  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 301,
207                   wifi2_network());
208
209  // Check HTTP 302 response code.
210  SetConnected(ethernet_network());
211  ASSERT_TRUE(is_state_checking_for_portal());
212
213  CompleteURLFetch(net::OK, 302, NULL);
214
215  ASSERT_TRUE(is_state_idle());
216  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 302,
217                   ethernet_network());
218}
219
220TEST_F(NetworkPortalDetectorImplTest, TwoNetworks) {
221  ASSERT_TRUE(is_state_idle());
222
223  SetConnected(wifi1_network());
224  ASSERT_TRUE(is_state_checking_for_portal());
225
226  // wifi is in portal state.
227  CompleteURLFetch(net::OK, 200, NULL);
228  ASSERT_TRUE(is_state_idle());
229
230  SetConnected(ethernet_network());
231  ASSERT_TRUE(is_state_checking_for_portal());
232
233  // ethernet is in online state.
234  CompleteURLFetch(net::OK, 204, NULL);
235  ASSERT_TRUE(is_state_idle());
236  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
237                   ethernet_network());
238  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
239                   wifi1_network());
240}
241
242TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) {
243  ASSERT_TRUE(is_state_idle());
244
245  SetConnected(wifi1_network());
246
247  // WiFi is in portal state.
248  fetcher()->set_response_code(200);
249  ASSERT_TRUE(is_state_checking_for_portal());
250
251  // Active network is changed during portal detection for wifi.
252  SetConnected(ethernet_network());
253
254  // Portal detection for wifi is cancelled, portal detection for
255  // ethernet is initiated.
256  ASSERT_TRUE(is_state_checking_for_portal());
257
258  // ethernet is in online state.
259  CompleteURLFetch(net::OK, 204, NULL);
260  ASSERT_TRUE(is_state_idle());
261  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
262                   ethernet_network());
263
264  // As active network was changed during portal detection for wifi
265  // network, it's state must be unknown.
266  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
267                   wifi1_network());
268}
269
270TEST_F(NetworkPortalDetectorImplTest, NetworkStateNotChanged) {
271  ASSERT_TRUE(is_state_idle());
272
273  SetConnected(wifi1_network());
274  ASSERT_TRUE(is_state_checking_for_portal());
275
276  CompleteURLFetch(net::OK, 204, NULL);
277
278  ASSERT_TRUE(is_state_idle());
279  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
280                   wifi1_network());
281
282  SetConnected(wifi1_network());
283  ASSERT_TRUE(is_state_idle());
284}
285
286TEST_F(NetworkPortalDetectorImplTest, NetworkStateChanged) {
287  // Test for Portal -> Online -> Portal network state transitions.
288  ASSERT_TRUE(is_state_idle());
289
290  SetBehindPortal(wifi1_network());
291  ASSERT_TRUE(is_state_checking_for_portal());
292
293  CompleteURLFetch(net::OK, 200, NULL);
294
295  ASSERT_TRUE(is_state_idle());
296  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
297                   wifi1_network());
298
299  SetConnected(wifi1_network());
300  ASSERT_TRUE(is_state_checking_for_portal());
301
302  CompleteURLFetch(net::OK, 204, NULL);
303
304  ASSERT_TRUE(is_state_idle());
305  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
306                   wifi1_network());
307
308  SetBehindPortal(wifi1_network());
309  ASSERT_TRUE(is_state_checking_for_portal());
310
311  CompleteURLFetch(net::OK, 200, NULL);
312
313  ASSERT_TRUE(is_state_idle());
314  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
315                   wifi1_network());
316}
317
318TEST_F(NetworkPortalDetectorImplTest, PortalDetectionTimeout) {
319  ASSERT_TRUE(is_state_idle());
320
321  // For instantaneous timeout.
322  set_request_timeout(base::TimeDelta::FromSeconds(0));
323
324  ASSERT_TRUE(is_state_idle());
325  ASSERT_EQ(0, attempt_count());
326
327  SetConnected(wifi1_network());
328  MessageLoop::current()->RunUntilIdle();
329
330  // First portal detection timeouts, next portal detection is
331  // scheduled.
332  ASSERT_TRUE(is_state_portal_detection_pending());
333  ASSERT_EQ(1, attempt_count());
334  ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay());
335}
336
337TEST_F(NetworkPortalDetectorImplTest, PortalDetectionRetryAfter) {
338  ASSERT_TRUE(is_state_idle());
339
340  const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 101\n\n";
341
342  ASSERT_TRUE(is_state_idle());
343  ASSERT_EQ(0, attempt_count());
344
345  SetConnected(wifi1_network());
346  CompleteURLFetch(net::OK, 503, retry_after);
347
348  // First portal detection completed, next portal detection is
349  // scheduled after 101 seconds.
350  ASSERT_TRUE(is_state_portal_detection_pending());
351  ASSERT_EQ(1, attempt_count());
352  ASSERT_EQ(base::TimeDelta::FromSeconds(101), next_attempt_delay());
353}
354
355TEST_F(NetworkPortalDetectorImplTest, PortalDetectorRetryAfterIsSmall) {
356  ASSERT_TRUE(is_state_idle());
357
358  const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 1\n\n";
359
360  ASSERT_TRUE(is_state_idle());
361  ASSERT_EQ(0, attempt_count());
362
363  SetConnected(wifi1_network());
364  CompleteURLFetch(net::OK, 503, retry_after);
365
366  // First portal detection completed, next portal detection is
367  // scheduled after 3 seconds (due to minimum time between detection
368  // attemps).
369  ASSERT_TRUE(is_state_portal_detection_pending());
370  ASSERT_EQ(1, attempt_count());
371  ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay());
372}
373
374TEST_F(NetworkPortalDetectorImplTest, FirstAttemptFailed) {
375  ASSERT_TRUE(is_state_idle());
376
377  set_min_time_between_attempts(base::TimeDelta());
378  const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n";
379
380  ASSERT_TRUE(is_state_idle());
381  ASSERT_EQ(0, attempt_count());
382
383  SetConnected(wifi1_network());
384
385  CompleteURLFetch(net::OK, 503, retry_after);
386  ASSERT_TRUE(is_state_portal_detection_pending());
387  ASSERT_EQ(1, attempt_count());
388  ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay());
389
390  // To run CaptivePortalDetector::DetectCaptivePortal().
391  MessageLoop::current()->RunUntilIdle();
392
393  CompleteURLFetch(net::OK, 204, NULL);
394  ASSERT_TRUE(is_state_idle());
395  ASSERT_EQ(2, attempt_count());
396  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
397                   wifi1_network());
398}
399
400TEST_F(NetworkPortalDetectorImplTest, AllAttemptsFailed) {
401  ASSERT_TRUE(is_state_idle());
402
403  set_min_time_between_attempts(base::TimeDelta());
404  const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n";
405
406  ASSERT_TRUE(is_state_idle());
407  ASSERT_EQ(0, attempt_count());
408
409  SetConnected(wifi1_network());
410
411  CompleteURLFetch(net::OK, 503, retry_after);
412  ASSERT_TRUE(is_state_portal_detection_pending());
413  ASSERT_EQ(1, attempt_count());
414  ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay());
415
416  // To run CaptivePortalDetector::DetectCaptivePortal().
417  MessageLoop::current()->RunUntilIdle();
418
419  CompleteURLFetch(net::OK, 503, retry_after);
420  ASSERT_TRUE(is_state_portal_detection_pending());
421  ASSERT_EQ(2, attempt_count());
422  ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay());
423
424  // To run CaptivePortalDetector::DetectCaptivePortal().
425  MessageLoop::current()->RunUntilIdle();
426
427  CompleteURLFetch(net::OK, 503, retry_after);
428  ASSERT_TRUE(is_state_idle());
429  ASSERT_EQ(3, attempt_count());
430  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 503,
431                   wifi1_network());
432}
433
434TEST_F(NetworkPortalDetectorImplTest, ProxyAuthRequired) {
435  ASSERT_TRUE(is_state_idle());
436  set_min_time_between_attempts(base::TimeDelta());
437
438  SetConnected(wifi1_network());
439  CompleteURLFetch(net::OK, 407, NULL);
440  ASSERT_EQ(1, attempt_count());
441  ASSERT_TRUE(is_state_portal_detection_pending());
442  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
443                   wifi1_network());
444
445  // To run CaptivePortalDetector::DetectCaptivePortal().
446  MessageLoop::current()->RunUntilIdle();
447
448  CompleteURLFetch(net::OK, 407, NULL);
449  ASSERT_EQ(2, attempt_count());
450  ASSERT_TRUE(is_state_portal_detection_pending());
451  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
452                   wifi1_network());
453
454  // To run CaptivePortalDetector::DetectCaptivePortal().
455  MessageLoop::current()->RunUntilIdle();
456
457  CompleteURLFetch(net::OK, 407, NULL);
458  ASSERT_EQ(3, attempt_count());
459  ASSERT_TRUE(is_state_idle());
460  CheckPortalState(
461      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 407,
462      wifi1_network());
463}
464
465TEST_F(NetworkPortalDetectorImplTest, NoResponseButBehindPortal) {
466  ASSERT_TRUE(is_state_idle());
467  set_min_time_between_attempts(base::TimeDelta());
468
469  SetBehindPortal(wifi1_network());
470  ASSERT_TRUE(is_state_checking_for_portal());
471
472  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
473                   net::URLFetcher::RESPONSE_CODE_INVALID,
474                   NULL);
475  ASSERT_EQ(1, attempt_count());
476  ASSERT_TRUE(is_state_portal_detection_pending());
477
478  // To run CaptivePortalDetector::DetectCaptivePortal().
479  MessageLoop::current()->RunUntilIdle();
480
481  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
482                   net::URLFetcher::RESPONSE_CODE_INVALID,
483                   NULL);
484  ASSERT_EQ(2, attempt_count());
485  ASSERT_TRUE(is_state_portal_detection_pending());
486
487  // To run CaptivePortalDetector::DetectCaptivePortal().
488  MessageLoop::current()->RunUntilIdle();
489
490  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
491                   net::URLFetcher::RESPONSE_CODE_INVALID,
492                   NULL);
493  ASSERT_EQ(3, attempt_count());
494  ASSERT_TRUE(is_state_idle());
495
496  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL,
497                   net::URLFetcher::RESPONSE_CODE_INVALID,
498                   wifi1_network());
499}
500
501TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForOnlineNetwork) {
502  ASSERT_TRUE(is_state_idle());
503  set_min_time_between_attempts(base::TimeDelta());
504  set_lazy_check_interval(base::TimeDelta());
505
506  SetConnected(wifi1_network());
507  enable_lazy_detection();
508  CompleteURLFetch(net::OK, 204, NULL);
509
510  ASSERT_EQ(1, attempt_count());
511  ASSERT_TRUE(is_state_portal_detection_pending());
512  CheckPortalState(
513      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
514      wifi1_network());
515
516  // To run CaptivePortalDetector::DetectCaptivePortal().
517  MessageLoop::current()->RunUntilIdle();
518
519  CompleteURLFetch(net::OK, 204, NULL);
520
521  ASSERT_EQ(2, attempt_count());
522  ASSERT_TRUE(is_state_portal_detection_pending());
523  CheckPortalState(
524      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
525      wifi1_network());
526
527  // To run CaptivePortalDetector::DetectCaptivePortal().
528  MessageLoop::current()->RunUntilIdle();
529
530  disable_lazy_detection();
531
532  // One more detection result, because DizableLazyDetection() doesn't
533  // cancel last detection request.
534  CompleteURLFetch(net::OK, 204, NULL);
535  ASSERT_EQ(3, attempt_count());
536  ASSERT_TRUE(is_state_idle());
537  CheckPortalState(
538      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204,
539      wifi1_network());
540}
541
542TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForPortalNetwork) {
543  ASSERT_TRUE(is_state_idle());
544  set_min_time_between_attempts(base::TimeDelta());
545  set_lazy_check_interval(base::TimeDelta());
546
547  SetConnected(wifi1_network());
548  enable_lazy_detection();
549
550  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
551                   net::URLFetcher::RESPONSE_CODE_INVALID,
552                   NULL);
553  ASSERT_EQ(1, attempt_count());
554  ASSERT_TRUE(is_state_portal_detection_pending());
555  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
556                   wifi1_network());
557
558  // To run CaptivePortalDetector::DetectCaptivePortal().
559  MessageLoop::current()->RunUntilIdle();
560
561  CompleteURLFetch(net::ERR_CONNECTION_CLOSED,
562                   net::URLFetcher::RESPONSE_CODE_INVALID,
563                   NULL);
564  ASSERT_EQ(2, attempt_count());
565  ASSERT_TRUE(is_state_portal_detection_pending());
566  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
567                   wifi1_network());
568
569  // To run CaptivePortalDetector::DetectCaptivePortal().
570  MessageLoop::current()->RunUntilIdle();
571
572  CompleteURLFetch(net::OK, 200, NULL);
573  ASSERT_EQ(3, attempt_count());
574  ASSERT_TRUE(is_state_portal_detection_pending());
575  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
576                   wifi1_network());
577
578  // To run CaptivePortalDetector::DetectCaptivePortal().
579  MessageLoop::current()->RunUntilIdle();
580
581  disable_lazy_detection();
582
583  // One more detection result, because DizableLazyDetection() doesn't
584  // cancel last detection request.
585  CompleteURLFetch(net::OK, 200, NULL);
586  ASSERT_EQ(3, attempt_count());
587  ASSERT_TRUE(is_state_idle());
588  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200,
589                   wifi1_network());
590}
591
592TEST_F(NetworkPortalDetectorImplTest, DetectionTimeoutIsCancelled) {
593  ASSERT_TRUE(is_state_idle());
594  set_min_time_between_attempts(base::TimeDelta());
595
596  SetConnected(wifi1_network());
597  ASSERT_TRUE(is_state_checking_for_portal());
598  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
599                   wifi1_network());
600
601  cancel_portal_detection();
602
603  ASSERT_TRUE(is_state_idle());
604  ASSERT_TRUE(detection_timeout_is_cancelled());
605  CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1,
606                   wifi1_network());
607}
608
609}  // namespace chromeos
610