libweave: Add command line flag to override ssid

Custom SSID can be useful test client applications.

BUG=none
TEST='FEATURES=test emerge-gizmo buffet'

Change-Id: I2a52543df2d62a35a38e2277bff865a0962069b9
Reviewed-on: https://chromium-review.googlesource.com/286662
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/etc/init/buffet.conf b/buffet/etc/init/buffet.conf
index bd273c1..6948605 100644
--- a/buffet/etc/init/buffet.conf
+++ b/buffet/etc/init/buffet.conf
@@ -13,11 +13,12 @@
 env BUFFET_ENABLE_XMPP=
 env BUFFET_STATE_PATH=
 env BUFFET_CONFIG_PATH=
-env BUFFET_TEST_DEFINITIONS_PATH=
 env BUFFET_ENABLE_PING=false
-env BUFFET_DISABLE_SECURITY=false
 env BUFFET_DEVICE_WHITELIST=
 env BUFFET_DISABLE_PRIVET=false
+env BUFFET_TEST_DEFINITIONS_PATH=
+env BUFFET_DISABLE_SECURITY=false
+env BUFFET_TEST_PRIVET_SSID=
 
 pre-start script
   mkdir -m 0755 -p /var/lib/buffet
@@ -31,12 +32,13 @@
     --v="${BUFFET_LOG_LEVEL}" \
     --config_path="${BUFFET_CONFIG_PATH}" \
     --state_path="${BUFFET_STATE_PATH}" \
-    --test_definitions_path="${BUFFET_TEST_DEFINITIONS_PATH}" \
-    --enable_xmpp="${BUFFET_ENABLE_XMPP}" \
     --disable_security="${BUFFET_DISABLE_SECURITY}" \
     --enable_ping="${BUFFET_ENABLE_PING}" \
     --device_whitelist="${BUFFET_DEVICE_WHITELIST}" \
-    --disable_privet="${BUFFET_DISABLE_PRIVET}"
+    --disable_privet="${BUFFET_DISABLE_PRIVET}" \
+    --test_definitions_path="${BUFFET_TEST_DEFINITIONS_PATH}" \
+    --enable_xmpp="${BUFFET_ENABLE_XMPP}" \
+    --test_privet_ssid="${BUFFET_TEST_PRIVET_SSID}"
 
 # Wait for daemon to claim its D-Bus name before transitioning to started.
 post-start exec gdbus wait --system --timeout 30 org.chromium.Buffet
diff --git a/buffet/main.cc b/buffet/main.cc
index 510dd04..0d1dff9 100644
--- a/buffet/main.cc
+++ b/buffet/main.cc
@@ -56,17 +56,22 @@
                 "Path to file containing config information.");
   DEFINE_string(state_path, kDefaultStateFilePath,
                 "Path to file containing state information.");
-  DEFINE_string(test_definitions_path, "",
-                "Path to directory containing additional command "
-                "and state definitions.  For use in test only.");
   DEFINE_bool(enable_xmpp, true,
               "Connect to GCD via a persistent XMPP connection.");
   DEFINE_bool(disable_privet, false, "disable Privet protocol");
-  DEFINE_bool(disable_security, false, "disable Privet security for tests");
   DEFINE_bool(enable_ping, false, "enable test HTTP handler at /privet/ping");
   DEFINE_string(device_whitelist, "",
                 "Comma separated list of network interfaces to monitor for "
                 "connectivity (an empty list enables all interfaces).");
+
+  DEFINE_bool(disable_security, false,
+              "disable Privet security for tests. For test only.");
+  DEFINE_string(test_privet_ssid, "",
+                "Fixed SSID for WiFi bootstrapping. For test only.");
+  DEFINE_string(test_definitions_path, "",
+                "Path to directory containing additional command "
+                "and state definitions. For test only.");
+
   chromeos::FlagHelper::Init(argc, argv, "Privet protocol handler daemon");
   if (FLAGS_config_path.empty())
     FLAGS_config_path = kDefaultConfigFilePath;
@@ -91,6 +96,7 @@
   options.disable_privet = FLAGS_disable_privet;
   options.disable_security = FLAGS_disable_security;
   options.enable_ping = FLAGS_enable_ping;
+  options.test_privet_ssid = FLAGS_test_privet_ssid;
 
   buffet::Daemon daemon{options};
   return daemon.Run();
diff --git a/libweave/include/weave/device.h b/libweave/include/weave/device.h
index 5a49409..4adaa53 100644
--- a/libweave/include/weave/device.h
+++ b/libweave/include/weave/device.h
@@ -46,11 +46,12 @@
     base::FilePath state_path;
     base::FilePath definitions_path;
     base::FilePath test_definitions_path;
-    bool xmpp_enabled{true};
+    bool xmpp_enabled = true;
     std::set<std::string> device_whitelist;
-    bool disable_privet{false};
-    bool disable_security{false};
-    bool enable_ping{false};
+    bool disable_privet = false;
+    bool disable_security = false;
+    bool enable_ping = false;
+    std::string test_privet_ssid;
   };
 
   virtual ~Device() = default;
diff --git a/libweave/src/privet/privet_manager.cc b/libweave/src/privet/privet_manager.cc
index 1c48548..5638726 100644
--- a/libweave/src/privet/privet_manager.cc
+++ b/libweave/src/privet/privet_manager.cc
@@ -82,8 +82,8 @@
   if (device->GetConfig().wifi_auto_setup_enabled()) {
     VLOG(1) << "Enabling WiFi bootstrapping.";
     wifi_bootstrap_manager_.reset(new WifiBootstrapManager(
-        device->GetConfig().last_configured_ssid(), shill_client,
-        ap_manager_client_.get(), cloud_.get()));
+        device->GetConfig().last_configured_ssid(), options.test_privet_ssid,
+        shill_client, ap_manager_client_.get(), cloud_.get()));
     wifi_bootstrap_manager_->Init();
   }
 
diff --git a/libweave/src/privet/wifi_bootstrap_manager.cc b/libweave/src/privet/wifi_bootstrap_manager.cc
index 487450c..a52b11c 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.cc
+++ b/libweave/src/privet/wifi_bootstrap_manager.cc
@@ -25,19 +25,21 @@
 
 WifiBootstrapManager::WifiBootstrapManager(
     const std::string& last_configured_ssid,
+    const std::string& test_privet_ssid,
     ShillClient* shill_client,
     ApManagerClient* ap_manager_client,
     CloudDelegate* gcd)
     : shill_client_{shill_client},
       ap_manager_client_{ap_manager_client},
       ssid_generator_{gcd, this},
-      last_configured_ssid_{last_configured_ssid} {
+      last_configured_ssid_{last_configured_ssid},
+      test_privet_ssid_{test_privet_ssid} {
   cloud_observer_.Add(gcd);
 }
 
 void WifiBootstrapManager::Init() {
   CHECK(!is_initialized_);
-  std::string ssid = ssid_generator_.GenerateSsid();
+  std::string ssid = GenerateSsid();
   if (ssid.empty())
     return;  // Delay initialization until ssid_generator_ is ready.
   UpdateConnectionState();
@@ -81,7 +83,7 @@
         base::TimeDelta::FromSeconds(kBootstrapTimeoutSeconds));
   }
   // TODO(vitalybuka): Add SSID probing.
-  std::string ssid = ssid_generator_.GenerateSsid();
+  std::string ssid = GenerateSsid();
   CHECK(!ssid.empty());
   ap_manager_client_->Start(ssid);
 }
@@ -155,6 +157,11 @@
     listener.Run(new_state);
 }
 
+std::string WifiBootstrapManager::GenerateSsid() const {
+  return test_privet_ssid_.empty() ? ssid_generator_.GenerateSsid()
+                                   : test_privet_ssid_;
+}
+
 const ConnectionState& WifiBootstrapManager::GetConnectionState() const {
   return connection_state_;
 }
diff --git a/libweave/src/privet/wifi_bootstrap_manager.h b/libweave/src/privet/wifi_bootstrap_manager.h
index 4a68c46..7ade295 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.h
+++ b/libweave/src/privet/wifi_bootstrap_manager.h
@@ -36,6 +36,7 @@
   using StateListener = base::Callback<void(State)>;
 
   WifiBootstrapManager(const std::string& last_configured_ssid,
+                       const std::string& test_privet_ssid,
                        ShillClient* shill_client,
                        ApManagerClient* ap_manager_client,
                        CloudDelegate* gcd);
@@ -76,6 +77,8 @@
   void UpdateState(State new_state);
   void NotifyStateListeners(State new_state) const;
 
+  std::string GenerateSsid() const;
+
   // If we've been bootstrapped successfully before, and we're bootstrapping
   // again because we slipped offline for a sufficiently longtime, we want
   // to return to monitoring mode periodically in case our connectivity issues
@@ -101,6 +104,7 @@
   std::vector<StateListener> state_listeners_;
   bool currently_online_{false};
   std::string last_configured_ssid_;
+  std::string test_privet_ssid_;
 
   ScopedObserver<CloudDelegate, CloudDelegate::Observer> cloud_observer_{this};