network_portal_detector_impl_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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/net/network_portal_detector_impl.h" 13#include "chrome/test/base/testing_profile.h" 14#include "chromeos/dbus/dbus_thread_manager.h" 15#include "chromeos/dbus/shill_device_client.h" 16#include "chromeos/dbus/shill_service_client.h" 17#include "chromeos/network/network_state.h" 18#include "chromeos/network/network_state_handler.h" 19#include "dbus/object_path.h" 20#include "net/base/net_errors.h" 21#include "testing/gtest/include/gtest/gtest.h" 22#include "third_party/cros_system_api/dbus/service_constants.h" 23 24namespace chromeos { 25 26namespace { 27 28void ErrorCallbackFunction(const std::string& error_name, 29 const std::string& error_message) { 30 LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; 31} 32 33} // namespace 34 35// Service paths for stub network devices. 36const char* kStubEthernet = "stub_ethernet"; 37const char* kStubWireless1 = "stub_wifi1"; 38const char* kStubWireless2 = "stub_wifi2"; 39const char* kStubCellular = "stub_cellular"; 40 41class NetworkPortalDetectorImplTest 42 : public testing::Test, 43 public captive_portal::CaptivePortalDetectorTestBase { 44 public: 45 NetworkPortalDetectorImplTest() {} 46 virtual ~NetworkPortalDetectorImplTest() {} 47 48 virtual void SetUp() { 49 DBusThreadManager::InitializeWithStub(); 50 SetupNetworkHandler(); 51 52 profile_.reset(new TestingProfile()); 53 network_portal_detector_.reset( 54 new NetworkPortalDetectorImpl(profile_->GetRequestContext())); 55 network_portal_detector_->Init(); 56 network_portal_detector_->Enable(false); 57 58 set_detector(network_portal_detector_->captive_portal_detector_.get()); 59 60 // Prevents flakiness due to message loop delays. 61 set_time_ticks(base::TimeTicks::Now()); 62 } 63 64 virtual void TearDown() { 65 network_portal_detector_->Shutdown(); 66 profile_.reset(); 67 NetworkHandler::Shutdown(); 68 DBusThreadManager::Shutdown(); 69 } 70 71 void CheckPortalState(NetworkPortalDetector::CaptivePortalStatus status, 72 int response_code, 73 const std::string& network_service_path) { 74 const NetworkState* network = 75 NetworkHandler::Get()->network_state_handler()->GetNetworkState( 76 network_service_path); 77 NetworkPortalDetector::CaptivePortalState state = 78 network_portal_detector()->GetCaptivePortalState(network); 79 ASSERT_EQ(status, state.status); 80 ASSERT_EQ(response_code, state.response_code); 81 } 82 83 void CheckRequestTimeoutAndCompleteAttempt( 84 int expected_attempt_count, 85 int expected_request_timeout_sec, 86 int net_error, 87 int status_code) { 88 ASSERT_TRUE(is_state_checking_for_portal()); 89 ASSERT_EQ(expected_attempt_count, attempt_count()); 90 ASSERT_EQ(expected_request_timeout_sec, get_request_timeout_sec()); 91 CompleteURLFetch(net_error, status_code, NULL); 92 } 93 94 Profile* profile() { return profile_.get(); } 95 96 NetworkPortalDetectorImpl* network_portal_detector() { 97 return network_portal_detector_.get(); 98 } 99 100 NetworkPortalDetectorImpl::State state() { 101 return network_portal_detector()->state(); 102 } 103 104 bool start_detection_if_idle() { 105 return network_portal_detector()->StartDetectionIfIdle(); 106 } 107 108 void enable_lazy_detection() { 109 network_portal_detector()->EnableLazyDetection(); 110 } 111 112 void disable_lazy_detection() { 113 network_portal_detector()->DisableLazyDetection(); 114 } 115 116 void cancel_portal_detection() { 117 network_portal_detector()->CancelPortalDetection(); 118 } 119 120 bool detection_timeout_is_cancelled() { 121 return 122 network_portal_detector()->DetectionTimeoutIsCancelledForTesting(); 123 } 124 125 int get_request_timeout_sec() { 126 return network_portal_detector()->GetRequestTimeoutSec(); 127 } 128 129 bool is_state_idle() { 130 return (NetworkPortalDetectorImpl::STATE_IDLE == state()); 131 } 132 133 bool is_state_portal_detection_pending() { 134 return (NetworkPortalDetectorImpl::STATE_PORTAL_CHECK_PENDING == state()); 135 } 136 137 bool is_state_checking_for_portal() { 138 return (NetworkPortalDetectorImpl::STATE_CHECKING_FOR_PORTAL == state()); 139 } 140 141 void set_request_timeout(const base::TimeDelta& timeout) { 142 network_portal_detector()->set_request_timeout_for_testing(timeout); 143 } 144 145 const base::TimeDelta& next_attempt_delay() { 146 return network_portal_detector()->next_attempt_delay_for_testing(); 147 } 148 149 int attempt_count() { 150 return network_portal_detector()->attempt_count_for_testing(); 151 } 152 153 void set_min_time_between_attempts(const base::TimeDelta& delta) { 154 network_portal_detector()->set_min_time_between_attempts_for_testing(delta); 155 } 156 157 void set_lazy_check_interval(const base::TimeDelta& delta) { 158 network_portal_detector()->set_lazy_check_interval_for_testing(delta); 159 } 160 161 void set_time_ticks(const base::TimeTicks& time_ticks) { 162 network_portal_detector()->set_time_ticks_for_testing(time_ticks); 163 } 164 165 void SetBehindPortal(const std::string& service_path) { 166 DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 167 dbus::ObjectPath(service_path), 168 flimflam::kStateProperty, base::StringValue(flimflam::kStatePortal), 169 base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 170 base::MessageLoop::current()->RunUntilIdle(); 171 } 172 173 void SetNetworkDeviceEnabled(const std::string& type, bool enabled) { 174 NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled( 175 type, enabled, network_handler::ErrorCallback()); 176 base::MessageLoop::current()->RunUntilIdle(); 177 } 178 179 void SetConnected(const std::string& service_path) { 180 DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 181 dbus::ObjectPath(service_path), 182 flimflam::kStateProperty, base::StringValue(flimflam::kStateOnline), 183 base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 184 base::MessageLoop::current()->RunUntilIdle(); 185 } 186 187 private: 188 void SetupDefaultShillState() { 189 base::MessageLoop::current()->RunUntilIdle(); 190 ShillServiceClient::TestInterface* service_test = 191 DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); 192 service_test->ClearServices(); 193 const bool add_to_visible = true; 194 const bool add_to_watchlist = true; 195 service_test->AddService(kStubEthernet, 196 kStubEthernet, 197 flimflam::kTypeEthernet, flimflam::kStateIdle, 198 add_to_visible, add_to_watchlist); 199 service_test->AddService(kStubWireless1, 200 kStubWireless1, 201 flimflam::kTypeWifi, flimflam::kStateIdle, 202 add_to_visible, add_to_watchlist); 203 service_test->AddService(kStubWireless2, 204 kStubWireless2, 205 flimflam::kTypeWifi, flimflam::kStateIdle, 206 add_to_visible, add_to_watchlist); 207 service_test->AddService(kStubCellular, 208 kStubCellular, 209 flimflam::kTypeCellular, flimflam::kStateIdle, 210 add_to_visible, add_to_watchlist); 211 } 212 213 void SetupNetworkHandler() { 214 SetupDefaultShillState(); 215 NetworkHandler::Initialize(); 216 } 217 218 base::MessageLoop message_loop_; 219 scoped_ptr<TestingProfile> profile_; 220 scoped_ptr<NetworkPortalDetectorImpl> network_portal_detector_; 221}; 222 223TEST_F(NetworkPortalDetectorImplTest, NoPortal) { 224 ASSERT_TRUE(is_state_idle()); 225 226 SetConnected(kStubWireless1); 227 228 ASSERT_TRUE(is_state_checking_for_portal()); 229 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 230 kStubWireless1); 231 232 CompleteURLFetch(net::OK, 204, NULL); 233 234 ASSERT_TRUE(is_state_idle()); 235 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 236 kStubWireless1); 237} 238 239TEST_F(NetworkPortalDetectorImplTest, Portal) { 240 ASSERT_TRUE(is_state_idle()); 241 242 // Check HTTP 200 response code. 243 SetConnected(kStubWireless1); 244 ASSERT_TRUE(is_state_checking_for_portal()); 245 246 CompleteURLFetch(net::OK, 200, NULL); 247 248 ASSERT_TRUE(is_state_idle()); 249 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 250 kStubWireless1); 251 252 // Check HTTP 301 response code. 253 SetConnected(kStubWireless2); 254 ASSERT_TRUE(is_state_checking_for_portal()); 255 256 CompleteURLFetch(net::OK, 301, NULL); 257 258 ASSERT_TRUE(is_state_idle()); 259 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 301, 260 kStubWireless2); 261 262 // Check HTTP 302 response code. 263 SetConnected(kStubEthernet); 264 ASSERT_TRUE(is_state_checking_for_portal()); 265 266 CompleteURLFetch(net::OK, 302, NULL); 267 268 ASSERT_TRUE(is_state_idle()); 269 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 302, 270 kStubEthernet); 271} 272 273TEST_F(NetworkPortalDetectorImplTest, TwoNetworks) { 274 ASSERT_TRUE(is_state_idle()); 275 276 SetConnected(kStubWireless1); 277 ASSERT_TRUE(is_state_checking_for_portal()); 278 279 // wifi is in portal state. 280 CompleteURLFetch(net::OK, 200, NULL); 281 ASSERT_TRUE(is_state_idle()); 282 283 SetConnected(kStubEthernet); 284 ASSERT_TRUE(is_state_checking_for_portal()); 285 286 // ethernet is in online state. 287 CompleteURLFetch(net::OK, 204, NULL); 288 ASSERT_TRUE(is_state_idle()); 289 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 290 kStubEthernet); 291 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 292 kStubWireless1); 293} 294 295TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) { 296 ASSERT_TRUE(is_state_idle()); 297 298 SetConnected(kStubWireless1); 299 300 // WiFi is in portal state. 301 fetcher()->set_response_code(200); 302 ASSERT_TRUE(is_state_checking_for_portal()); 303 304 // Active network is changed during portal detection for wifi. 305 SetConnected(kStubEthernet); 306 307 // Portal detection for wifi is cancelled, portal detection for 308 // ethernet is initiated. 309 ASSERT_TRUE(is_state_checking_for_portal()); 310 311 // ethernet is in online state. 312 CompleteURLFetch(net::OK, 204, NULL); 313 ASSERT_TRUE(is_state_idle()); 314 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 315 kStubEthernet); 316 317 // As active network was changed during portal detection for wifi 318 // network, it's state must be unknown. 319 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 320 kStubWireless1); 321} 322 323TEST_F(NetworkPortalDetectorImplTest, NetworkStateNotChanged) { 324 ASSERT_TRUE(is_state_idle()); 325 326 SetConnected(kStubWireless1); 327 ASSERT_TRUE(is_state_checking_for_portal()); 328 329 CompleteURLFetch(net::OK, 204, NULL); 330 331 ASSERT_TRUE(is_state_idle()); 332 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 333 kStubWireless1); 334 335 SetConnected(kStubWireless1); 336 ASSERT_TRUE(is_state_idle()); 337} 338 339TEST_F(NetworkPortalDetectorImplTest, NetworkStateChanged) { 340 // Test for Portal -> Online -> Portal network state transitions. 341 ASSERT_TRUE(is_state_idle()); 342 343 SetBehindPortal(kStubWireless1); 344 ASSERT_TRUE(is_state_checking_for_portal()); 345 346 CompleteURLFetch(net::OK, 200, NULL); 347 348 ASSERT_TRUE(is_state_idle()); 349 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 350 kStubWireless1); 351 352 SetConnected(kStubWireless1); 353 ASSERT_TRUE(is_state_checking_for_portal()); 354 355 CompleteURLFetch(net::OK, 204, NULL); 356 357 ASSERT_TRUE(is_state_idle()); 358 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 359 kStubWireless1); 360 361 SetBehindPortal(kStubWireless1); 362 ASSERT_TRUE(is_state_checking_for_portal()); 363 364 CompleteURLFetch(net::OK, 200, NULL); 365 366 ASSERT_TRUE(is_state_idle()); 367 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 368 kStubWireless1); 369} 370 371TEST_F(NetworkPortalDetectorImplTest, PortalDetectionTimeout) { 372 ASSERT_TRUE(is_state_idle()); 373 374 // For instantaneous timeout. 375 set_request_timeout(base::TimeDelta::FromSeconds(0)); 376 377 ASSERT_TRUE(is_state_idle()); 378 ASSERT_EQ(0, attempt_count()); 379 380 SetConnected(kStubWireless1); 381 base::MessageLoop::current()->RunUntilIdle(); 382 383 // First portal detection timeouts, next portal detection is 384 // scheduled. 385 ASSERT_TRUE(is_state_portal_detection_pending()); 386 ASSERT_EQ(1, attempt_count()); 387 ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay()); 388} 389 390TEST_F(NetworkPortalDetectorImplTest, PortalDetectionRetryAfter) { 391 ASSERT_TRUE(is_state_idle()); 392 393 const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 101\n\n"; 394 395 ASSERT_TRUE(is_state_idle()); 396 ASSERT_EQ(0, attempt_count()); 397 398 SetConnected(kStubWireless1); 399 CompleteURLFetch(net::OK, 503, retry_after); 400 401 // First portal detection completed, next portal detection is 402 // scheduled after 101 seconds. 403 ASSERT_TRUE(is_state_portal_detection_pending()); 404 ASSERT_EQ(1, attempt_count()); 405 ASSERT_EQ(base::TimeDelta::FromSeconds(101), next_attempt_delay()); 406} 407 408TEST_F(NetworkPortalDetectorImplTest, PortalDetectorRetryAfterIsSmall) { 409 ASSERT_TRUE(is_state_idle()); 410 411 const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 1\n\n"; 412 413 ASSERT_TRUE(is_state_idle()); 414 ASSERT_EQ(0, attempt_count()); 415 416 SetConnected(kStubWireless1); 417 CompleteURLFetch(net::OK, 503, retry_after); 418 419 // First portal detection completed, next portal detection is 420 // scheduled after 3 seconds (due to minimum time between detection 421 // attemps). 422 ASSERT_TRUE(is_state_portal_detection_pending()); 423 ASSERT_EQ(1, attempt_count()); 424 ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay()); 425} 426 427TEST_F(NetworkPortalDetectorImplTest, FirstAttemptFailed) { 428 ASSERT_TRUE(is_state_idle()); 429 430 set_min_time_between_attempts(base::TimeDelta()); 431 const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n"; 432 433 ASSERT_TRUE(is_state_idle()); 434 ASSERT_EQ(0, attempt_count()); 435 436 SetConnected(kStubWireless1); 437 438 CompleteURLFetch(net::OK, 503, retry_after); 439 ASSERT_TRUE(is_state_portal_detection_pending()); 440 ASSERT_EQ(1, attempt_count()); 441 ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay()); 442 443 // To run CaptivePortalDetector::DetectCaptivePortal(). 444 base::MessageLoop::current()->RunUntilIdle(); 445 446 CompleteURLFetch(net::OK, 204, NULL); 447 ASSERT_TRUE(is_state_idle()); 448 ASSERT_EQ(2, attempt_count()); 449 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 450 kStubWireless1); 451} 452 453TEST_F(NetworkPortalDetectorImplTest, AllAttemptsFailed) { 454 ASSERT_TRUE(is_state_idle()); 455 456 set_min_time_between_attempts(base::TimeDelta()); 457 const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n"; 458 459 ASSERT_TRUE(is_state_idle()); 460 ASSERT_EQ(0, attempt_count()); 461 462 SetConnected(kStubWireless1); 463 464 CompleteURLFetch(net::OK, 503, retry_after); 465 ASSERT_TRUE(is_state_portal_detection_pending()); 466 ASSERT_EQ(1, attempt_count()); 467 ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay()); 468 469 // To run CaptivePortalDetector::DetectCaptivePortal(). 470 base::MessageLoop::current()->RunUntilIdle(); 471 472 CompleteURLFetch(net::OK, 503, retry_after); 473 ASSERT_TRUE(is_state_portal_detection_pending()); 474 ASSERT_EQ(2, attempt_count()); 475 ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay()); 476 477 // To run CaptivePortalDetector::DetectCaptivePortal(). 478 base::MessageLoop::current()->RunUntilIdle(); 479 480 CompleteURLFetch(net::OK, 503, retry_after); 481 ASSERT_TRUE(is_state_idle()); 482 ASSERT_EQ(3, attempt_count()); 483 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 503, 484 kStubWireless1); 485} 486 487TEST_F(NetworkPortalDetectorImplTest, ProxyAuthRequired) { 488 ASSERT_TRUE(is_state_idle()); 489 set_min_time_between_attempts(base::TimeDelta()); 490 491 SetConnected(kStubWireless1); 492 CompleteURLFetch(net::OK, 407, NULL); 493 ASSERT_EQ(1, attempt_count()); 494 ASSERT_TRUE(is_state_portal_detection_pending()); 495 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 496 kStubWireless1); 497 498 // To run CaptivePortalDetector::DetectCaptivePortal(). 499 base::MessageLoop::current()->RunUntilIdle(); 500 501 CompleteURLFetch(net::OK, 407, NULL); 502 ASSERT_EQ(2, attempt_count()); 503 ASSERT_TRUE(is_state_portal_detection_pending()); 504 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 505 kStubWireless1); 506 507 // To run CaptivePortalDetector::DetectCaptivePortal(). 508 base::MessageLoop::current()->RunUntilIdle(); 509 510 CompleteURLFetch(net::OK, 407, NULL); 511 ASSERT_EQ(3, attempt_count()); 512 ASSERT_TRUE(is_state_idle()); 513 CheckPortalState( 514 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 407, 515 kStubWireless1); 516} 517 518TEST_F(NetworkPortalDetectorImplTest, NoResponseButBehindPortal) { 519 ASSERT_TRUE(is_state_idle()); 520 set_min_time_between_attempts(base::TimeDelta()); 521 522 SetBehindPortal(kStubWireless1); 523 ASSERT_TRUE(is_state_checking_for_portal()); 524 525 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 526 net::URLFetcher::RESPONSE_CODE_INVALID, 527 NULL); 528 ASSERT_EQ(1, attempt_count()); 529 ASSERT_TRUE(is_state_portal_detection_pending()); 530 531 // To run CaptivePortalDetector::DetectCaptivePortal(). 532 base::MessageLoop::current()->RunUntilIdle(); 533 534 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 535 net::URLFetcher::RESPONSE_CODE_INVALID, 536 NULL); 537 ASSERT_EQ(2, attempt_count()); 538 ASSERT_TRUE(is_state_portal_detection_pending()); 539 540 // To run CaptivePortalDetector::DetectCaptivePortal(). 541 base::MessageLoop::current()->RunUntilIdle(); 542 543 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 544 net::URLFetcher::RESPONSE_CODE_INVALID, 545 NULL); 546 ASSERT_EQ(3, attempt_count()); 547 ASSERT_TRUE(is_state_idle()); 548 549 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 550 net::URLFetcher::RESPONSE_CODE_INVALID, 551 kStubWireless1); 552} 553 554TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForOnlineNetwork) { 555 ASSERT_TRUE(is_state_idle()); 556 set_min_time_between_attempts(base::TimeDelta()); 557 set_lazy_check_interval(base::TimeDelta()); 558 559 SetConnected(kStubWireless1); 560 enable_lazy_detection(); 561 CompleteURLFetch(net::OK, 204, NULL); 562 563 ASSERT_EQ(1, attempt_count()); 564 ASSERT_TRUE(is_state_portal_detection_pending()); 565 CheckPortalState( 566 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 567 kStubWireless1); 568 569 // To run CaptivePortalDetector::DetectCaptivePortal(). 570 base::MessageLoop::current()->RunUntilIdle(); 571 572 CompleteURLFetch(net::OK, 204, NULL); 573 574 ASSERT_EQ(2, attempt_count()); 575 ASSERT_TRUE(is_state_portal_detection_pending()); 576 CheckPortalState( 577 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 578 kStubWireless1); 579 580 // To run CaptivePortalDetector::DetectCaptivePortal(). 581 base::MessageLoop::current()->RunUntilIdle(); 582 583 disable_lazy_detection(); 584 585 // One more detection result, because DizableLazyDetection() doesn't 586 // cancel last detection request. 587 CompleteURLFetch(net::OK, 204, NULL); 588 ASSERT_EQ(3, attempt_count()); 589 ASSERT_TRUE(is_state_idle()); 590 CheckPortalState( 591 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 592 kStubWireless1); 593} 594 595TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForPortalNetwork) { 596 ASSERT_TRUE(is_state_idle()); 597 set_min_time_between_attempts(base::TimeDelta()); 598 set_lazy_check_interval(base::TimeDelta()); 599 600 SetConnected(kStubWireless1); 601 enable_lazy_detection(); 602 603 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 604 net::URLFetcher::RESPONSE_CODE_INVALID, 605 NULL); 606 ASSERT_EQ(1, attempt_count()); 607 ASSERT_TRUE(is_state_portal_detection_pending()); 608 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 609 kStubWireless1); 610 611 // To run CaptivePortalDetector::DetectCaptivePortal(). 612 base::MessageLoop::current()->RunUntilIdle(); 613 614 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 615 net::URLFetcher::RESPONSE_CODE_INVALID, 616 NULL); 617 ASSERT_EQ(2, attempt_count()); 618 ASSERT_TRUE(is_state_portal_detection_pending()); 619 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 620 kStubWireless1); 621 622 // To run CaptivePortalDetector::DetectCaptivePortal(). 623 base::MessageLoop::current()->RunUntilIdle(); 624 625 CompleteURLFetch(net::OK, 200, NULL); 626 ASSERT_EQ(3, attempt_count()); 627 ASSERT_TRUE(is_state_portal_detection_pending()); 628 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 629 kStubWireless1); 630 631 // To run CaptivePortalDetector::DetectCaptivePortal(). 632 base::MessageLoop::current()->RunUntilIdle(); 633 634 disable_lazy_detection(); 635 636 // One more detection result, because DizableLazyDetection() doesn't 637 // cancel last detection request. 638 CompleteURLFetch(net::OK, 200, NULL); 639 ASSERT_EQ(3, attempt_count()); 640 ASSERT_TRUE(is_state_idle()); 641 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 642 kStubWireless1); 643} 644 645TEST_F(NetworkPortalDetectorImplTest, DetectionTimeoutIsCancelled) { 646 ASSERT_TRUE(is_state_idle()); 647 set_min_time_between_attempts(base::TimeDelta()); 648 649 SetConnected(kStubWireless1); 650 ASSERT_TRUE(is_state_checking_for_portal()); 651 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 652 kStubWireless1); 653 654 cancel_portal_detection(); 655 656 ASSERT_TRUE(is_state_idle()); 657 ASSERT_TRUE(detection_timeout_is_cancelled()); 658 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 659 kStubWireless1); 660} 661 662TEST_F(NetworkPortalDetectorImplTest, TestDetectionRestart) { 663 ASSERT_TRUE(is_state_idle()); 664 set_min_time_between_attempts(base::TimeDelta()); 665 666 // First portal detection attempts determines ONLINE state. 667 SetConnected(kStubWireless1); 668 ASSERT_TRUE(is_state_checking_for_portal()); 669 ASSERT_FALSE(start_detection_if_idle()); 670 671 CompleteURLFetch(net::OK, 204, NULL); 672 673 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 674 kStubWireless1); 675 ASSERT_TRUE(is_state_idle()); 676 677 // First portal detection attempts determines PORTAL state. 678 ASSERT_TRUE(start_detection_if_idle()); 679 ASSERT_TRUE(is_state_portal_detection_pending()); 680 ASSERT_FALSE(start_detection_if_idle()); 681 682 base::MessageLoop::current()->RunUntilIdle(); 683 ASSERT_TRUE(is_state_checking_for_portal()); 684 CompleteURLFetch(net::OK, 200, NULL); 685 686 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 687 kStubWireless1); 688 ASSERT_TRUE(is_state_idle()); 689} 690 691TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts) { 692 ASSERT_TRUE(is_state_idle()); 693 set_min_time_between_attempts(base::TimeDelta()); 694 set_lazy_check_interval(base::TimeDelta()); 695 696 SetNetworkDeviceEnabled(flimflam::kTypeWifi, false); 697 SetConnected(kStubCellular); 698 699 // First portal detection attempt for cellular1 uses 5sec timeout. 700 CheckRequestTimeoutAndCompleteAttempt(1, 5, net::ERR_CONNECTION_CLOSED, 701 net::URLFetcher::RESPONSE_CODE_INVALID); 702 703 // Second portal detection attempt for cellular1 uses 10sec timeout. 704 ASSERT_TRUE(is_state_portal_detection_pending()); 705 base::MessageLoop::current()->RunUntilIdle(); 706 CheckRequestTimeoutAndCompleteAttempt(2, 10, net::ERR_CONNECTION_CLOSED, 707 net::URLFetcher::RESPONSE_CODE_INVALID); 708 709 // Third portal detection attempt for cellular1 uses 15sec timeout. 710 ASSERT_TRUE(is_state_portal_detection_pending()); 711 base::MessageLoop::current()->RunUntilIdle(); 712 CheckRequestTimeoutAndCompleteAttempt(3, 15, net::ERR_CONNECTION_CLOSED, 713 net::URLFetcher::RESPONSE_CODE_INVALID); 714 715 ASSERT_TRUE(is_state_idle()); 716 717 // Check that in lazy detection for cellular1 15sec timeout is used. 718 enable_lazy_detection(); 719 ASSERT_TRUE(is_state_portal_detection_pending()); 720 base::MessageLoop::current()->RunUntilIdle(); 721 disable_lazy_detection(); 722 CheckRequestTimeoutAndCompleteAttempt(3, 15, net::ERR_CONNECTION_CLOSED, 723 net::URLFetcher::RESPONSE_CODE_INVALID); 724 ASSERT_TRUE(is_state_idle()); 725 726 SetNetworkDeviceEnabled(flimflam::kTypeWifi, true); 727 SetConnected(kStubWireless1); 728 729 // First portal detection attempt for wifi1 uses 5sec timeout. 730 CheckRequestTimeoutAndCompleteAttempt(1, 5, net::ERR_CONNECTION_CLOSED, 731 net::URLFetcher::RESPONSE_CODE_INVALID); 732 733 // Second portal detection attempt for wifi1 also uses 5sec timeout. 734 ASSERT_TRUE(is_state_portal_detection_pending()); 735 base::MessageLoop::current()->RunUntilIdle(); 736 CheckRequestTimeoutAndCompleteAttempt(2, 10, net::OK, 204); 737 ASSERT_TRUE(is_state_idle()); 738 739 // Check that in lazy detection for wifi1 5sec timeout is used. 740 enable_lazy_detection(); 741 ASSERT_TRUE(is_state_portal_detection_pending()); 742 base::MessageLoop::current()->RunUntilIdle(); 743 disable_lazy_detection(); 744 CheckRequestTimeoutAndCompleteAttempt(3, 15, net::OK, 204); 745 ASSERT_TRUE(is_state_idle()); 746} 747 748TEST_F(NetworkPortalDetectorImplTest, StartDetectionIfIdle) { 749 ASSERT_TRUE(is_state_idle()); 750 set_min_time_between_attempts(base::TimeDelta()); 751 SetConnected(kStubWireless1); 752 753 // First portal detection attempt for wifi1 uses 5sec timeout. 754 CheckRequestTimeoutAndCompleteAttempt(1, 5, net::ERR_CONNECTION_CLOSED, 755 net::URLFetcher::RESPONSE_CODE_INVALID); 756 ASSERT_TRUE(is_state_portal_detection_pending()); 757 base::MessageLoop::current()->RunUntilIdle(); 758 759 // Second portal detection attempt for wifi1 uses 10sec timeout. 760 CheckRequestTimeoutAndCompleteAttempt(2, 10, net::ERR_CONNECTION_CLOSED, 761 net::URLFetcher::RESPONSE_CODE_INVALID); 762 ASSERT_TRUE(is_state_portal_detection_pending()); 763 base::MessageLoop::current()->RunUntilIdle(); 764 765 // Second portal detection attempt for wifi1 uses 15sec timeout. 766 CheckRequestTimeoutAndCompleteAttempt(3, 15, net::ERR_CONNECTION_CLOSED, 767 net::URLFetcher::RESPONSE_CODE_INVALID); 768 ASSERT_TRUE(is_state_idle()); 769 start_detection_if_idle(); 770 771 ASSERT_TRUE(is_state_portal_detection_pending()); 772 773 // First portal detection attempt for wifi1 uses 5sec timeout. 774 base::MessageLoop::current()->RunUntilIdle(); 775 CheckRequestTimeoutAndCompleteAttempt(1, 5, net::OK, 204); 776 ASSERT_TRUE(is_state_idle()); 777} 778 779} // namespace chromeos 780