diff options
author | ygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-28 14:33:36 +0000 |
---|---|---|
committer | ygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-28 14:33:36 +0000 |
commit | 7af47be542623a729971b724d336e76752c443a0 (patch) | |
tree | cb08a88c058b07c88313a551cc44a21ff3fff23a | |
parent | e161710d52ed947f419f077c919cf7f05283da1d (diff) | |
download | chromium_src-7af47be542623a729971b724d336e76752c443a0.zip chromium_src-7af47be542623a729971b724d336e76752c443a0.tar.gz chromium_src-7af47be542623a729971b724d336e76752c443a0.tar.bz2 |
Fixed detector behaviour for online -> offline transitions.
BUG=307033
TEST=NetworkPortalDetectorImplTest.*
Review URL: https://codereview.chromium.org/94373002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@237780 0039d316-1c4b-4281-b951-d872f2087c98
3 files changed, 73 insertions, 3 deletions
diff --git a/chrome/browser/chromeos/net/network_portal_detector.h b/chrome/browser/chromeos/net/network_portal_detector.h index 9568b53..b420442 100644 --- a/chrome/browser/chromeos/net/network_portal_detector.h +++ b/chrome/browser/chromeos/net/network_portal_detector.h @@ -32,6 +32,10 @@ class NetworkPortalDetector { response_code(net::URLFetcher::RESPONSE_CODE_INVALID) { } + bool operator==(const CaptivePortalState& o) const { + return status == o.status && response_code == o.response_code; + } + CaptivePortalStatus status; int response_code; }; diff --git a/chrome/browser/chromeos/net/network_portal_detector_impl.cc b/chrome/browser/chromeos/net/network_portal_detector_impl.cc index f9137ef..b92dfe7 100644 --- a/chrome/browser/chromeos/net/network_portal_detector_impl.cc +++ b/chrome/browser/chromeos/net/network_portal_detector_impl.cc @@ -204,9 +204,16 @@ void NetworkPortalDetectorImpl::DisableLazyDetection() { void NetworkPortalDetectorImpl::DefaultNetworkChanged( const NetworkState* default_network) { DCHECK(CalledOnValidThread()); + if (!default_network) { default_network_name_.clear(); default_network_id_.clear(); + + CancelPortalDetection(); + + CaptivePortalState state; + state.status = CAPTIVE_PORTAL_STATUS_OFFLINE; + SetCaptivePortalState(NULL, state); return; } diff --git a/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc b/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc index f5b8449..799785d 100644 --- a/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc +++ b/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc @@ -19,9 +19,13 @@ #include "content/public/test/test_browser_thread_bundle.h" #include "dbus/object_path.h" #include "net/base/net_errors.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/service_constants.h" +using testing::Mock; +using testing::_; + namespace chromeos { namespace { @@ -31,6 +35,15 @@ void ErrorCallbackFunction(const std::string& error_name, LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; } +class MockObserver : public NetworkPortalDetector::Observer { + public: + virtual ~MockObserver() {} + + MOCK_METHOD2(OnPortalDetectionCompleted, + void(const NetworkState* network, + const NetworkPortalDetector::CaptivePortalState& state)); +}; + } // namespace // Service paths for stub network devices. @@ -186,6 +199,13 @@ class NetworkPortalDetectorImplTest 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::RunLoop().RunUntilIdle(); + } + private: void SetupDefaultShillState() { base::RunLoop().RunUntilIdle(); @@ -272,13 +292,52 @@ TEST_F(NetworkPortalDetectorImplTest, Portal) { kStubEthernet); } +TEST_F(NetworkPortalDetectorImplTest, Online2Offline) { + ASSERT_TRUE(is_state_idle()); + + MockObserver observer; + network_portal_detector()->AddObserver(&observer); + + // 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); + + SetConnected(kStubWireless1); + ASSERT_TRUE(is_state_checking_for_portal()); + + CompleteURLFetch(net::OK, 204, NULL); + ASSERT_TRUE(is_state_idle()); + + // Check that observer was notified about online state. + Mock::VerifyAndClearExpectations(&observer); + } + + // WiFi is turned off. + { + NetworkPortalDetector::CaptivePortalState state; + state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE; + EXPECT_CALL(observer, OnPortalDetectionCompleted(NULL, state)).Times(1); + + SetDisconnected(kStubWireless1); + ASSERT_TRUE(is_state_idle()); + + // Check that observer was notified about offline state. + Mock::VerifyAndClearExpectations(&observer); + } + + network_portal_detector()->RemoveObserver(&observer); +} + TEST_F(NetworkPortalDetectorImplTest, TwoNetworks) { ASSERT_TRUE(is_state_idle()); SetConnected(kStubWireless1); ASSERT_TRUE(is_state_checking_for_portal()); - // wifi is in portal state. + // WiFi is in portal state. CompleteURLFetch(net::OK, 200, NULL); ASSERT_TRUE(is_state_idle()); @@ -303,10 +362,10 @@ TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) { fetcher()->set_response_code(200); ASSERT_TRUE(is_state_checking_for_portal()); - // Active network is changed during portal detection for wifi. + // Active network is changed during portal detection for WiFi. SetConnected(kStubEthernet); - // Portal detection for wifi is cancelled, portal detection for + // Portal detection for WiFi is cancelled, portal detection for // ethernet is initiated. ASSERT_TRUE(is_state_checking_for_portal()); |