shill: add support for connecting to WPA-PSK networks

BUG=chromium-os:20897
TEST=unittests, some autotests (see below)

the following autotests now pass, at least in the wifi_vm_config:
- network_WiFiManager.000_SSID_Length_Limit
- network_WiFiSecMat.010CheckWPA_TKIP
- network_WiFiSecMat.011CheckWPA_AES
- network_WiFiSecMat.012CheckWPA_Multi
- network_WiFiSecMat.018CheckWPA_CounterMeasures

Change-Id: Ie7499fd87f661ceef3ef0aae348a08bd43c305f4
Reviewed-on: http://gerrit.chromium.org/gerrit/8586
Tested-by: mukesh agrawal <quiche@google.com>
Reviewed-by: Paul Stewart <pstew@chromium.org>
diff --git a/wifi_service_unittest.cc b/wifi_service_unittest.cc
index e142d86..cd68eca 100644
--- a/wifi_service_unittest.cc
+++ b/wifi_service_unittest.cc
@@ -17,36 +17,53 @@
 #include "shill/mock_control.h"
 #include "shill/mock_service.h"
 #include "shill/mock_store.h"
+#include "shill/mock_wifi.h"
 #include "shill/property_store_unittest.h"
 #include "shill/shill_event.h"
-#include "shill/wifi.h"
+#include "shill/wpa_supplicant.h"
 
 using std::string;
 using std::vector;
 
 namespace shill {
+using ::testing::NiceMock;
 
 class WiFiServiceTest : public PropertyStoreTest {
  public:
-  WiFiServiceTest() {}
+  WiFiServiceTest() : wifi_(
+      new NiceMock<MockWiFi>(
+          control_interface(),
+          dispatcher(),
+          manager(),
+          "wifi",
+          fake_mac,
+          0)) {}
   virtual ~WiFiServiceTest() {}
+
+ protected:
+  static const char fake_mac[];
+  scoped_refptr<MockWiFi> wifi() { return wifi_; }
+
+ private:
+  scoped_refptr<MockWiFi> wifi_;
 };
 
+// static
+const char WiFiServiceTest::fake_mac[] = "AaBBcCDDeeFF";
+
+MATCHER(WPASecurityArgs, "") {
+  return ContainsKey(arg, wpa_supplicant::kPropertySecurityProtocol) &&
+      ContainsKey(arg, wpa_supplicant::kPropertyPreSharedKey);
+}
+
 TEST_F(WiFiServiceTest, StorageId) {
   vector<uint8_t> ssid(5, 0);
   ssid.push_back(0xff);
-  static const char fake_mac[] = "AaBBcCDDeeFF";
 
-  WiFiRefPtr wifi = new WiFi(control_interface(),
-                             dispatcher(),
-                             manager(),
-                             "wifi",
-                             fake_mac,
-                             0);
   WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
                                                    dispatcher(),
                                                    manager(),
-                                                   wifi,
+                                                   wifi(),
                                                    ssid,
                                                    flimflam::kModeManaged,
                                                    "none");
@@ -62,4 +79,18 @@
   EXPECT_NE(id.find(string(flimflam::kModeManaged), mac_pos), string::npos);
 }
 
+TEST_F(WiFiServiceTest, ConnectTask) {
+  vector<uint8_t> ssid(5, 0);
+  WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
+                                                   dispatcher(),
+                                                   manager(),
+                                                   wifi(),
+                                                   ssid,
+                                                   flimflam::kModeManaged,
+                                                   flimflam::kSecurityWpa);
+  EXPECT_CALL(*wifi(),
+              ConnectTo(wifi_service.get(), WPASecurityArgs()));
+  wifi_service->ConnectTask();
+}
+
 }  // namespace shill