network_portal_detector_impl_unittest.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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_watchlist = true; 194 service_test->AddService(kStubEthernet, 195 kStubEthernet, 196 flimflam::kTypeEthernet, flimflam::kStateIdle, 197 add_to_watchlist); 198 service_test->AddService(kStubWireless1, 199 kStubWireless1, 200 flimflam::kTypeWifi, flimflam::kStateIdle, 201 add_to_watchlist); 202 service_test->AddService(kStubWireless2, 203 kStubWireless2, 204 flimflam::kTypeWifi, flimflam::kStateIdle, 205 add_to_watchlist); 206 service_test->AddService(kStubCellular, 207 kStubCellular, 208 flimflam::kTypeCellular, flimflam::kStateIdle, 209 add_to_watchlist); 210 } 211 212 void SetupNetworkHandler() { 213 SetupDefaultShillState(); 214 NetworkHandler::Initialize(); 215 } 216 217 base::MessageLoop message_loop_; 218 scoped_ptr<TestingProfile> profile_; 219 scoped_ptr<NetworkPortalDetectorImpl> network_portal_detector_; 220}; 221 222TEST_F(NetworkPortalDetectorImplTest, NoPortal) { 223 ASSERT_TRUE(is_state_idle()); 224 225 SetConnected(kStubWireless1); 226 227 ASSERT_TRUE(is_state_checking_for_portal()); 228 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 229 kStubWireless1); 230 231 CompleteURLFetch(net::OK, 204, NULL); 232 233 ASSERT_TRUE(is_state_idle()); 234 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 235 kStubWireless1); 236} 237 238TEST_F(NetworkPortalDetectorImplTest, Portal) { 239 ASSERT_TRUE(is_state_idle()); 240 241 // Check HTTP 200 response code. 242 SetConnected(kStubWireless1); 243 ASSERT_TRUE(is_state_checking_for_portal()); 244 245 CompleteURLFetch(net::OK, 200, NULL); 246 247 ASSERT_TRUE(is_state_idle()); 248 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 249 kStubWireless1); 250 251 // Check HTTP 301 response code. 252 SetConnected(kStubWireless2); 253 ASSERT_TRUE(is_state_checking_for_portal()); 254 255 CompleteURLFetch(net::OK, 301, NULL); 256 257 ASSERT_TRUE(is_state_idle()); 258 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 301, 259 kStubWireless2); 260 261 // Check HTTP 302 response code. 262 SetConnected(kStubEthernet); 263 ASSERT_TRUE(is_state_checking_for_portal()); 264 265 CompleteURLFetch(net::OK, 302, NULL); 266 267 ASSERT_TRUE(is_state_idle()); 268 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 302, 269 kStubEthernet); 270} 271 272TEST_F(NetworkPortalDetectorImplTest, TwoNetworks) { 273 ASSERT_TRUE(is_state_idle()); 274 275 SetConnected(kStubWireless1); 276 ASSERT_TRUE(is_state_checking_for_portal()); 277 278 // wifi is in portal state. 279 CompleteURLFetch(net::OK, 200, NULL); 280 ASSERT_TRUE(is_state_idle()); 281 282 SetConnected(kStubEthernet); 283 ASSERT_TRUE(is_state_checking_for_portal()); 284 285 // ethernet is in online state. 286 CompleteURLFetch(net::OK, 204, NULL); 287 ASSERT_TRUE(is_state_idle()); 288 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 289 kStubEthernet); 290 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 291 kStubWireless1); 292} 293 294TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) { 295 ASSERT_TRUE(is_state_idle()); 296 297 SetConnected(kStubWireless1); 298 299 // WiFi is in portal state. 300 fetcher()->set_response_code(200); 301 ASSERT_TRUE(is_state_checking_for_portal()); 302 303 // Active network is changed during portal detection for wifi. 304 SetConnected(kStubEthernet); 305 306 // Portal detection for wifi is cancelled, portal detection for 307 // ethernet is initiated. 308 ASSERT_TRUE(is_state_checking_for_portal()); 309 310 // ethernet is in online state. 311 CompleteURLFetch(net::OK, 204, NULL); 312 ASSERT_TRUE(is_state_idle()); 313 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 314 kStubEthernet); 315 316 // As active network was changed during portal detection for wifi 317 // network, it's state must be unknown. 318 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 319 kStubWireless1); 320} 321 322TEST_F(NetworkPortalDetectorImplTest, NetworkStateNotChanged) { 323 ASSERT_TRUE(is_state_idle()); 324 325 SetConnected(kStubWireless1); 326 ASSERT_TRUE(is_state_checking_for_portal()); 327 328 CompleteURLFetch(net::OK, 204, NULL); 329 330 ASSERT_TRUE(is_state_idle()); 331 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 332 kStubWireless1); 333 334 SetConnected(kStubWireless1); 335 ASSERT_TRUE(is_state_idle()); 336} 337 338TEST_F(NetworkPortalDetectorImplTest, NetworkStateChanged) { 339 // Test for Portal -> Online -> Portal network state transitions. 340 ASSERT_TRUE(is_state_idle()); 341 342 SetBehindPortal(kStubWireless1); 343 ASSERT_TRUE(is_state_checking_for_portal()); 344 345 CompleteURLFetch(net::OK, 200, NULL); 346 347 ASSERT_TRUE(is_state_idle()); 348 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 349 kStubWireless1); 350 351 SetConnected(kStubWireless1); 352 ASSERT_TRUE(is_state_checking_for_portal()); 353 354 CompleteURLFetch(net::OK, 204, NULL); 355 356 ASSERT_TRUE(is_state_idle()); 357 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 358 kStubWireless1); 359 360 SetBehindPortal(kStubWireless1); 361 ASSERT_TRUE(is_state_checking_for_portal()); 362 363 CompleteURLFetch(net::OK, 200, NULL); 364 365 ASSERT_TRUE(is_state_idle()); 366 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 367 kStubWireless1); 368} 369 370TEST_F(NetworkPortalDetectorImplTest, PortalDetectionTimeout) { 371 ASSERT_TRUE(is_state_idle()); 372 373 // For instantaneous timeout. 374 set_request_timeout(base::TimeDelta::FromSeconds(0)); 375 376 ASSERT_TRUE(is_state_idle()); 377 ASSERT_EQ(0, attempt_count()); 378 379 SetConnected(kStubWireless1); 380 base::MessageLoop::current()->RunUntilIdle(); 381 382 // First portal detection timeouts, next portal detection is 383 // scheduled. 384 ASSERT_TRUE(is_state_portal_detection_pending()); 385 ASSERT_EQ(1, attempt_count()); 386 ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay()); 387} 388 389TEST_F(NetworkPortalDetectorImplTest, PortalDetectionRetryAfter) { 390 ASSERT_TRUE(is_state_idle()); 391 392 const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 101\n\n"; 393 394 ASSERT_TRUE(is_state_idle()); 395 ASSERT_EQ(0, attempt_count()); 396 397 SetConnected(kStubWireless1); 398 CompleteURLFetch(net::OK, 503, retry_after); 399 400 // First portal detection completed, next portal detection is 401 // scheduled after 101 seconds. 402 ASSERT_TRUE(is_state_portal_detection_pending()); 403 ASSERT_EQ(1, attempt_count()); 404 ASSERT_EQ(base::TimeDelta::FromSeconds(101), next_attempt_delay()); 405} 406 407TEST_F(NetworkPortalDetectorImplTest, PortalDetectorRetryAfterIsSmall) { 408 ASSERT_TRUE(is_state_idle()); 409 410 const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 1\n\n"; 411 412 ASSERT_TRUE(is_state_idle()); 413 ASSERT_EQ(0, attempt_count()); 414 415 SetConnected(kStubWireless1); 416 CompleteURLFetch(net::OK, 503, retry_after); 417 418 // First portal detection completed, next portal detection is 419 // scheduled after 3 seconds (due to minimum time between detection 420 // attemps). 421 ASSERT_TRUE(is_state_portal_detection_pending()); 422 ASSERT_EQ(1, attempt_count()); 423 ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay()); 424} 425 426TEST_F(NetworkPortalDetectorImplTest, FirstAttemptFailed) { 427 ASSERT_TRUE(is_state_idle()); 428 429 set_min_time_between_attempts(base::TimeDelta()); 430 const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n"; 431 432 ASSERT_TRUE(is_state_idle()); 433 ASSERT_EQ(0, attempt_count()); 434 435 SetConnected(kStubWireless1); 436 437 CompleteURLFetch(net::OK, 503, retry_after); 438 ASSERT_TRUE(is_state_portal_detection_pending()); 439 ASSERT_EQ(1, attempt_count()); 440 ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay()); 441 442 // To run CaptivePortalDetector::DetectCaptivePortal(). 443 base::MessageLoop::current()->RunUntilIdle(); 444 445 CompleteURLFetch(net::OK, 204, NULL); 446 ASSERT_TRUE(is_state_idle()); 447 ASSERT_EQ(2, attempt_count()); 448 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 449 kStubWireless1); 450} 451 452TEST_F(NetworkPortalDetectorImplTest, AllAttemptsFailed) { 453 ASSERT_TRUE(is_state_idle()); 454 455 set_min_time_between_attempts(base::TimeDelta()); 456 const char* retry_after = "HTTP/1.1 503 OK\nRetry-After: 0\n\n"; 457 458 ASSERT_TRUE(is_state_idle()); 459 ASSERT_EQ(0, attempt_count()); 460 461 SetConnected(kStubWireless1); 462 463 CompleteURLFetch(net::OK, 503, retry_after); 464 ASSERT_TRUE(is_state_portal_detection_pending()); 465 ASSERT_EQ(1, attempt_count()); 466 ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay()); 467 468 // To run CaptivePortalDetector::DetectCaptivePortal(). 469 base::MessageLoop::current()->RunUntilIdle(); 470 471 CompleteURLFetch(net::OK, 503, retry_after); 472 ASSERT_TRUE(is_state_portal_detection_pending()); 473 ASSERT_EQ(2, attempt_count()); 474 ASSERT_EQ(base::TimeDelta::FromSeconds(0), next_attempt_delay()); 475 476 // To run CaptivePortalDetector::DetectCaptivePortal(). 477 base::MessageLoop::current()->RunUntilIdle(); 478 479 CompleteURLFetch(net::OK, 503, retry_after); 480 ASSERT_TRUE(is_state_idle()); 481 ASSERT_EQ(3, attempt_count()); 482 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 503, 483 kStubWireless1); 484} 485 486TEST_F(NetworkPortalDetectorImplTest, ProxyAuthRequired) { 487 ASSERT_TRUE(is_state_idle()); 488 set_min_time_between_attempts(base::TimeDelta()); 489 490 SetConnected(kStubWireless1); 491 CompleteURLFetch(net::OK, 407, NULL); 492 ASSERT_EQ(1, attempt_count()); 493 ASSERT_TRUE(is_state_portal_detection_pending()); 494 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 495 kStubWireless1); 496 497 // To run CaptivePortalDetector::DetectCaptivePortal(). 498 base::MessageLoop::current()->RunUntilIdle(); 499 500 CompleteURLFetch(net::OK, 407, NULL); 501 ASSERT_EQ(2, attempt_count()); 502 ASSERT_TRUE(is_state_portal_detection_pending()); 503 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 504 kStubWireless1); 505 506 // To run CaptivePortalDetector::DetectCaptivePortal(). 507 base::MessageLoop::current()->RunUntilIdle(); 508 509 CompleteURLFetch(net::OK, 407, NULL); 510 ASSERT_EQ(3, attempt_count()); 511 ASSERT_TRUE(is_state_idle()); 512 CheckPortalState( 513 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 407, 514 kStubWireless1); 515} 516 517TEST_F(NetworkPortalDetectorImplTest, NoResponseButBehindPortal) { 518 ASSERT_TRUE(is_state_idle()); 519 set_min_time_between_attempts(base::TimeDelta()); 520 521 SetBehindPortal(kStubWireless1); 522 ASSERT_TRUE(is_state_checking_for_portal()); 523 524 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 525 net::URLFetcher::RESPONSE_CODE_INVALID, 526 NULL); 527 ASSERT_EQ(1, attempt_count()); 528 ASSERT_TRUE(is_state_portal_detection_pending()); 529 530 // To run CaptivePortalDetector::DetectCaptivePortal(). 531 base::MessageLoop::current()->RunUntilIdle(); 532 533 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 534 net::URLFetcher::RESPONSE_CODE_INVALID, 535 NULL); 536 ASSERT_EQ(2, attempt_count()); 537 ASSERT_TRUE(is_state_portal_detection_pending()); 538 539 // To run CaptivePortalDetector::DetectCaptivePortal(). 540 base::MessageLoop::current()->RunUntilIdle(); 541 542 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 543 net::URLFetcher::RESPONSE_CODE_INVALID, 544 NULL); 545 ASSERT_EQ(3, attempt_count()); 546 ASSERT_TRUE(is_state_idle()); 547 548 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 549 net::URLFetcher::RESPONSE_CODE_INVALID, 550 kStubWireless1); 551} 552 553TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForOnlineNetwork) { 554 ASSERT_TRUE(is_state_idle()); 555 set_min_time_between_attempts(base::TimeDelta()); 556 set_lazy_check_interval(base::TimeDelta()); 557 558 SetConnected(kStubWireless1); 559 enable_lazy_detection(); 560 CompleteURLFetch(net::OK, 204, NULL); 561 562 ASSERT_EQ(1, attempt_count()); 563 ASSERT_TRUE(is_state_portal_detection_pending()); 564 CheckPortalState( 565 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 566 kStubWireless1); 567 568 // To run CaptivePortalDetector::DetectCaptivePortal(). 569 base::MessageLoop::current()->RunUntilIdle(); 570 571 CompleteURLFetch(net::OK, 204, NULL); 572 573 ASSERT_EQ(2, attempt_count()); 574 ASSERT_TRUE(is_state_portal_detection_pending()); 575 CheckPortalState( 576 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 577 kStubWireless1); 578 579 // To run CaptivePortalDetector::DetectCaptivePortal(). 580 base::MessageLoop::current()->RunUntilIdle(); 581 582 disable_lazy_detection(); 583 584 // One more detection result, because DizableLazyDetection() doesn't 585 // cancel last detection request. 586 CompleteURLFetch(net::OK, 204, NULL); 587 ASSERT_EQ(3, attempt_count()); 588 ASSERT_TRUE(is_state_idle()); 589 CheckPortalState( 590 NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 591 kStubWireless1); 592} 593 594TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForPortalNetwork) { 595 ASSERT_TRUE(is_state_idle()); 596 set_min_time_between_attempts(base::TimeDelta()); 597 set_lazy_check_interval(base::TimeDelta()); 598 599 SetConnected(kStubWireless1); 600 enable_lazy_detection(); 601 602 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 603 net::URLFetcher::RESPONSE_CODE_INVALID, 604 NULL); 605 ASSERT_EQ(1, attempt_count()); 606 ASSERT_TRUE(is_state_portal_detection_pending()); 607 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 608 kStubWireless1); 609 610 // To run CaptivePortalDetector::DetectCaptivePortal(). 611 base::MessageLoop::current()->RunUntilIdle(); 612 613 CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 614 net::URLFetcher::RESPONSE_CODE_INVALID, 615 NULL); 616 ASSERT_EQ(2, attempt_count()); 617 ASSERT_TRUE(is_state_portal_detection_pending()); 618 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 619 kStubWireless1); 620 621 // To run CaptivePortalDetector::DetectCaptivePortal(). 622 base::MessageLoop::current()->RunUntilIdle(); 623 624 CompleteURLFetch(net::OK, 200, NULL); 625 ASSERT_EQ(3, attempt_count()); 626 ASSERT_TRUE(is_state_portal_detection_pending()); 627 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 628 kStubWireless1); 629 630 // To run CaptivePortalDetector::DetectCaptivePortal(). 631 base::MessageLoop::current()->RunUntilIdle(); 632 633 disable_lazy_detection(); 634 635 // One more detection result, because DizableLazyDetection() doesn't 636 // cancel last detection request. 637 CompleteURLFetch(net::OK, 200, NULL); 638 ASSERT_EQ(3, attempt_count()); 639 ASSERT_TRUE(is_state_idle()); 640 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 641 kStubWireless1); 642} 643 644TEST_F(NetworkPortalDetectorImplTest, DetectionTimeoutIsCancelled) { 645 ASSERT_TRUE(is_state_idle()); 646 set_min_time_between_attempts(base::TimeDelta()); 647 648 SetConnected(kStubWireless1); 649 ASSERT_TRUE(is_state_checking_for_portal()); 650 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 651 kStubWireless1); 652 653 cancel_portal_detection(); 654 655 ASSERT_TRUE(is_state_idle()); 656 ASSERT_TRUE(detection_timeout_is_cancelled()); 657 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, 658 kStubWireless1); 659} 660 661TEST_F(NetworkPortalDetectorImplTest, TestDetectionRestart) { 662 ASSERT_TRUE(is_state_idle()); 663 set_min_time_between_attempts(base::TimeDelta()); 664 665 // First portal detection attempts determines ONLINE state. 666 SetConnected(kStubWireless1); 667 ASSERT_TRUE(is_state_checking_for_portal()); 668 ASSERT_FALSE(start_detection_if_idle()); 669 670 CompleteURLFetch(net::OK, 204, NULL); 671 672 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, 673 kStubWireless1); 674 ASSERT_TRUE(is_state_idle()); 675 676 // First portal detection attempts determines PORTAL state. 677 ASSERT_TRUE(start_detection_if_idle()); 678 ASSERT_TRUE(is_state_portal_detection_pending()); 679 ASSERT_FALSE(start_detection_if_idle()); 680 681 base::MessageLoop::current()->RunUntilIdle(); 682 ASSERT_TRUE(is_state_checking_for_portal()); 683 CompleteURLFetch(net::OK, 200, NULL); 684 685 CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, 686 kStubWireless1); 687 ASSERT_TRUE(is_state_idle()); 688} 689 690TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts) { 691 ASSERT_TRUE(is_state_idle()); 692 set_min_time_between_attempts(base::TimeDelta()); 693 set_lazy_check_interval(base::TimeDelta()); 694 695 SetNetworkDeviceEnabled(flimflam::kTypeWifi, false); 696 SetConnected(kStubCellular); 697 698 // First portal detection attempt for cellular1 uses 5sec timeout. 699 CheckRequestTimeoutAndCompleteAttempt(1, 5, net::ERR_CONNECTION_CLOSED, 700 net::URLFetcher::RESPONSE_CODE_INVALID); 701 702 // Second portal detection attempt for cellular1 uses 10sec timeout. 703 ASSERT_TRUE(is_state_portal_detection_pending()); 704 base::MessageLoop::current()->RunUntilIdle(); 705 CheckRequestTimeoutAndCompleteAttempt(2, 10, net::ERR_CONNECTION_CLOSED, 706 net::URLFetcher::RESPONSE_CODE_INVALID); 707 708 // Third portal detection attempt for cellular1 uses 15sec timeout. 709 ASSERT_TRUE(is_state_portal_detection_pending()); 710 base::MessageLoop::current()->RunUntilIdle(); 711 CheckRequestTimeoutAndCompleteAttempt(3, 15, net::ERR_CONNECTION_CLOSED, 712 net::URLFetcher::RESPONSE_CODE_INVALID); 713 714 ASSERT_TRUE(is_state_idle()); 715 716 // Check that in lazy detection for cellular1 15sec timeout is used. 717 enable_lazy_detection(); 718 ASSERT_TRUE(is_state_portal_detection_pending()); 719 base::MessageLoop::current()->RunUntilIdle(); 720 disable_lazy_detection(); 721 CheckRequestTimeoutAndCompleteAttempt(3, 15, net::ERR_CONNECTION_CLOSED, 722 net::URLFetcher::RESPONSE_CODE_INVALID); 723 ASSERT_TRUE(is_state_idle()); 724 725 SetNetworkDeviceEnabled(flimflam::kTypeWifi, true); 726 SetConnected(kStubWireless1); 727 728 // First portal detection attempt for wifi1 uses 5sec timeout. 729 CheckRequestTimeoutAndCompleteAttempt(1, 5, net::ERR_CONNECTION_CLOSED, 730 net::URLFetcher::RESPONSE_CODE_INVALID); 731 732 // Second portal detection attempt for wifi1 also uses 5sec timeout. 733 ASSERT_TRUE(is_state_portal_detection_pending()); 734 base::MessageLoop::current()->RunUntilIdle(); 735 CheckRequestTimeoutAndCompleteAttempt(2, 10, net::OK, 204); 736 ASSERT_TRUE(is_state_idle()); 737 738 // Check that in lazy detection for wifi1 5sec timeout is used. 739 enable_lazy_detection(); 740 ASSERT_TRUE(is_state_portal_detection_pending()); 741 base::MessageLoop::current()->RunUntilIdle(); 742 disable_lazy_detection(); 743 CheckRequestTimeoutAndCompleteAttempt(3, 15, net::OK, 204); 744 ASSERT_TRUE(is_state_idle()); 745} 746 747TEST_F(NetworkPortalDetectorImplTest, StartDetectionIfIdle) { 748 ASSERT_TRUE(is_state_idle()); 749 set_min_time_between_attempts(base::TimeDelta()); 750 SetConnected(kStubWireless1); 751 752 // First portal detection attempt for wifi1 uses 5sec timeout. 753 CheckRequestTimeoutAndCompleteAttempt(1, 5, net::ERR_CONNECTION_CLOSED, 754 net::URLFetcher::RESPONSE_CODE_INVALID); 755 ASSERT_TRUE(is_state_portal_detection_pending()); 756 base::MessageLoop::current()->RunUntilIdle(); 757 758 // Second portal detection attempt for wifi1 uses 10sec timeout. 759 CheckRequestTimeoutAndCompleteAttempt(2, 10, net::ERR_CONNECTION_CLOSED, 760 net::URLFetcher::RESPONSE_CODE_INVALID); 761 ASSERT_TRUE(is_state_portal_detection_pending()); 762 base::MessageLoop::current()->RunUntilIdle(); 763 764 // Second portal detection attempt for wifi1 uses 15sec timeout. 765 CheckRequestTimeoutAndCompleteAttempt(3, 15, net::ERR_CONNECTION_CLOSED, 766 net::URLFetcher::RESPONSE_CODE_INVALID); 767 ASSERT_TRUE(is_state_idle()); 768 start_detection_if_idle(); 769 770 ASSERT_TRUE(is_state_portal_detection_pending()); 771 772 // First portal detection attempt for wifi1 uses 5sec timeout. 773 base::MessageLoop::current()->RunUntilIdle(); 774 CheckRequestTimeoutAndCompleteAttempt(1, 5, net::OK, 204); 775 ASSERT_TRUE(is_state_idle()); 776} 777 778} // namespace chromeos 779