summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-28 14:33:36 +0000
committerygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-28 14:33:36 +0000
commit7af47be542623a729971b724d336e76752c443a0 (patch)
treecb08a88c058b07c88313a551cc44a21ff3fff23a
parente161710d52ed947f419f077c919cf7f05283da1d (diff)
downloadchromium_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
-rw-r--r--chrome/browser/chromeos/net/network_portal_detector.h4
-rw-r--r--chrome/browser/chromeos/net/network_portal_detector_impl.cc7
-rw-r--r--chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc65
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());