blob: afb78c9361467e158ade0b7b043908db5c16388e [file] [log] [blame]
Darin Petkovb451d6e2012-04-23 11:56:41 +02001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/vpn_driver.h"
6
7#include <base/stl_util.h>
8#include <base/string_number_conversions.h>
9#include <chromeos/dbus/service_constants.h>
10#include <gmock/gmock.h>
11#include <gtest/gtest.h>
12
Darin Petkov0e9735d2012-04-24 12:33:45 +020013#include "shill/event_dispatcher.h"
14#include "shill/glib.h"
15#include "shill/mock_connection.h"
16#include "shill/mock_device_info.h"
17#include "shill/mock_glib.h"
18#include "shill/mock_manager.h"
19#include "shill/mock_metrics.h"
20#include "shill/mock_service.h"
Darin Petkovb451d6e2012-04-23 11:56:41 +020021#include "shill/mock_store.h"
Darin Petkov0e9735d2012-04-24 12:33:45 +020022#include "shill/nice_mock_control.h"
Darin Petkovb451d6e2012-04-23 11:56:41 +020023#include "shill/property_store.h"
24
25using std::string;
Paul Stewartdf4e3c92013-06-13 17:50:30 -070026using std::vector;
Darin Petkovb451d6e2012-04-23 11:56:41 +020027using testing::_;
28using testing::AnyNumber;
Darin Petkov0e9735d2012-04-24 12:33:45 +020029using testing::NiceMock;
Darin Petkovb451d6e2012-04-23 11:56:41 +020030using testing::Return;
31using testing::SetArgumentPointee;
Darin Petkov0e9735d2012-04-24 12:33:45 +020032using testing::StrictMock;
Darin Petkovb451d6e2012-04-23 11:56:41 +020033using testing::Test;
34
35namespace shill {
36
37namespace {
Darin Petkov602303f2012-06-06 12:15:59 +020038
Darin Petkovb451d6e2012-04-23 11:56:41 +020039const char kHostProperty[] = "VPN.Host";
40const char kOTPProperty[] = "VPN.OTP";
Darin Petkovcb715292012-04-25 13:04:37 +020041const char kPINProperty[] = "VPN.PIN";
Darin Petkov4e9066f2012-06-11 13:17:06 +020042const char kPSKProperty[] = "VPN.PSK";
Darin Petkovb451d6e2012-04-23 11:56:41 +020043const char kPasswordProperty[] = "VPN.Password";
44const char kPortProperty[] = "VPN.Port";
Darin Petkovcb715292012-04-25 13:04:37 +020045
46const char kPIN[] = "5555";
47const char kPassword[] = "random-password";
48const char kPort[] = "1234";
49const char kStorageID[] = "vpn_service_id";
50
Darin Petkovb451d6e2012-04-23 11:56:41 +020051} // namespace
52
53class VPNDriverUnderTest : public VPNDriver {
54 public:
Darin Petkov602303f2012-06-06 12:15:59 +020055 VPNDriverUnderTest(EventDispatcher *dispatcher, Manager *manager);
Darin Petkovb451d6e2012-04-23 11:56:41 +020056 virtual ~VPNDriverUnderTest() {}
57
58 // Inherited from VPNDriver.
59 MOCK_METHOD2(ClaimInterface, bool(const string &link_name,
60 int interface_index));
61 MOCK_METHOD2(Connect, void(const VPNServiceRefPtr &service, Error *error));
62 MOCK_METHOD0(Disconnect, void());
Darin Petkov5eb05422012-05-11 15:45:25 +020063 MOCK_METHOD0(OnConnectionDisconnected, void());
Darin Petkovb451d6e2012-04-23 11:56:41 +020064 MOCK_CONST_METHOD0(GetProviderType, string());
65
66 private:
67 static const Property kProperties[];
68
69 DISALLOW_COPY_AND_ASSIGN(VPNDriverUnderTest);
70};
71
72// static
73const VPNDriverUnderTest::Property VPNDriverUnderTest::kProperties[] = {
Paul Stewartdf4e3c92013-06-13 17:50:30 -070074 { kEapCaCertPemProperty, Property::kArray },
Darin Petkovb451d6e2012-04-23 11:56:41 +020075 { kHostProperty, 0 },
Paul Stewartdf4e3c92013-06-13 17:50:30 -070076 { kL2tpIpsecCaCertPemProperty, Property::kArray },
Darin Petkovcb715292012-04-25 13:04:37 +020077 { kOTPProperty, Property::kEphemeral },
78 { kPINProperty, Property::kWriteOnly },
Darin Petkov4e9066f2012-06-11 13:17:06 +020079 { kPSKProperty, Property::kCredential },
Darin Petkovcb715292012-04-25 13:04:37 +020080 { kPasswordProperty, Property::kCredential },
Darin Petkovb451d6e2012-04-23 11:56:41 +020081 { kPortProperty, 0 },
Darin Petkov4e02ba22013-04-02 13:44:08 +020082 { flimflam::kProviderTypeProperty, 0 },
Darin Petkovb451d6e2012-04-23 11:56:41 +020083};
84
Darin Petkov602303f2012-06-06 12:15:59 +020085VPNDriverUnderTest::VPNDriverUnderTest(
86 EventDispatcher *dispatcher, Manager *manager)
87 : VPNDriver(dispatcher, manager, kProperties, arraysize(kProperties)) {}
Darin Petkovb451d6e2012-04-23 11:56:41 +020088
89class VPNDriverTest : public Test {
90 public:
Darin Petkov0e9735d2012-04-24 12:33:45 +020091 VPNDriverTest()
92 : device_info_(&control_, &dispatcher_, &metrics_, &manager_),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080093 metrics_(&dispatcher_),
Darin Petkov0e9735d2012-04-24 12:33:45 +020094 manager_(&control_, &dispatcher_, &metrics_, &glib_),
Darin Petkov602303f2012-06-06 12:15:59 +020095 driver_(&dispatcher_, &manager_) {}
Darin Petkovb451d6e2012-04-23 11:56:41 +020096
97 virtual ~VPNDriverTest() {}
98
99 protected:
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100100 EventDispatcher *dispatcher() { return driver_.dispatcher_; }
101 void set_dispatcher(EventDispatcher *dispatcher) {
102 driver_.dispatcher_ = dispatcher;
103 }
104
105 const base::CancelableClosure &connect_timeout_callback() {
106 return driver_.connect_timeout_callback_;
107 }
108
109 bool IsConnectTimeoutStarted() { return driver_.IsConnectTimeoutStarted(); }
110 int connect_timeout_seconds() { return driver_.connect_timeout_seconds(); }
111
112 void StartConnectTimeout(int timeout_seconds) {
113 driver_.StartConnectTimeout(timeout_seconds);
114 }
115
116 void StopConnectTimeout() { driver_.StopConnectTimeout(); }
117
Darin Petkovb451d6e2012-04-23 11:56:41 +0200118 void SetArg(const string &arg, const string &value) {
119 driver_.args()->SetString(arg, value);
120 }
121
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700122 void SetArgArray(const string &arg, const vector<string> &value) {
123 driver_.args()->SetStrings(arg, value);
124 }
125
Darin Petkovb451d6e2012-04-23 11:56:41 +0200126 KeyValueStore *GetArgs() { return driver_.args(); }
127
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700128 bool GetProviderPropertyString(const PropertyStore &store,
129 const string &key,
130 string *value);
131
132 bool GetProviderPropertyStrings(const PropertyStore &store,
133 const string &key,
134 vector<string> *value);
Darin Petkovb451d6e2012-04-23 11:56:41 +0200135
Darin Petkov0e9735d2012-04-24 12:33:45 +0200136 NiceMockControl control_;
137 NiceMock<MockDeviceInfo> device_info_;
138 EventDispatcher dispatcher_;
139 MockMetrics metrics_;
140 MockGLib glib_;
141 MockManager manager_;
Darin Petkovb451d6e2012-04-23 11:56:41 +0200142 VPNDriverUnderTest driver_;
143};
144
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700145bool VPNDriverTest::GetProviderPropertyString(const PropertyStore &store,
146 const string &key,
147 string *value) {
Paul Stewart8e7e4592012-04-29 09:47:48 -0700148 KeyValueStore provider_properties;
Paul Stewarte6e8e492013-01-17 11:00:50 -0800149 Error error;
150 EXPECT_TRUE(store.GetKeyValueStoreProperty(
151 flimflam::kProviderProperty, &provider_properties, &error));
Paul Stewart8e7e4592012-04-29 09:47:48 -0700152 if (!provider_properties.ContainsString(key)) {
153 return false;
Darin Petkovb451d6e2012-04-23 11:56:41 +0200154 }
Paul Stewart8e7e4592012-04-29 09:47:48 -0700155 if (value != NULL) {
156 *value = provider_properties.GetString(key);
Darin Petkovb451d6e2012-04-23 11:56:41 +0200157 }
Paul Stewart8e7e4592012-04-29 09:47:48 -0700158 return true;
Darin Petkovb451d6e2012-04-23 11:56:41 +0200159}
160
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700161bool VPNDriverTest::GetProviderPropertyStrings(const PropertyStore &store,
162 const string &key,
163 vector<string> *value) {
164 KeyValueStore provider_properties;
165 Error error;
166 EXPECT_TRUE(store.GetKeyValueStoreProperty(
167 flimflam::kProviderProperty, &provider_properties, &error));
168 if (!provider_properties.ContainsStrings(key)) {
169 return false;
170 }
171 if (value != NULL) {
172 *value = provider_properties.GetStrings(key);
173 }
174 return true;
175}
176
Darin Petkovb451d6e2012-04-23 11:56:41 +0200177TEST_F(VPNDriverTest, Load) {
178 MockStore storage;
Darin Petkov4e9066f2012-06-11 13:17:06 +0200179 GetArgs()->SetString(kHostProperty, "1.2.3.4");
180 GetArgs()->SetString(kPSKProperty, "1234");
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700181 GetArgs()->SetStrings(kL2tpIpsecCaCertPemProperty,
182 vector<string>{ "cleared-cert0", "cleared-cert1" });
Darin Petkovb451d6e2012-04-23 11:56:41 +0200183 EXPECT_CALL(storage, GetString(kStorageID, _, _))
184 .WillRepeatedly(Return(false));
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700185 EXPECT_CALL(storage, GetStringList(kStorageID, _, _))
186 .WillRepeatedly(Return(false));
187 EXPECT_CALL(storage, GetString(_, kEapCaCertPemProperty, _)).Times(0);
Darin Petkovcb715292012-04-25 13:04:37 +0200188 EXPECT_CALL(storage, GetString(_, kOTPProperty, _)).Times(0);
189 EXPECT_CALL(storage, GetCryptedString(_, kOTPProperty, _)).Times(0);
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700190 EXPECT_CALL(storage, GetStringList(_, kOTPProperty, _)).Times(0);
191 vector<string> kCaCerts{ "cert0", "cert1" };
192 EXPECT_CALL(storage, GetStringList(kStorageID, kEapCaCertPemProperty, _))
193 .WillOnce(DoAll(SetArgumentPointee<2>(kCaCerts), Return(true)));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200194 EXPECT_CALL(storage, GetString(kStorageID, kPortProperty, _))
Darin Petkovcb715292012-04-25 13:04:37 +0200195 .WillOnce(DoAll(SetArgumentPointee<2>(string(kPort)), Return(true)));
196 EXPECT_CALL(storage, GetString(kStorageID, kPINProperty, _))
197 .WillOnce(DoAll(SetArgumentPointee<2>(string(kPIN)), Return(true)));
Darin Petkov4e9066f2012-06-11 13:17:06 +0200198 EXPECT_CALL(storage, GetCryptedString(kStorageID, kPSKProperty, _))
199 .WillOnce(Return(false));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200200 EXPECT_CALL(storage, GetCryptedString(kStorageID, kPasswordProperty, _))
Darin Petkovcb715292012-04-25 13:04:37 +0200201 .WillOnce(DoAll(SetArgumentPointee<2>(string(kPassword)), Return(true)));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200202 EXPECT_TRUE(driver_.Load(&storage, kStorageID));
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700203 EXPECT_TRUE(GetArgs()->ContainsStrings(kEapCaCertPemProperty));
204 if (GetArgs()->ContainsStrings(kEapCaCertPemProperty)) {
205 EXPECT_EQ(kCaCerts, GetArgs()->GetStrings(kEapCaCertPemProperty));
206 }
Darin Petkovb451d6e2012-04-23 11:56:41 +0200207 EXPECT_EQ(kPort, GetArgs()->LookupString(kPortProperty, ""));
Darin Petkovcb715292012-04-25 13:04:37 +0200208 EXPECT_EQ(kPIN, GetArgs()->LookupString(kPINProperty, ""));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200209 EXPECT_EQ(kPassword, GetArgs()->LookupString(kPasswordProperty, ""));
Darin Petkov4e9066f2012-06-11 13:17:06 +0200210
211 // Properties missing from the persistent store should be deleted.
212 EXPECT_FALSE(GetArgs()->ContainsString(kHostProperty));
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700213 EXPECT_FALSE(GetArgs()->ContainsStrings(kL2tpIpsecCaCertPemProperty));
Darin Petkov4e9066f2012-06-11 13:17:06 +0200214 EXPECT_FALSE(GetArgs()->ContainsString(kPSKProperty));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200215}
216
Darin Petkov4e9066f2012-06-11 13:17:06 +0200217TEST_F(VPNDriverTest, Save) {
Darin Petkov4e02ba22013-04-02 13:44:08 +0200218 SetArg(flimflam::kProviderTypeProperty, "");
Darin Petkovcb715292012-04-25 13:04:37 +0200219 SetArg(kPINProperty, kPIN);
Darin Petkovb451d6e2012-04-23 11:56:41 +0200220 SetArg(kPortProperty, kPort);
221 SetArg(kPasswordProperty, kPassword);
222 SetArg(kOTPProperty, "987654");
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700223 const vector<string> kCaCerts{ "cert0", "cert1" };
224 SetArgArray(kEapCaCertPemProperty, kCaCerts);
Darin Petkovb451d6e2012-04-23 11:56:41 +0200225 MockStore storage;
Darin Petkov4e9066f2012-06-11 13:17:06 +0200226 EXPECT_CALL(storage,
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700227 SetStringList(kStorageID, kEapCaCertPemProperty, kCaCerts))
228 .WillOnce(Return(true));
229 EXPECT_CALL(storage,
Darin Petkov4e02ba22013-04-02 13:44:08 +0200230 SetString(kStorageID, flimflam::kProviderTypeProperty, ""))
Darin Petkov4e9066f2012-06-11 13:17:06 +0200231 .WillOnce(Return(true));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200232 EXPECT_CALL(storage, SetString(kStorageID, kPortProperty, kPort))
233 .WillOnce(Return(true));
Darin Petkovcb715292012-04-25 13:04:37 +0200234 EXPECT_CALL(storage, SetString(kStorageID, kPINProperty, kPIN))
235 .WillOnce(Return(true));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200236 EXPECT_CALL(storage,
237 SetCryptedString(kStorageID, kPasswordProperty, kPassword))
238 .WillOnce(Return(true));
Darin Petkovcb715292012-04-25 13:04:37 +0200239 EXPECT_CALL(storage, SetCryptedString(_, kOTPProperty, _)).Times(0);
240 EXPECT_CALL(storage, SetString(_, kOTPProperty, _)).Times(0);
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700241 EXPECT_CALL(storage, SetString(_, kEapCaCertPemProperty, _)).Times(0);
242 EXPECT_CALL(storage, DeleteKey(kStorageID, kEapCaCertPemProperty)).Times(0);
Darin Petkov4e02ba22013-04-02 13:44:08 +0200243 EXPECT_CALL(storage, DeleteKey(kStorageID, flimflam::kProviderTypeProperty))
Darin Petkov4e9066f2012-06-11 13:17:06 +0200244 .Times(0);
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700245 EXPECT_CALL(storage, DeleteKey(kStorageID, kL2tpIpsecCaCertPemProperty));
246 EXPECT_CALL(storage, DeleteKey(kStorageID, kPSKProperty));
247 EXPECT_CALL(storage, DeleteKey(kStorageID, kHostProperty));
Darin Petkovcb715292012-04-25 13:04:37 +0200248 EXPECT_TRUE(driver_.Save(&storage, kStorageID, true));
249}
250
Darin Petkov4e9066f2012-06-11 13:17:06 +0200251TEST_F(VPNDriverTest, SaveNoCredentials) {
Darin Petkovcb715292012-04-25 13:04:37 +0200252 SetArg(kPasswordProperty, kPassword);
Darin Petkov4e9066f2012-06-11 13:17:06 +0200253 SetArg(kPSKProperty, "");
Darin Petkovcb715292012-04-25 13:04:37 +0200254 MockStore storage;
255 EXPECT_CALL(storage, SetString(_, kPasswordProperty, _)).Times(0);
256 EXPECT_CALL(storage, SetCryptedString(_, kPasswordProperty, _)).Times(0);
257 EXPECT_CALL(storage, DeleteKey(kStorageID, _)).Times(AnyNumber());
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700258 EXPECT_CALL(storage, DeleteKey(kStorageID, kPasswordProperty));
259 EXPECT_CALL(storage, DeleteKey(kStorageID, kPSKProperty));
260 EXPECT_CALL(storage, DeleteKey(kStorageID, kEapCaCertPemProperty));
261 EXPECT_CALL(storage, DeleteKey(kStorageID, kL2tpIpsecCaCertPemProperty));
Darin Petkovcb715292012-04-25 13:04:37 +0200262 EXPECT_TRUE(driver_.Save(&storage, kStorageID, false));
263}
264
265TEST_F(VPNDriverTest, UnloadCredentials) {
266 SetArg(kOTPProperty, "654321");
267 SetArg(kPasswordProperty, kPassword);
268 SetArg(kPortProperty, kPort);
269 driver_.UnloadCredentials();
270 EXPECT_FALSE(GetArgs()->ContainsString(kOTPProperty));
271 EXPECT_FALSE(GetArgs()->ContainsString(kPasswordProperty));
272 EXPECT_EQ(kPort, GetArgs()->LookupString(kPortProperty, ""));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200273}
274
275TEST_F(VPNDriverTest, InitPropertyStore) {
276 // Figure out if the store is actually hooked up to the driver argument
277 // KeyValueStore.
278 PropertyStore store;
279 driver_.InitPropertyStore(&store);
280
281 // An un-set property should not be readable.
Paul Stewarte6e8e492013-01-17 11:00:50 -0800282 {
283 Error error;
284 EXPECT_FALSE(store.GetStringProperty(kPortProperty, NULL, &error));
285 EXPECT_EQ(Error::kInvalidArguments, error.type());
286 }
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700287 {
288 Error error;
289 EXPECT_FALSE(store.GetStringsProperty(kEapCaCertPemProperty, NULL, &error));
290 EXPECT_EQ(Error::kInvalidArguments, error.type());
291 }
292 EXPECT_FALSE(GetProviderPropertyString(store, kPortProperty, NULL));
293 EXPECT_FALSE(GetProviderPropertyStrings(store, kEapCaCertPemProperty, NULL));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200294
Darin Petkov4e02ba22013-04-02 13:44:08 +0200295 const string kProviderType = "boo";
Darin Petkovb451d6e2012-04-23 11:56:41 +0200296 SetArg(kPortProperty, kPort);
297 SetArg(kPasswordProperty, kPassword);
Darin Petkov4e02ba22013-04-02 13:44:08 +0200298 SetArg(flimflam::kProviderTypeProperty, kProviderType);
Darin Petkov4e9066f2012-06-11 13:17:06 +0200299 SetArg(kHostProperty, "");
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700300 const vector<string> kCaCerts{ "cert1" };
301 SetArgArray(kEapCaCertPemProperty, kCaCerts);
302 SetArgArray(kL2tpIpsecCaCertPemProperty, vector<string>());
Darin Petkovb451d6e2012-04-23 11:56:41 +0200303
304 // We should not be able to read a property out of the driver args using the
305 // key to the args directly.
Paul Stewarte6e8e492013-01-17 11:00:50 -0800306 {
307 Error error;
308 EXPECT_FALSE(store.GetStringProperty(kPortProperty, NULL, &error));
309 EXPECT_EQ(Error::kInvalidArguments, error.type());
310 }
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700311 {
312 Error error;
313 EXPECT_FALSE(store.GetStringsProperty(kEapCaCertPemProperty, NULL, &error));
314 EXPECT_EQ(Error::kInvalidArguments, error.type());
315 }
Darin Petkovb451d6e2012-04-23 11:56:41 +0200316
317 // We should instead be able to find it within the "Provider" stringmap.
Paul Stewarte6e8e492013-01-17 11:00:50 -0800318 {
319 string value;
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700320 EXPECT_TRUE(GetProviderPropertyString(store, kPortProperty, &value));
Paul Stewarte6e8e492013-01-17 11:00:50 -0800321 EXPECT_EQ(kPort, value);
322 }
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700323 {
324 vector<string> value;
325 EXPECT_TRUE(GetProviderPropertyStrings(store, kEapCaCertPemProperty,
326 &value));
327 EXPECT_EQ(kCaCerts, value);
328 }
Darin Petkovb451d6e2012-04-23 11:56:41 +0200329
Darin Petkov4e9066f2012-06-11 13:17:06 +0200330 // We should be able to read empty properties from the "Provider" stringmap.
331 {
332 string value;
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700333 EXPECT_TRUE(GetProviderPropertyString(store, kHostProperty, &value));
334 EXPECT_TRUE(value.empty());
335 }
336 {
337 vector<string> value;
338 EXPECT_TRUE(GetProviderPropertyStrings(store, kL2tpIpsecCaCertPemProperty,
339 &value));
Darin Petkov4e9066f2012-06-11 13:17:06 +0200340 EXPECT_TRUE(value.empty());
341 }
342
Darin Petkovb451d6e2012-04-23 11:56:41 +0200343 // Properties that start with the prefix "Provider." should be mapped to the
344 // name in the Properties dict with the prefix removed.
Paul Stewarte6e8e492013-01-17 11:00:50 -0800345 {
346 string value;
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700347 EXPECT_TRUE(GetProviderPropertyString(store, flimflam::kTypeProperty,
348 &value));
Darin Petkov4e02ba22013-04-02 13:44:08 +0200349 EXPECT_EQ(kProviderType, value);
Paul Stewarte6e8e492013-01-17 11:00:50 -0800350 }
Darin Petkovb451d6e2012-04-23 11:56:41 +0200351
Paul Stewart8e7e4592012-04-29 09:47:48 -0700352 // If we clear a property, we should no longer be able to find it.
Darin Petkovb451d6e2012-04-23 11:56:41 +0200353 {
354 Error error;
355 EXPECT_TRUE(store.ClearProperty(kPortProperty, &error));
356 EXPECT_TRUE(error.IsSuccess());
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700357 EXPECT_FALSE(GetProviderPropertyString(store, kPortProperty, NULL));
358 }
359 {
360 Error error;
361 EXPECT_TRUE(store.ClearProperty(kEapCaCertPemProperty, &error));
362 EXPECT_TRUE(error.IsSuccess());
363 EXPECT_FALSE(GetProviderPropertyStrings(store, kEapCaCertPemProperty,
364 NULL));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200365 }
366
367 // A second attempt to clear this property should return an error.
368 {
369 Error error;
370 EXPECT_FALSE(store.ClearProperty(kPortProperty, &error));
371 EXPECT_EQ(Error::kNotFound, error.type());
372 }
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700373 {
374 Error error;
375 EXPECT_FALSE(store.ClearProperty(kEapCaCertPemProperty, &error));
376 EXPECT_EQ(Error::kNotFound, error.type());
377 }
Darin Petkovb451d6e2012-04-23 11:56:41 +0200378
Darin Petkovcb715292012-04-25 13:04:37 +0200379 // Test write only properties.
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700380 EXPECT_FALSE(GetProviderPropertyString(store, kPINProperty, NULL));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200381
382 // Write properties to the driver args using the PropertyStore interface.
Darin Petkovcb715292012-04-25 13:04:37 +0200383 {
384 const string kValue = "some-value";
Darin Petkovb451d6e2012-04-23 11:56:41 +0200385 Error error;
Darin Petkovcb715292012-04-25 13:04:37 +0200386 EXPECT_TRUE(store.SetStringProperty(kPINProperty, kValue, &error));
387 EXPECT_EQ(kValue, GetArgs()->GetString(kPINProperty));
Darin Petkovb451d6e2012-04-23 11:56:41 +0200388 }
Paul Stewartdf4e3c92013-06-13 17:50:30 -0700389 {
390 const vector<string> kValue{ "some-value" };
391 Error error;
392 EXPECT_TRUE(store.SetStringsProperty(kEapCaCertPemProperty, kValue,
393 &error));
394 EXPECT_EQ(kValue, GetArgs()->GetStrings(kEapCaCertPemProperty));
395 }
Darin Petkovb451d6e2012-04-23 11:56:41 +0200396}
397
Darin Petkov602303f2012-06-06 12:15:59 +0200398TEST_F(VPNDriverTest, ConnectTimeout) {
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100399 EXPECT_EQ(&dispatcher_, dispatcher());
400 EXPECT_TRUE(connect_timeout_callback().IsCancelled());
401 EXPECT_FALSE(IsConnectTimeoutStarted());
402 StartConnectTimeout(0);
403 EXPECT_FALSE(connect_timeout_callback().IsCancelled());
404 EXPECT_TRUE(IsConnectTimeoutStarted());
405 set_dispatcher(NULL);
406 StartConnectTimeout(0); // Expect no crash.
Darin Petkov602303f2012-06-06 12:15:59 +0200407 dispatcher_.DispatchPendingEvents();
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100408 EXPECT_TRUE(connect_timeout_callback().IsCancelled());
409 EXPECT_FALSE(IsConnectTimeoutStarted());
410}
411
412TEST_F(VPNDriverTest, StartStopConnectTimeout) {
413 EXPECT_FALSE(IsConnectTimeoutStarted());
414 EXPECT_EQ(0, connect_timeout_seconds());
415 const int kTimeout = 123;
416 StartConnectTimeout(kTimeout);
417 EXPECT_TRUE(IsConnectTimeoutStarted());
418 EXPECT_EQ(kTimeout, connect_timeout_seconds());
419 StartConnectTimeout(kTimeout - 20);
420 EXPECT_EQ(kTimeout, connect_timeout_seconds());
421 StopConnectTimeout();
422 EXPECT_FALSE(IsConnectTimeoutStarted());
423 EXPECT_EQ(0, connect_timeout_seconds());
Darin Petkov602303f2012-06-06 12:15:59 +0200424}
425
Darin Petkovb451d6e2012-04-23 11:56:41 +0200426} // namespace shill