Extracted WiFi interface from Network interface
BUG: 24111116
Change-Id: Idffd3b84d2b5b5b7fc6414511bbc6fb7aaca98d3
Reviewed-on: https://weave-review.googlesource.com/1113
Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/libweave/examples/ubuntu/main.cc b/libweave/examples/ubuntu/main.cc
index 2a96ee2..b0b7f14 100644
--- a/libweave/examples/ubuntu/main.cc
+++ b/libweave/examples/ubuntu/main.cc
@@ -48,7 +48,7 @@
opts.disable_security = false;
opts.enable_ping = true;
device->Start(opts, &config_store, &task_runner, &http_client, &network,
- &mdns, &http_server, &bluetooth);
+ &mdns, &http_server, &network, &bluetooth);
task_runner.Run();
diff --git a/libweave/examples/ubuntu/network_manager.h b/libweave/examples/ubuntu/network_manager.h
index 8abc80d..4855cfa 100644
--- a/libweave/examples/ubuntu/network_manager.h
+++ b/libweave/examples/ubuntu/network_manager.h
@@ -11,6 +11,7 @@
#include <base/memory/weak_ptr.h>
#include <base/time/time.h>
#include <weave/network.h>
+#include <weave/wifi.h>
namespace weave {
@@ -20,7 +21,7 @@
// Basic weave::Network implementation.
// Production version of SSL socket needs secure server certificate check.
-class NetworkImpl : public Network {
+class NetworkImpl : public Network, public Wifi {
public:
explicit NetworkImpl(TaskRunner* task_runner, bool force_bootstrapping);
~NetworkImpl();
diff --git a/libweave/include/weave/device.h b/libweave/include/weave/device.h
index c7ed3ae..e45d727 100644
--- a/libweave/include/weave/device.h
+++ b/libweave/include/weave/device.h
@@ -21,6 +21,7 @@
#include <weave/privet.h>
#include <weave/state.h>
#include <weave/task_runner.h>
+#include <weave/wifi.h>
namespace weave {
@@ -43,6 +44,7 @@
Network* network,
Mdns* mdns,
HttpServer* http_server,
+ Wifi* wifi,
Bluetooth* bluetooth) = 0;
virtual Commands* GetCommands() = 0;
diff --git a/libweave/include/weave/network.h b/libweave/include/weave/network.h
index 3ae70c0..1d4e07f 100644
--- a/libweave/include/weave/network.h
+++ b/libweave/include/weave/network.h
@@ -5,7 +5,6 @@
#ifndef LIBWEAVE_INCLUDE_WEAVE_NETWORK_H_
#define LIBWEAVE_INCLUDE_WEAVE_NETWORK_H_
-#include <map>
#include <string>
#include <base/callback.h>
@@ -31,22 +30,9 @@
virtual void AddOnConnectionChangedCallback(
const OnConnectionChangedCallback& listener) = 0;
- // Implementation should attempt to connect to the given network with the
- // given passphrase. This is accomplished by:
- // Returns false on immediate failures with some descriptive codes in |error|.
- virtual bool ConnectToService(const std::string& ssid,
- const std::string& passphrase,
- const base::Closure& on_success,
- ErrorPtr* error) = 0;
-
+ // Returns current Internet connectivity state
virtual NetworkState GetConnectionState() const = 0;
- // Starts WiFi access point for wifi setup.
- virtual void EnableAccessPoint(const std::string& ssid) = 0;
-
- // Stops WiFi access point.
- virtual void DisableAccessPoint() = 0;
-
// Opens bidirectional sockets and returns attached stream.
virtual void OpenSslSocket(
const std::string& host,
diff --git a/libweave/include/weave/test/mock_network.h b/libweave/include/weave/test/mock_network.h
index f188223..e2d0074 100644
--- a/libweave/include/weave/test/mock_network.h
+++ b/libweave/include/weave/test/mock_network.h
@@ -21,15 +21,7 @@
MOCK_METHOD1(AddOnConnectionChangedCallback,
void(const OnConnectionChangedCallback&));
- MOCK_METHOD4(ConnectToService,
- bool(const std::string&,
- const std::string&,
- const base::Closure&,
- ErrorPtr*));
MOCK_CONST_METHOD0(GetConnectionState, NetworkState());
- MOCK_METHOD1(EnableAccessPoint, void(const std::string&));
- MOCK_METHOD0(DisableAccessPoint, void());
-
MOCK_METHOD4(OpenSslSocket,
void(const std::string&,
uint16_t,
diff --git a/libweave/include/weave/test/mock_wifi.h b/libweave/include/weave/test/mock_wifi.h
new file mode 100644
index 0000000..b32d1f2
--- /dev/null
+++ b/libweave/include/weave/test/mock_wifi.h
@@ -0,0 +1,34 @@
+// Copyright 2015 The Chromium OS 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 LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_WIFI_H_
+#define LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_WIFI_H_
+
+#include <weave/network.h>
+
+#include <string>
+
+#include <gmock/gmock.h>
+
+namespace weave {
+namespace test {
+
+class MockWifi : public Wifi {
+ public:
+ MockWifi() {}
+ ~MockWifi() override = default;
+
+ MOCK_METHOD4(ConnectToService,
+ bool(const std::string&,
+ const std::string&,
+ const base::Closure&,
+ ErrorPtr*));
+ MOCK_METHOD1(EnableAccessPoint, void(const std::string&));
+ MOCK_METHOD0(DisableAccessPoint, void());
+};
+
+} // namespace test
+} // namespace weave
+
+#endif // LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_WIFI_H_
diff --git a/libweave/include/weave/wifi.h b/libweave/include/weave/wifi.h
new file mode 100644
index 0000000..95edbeb
--- /dev/null
+++ b/libweave/include/weave/wifi.h
@@ -0,0 +1,37 @@
+// Copyright 2015 The Chromium OS 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 LIBWEAVE_INCLUDE_WEAVE_WIFI_H_
+#define LIBWEAVE_INCLUDE_WEAVE_WIFI_H_
+
+#include <string>
+
+#include <base/callback.h>
+#include <weave/error.h>
+
+namespace weave {
+
+class Wifi {
+ public:
+ // Implementation should attempt to connect to the given network with the
+ // given passphrase. Implementation should run either of callback.
+ // Callback should be posted.
+ virtual bool ConnectToService(const std::string& ssid,
+ const std::string& passphrase,
+ const base::Closure& success_callback,
+ ErrorPtr* error) = 0;
+
+ // Starts WiFi access point for wifi setup.
+ virtual void EnableAccessPoint(const std::string& ssid) = 0;
+
+ // Stops WiFi access point.
+ virtual void DisableAccessPoint() = 0;
+
+ protected:
+ virtual ~Wifi() = default;
+};
+
+} // namespace weave
+
+#endif // LIBWEAVE_INCLUDE_WEAVE_WIFI_H_
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc
index 1435aeb..111b87e 100644
--- a/libweave/src/device_manager.cc
+++ b/libweave/src/device_manager.cc
@@ -36,6 +36,7 @@
Network* network,
Mdns* mdns,
HttpServer* http_server,
+ Wifi* wifi,
Bluetooth* bluetooth) {
command_manager_ = std::make_shared<CommandManager>();
command_manager_->Startup(config_store);
@@ -57,7 +58,8 @@
device_info_->Start();
if (!options.disable_privet) {
- StartPrivet(options, task_runner, network, mdns, http_server, bluetooth);
+ StartPrivet(options, task_runner, network, mdns, http_server, wifi,
+ bluetooth);
} else {
CHECK(!http_server);
CHECK(!mdns);
@@ -89,9 +91,10 @@
Network* network,
Mdns* mdns,
HttpServer* http_server,
+ Wifi* wifi,
Bluetooth* bluetooth) {
privet_.reset(new privet::Manager{});
- privet_->Start(options, task_runner, network, mdns, http_server,
+ privet_->Start(options, task_runner, network, mdns, http_server, wifi,
device_info_.get(), command_manager_.get(),
state_manager_.get());
diff --git a/libweave/src/device_manager.h b/libweave/src/device_manager.h
index 376f122..bc6f031 100644
--- a/libweave/src/device_manager.h
+++ b/libweave/src/device_manager.h
@@ -33,6 +33,7 @@
Network* network,
Mdns* mdns,
HttpServer* http_server,
+ Wifi* wifi,
Bluetooth* bluetooth) override;
Commands* GetCommands() override;
@@ -48,6 +49,7 @@
Network* network,
Mdns* mdns,
HttpServer* http_server,
+ Wifi* wifi,
Bluetooth* bluetooth);
void OnWiFiBootstrapStateChanged(weave::WifiSetupState state);
diff --git a/libweave/src/privet/privet_manager.cc b/libweave/src/privet/privet_manager.cc
index 2c581f7..4363d5a 100644
--- a/libweave/src/privet/privet_manager.cc
+++ b/libweave/src/privet/privet_manager.cc
@@ -40,6 +40,7 @@
Network* network,
Mdns* mdns,
HttpServer* http_server,
+ Wifi* wifi,
DeviceRegistrationInfo* device,
CommandManager* command_manager,
StateManager* state_manager) {
@@ -55,11 +56,11 @@
network->AddOnConnectionChangedCallback(
base::Bind(&Manager::OnConnectivityChanged, base::Unretained(this)));
- if (device->GetSettings().wifi_auto_setup_enabled) {
+ if (wifi && device->GetSettings().wifi_auto_setup_enabled) {
VLOG(1) << "Enabling WiFi bootstrapping.";
wifi_bootstrap_manager_.reset(new WifiBootstrapManager(
device->GetSettings().last_configured_ssid, options.test_privet_ssid,
- device->GetSettings().ble_setup_enabled, task_runner, network,
+ device->GetSettings().ble_setup_enabled, task_runner, network, wifi,
cloud_.get()));
wifi_bootstrap_manager_->Init();
}
diff --git a/libweave/src/privet/privet_manager.h b/libweave/src/privet/privet_manager.h
index cc9ccc5..50f7416 100644
--- a/libweave/src/privet/privet_manager.h
+++ b/libweave/src/privet/privet_manager.h
@@ -52,6 +52,7 @@
Network* network,
Mdns* mdns,
HttpServer* http_server,
+ Wifi* wifi,
DeviceRegistrationInfo* device,
CommandManager* command_manager,
StateManager* state_manager);
diff --git a/libweave/src/privet/wifi_bootstrap_manager.cc b/libweave/src/privet/wifi_bootstrap_manager.cc
index dc5ef7f..b9766d9 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.cc
+++ b/libweave/src/privet/wifi_bootstrap_manager.cc
@@ -9,6 +9,7 @@
#include <weave/enum_to_string.h>
#include <weave/network.h>
#include <weave/task_runner.h>
+#include <weave/wifi.h>
#include "libweave/src/bind_lambda.h"
#include "libweave/src/privet/constants.h"
@@ -22,13 +23,18 @@
bool ble_setup_enabled,
TaskRunner* task_runner,
Network* network,
+ Wifi* wifi,
CloudDelegate* gcd)
: task_runner_{task_runner},
network_{network},
+ wifi_{wifi},
ssid_generator_{gcd, this},
last_configured_ssid_{last_configured_ssid},
test_privet_ssid_{test_privet_ssid},
ble_setup_enabled_{ble_setup_enabled} {
+ CHECK(network_);
+ CHECK(task_runner_);
+ CHECK(wifi_);
}
void WifiBootstrapManager::Init() {
@@ -74,13 +80,13 @@
// TODO(vitalybuka): Add SSID probing.
privet_ssid_ = GenerateSsid();
CHECK(!privet_ssid_.empty());
- network_->EnableAccessPoint(privet_ssid_);
+ wifi_->EnableAccessPoint(privet_ssid_);
LOG_IF(INFO, ble_setup_enabled_) << "BLE Bootstrap start: not implemented.";
}
void WifiBootstrapManager::EndBootstrapping() {
LOG_IF(INFO, ble_setup_enabled_) << "BLE Bootstrap stop: not implemented.";
- network_->DisableAccessPoint();
+ wifi_->DisableAccessPoint();
privet_ssid_.clear();
}
@@ -93,10 +99,10 @@
FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectTimeout,
tasks_weak_factory_.GetWeakPtr()),
base::TimeDelta::FromMinutes(3));
- network_->ConnectToService(ssid, passphrase,
- base::Bind(&WifiBootstrapManager::OnConnectSuccess,
- tasks_weak_factory_.GetWeakPtr(), ssid),
- nullptr);
+ wifi_->ConnectToService(ssid, passphrase,
+ base::Bind(&WifiBootstrapManager::OnConnectSuccess,
+ tasks_weak_factory_.GetWeakPtr(), ssid),
+ nullptr);
}
void WifiBootstrapManager::EndConnecting() {
diff --git a/libweave/src/privet/wifi_bootstrap_manager.h b/libweave/src/privet/wifi_bootstrap_manager.h
index 65436c2..340296c 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.h
+++ b/libweave/src/privet/wifi_bootstrap_manager.h
@@ -24,6 +24,7 @@
class Network;
class TaskRunner;
+class Wifi;
namespace privet {
@@ -41,6 +42,7 @@
bool wifi_setup_enabled,
TaskRunner* task_runner,
Network* shill_client,
+ Wifi* wifi,
CloudDelegate* gcd);
~WifiBootstrapManager() override = default;
virtual void Init();
@@ -96,6 +98,7 @@
ConnectionState connection_state_{ConnectionState::kDisabled};
TaskRunner* task_runner_{nullptr};
Network* network_{nullptr};
+ Wifi* wifi_{nullptr};
WifiSsidGenerator ssid_generator_;
base::Time monitor_until_;
diff --git a/libweave/src/weave_unittest.cc b/libweave/src/weave_unittest.cc
index d6418c3..43a7282 100644
--- a/libweave/src/weave_unittest.cc
+++ b/libweave/src/weave_unittest.cc
@@ -13,6 +13,7 @@
#include <weave/test/mock_mdns.h>
#include <weave/test/mock_network.h>
#include <weave/test/mock_task_runner.h>
+#include <weave/test/mock_wifi.h>
#include <weave/test/unittest_utils.h>
#include "libweave/src/bind_lambda.h"
@@ -282,7 +283,7 @@
void InitDefaultExpectations() {
InitConfigStore();
InitNetwork();
- EXPECT_CALL(network_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
+ EXPECT_CALL(wifi_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
.WillOnce(Return());
InitHttpServer();
InitMdns();
@@ -293,7 +294,7 @@
options.xmpp_enabled = false;
device_->Start(options, &config_store_, &task_runner_, &http_client_,
- &network_, &mdns_, &http_server_, &bluetooth_);
+ &network_, &mdns_, &http_server_, &wifi_, &bluetooth_);
cloud_ = device_->GetCloud();
ASSERT_TRUE(cloud_);
@@ -327,6 +328,7 @@
StrictMock<test::MockNetwork> network_;
StrictMock<test::MockMdns> mdns_;
StrictMock<test::MockHttpServer> http_server_;
+ StrictMock<test::MockWifi> wifi_;
StrictMock<test::MockBluetooth> bluetooth_;
std::vector<Network::OnConnectionChangedCallback> network_callbacks_;
@@ -348,7 +350,24 @@
InitConfigStore();
device_->Start(options, &config_store_, &task_runner_, &http_client_,
- &network_, nullptr, nullptr, nullptr);
+ &network_, nullptr, nullptr, &wifi_, nullptr);
+}
+
+TEST_F(WeaveTest, StartNoWifi) {
+ InitConfigStore();
+ InitNetwork();
+ InitHttpServer();
+ InitMdns();
+ InitMdnsPublishing(false, "CB");
+
+ weave::Device::Options options;
+ device_->Start(options, &config_store_, &task_runner_, &http_client_,
+ &network_, &mdns_, &http_server_, nullptr, &bluetooth_);
+
+ for (const auto& cb : http_server_changed_cb_)
+ cb.Run(http_server_);
+
+ task_runner_.Run();
}
class WeaveBasicTest : public WeaveTest {
@@ -420,7 +439,7 @@
// Long disconnect.
NotifyNetworkChanged(NetworkState::kOffline, {});
auto offline_from = task_runner_.GetClock()->Now();
- EXPECT_CALL(network_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
+ EXPECT_CALL(wifi_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
.WillOnce(InvokeWithoutArgs([this, offline_from]() {
EXPECT_GT(task_runner_.GetClock()->Now() - offline_from,
base::TimeDelta::FromMinutes(1));
@@ -442,7 +461,7 @@
for (int i = 0; i < 5; ++i) {
auto offline_from = task_runner_.GetClock()->Now();
// Temporarily offline mode.
- EXPECT_CALL(network_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
+ EXPECT_CALL(wifi_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
.WillOnce(InvokeWithoutArgs([this, &offline_from]() {
EXPECT_GT(task_runner_.GetClock()->Now() - offline_from,
base::TimeDelta::FromMinutes(1));
@@ -452,7 +471,7 @@
// Try to reconnect again.
offline_from = task_runner_.GetClock()->Now();
- EXPECT_CALL(network_, DisableAccessPoint())
+ EXPECT_CALL(wifi_, DisableAccessPoint())
.WillOnce(InvokeWithoutArgs([this, offline_from]() {
EXPECT_GT(task_runner_.GetClock()->Now() - offline_from,
base::TimeDelta::FromMinutes(5));
@@ -472,7 +491,7 @@
.WillRepeatedly(Return(NetworkState::kOffline));
auto offline_from = task_runner_.GetClock()->Now();
- EXPECT_CALL(network_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
+ EXPECT_CALL(wifi_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
.WillOnce(InvokeWithoutArgs([this, &offline_from]() {
EXPECT_GT(task_runner_.GetClock()->Now() - offline_from,
base::TimeDelta::FromMinutes(1));