summaryrefslogtreecommitdiffstats
path: root/chromecast
diff options
context:
space:
mode:
authorderekjchow <derekjchow@chromium.org>2015-06-02 17:01:43 -0700
committerCommit bot <commit-bot@chromium.org>2015-06-03 00:02:33 +0000
commit15b3f076092736bb58a2ad368d4cfe14308bb463 (patch)
treeed4c161da3f64c9f2e7a031160607a5d5879a61f /chromecast
parent5ddc2b7de39a0ac89b25fbdac9d150372eff4221 (diff)
downloadchromium_src-15b3f076092736bb58a2ad368d4cfe14308bb463.zip
chromium_src-15b3f076092736bb58a2ad368d4cfe14308bb463.tar.gz
chromium_src-15b3f076092736bb58a2ad368d4cfe14308bb463.tar.bz2
[Chromecast] Refactor ConnectivityChecker for test.
Make ConnectivityChecker virtual and add default implementation. Add FakeConnectivityChecker for use in tests. TEST=Build cast_shell. Build/run internal unittests. BUG= Review URL: https://codereview.chromium.org/1152293006 Cr-Commit-Position: refs/heads/master@{#332499}
Diffstat (limited to 'chromecast')
-rw-r--r--chromecast/browser/cast_browser_main_parts.cc4
-rw-r--r--chromecast/chromecast.gyp4
-rw-r--r--chromecast/net/connectivity_checker.cc177
-rw-r--r--chromecast/net/connectivity_checker.h68
-rw-r--r--chromecast/net/connectivity_checker_impl.cc184
-rw-r--r--chromecast/net/connectivity_checker_impl.h86
-rw-r--r--chromecast/net/fake_connectivity_checker.cc32
-rw-r--r--chromecast/net/fake_connectivity_checker.h32
8 files changed, 358 insertions, 229 deletions
diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc
index 9e2b84a..f4ea856 100644
--- a/chromecast/browser/cast_browser_main_parts.cc
+++ b/chromecast/browser/cast_browser_main_parts.cc
@@ -300,9 +300,9 @@ void CastBrowserMainParts::PreMainMessageLoopRun() {
#endif // defined(OS_ANDROID)
cast_browser_process_->SetConnectivityChecker(
- make_scoped_refptr(new ConnectivityChecker(
+ ConnectivityChecker::Create(
content::BrowserThread::GetMessageLoopProxyForThread(
- content::BrowserThread::IO))));
+ content::BrowserThread::IO)));
url_request_context_factory_->InitializeOnUIThread();
diff --git a/chromecast/chromecast.gyp b/chromecast/chromecast.gyp
index 830c313..f0782ee 100644
--- a/chromecast/chromecast.gyp
+++ b/chromecast/chromecast.gyp
@@ -110,6 +110,10 @@
'sources': [
'net/connectivity_checker.cc',
'net/connectivity_checker.h',
+ 'net/connectivity_checker_impl.cc',
+ 'net/connectivity_checker_impl.h',
+ 'net/fake_connectivity_checker.cc',
+ 'net/fake_connectivity_checker.h',
'net/net_switches.cc',
'net/net_switches.h',
'net/net_util_cast.cc',
diff --git a/chromecast/net/connectivity_checker.cc b/chromecast/net/connectivity_checker.cc
index 017b65b..16417ab 100644
--- a/chromecast/net/connectivity_checker.cc
+++ b/chromecast/net/connectivity_checker.cc
@@ -4,73 +4,16 @@
#include "chromecast/net/connectivity_checker.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "chromecast/net/net_switches.h"
-#include "net/base/request_priority.h"
-#include "net/http/http_response_headers.h"
-#include "net/http/http_response_info.h"
-#include "net/http/http_status_code.h"
-#include "net/proxy/proxy_config.h"
-#include "net/proxy/proxy_config_service_fixed.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_builder.h"
+#include "chromecast/net/connectivity_checker_impl.h"
namespace chromecast {
-namespace {
-
-// How often connectivity checks are performed in seconds.
-const unsigned int kConnectivityPeriodSeconds = 1;
-
-// Number of consecutive connectivity check errors before status is changed
-// to offline.
-const unsigned int kNumErrorsToNotifyOffline = 3;
-
-// Default url for connectivity checking.
-const char kDefaultConnectivityCheckUrl[] =
- "https://clients3.google.com/generate_204";
-
-} // namespace
-
-ConnectivityChecker::ConnectivityChecker(
- const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
+ConnectivityChecker::ConnectivityChecker()
: connectivity_observer_list_(
- new ObserverListThreadSafe<ConnectivityObserver>()),
- task_runner_(task_runner),
- connected_(false),
- check_errors_(0) {
- DCHECK(task_runner_.get());
- task_runner->PostTask(FROM_HERE,
- base::Bind(&ConnectivityChecker::Initialize, this));
-}
-
-void ConnectivityChecker::Initialize() {
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- base::CommandLine::StringType check_url_str =
- command_line->GetSwitchValueNative(switches::kConnectivityCheckUrl);
- connectivity_check_url_.reset(new GURL(
- check_url_str.empty() ? kDefaultConnectivityCheckUrl : check_url_str));
-
- net::URLRequestContextBuilder builder;
- builder.set_proxy_config_service(
- new net::ProxyConfigServiceFixed(net::ProxyConfig::CreateDirect()));
- builder.DisableHttpCache();
- url_request_context_.reset(builder.Build());
-
- net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
- net::NetworkChangeNotifier::AddIPAddressObserver(this);
- task_runner_->PostTask(FROM_HERE,
- base::Bind(&ConnectivityChecker::Check, this));
+ new base::ObserverListThreadSafe<ConnectivityObserver>()) {
}
ConnectivityChecker::~ConnectivityChecker() {
- DCHECK(task_runner_.get());
- net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
- net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
- task_runner_->DeleteSoon(FROM_HERE, url_request_context_.release());
- task_runner_->DeleteSoon(FROM_HERE, url_request_.release());
}
void ConnectivityChecker::AddConnectivityObserver(
@@ -83,116 +26,10 @@ void ConnectivityChecker::RemoveConnectivityObserver(
connectivity_observer_list_->RemoveObserver(observer);
}
-bool ConnectivityChecker::Connected() const {
- return connected_;
-}
-
-void ConnectivityChecker::SetConnectedForTesting(bool connected) {
- SetConnected(connected);
-}
-
-void ConnectivityChecker::SetConnected(bool connected) {
- if (connected_ == connected)
- return;
-
- connected_ = connected;
- connectivity_observer_list_->Notify(
- FROM_HERE, &ConnectivityObserver::OnConnectivityChanged, connected);
- LOG(INFO) << "Global connection is: " << (connected ? "Up" : "Down");
-}
-
-void ConnectivityChecker::Check() {
- if (!task_runner_->BelongsToCurrentThread()) {
- task_runner_->PostTask(FROM_HERE,
- base::Bind(&ConnectivityChecker::Check, this));
- return;
- }
- DCHECK(url_request_context_.get());
-
- // Don't check connectivity if network is offline, because Internet could be
- // accessible via netifs ignored.
- if (net::NetworkChangeNotifier::IsOffline())
- return;
-
- // If url_request_ is non-null, there is already a check going on. Don't
- // start another.
- if (url_request_.get())
- return;
-
- VLOG(1) << "Connectivity check: url=" << *connectivity_check_url_;
- url_request_ = url_request_context_->CreateRequest(
- *connectivity_check_url_, net::MAXIMUM_PRIORITY, this);
- url_request_->set_method("HEAD");
- url_request_->Start();
-}
-
-void ConnectivityChecker::OnConnectionTypeChanged(
- net::NetworkChangeNotifier::ConnectionType type) {
- VLOG(2) << "OnConnectionTypeChanged " << type;
- if (type == net::NetworkChangeNotifier::CONNECTION_NONE)
- SetConnected(false);
-
- Cancel();
- Check();
-}
-
-void ConnectivityChecker::OnIPAddressChanged() {
- VLOG(2) << "OnIPAddressChanged";
-
- Cancel();
- Check();
-}
-
-void ConnectivityChecker::OnResponseStarted(net::URLRequest* request) {
- int http_response_code =
- (request->status().is_success() &&
- request->response_info().headers.get() != NULL)
- ? request->response_info().headers->response_code()
- : net::HTTP_BAD_REQUEST;
-
- // Clears resources.
- url_request_.reset(NULL); // URLRequest::Cancel() is called in destructor.
-
- if (http_response_code < 400) {
- VLOG(1) << "Connectivity check succeeded";
- check_errors_ = 0;
- SetConnected(true);
- return;
- }
- VLOG(1) << "Connectivity check failed: " << http_response_code;
- OnUrlRequestError();
-}
-
-void ConnectivityChecker::OnSSLCertificateError(net::URLRequest* request,
- const net::SSLInfo& ssl_info,
- bool fatal) {
- LOG(ERROR) << "OnSSLCertificateError";
- OnUrlRequestError();
-}
-
-void ConnectivityChecker::OnUrlRequestError() {
- ++check_errors_;
- if (check_errors_ > kNumErrorsToNotifyOffline) {
- check_errors_ = kNumErrorsToNotifyOffline;
- SetConnected(false);
- }
- url_request_.reset(NULL);
- // Check again.
- task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(&ConnectivityChecker::Check, this),
- base::TimeDelta::FromSeconds(kConnectivityPeriodSeconds));
-}
-
-void ConnectivityChecker::OnReadCompleted(net::URLRequest* request,
- int bytes_read) {
- NOTREACHED();
-}
-
-void ConnectivityChecker::Cancel() {
- if (url_request_.get()) {
- VLOG(2) << "Cancel connectivity check in progress";
- url_request_.reset(NULL); // URLRequest::Cancel() is called in destructor.
- }
+// static
+scoped_refptr<ConnectivityChecker> ConnectivityChecker::Create(
+ const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
+ return make_scoped_refptr(new ConnectivityCheckerImpl(task_runner));
}
} // namespace chromecast
diff --git a/chromecast/net/connectivity_checker.h b/chromecast/net/connectivity_checker.h
index e01f08e..0c843a0 100644
--- a/chromecast/net/connectivity_checker.h
+++ b/chromecast/net/connectivity_checker.h
@@ -7,9 +7,7 @@
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "net/base/network_change_notifier.h"
-#include "net/url_request/url_request.h"
+#include "base/observer_list_threadsafe.h"
class GURL;
@@ -17,20 +15,11 @@ namespace base {
class SingleThreadTaskRunner;
}
-namespace net {
-class SSLInfo;
-class URLRequestContext;
-}
-
namespace chromecast {
-// Simple class to check network connectivity by sending a HEAD http request
-// to given url.
+// Checks if internet connectivity is available.
class ConnectivityChecker
- : public base::RefCountedThreadSafe<ConnectivityChecker>,
- public net::URLRequest::Delegate,
- public net::NetworkChangeNotifier::ConnectionTypeObserver,
- public net::NetworkChangeNotifier::IPAddressObserver {
+ : public base::RefCountedThreadSafe<ConnectivityChecker> {
public:
class ConnectivityObserver {
public:
@@ -45,63 +34,28 @@ class ConnectivityChecker
DISALLOW_COPY_AND_ASSIGN(ConnectivityObserver);
};
- explicit ConnectivityChecker(
+ static scoped_refptr<ConnectivityChecker> Create(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
+ ConnectivityChecker();
+
void AddConnectivityObserver(ConnectivityObserver* observer);
void RemoveConnectivityObserver(ConnectivityObserver* observer);
// Returns if there is internet connectivity
- bool Connected() const;
+ virtual bool Connected() const = 0;
// Checks for connectivity
- void Check();
-
- // TODO(derek): refactor ConnectivityChecker to make a fully functional mock.
- void SetConnectedForTesting(bool connected);
+ virtual void Check() = 0;
protected:
- ~ConnectivityChecker() override;
+ virtual ~ConnectivityChecker();
+ const scoped_refptr<base::ObserverListThreadSafe<ConnectivityObserver>>
+ connectivity_observer_list_;
private:
friend class base::RefCountedThreadSafe<ConnectivityChecker>;
- // UrlRequest::Delegate implementation:
- void OnResponseStarted(net::URLRequest* request) override;
- void OnReadCompleted(net::URLRequest* request, int bytes_read) override;
- void OnSSLCertificateError(net::URLRequest* request,
- const net::SSLInfo& ssl_info,
- bool fatal) override;
-
- // Initializes ConnectivityChecker
- void Initialize();
-
- // NetworkChangeNotifier::ConnectionTypeObserver implementation:
- void OnConnectionTypeChanged(
- net::NetworkChangeNotifier::ConnectionType type) override;
-
- // net::NetworkChangeNotifier::IPAddressObserver implementation:
- void OnIPAddressChanged() override;
-
- // Cancels current connectivity checking in progress.
- void Cancel();
-
- // Sets connectivity and alerts observers if it has changed
- void SetConnected(bool connected);
-
- // Called when URL request failed.
- void OnUrlRequestError();
-
- scoped_ptr<GURL> connectivity_check_url_;
- scoped_ptr<net::URLRequestContext> url_request_context_;
- scoped_ptr<net::URLRequest> url_request_;
- const scoped_refptr<ObserverListThreadSafe<ConnectivityObserver> >
- connectivity_observer_list_;
- const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
- bool connected_;
- // Number of connectivity check errors.
- unsigned int check_errors_;
-
DISALLOW_COPY_AND_ASSIGN(ConnectivityChecker);
};
diff --git a/chromecast/net/connectivity_checker_impl.cc b/chromecast/net/connectivity_checker_impl.cc
new file mode 100644
index 0000000..f17a73f
--- /dev/null
+++ b/chromecast/net/connectivity_checker_impl.cc
@@ -0,0 +1,184 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/net/connectivity_checker_impl.h"
+
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/message_loop/message_loop.h"
+#include "chromecast/net/net_switches.h"
+#include "net/base/request_priority.h"
+#include "net/http/http_response_headers.h"
+#include "net/http/http_response_info.h"
+#include "net/http/http_status_code.h"
+#include "net/proxy/proxy_config.h"
+#include "net/proxy/proxy_config_service_fixed.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_builder.h"
+
+namespace chromecast {
+
+namespace {
+
+// How often connectivity checks are performed in seconds.
+const unsigned int kConnectivityPeriodSeconds = 1;
+
+// Number of consecutive connectivity check errors before status is changed
+// to offline.
+const unsigned int kNumErrorsToNotifyOffline = 3;
+
+// Default url for connectivity checking.
+const char kDefaultConnectivityCheckUrl[] =
+ "https://clients3.google.com/generate_204";
+
+} // namespace
+
+ConnectivityCheckerImpl::ConnectivityCheckerImpl(
+ const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
+ : ConnectivityChecker(),
+ task_runner_(task_runner),
+ connected_(false),
+ check_errors_(0) {
+ DCHECK(task_runner_.get());
+ task_runner->PostTask(FROM_HERE,
+ base::Bind(&ConnectivityCheckerImpl::Initialize, this));
+}
+
+void ConnectivityCheckerImpl::Initialize() {
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ base::CommandLine::StringType check_url_str =
+ command_line->GetSwitchValueNative(switches::kConnectivityCheckUrl);
+ connectivity_check_url_.reset(new GURL(
+ check_url_str.empty() ? kDefaultConnectivityCheckUrl : check_url_str));
+
+ net::URLRequestContextBuilder builder;
+ builder.set_proxy_config_service(
+ new net::ProxyConfigServiceFixed(net::ProxyConfig::CreateDirect()));
+ builder.DisableHttpCache();
+ url_request_context_.reset(builder.Build());
+
+ net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
+ net::NetworkChangeNotifier::AddIPAddressObserver(this);
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&ConnectivityCheckerImpl::Check, this));
+}
+
+ConnectivityCheckerImpl::~ConnectivityCheckerImpl() {
+ DCHECK(task_runner_.get());
+ net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
+ net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
+ task_runner_->DeleteSoon(FROM_HERE, url_request_.release());
+ task_runner_->DeleteSoon(FROM_HERE, url_request_context_.release());
+}
+
+bool ConnectivityCheckerImpl::Connected() const {
+ return connected_;
+}
+
+void ConnectivityCheckerImpl::SetConnected(bool connected) {
+ if (connected_ == connected)
+ return;
+
+ connected_ = connected;
+ connectivity_observer_list_->Notify(
+ FROM_HERE, &ConnectivityObserver::OnConnectivityChanged, connected);
+ LOG(INFO) << "Global connection is: " << (connected ? "Up" : "Down");
+}
+
+void ConnectivityCheckerImpl::Check() {
+ if (!task_runner_->BelongsToCurrentThread()) {
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&ConnectivityCheckerImpl::Check, this));
+ return;
+ }
+ DCHECK(url_request_context_.get());
+
+ // Don't check connectivity if network is offline, because Internet could be
+ // accessible via netifs ignored.
+ if (net::NetworkChangeNotifier::IsOffline())
+ return;
+
+ // If url_request_ is non-null, there is already a check going on. Don't
+ // start another.
+ if (url_request_.get())
+ return;
+
+ VLOG(1) << "Connectivity check: url=" << *connectivity_check_url_;
+ url_request_ = url_request_context_->CreateRequest(
+ *connectivity_check_url_, net::MAXIMUM_PRIORITY, this);
+ url_request_->set_method("HEAD");
+ url_request_->Start();
+}
+
+void ConnectivityCheckerImpl::OnConnectionTypeChanged(
+ net::NetworkChangeNotifier::ConnectionType type) {
+ VLOG(2) << "OnConnectionTypeChanged " << type;
+ if (type == net::NetworkChangeNotifier::CONNECTION_NONE)
+ SetConnected(false);
+
+ Cancel();
+ Check();
+}
+
+void ConnectivityCheckerImpl::OnIPAddressChanged() {
+ VLOG(2) << "OnIPAddressChanged";
+
+ Cancel();
+ Check();
+}
+
+void ConnectivityCheckerImpl::OnResponseStarted(net::URLRequest* request) {
+ int http_response_code =
+ (request->status().is_success() &&
+ request->response_info().headers.get() != NULL)
+ ? request->response_info().headers->response_code()
+ : net::HTTP_BAD_REQUEST;
+
+ // Clears resources.
+ url_request_.reset(NULL); // URLRequest::Cancel() is called in destructor.
+
+ if (http_response_code < 400) {
+ VLOG(1) << "Connectivity check succeeded";
+ check_errors_ = 0;
+ SetConnected(true);
+ return;
+ }
+ VLOG(1) << "Connectivity check failed: " << http_response_code;
+ OnUrlRequestError();
+}
+
+void ConnectivityCheckerImpl::OnSSLCertificateError(
+ net::URLRequest* request,
+ const net::SSLInfo& ssl_info,
+ bool fatal) {
+ LOG(ERROR) << "OnSSLCertificateError";
+ OnUrlRequestError();
+}
+
+void ConnectivityCheckerImpl::OnUrlRequestError() {
+ ++check_errors_;
+ if (check_errors_ > kNumErrorsToNotifyOffline) {
+ check_errors_ = kNumErrorsToNotifyOffline;
+ SetConnected(false);
+ }
+ url_request_.reset(NULL);
+ // Check again.
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(&ConnectivityCheckerImpl::Check, this),
+ base::TimeDelta::FromSeconds(kConnectivityPeriodSeconds));
+}
+
+void ConnectivityCheckerImpl::OnReadCompleted(net::URLRequest* request,
+ int bytes_read) {
+ NOTREACHED();
+}
+
+void ConnectivityCheckerImpl::Cancel() {
+ if (url_request_.get()) {
+ VLOG(2) << "Cancel connectivity check in progress";
+ url_request_.reset(NULL); // URLRequest::Cancel() is called in destructor.
+ }
+}
+
+} // namespace chromecast
diff --git a/chromecast/net/connectivity_checker_impl.h b/chromecast/net/connectivity_checker_impl.h
new file mode 100644
index 0000000..6ebe718
--- /dev/null
+++ b/chromecast/net/connectivity_checker_impl.h
@@ -0,0 +1,86 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMECAST_NET_CONNECTIVITY_CHECKER_IMPL_H_
+#define CHROMECAST_NET_CONNECTIVITY_CHECKER_IMPL_H_
+
+#include "chromecast/net/connectivity_checker.h"
+#include "net/base/network_change_notifier.h"
+#include "net/url_request/url_request.h"
+
+class GURL;
+
+namespace base {
+class SingleThreadTaskRunner;
+}
+
+namespace net {
+class SSLInfo;
+class URLRequest;
+class URLRequestContext;
+}
+
+namespace chromecast {
+
+// Simple class to check network connectivity by sending a HEAD http request
+// to given url.
+class ConnectivityCheckerImpl
+ : public ConnectivityChecker,
+ public net::URLRequest::Delegate,
+ public net::NetworkChangeNotifier::ConnectionTypeObserver,
+ public net::NetworkChangeNotifier::IPAddressObserver {
+ public:
+ explicit ConnectivityCheckerImpl(
+ const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
+
+ // ConnectivityChecker implementation:
+ bool Connected() const override;
+ void Check() override;
+
+ protected:
+ ~ConnectivityCheckerImpl() override;
+
+ private:
+ // UrlRequest::Delegate implementation:
+ void OnResponseStarted(net::URLRequest* request) override;
+ void OnReadCompleted(net::URLRequest* request, int bytes_read) override;
+ void OnSSLCertificateError(net::URLRequest* request,
+ const net::SSLInfo& ssl_info,
+ bool fatal) override;
+
+ // Initializes ConnectivityChecker
+ void Initialize();
+
+ // NetworkChangeNotifier::ConnectionTypeObserver implementation:
+ void OnConnectionTypeChanged(
+ net::NetworkChangeNotifier::ConnectionType type) override;
+
+ // net::NetworkChangeNotifier::IPAddressObserver implementation:
+ void OnIPAddressChanged() override;
+
+ // Cancels current connectivity checking in progress.
+ void Cancel();
+
+ // Sets connectivity and alerts observers if it has changed
+ void SetConnected(bool connected);
+
+ // Called when URL request failed.
+ void OnUrlRequestError();
+
+ scoped_ptr<GURL> connectivity_check_url_;
+ scoped_ptr<net::URLRequestContext> url_request_context_;
+ scoped_ptr<net::URLRequest> url_request_;
+ const scoped_refptr<ObserverListThreadSafe<ConnectivityObserver> >
+ connectivity_observer_list_;
+ const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+ bool connected_;
+ // Number of connectivity check errors.
+ unsigned int check_errors_;
+
+ DISALLOW_COPY_AND_ASSIGN(ConnectivityCheckerImpl);
+};
+
+} // namespace chromecast
+
+#endif // CHROMECAST_NET_CONNECTIVITY_CHECKER_IMPL_H_
diff --git a/chromecast/net/fake_connectivity_checker.cc b/chromecast/net/fake_connectivity_checker.cc
new file mode 100644
index 0000000..7b97d8a
--- /dev/null
+++ b/chromecast/net/fake_connectivity_checker.cc
@@ -0,0 +1,32 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/net/fake_connectivity_checker.h"
+
+namespace chromecast {
+
+FakeConnectivityChecker::FakeConnectivityChecker()
+ : ConnectivityChecker(),
+ connected_(true) {
+}
+
+FakeConnectivityChecker::~FakeConnectivityChecker() {}
+
+bool FakeConnectivityChecker::Connected() const {
+ return connected_;
+}
+
+void FakeConnectivityChecker::Check() {
+}
+
+void FakeConnectivityChecker::SetConnectedForTest(bool connected) {
+ if (connected_ == connected)
+ return;
+
+ connected_ = connected;
+ connectivity_observer_list_->Notify(
+ FROM_HERE, &ConnectivityObserver::OnConnectivityChanged, connected);
+}
+
+} // namespace chromecast
diff --git a/chromecast/net/fake_connectivity_checker.h b/chromecast/net/fake_connectivity_checker.h
new file mode 100644
index 0000000..7381b8f
--- /dev/null
+++ b/chromecast/net/fake_connectivity_checker.h
@@ -0,0 +1,32 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/net/connectivity_checker.h"
+
+namespace chromecast {
+
+// A simple fake connectivity checker for testing. Will appeared to be
+// connected by default.
+class FakeConnectivityChecker : public ConnectivityChecker {
+ public:
+ FakeConnectivityChecker();
+
+ // ConnectivityChecker implementation:
+ bool Connected() const override;
+ void Check() override;
+
+ // Sets connectivity and notifies observers if it has changed.
+ void SetConnectedForTest(bool connected);
+
+ protected:
+ ~FakeConnectivityChecker() override;
+
+ private:
+ friend class base::RefCountedThreadSafe<FakeConnectivityChecker>;
+ bool connected_;
+
+ DISALLOW_COPY_AND_ASSIGN(FakeConnectivityChecker);
+};
+
+} // namespace chromecast