shill: enable background scanning for wifi

When connecting to a WiFi service, supply wpa_supplicant with background
scan configuration parameters. Also, allow bgscan parameters to be
configured via RPC.

Collateral change: added NOTIMPLEMENTED log messages for ClearProperty
methods on {Device,IPConfig,Service}DBusAdaptor

BUG=chromium-os:24309
TEST=unit tests, WiFiRoaming.003SSIDMultiSwitchBack

Change-Id: I3289684bcae58a01be61d2341fd6a1099c1c7f6f
Reviewed-on: https://gerrit.chromium.org/gerrit/13844
Tested-by: mukesh agrawal <quiche@chromium.org>
Reviewed-by: Thieu Le <thieule@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Ready: mukesh agrawal <quiche@chromium.org>
diff --git a/wifi_unittest.cc b/wifi_unittest.cc
index 649ee95..ed35eeb 100644
--- a/wifi_unittest.cc
+++ b/wifi_unittest.cc
@@ -86,13 +86,6 @@
 TEST_F(WiFiPropertyTest, Dispatch) {
   {
     ::DBus::Error error;
-    EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
-                                            flimflam::kBgscanMethodProperty,
-                                            PropertyStoreTest::kStringV,
-                                            &error));
-  }
-  {
-    ::DBus::Error error;
     EXPECT_TRUE(DBusAdaptor::DispatchOnType(
         device_->mutable_store(),
         flimflam::kBgscanSignalThresholdProperty,
@@ -117,6 +110,27 @@
   }
 }
 
+TEST_F(WiFiPropertyTest, BgscanMethod) {
+  {
+    ::DBus::Error error;
+    EXPECT_TRUE(DBusAdaptor::DispatchOnType(
+        device_->mutable_store(),
+        flimflam::kBgscanMethodProperty,
+        DBusAdaptor::StringToVariant(
+            wpa_supplicant::kNetworkBgscanMethodSimple),
+        &error));
+  }
+
+  {
+    ::DBus::Error error;
+    EXPECT_FALSE(DBusAdaptor::DispatchOnType(
+        device_->mutable_store(),
+        flimflam::kBgscanMethodProperty,
+        DBusAdaptor::StringToVariant("not a real scan method"),
+        &error));
+  }
+}
+
 class WiFiMainTest : public ::testing::TestWithParam<string> {
  public:
   WiFiMainTest()
@@ -1295,4 +1309,20 @@
   EXPECT_FALSE(wifi()->IsIdle());
 }
 
+MATCHER(WiFiAddedArgs, "") {
+  return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
+      ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
+}
+
+TEST_F(WiFiMainTest, AddNetworkArgs) {
+  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
+      *supplicant_interface_proxy_;
+
+  StartWiFi();
+  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
+  WiFiService *service(GetServices().begin()->get());
+  EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
+  InitiateConnect(service);
+}
+
 }  // namespace shill