shill: Basic VPN service framework.

The manager uses a VPNProvider (similar to DeviceInfo and ModemInfo) to manage
VPN services. For each VPN service the VPNProvider instantiates an appropriate
VPNDriver (e.g., OpenVPNDriver) based on the service arguments and associates it
with the generic VPN service.

BUG=chromium-os:26835,chromium-os:26836,chromium-os:26838,chromium-os:26839
TEST=unit tests

Change-Id: Ia1bdbe49ecbb6d5b50a732dcef4a15e1feaa4f69
Reviewed-on: https://gerrit.chromium.org/gerrit/16956
Commit-Ready: Darin Petkov <petkov@chromium.org>
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
diff --git a/manager_unittest.cc b/manager_unittest.cc
index ec739a2..9ce7177 100644
--- a/manager_unittest.cc
+++ b/manager_unittest.cc
@@ -875,15 +875,23 @@
   EXPECT_TRUE(e.IsSuccess());
 }
 
+TEST_F(ManagerTest, GetServiceVPNUnknownType) {
+  KeyValueStore args;
+  Error e;
+  args.SetString(flimflam::kTypeProperty, flimflam::kTypeVPN);
+  ServiceRefPtr service = manager()->GetService(args, &e);
+  EXPECT_EQ(Error::kNotSupported, e.type());
+  EXPECT_FALSE(service);
+}
+
 TEST_F(ManagerTest, GetServiceVPN) {
   KeyValueStore args;
   Error e;
-  WiFiServiceRefPtr wifi_service;
   args.SetString(flimflam::kTypeProperty, flimflam::kTypeVPN);
-  manager()->GetService(args, &e);
-  // TODO(petkov): Test that a VPN service is created.
-  EXPECT_EQ(Error::kNotSupported, e.type());
-  EXPECT_EQ("service type is unsupported", e.message());
+  args.SetString(flimflam::kProviderTypeProperty, flimflam::kProviderOpenVpn);
+  ServiceRefPtr service = manager()->GetService(args, &e);
+  EXPECT_TRUE(e.IsSuccess());
+  EXPECT_TRUE(service);
 }
 
 TEST_F(ManagerTest, TechnologyOrder) {