blob: 02008d354925b0efe2f6b68b91d17bbc0eb2ab62 [file] [log] [blame]
Darin Petkov7476a262012-04-12 16:30:46 +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/l2tp_ipsec_driver.h"
6
Darin Petkovf7ef50a2012-04-16 20:54:31 +02007#include <base/file_util.h>
8#include <base/scoped_temp_dir.h>
Darin Petkov209e6292012-04-20 11:33:32 +02009#include <base/string_util.h>
Darin Petkov7476a262012-04-12 16:30:46 +020010#include <gtest/gtest.h>
11
12#include "shill/event_dispatcher.h"
13#include "shill/nice_mock_control.h"
Darin Petkov209e6292012-04-20 11:33:32 +020014#include "shill/mock_adaptors.h"
Darin Petkov0e9735d2012-04-24 12:33:45 +020015#include "shill/mock_device_info.h"
Darin Petkov7476a262012-04-12 16:30:46 +020016#include "shill/mock_glib.h"
17#include "shill/mock_manager.h"
18#include "shill/mock_metrics.h"
Darin Petkovf7ef50a2012-04-16 20:54:31 +020019#include "shill/mock_nss.h"
Darin Petkovf8046b82012-04-24 16:29:23 +020020#include "shill/mock_vpn.h"
Darin Petkov7476a262012-04-12 16:30:46 +020021#include "shill/mock_vpn_service.h"
Darin Petkovf8046b82012-04-24 16:29:23 +020022#include "shill/vpn.h"
Darin Petkov7476a262012-04-12 16:30:46 +020023
Darin Petkovf7ef50a2012-04-16 20:54:31 +020024using std::find;
Darin Petkov209e6292012-04-20 11:33:32 +020025using std::map;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020026using std::string;
27using std::vector;
28using testing::_;
29using testing::ElementsAreArray;
Darin Petkov0e9735d2012-04-24 12:33:45 +020030using testing::NiceMock;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020031using testing::Return;
32using testing::ReturnRef;
Darin Petkov209e6292012-04-20 11:33:32 +020033using testing::SetArgumentPointee;
Darin Petkov0e9735d2012-04-24 12:33:45 +020034using testing::StrictMock;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020035
Darin Petkov7476a262012-04-12 16:30:46 +020036namespace shill {
37
Darin Petkov209e6292012-04-20 11:33:32 +020038class L2TPIPSecDriverTest : public testing::Test,
39 public RPCTaskDelegate {
Darin Petkov7476a262012-04-12 16:30:46 +020040 public:
41 L2TPIPSecDriverTest()
Darin Petkov0e9735d2012-04-24 12:33:45 +020042 : device_info_(&control_, &dispatcher_, &metrics_, &manager_),
43 manager_(&control_, &dispatcher_, &metrics_, &glib_),
Darin Petkovf8046b82012-04-24 16:29:23 +020044 driver_(new L2TPIPSecDriver(&control_, &dispatcher_, &metrics_,
45 &manager_, &device_info_, &glib_)),
Darin Petkov7476a262012-04-12 16:30:46 +020046 service_(new MockVPNService(&control_, &dispatcher_, &metrics_,
Darin Petkovf8046b82012-04-24 16:29:23 +020047 &manager_, driver_)),
48 device_(new MockVPN(&control_, &dispatcher_, &metrics_, &manager_,
49 kInterfaceName, kInterfaceIndex)) {
Darin Petkovf7ef50a2012-04-16 20:54:31 +020050 driver_->nss_ = &nss_;
51 }
Darin Petkov7476a262012-04-12 16:30:46 +020052
53 virtual ~L2TPIPSecDriverTest() {}
54
Darin Petkovf7ef50a2012-04-16 20:54:31 +020055 virtual void SetUp() {
56 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
57 }
58
59 virtual void TearDown() {
Darin Petkov209e6292012-04-20 11:33:32 +020060 driver_->child_watch_tag_ = 0;
61 driver_->pid_ = 0;
Darin Petkovf8046b82012-04-24 16:29:23 +020062 driver_->device_ = NULL;
Darin Petkov209e6292012-04-20 11:33:32 +020063 driver_->service_ = NULL;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020064 ASSERT_TRUE(temp_dir_.Delete());
65 }
66
Darin Petkov7476a262012-04-12 16:30:46 +020067 protected:
Darin Petkovf8046b82012-04-24 16:29:23 +020068 static const char kInterfaceName[];
69 static const int kInterfaceIndex;
70
Darin Petkovf7ef50a2012-04-16 20:54:31 +020071 void SetArg(const string &arg, const string &value) {
Darin Petkov01c66042012-04-26 11:10:45 +020072 driver_->args()->SetString(arg, value);
Darin Petkovf7ef50a2012-04-16 20:54:31 +020073 }
74
Darin Petkovd4325392012-04-23 15:48:22 +020075 KeyValueStore *GetArgs() {
76 return driver_->args();
77 }
78
Darin Petkovf7ef50a2012-04-16 20:54:31 +020079 // Used to assert that a flag appears in the options.
80 void ExpectInFlags(const vector<string> &options, const string &flag,
81 const string &value);
82
Darin Petkov0e9735d2012-04-24 12:33:45 +020083 FilePath SetupPSKFile();
84
Darin Petkov209e6292012-04-20 11:33:32 +020085 // Inherited from RPCTaskDelegate.
86 virtual void GetLogin(string *user, string *password);
87 virtual void Notify(const string &reason, const map<string, string> &dict);
88
Darin Petkovf7ef50a2012-04-16 20:54:31 +020089 ScopedTempDir temp_dir_;
Darin Petkov7476a262012-04-12 16:30:46 +020090 NiceMockControl control_;
Darin Petkov0e9735d2012-04-24 12:33:45 +020091 NiceMock<MockDeviceInfo> device_info_;
Darin Petkov7476a262012-04-12 16:30:46 +020092 EventDispatcher dispatcher_;
93 MockMetrics metrics_;
94 MockGLib glib_;
95 MockManager manager_;
96 L2TPIPSecDriver *driver_; // Owned by |service_|.
97 scoped_refptr<MockVPNService> service_;
Darin Petkovf8046b82012-04-24 16:29:23 +020098 scoped_refptr<MockVPN> device_;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020099 MockNSS nss_;
Darin Petkov7476a262012-04-12 16:30:46 +0200100};
101
Darin Petkovf8046b82012-04-24 16:29:23 +0200102const char L2TPIPSecDriverTest::kInterfaceName[] = "ppp0";
103const int L2TPIPSecDriverTest::kInterfaceIndex = 123;
104
Darin Petkov209e6292012-04-20 11:33:32 +0200105void L2TPIPSecDriverTest::GetLogin(string */*user*/, string */*password*/) {}
106
107void L2TPIPSecDriverTest::Notify(
108 const string &/*reason*/, const map<string, string> &/*dict*/) {}
109
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200110void L2TPIPSecDriverTest::ExpectInFlags(
111 const vector<string> &options, const string &flag, const string &value) {
112 vector<string>::const_iterator it =
113 find(options.begin(), options.end(), flag);
114
115 EXPECT_TRUE(it != options.end());
116 if (it != options.end())
117 return; // Don't crash below.
118 it++;
119 EXPECT_TRUE(it != options.end());
120 if (it != options.end())
121 return; // Don't crash below.
122 EXPECT_EQ(value, *it);
123}
124
Darin Petkov0e9735d2012-04-24 12:33:45 +0200125FilePath L2TPIPSecDriverTest::SetupPSKFile() {
126 FilePath psk_file;
127 EXPECT_TRUE(file_util::CreateTemporaryFileInDir(temp_dir_.path(), &psk_file));
128 EXPECT_FALSE(psk_file.empty());
129 EXPECT_TRUE(file_util::PathExists(psk_file));
130 driver_->psk_file_ = psk_file;
131 return psk_file;
132}
133
Darin Petkov7476a262012-04-12 16:30:46 +0200134TEST_F(L2TPIPSecDriverTest, GetProviderType) {
135 EXPECT_EQ(flimflam::kProviderL2tpIpsec, driver_->GetProviderType());
136}
137
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200138TEST_F(L2TPIPSecDriverTest, Cleanup) {
Darin Petkov209e6292012-04-20 11:33:32 +0200139 driver_->Cleanup(Service::kStateIdle); // Ensure no crash.
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200140
Darin Petkov209e6292012-04-20 11:33:32 +0200141 const unsigned int kTag = 123;
142 driver_->child_watch_tag_ = kTag;
143 EXPECT_CALL(glib_, SourceRemove(kTag));
144 const int kPID = 123456;
145 driver_->pid_ = kPID;
146 EXPECT_CALL(glib_, SpawnClosePID(kPID));
Darin Petkova0e645e2012-04-25 11:38:59 +0200147 driver_->device_ = device_;
Darin Petkov209e6292012-04-20 11:33:32 +0200148 driver_->service_ = service_;
Darin Petkova0e645e2012-04-25 11:38:59 +0200149 EXPECT_CALL(*device_, OnDisconnected());
150 EXPECT_CALL(*device_, SetEnabled(false));
Darin Petkov209e6292012-04-20 11:33:32 +0200151 EXPECT_CALL(*service_, SetState(Service::kStateFailure));
152 driver_->rpc_task_.reset(new RPCTask(&control_, this));
Darin Petkov0e9735d2012-04-24 12:33:45 +0200153 FilePath psk_file = SetupPSKFile();
Darin Petkov209e6292012-04-20 11:33:32 +0200154 driver_->Cleanup(Service::kStateFailure);
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200155 EXPECT_FALSE(file_util::PathExists(psk_file));
156 EXPECT_TRUE(driver_->psk_file_.empty());
Darin Petkov209e6292012-04-20 11:33:32 +0200157 EXPECT_EQ(0, driver_->child_watch_tag_);
158 EXPECT_EQ(0, driver_->pid_);
159 EXPECT_FALSE(driver_->rpc_task_.get());
Darin Petkova0e645e2012-04-25 11:38:59 +0200160 EXPECT_FALSE(driver_->device_);
Darin Petkov209e6292012-04-20 11:33:32 +0200161 EXPECT_FALSE(driver_->service_);
162}
163
Darin Petkov0e9735d2012-04-24 12:33:45 +0200164TEST_F(L2TPIPSecDriverTest, DeletePSKFile) {
165 FilePath psk_file = SetupPSKFile();
166 driver_->DeletePSKFile();
167 EXPECT_FALSE(file_util::PathExists(psk_file));
168 EXPECT_TRUE(driver_->psk_file_.empty());
169}
170
Darin Petkov209e6292012-04-20 11:33:32 +0200171TEST_F(L2TPIPSecDriverTest, InitEnvironment) {
172 vector<string> env;
173 driver_->rpc_task_.reset(new RPCTask(&control_, this));
174 driver_->InitEnvironment(&env);
175 ASSERT_EQ(3, env.size());
176 EXPECT_EQ(string("CONNMAN_BUSNAME=") + RPCTaskMockAdaptor::kRpcConnId,
177 env[0]);
178 EXPECT_EQ(string("CONNMAN_INTERFACE=") + RPCTaskMockAdaptor::kRpcInterfaceId,
179 env[1]);
180 EXPECT_EQ(string("CONNMAN_PATH=") + RPCTaskMockAdaptor::kRpcId, env[2]);
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200181}
182
183TEST_F(L2TPIPSecDriverTest, InitOptionsNoHost) {
184 Error error;
185 vector<string> options;
Darin Petkov209e6292012-04-20 11:33:32 +0200186 EXPECT_FALSE(driver_->InitOptions(&options, &error));
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200187 EXPECT_EQ(Error::kInvalidArguments, error.type());
188 EXPECT_TRUE(options.empty());
189}
190
191TEST_F(L2TPIPSecDriverTest, InitOptions) {
192 static const char kHost[] = "192.168.2.254";
193 static const char kCaCertNSS[] = "{1234}";
194 static const char kPSK[] = "foobar";
195
196 SetArg(flimflam::kProviderHostProperty, kHost);
197 SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS);
198 SetArg(flimflam::kL2tpIpsecPskProperty, kPSK);
199
200 FilePath empty_cert;
201 EXPECT_CALL(nss_, GetDERCertfile(kCaCertNSS, _)).WillOnce(Return(empty_cert));
202
203 const FilePath temp_dir(temp_dir_.path());
204 EXPECT_CALL(manager_, run_path()).WillOnce(ReturnRef(temp_dir));
205
206 Error error;
207 vector<string> options;
Darin Petkov209e6292012-04-20 11:33:32 +0200208 EXPECT_TRUE(driver_->InitOptions(&options, &error));
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200209 EXPECT_TRUE(error.IsSuccess());
210
211 ExpectInFlags(options, "--remote_host", kHost);
212 ASSERT_FALSE(driver_->psk_file_.empty());
213 ExpectInFlags(options, "--psk_file", driver_->psk_file_.value());
214}
215
216TEST_F(L2TPIPSecDriverTest, InitPSKOptions) {
217 Error error;
218 vector<string> options;
219 static const char kPSK[] = "foobar";
220 const FilePath bad_dir("/non/existent/directory");
221 const FilePath temp_dir(temp_dir_.path());
222 EXPECT_CALL(manager_, run_path())
223 .WillOnce(ReturnRef(bad_dir))
224 .WillOnce(ReturnRef(temp_dir));
225
226 EXPECT_TRUE(driver_->InitPSKOptions(&options, &error));
227 EXPECT_TRUE(options.empty());
228 EXPECT_TRUE(error.IsSuccess());
229
230 SetArg(flimflam::kL2tpIpsecPskProperty, kPSK);
231
232 EXPECT_FALSE(driver_->InitPSKOptions(&options, &error));
233 EXPECT_TRUE(options.empty());
234 EXPECT_EQ(Error::kInternalError, error.type());
235 error.Reset();
236
237 EXPECT_TRUE(driver_->InitPSKOptions(&options, &error));
238 ASSERT_FALSE(driver_->psk_file_.empty());
239 ExpectInFlags(options, "--psk_file", driver_->psk_file_.value());
240 EXPECT_TRUE(error.IsSuccess());
241 string contents;
242 EXPECT_TRUE(
243 file_util::ReadFileToString(driver_->psk_file_, &contents));
244 EXPECT_EQ(kPSK, contents);
245 struct stat buf;
246 ASSERT_EQ(0, stat(driver_->psk_file_.value().c_str(), &buf));
247 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, buf.st_mode);
248}
249
250TEST_F(L2TPIPSecDriverTest, InitNSSOptions) {
251 static const char kHost[] = "192.168.2.254";
252 static const char kCaCertNSS[] = "{1234}";
253 static const char kNSSCertfile[] = "/tmp/nss-cert";
254 FilePath empty_cert;
255 FilePath nss_cert(kNSSCertfile);
256 SetArg(flimflam::kProviderHostProperty, kHost);
257 SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS);
258 EXPECT_CALL(nss_,
259 GetDERCertfile(kCaCertNSS,
260 ElementsAreArray(kHost, arraysize(kHost) - 1)))
261 .WillOnce(Return(empty_cert))
262 .WillOnce(Return(nss_cert));
263
264 vector<string> options;
265 driver_->InitNSSOptions(&options);
266 EXPECT_TRUE(options.empty());
267 driver_->InitNSSOptions(&options);
268 ExpectInFlags(options, "--server_ca_file", kNSSCertfile);
269}
270
271TEST_F(L2TPIPSecDriverTest, AppendValueOption) {
272 static const char kOption[] = "--l2tpipsec-option";
273 static const char kProperty[] = "L2TPIPSec.SomeProperty";
274 static const char kValue[] = "some-property-value";
275 static const char kOption2[] = "--l2tpipsec-option2";
276 static const char kProperty2[] = "L2TPIPSec.SomeProperty2";
277 static const char kValue2[] = "some-property-value2";
278
279 vector<string> options;
280 EXPECT_FALSE(
281 driver_->AppendValueOption(
282 "L2TPIPSec.UnknownProperty", kOption, &options));
283 EXPECT_TRUE(options.empty());
284
285 SetArg(kProperty, "");
286 EXPECT_FALSE(driver_->AppendValueOption(kProperty, kOption, &options));
287 EXPECT_TRUE(options.empty());
288
289 SetArg(kProperty, kValue);
290 SetArg(kProperty2, kValue2);
291 EXPECT_TRUE(driver_->AppendValueOption(kProperty, kOption, &options));
292 EXPECT_TRUE(driver_->AppendValueOption(kProperty2, kOption2, &options));
293 EXPECT_EQ(4, options.size());
294 EXPECT_EQ(kOption, options[0]);
295 EXPECT_EQ(kValue, options[1]);
296 EXPECT_EQ(kOption2, options[2]);
297 EXPECT_EQ(kValue2, options[3]);
298}
299
300TEST_F(L2TPIPSecDriverTest, AppendFlag) {
301 static const char kTrueOption[] = "--l2tpipsec-option";
302 static const char kFalseOption[] = "--nol2tpipsec-option";
303 static const char kProperty[] = "L2TPIPSec.SomeProperty";
304 static const char kTrueOption2[] = "--l2tpipsec-option2";
305 static const char kFalseOption2[] = "--nol2tpipsec-option2";
306 static const char kProperty2[] = "L2TPIPSec.SomeProperty2";
307
308 vector<string> options;
309 EXPECT_FALSE(driver_->AppendFlag("L2TPIPSec.UnknownProperty",
310 kTrueOption, kFalseOption, &options));
311 EXPECT_TRUE(options.empty());
312
313 SetArg(kProperty, "");
314 EXPECT_FALSE(
315 driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options));
316 EXPECT_TRUE(options.empty());
317
318 SetArg(kProperty, "true");
319 SetArg(kProperty2, "false");
320 EXPECT_TRUE(
321 driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options));
322 EXPECT_TRUE(
323 driver_->AppendFlag(kProperty2, kTrueOption2, kFalseOption2, &options));
324 EXPECT_EQ(2, options.size());
325 EXPECT_EQ(kTrueOption, options[0]);
326 EXPECT_EQ(kFalseOption2, options[1]);
327}
328
Darin Petkov209e6292012-04-20 11:33:32 +0200329TEST_F(L2TPIPSecDriverTest, GetLogin) {
330 static const char kUser[] = "joesmith";
331 static const char kPassword[] = "random-password";
332 string user, password;
333 SetArg(flimflam::kL2tpIpsecUserProperty, kUser);
334 driver_->GetLogin(&user, &password);
335 EXPECT_TRUE(user.empty());
336 EXPECT_TRUE(password.empty());
337 SetArg(flimflam::kL2tpIpsecUserProperty, "");
338 SetArg(flimflam::kL2tpIpsecPasswordProperty, kPassword);
339 driver_->GetLogin(&user, &password);
340 EXPECT_TRUE(user.empty());
341 EXPECT_TRUE(password.empty());
342 SetArg(flimflam::kL2tpIpsecUserProperty, kUser);
343 driver_->GetLogin(&user, &password);
344 EXPECT_EQ(kUser, user);
345 EXPECT_EQ(kPassword, password);
346}
347
348TEST_F(L2TPIPSecDriverTest, OnL2TPIPSecVPNDied) {
349 const int kPID = 99999;
350 driver_->child_watch_tag_ = 333;
351 driver_->pid_ = kPID;
352 EXPECT_CALL(glib_, SpawnClosePID(kPID));
353 L2TPIPSecDriver::OnL2TPIPSecVPNDied(kPID, 2, driver_);
354 EXPECT_EQ(0, driver_->child_watch_tag_);
355 EXPECT_EQ(0, driver_->pid_);
356}
357
358namespace {
359MATCHER(CheckEnv, "") {
360 if (!arg || !arg[0] || !arg[1] || !arg[2] || arg[3]) {
361 return false;
362 }
363 return StartsWithASCII(arg[0], "CONNMAN_", true);
364}
365} // namespace
366
367TEST_F(L2TPIPSecDriverTest, SpawnL2TPIPSecVPN) {
368 Error error;
369 EXPECT_FALSE(driver_->SpawnL2TPIPSecVPN(&error));
370 EXPECT_TRUE(error.IsFailure());
371
372 static const char kHost[] = "192.168.2.254";
373 SetArg(flimflam::kProviderHostProperty, kHost);
374 driver_->rpc_task_.reset(new RPCTask(&control_, this));
375
376 const int kPID = 234678;
377 EXPECT_CALL(glib_,
378 SpawnAsyncWithPipesCWD(_, CheckEnv(), _, _, _, _, _, _, _, _))
379 .WillOnce(Return(false))
380 .WillOnce(DoAll(SetArgumentPointee<5>(kPID), Return(true)));
381 const int kTag = 6;
382 EXPECT_CALL(glib_, ChildWatchAdd(kPID, &driver_->OnL2TPIPSecVPNDied, driver_))
383 .WillOnce(Return(kTag));
384 error.Reset();
385 EXPECT_FALSE(driver_->SpawnL2TPIPSecVPN(&error));
386 EXPECT_EQ(Error::kInternalError, error.type());
387 error.Reset();
388 EXPECT_TRUE(driver_->SpawnL2TPIPSecVPN(&error));
389 EXPECT_TRUE(error.IsSuccess());
390 EXPECT_EQ(kPID, driver_->pid_);
391 EXPECT_EQ(kTag, driver_->child_watch_tag_);
392}
393
394TEST_F(L2TPIPSecDriverTest, Connect) {
395 EXPECT_CALL(*service_, SetState(Service::kStateConfiguring));
396 static const char kHost[] = "192.168.2.254";
397 SetArg(flimflam::kProviderHostProperty, kHost);
398 EXPECT_CALL(glib_, SpawnAsyncWithPipesCWD(_, _, _, _, _, _, _, _, _, _))
399 .WillOnce(Return(true));
400 EXPECT_CALL(glib_, ChildWatchAdd(_, _, _)).WillOnce(Return(1));
401 Error error;
402 driver_->Connect(service_, &error);
403 EXPECT_TRUE(error.IsSuccess());
404}
405
Darin Petkova0e645e2012-04-25 11:38:59 +0200406TEST_F(L2TPIPSecDriverTest, Disconnect) {
407 driver_->device_ = device_;
408 driver_->service_ = service_;
409 EXPECT_CALL(*device_, OnDisconnected());
410 EXPECT_CALL(*device_, SetEnabled(false));
411 EXPECT_CALL(*service_, SetState(Service::kStateIdle));
412 driver_->Disconnect();
413 EXPECT_FALSE(driver_->device_);
414 EXPECT_FALSE(driver_->service_);
415}
416
Darin Petkovd4325392012-04-23 15:48:22 +0200417TEST_F(L2TPIPSecDriverTest, InitPropertyStore) {
418 // Sanity test property store initialization.
419 PropertyStore store;
420 driver_->InitPropertyStore(&store);
421 const string kUser = "joe";
422 Error error;
423 EXPECT_TRUE(
424 store.SetStringProperty(flimflam::kL2tpIpsecUserProperty, kUser, &error));
425 EXPECT_TRUE(error.IsSuccess());
426 EXPECT_EQ(kUser, GetArgs()->GetString(flimflam::kL2tpIpsecUserProperty));
427}
428
Darin Petkov0e9735d2012-04-24 12:33:45 +0200429TEST_F(L2TPIPSecDriverTest, ParseIPConfiguration) {
430 map<string, string> config;
431 config["INTERNAL_IP4_ADDRESS"] = "4.5.6.7";
432 config["EXTERNAL_IP4_ADDRESS"] = "33.44.55.66";
433 config["GATEWAY_ADDRESS"] = "192.168.1.1";
434 config["DNS1"] = "1.1.1.1";
435 config["DNS2"] = "2.2.2.2";
436 config["INTERNAL_IFNAME"] = "ppp0";
437 config["LNS_ADDRESS"] = "99.88.77.66";
438 config["foo"] = "bar";
439 IPConfig::Properties props;
440 string interface_name;
441 L2TPIPSecDriver::ParseIPConfiguration(config, &props, &interface_name);
442 EXPECT_EQ(IPAddress::kFamilyIPv4, props.address_family);
443 EXPECT_EQ("4.5.6.7", props.address);
444 EXPECT_EQ("33.44.55.66", props.peer_address);
445 EXPECT_EQ("192.168.1.1", props.gateway);
446 EXPECT_EQ("99.88.77.66", props.trusted_ip);
447 ASSERT_EQ(2, props.dns_servers.size());
448 EXPECT_EQ("1.1.1.1", props.dns_servers[0]);
449 EXPECT_EQ("2.2.2.2", props.dns_servers[1]);
450 EXPECT_EQ("ppp0", interface_name);
451}
452
453namespace {
454MATCHER_P(IsIPAddress, address, "") {
455 IPAddress ip_address(IPAddress::kFamilyIPv4);
456 EXPECT_TRUE(ip_address.SetAddressFromString(address));
457 return ip_address.Equals(arg);
458}
459} // namespace
460
461TEST_F(L2TPIPSecDriverTest, Notify) {
462 map<string, string> config;
Darin Petkovf8046b82012-04-24 16:29:23 +0200463 config["INTERNAL_IFNAME"] = kInterfaceName;
Darin Petkovf8046b82012-04-24 16:29:23 +0200464 EXPECT_CALL(device_info_, GetIndex(kInterfaceName))
465 .WillOnce(Return(kInterfaceIndex));
Darin Petkovf8046b82012-04-24 16:29:23 +0200466 EXPECT_CALL(*device_, SetEnabled(true));
467 EXPECT_CALL(*device_, UpdateIPConfig(_));
468 driver_->device_ = device_;
Darin Petkov0e9735d2012-04-24 12:33:45 +0200469 FilePath psk_file = SetupPSKFile();
470 driver_->Notify("connect", config);
471 EXPECT_FALSE(file_util::PathExists(psk_file));
472 EXPECT_TRUE(driver_->psk_file_.empty());
473}
474
Darin Petkova0e645e2012-04-25 11:38:59 +0200475TEST_F(L2TPIPSecDriverTest, NotifyFail) {
476 map<string, string> dict;
477 driver_->device_ = device_;
478 EXPECT_CALL(*device_, OnDisconnected());
479 driver_->Notify("fail", dict);
480}
481
482TEST_F(L2TPIPSecDriverTest, VerifyPaths) {
483 // Ensure that the various path constants that the L2TP/IPSec driver uses
484 // actually exists in the build image. Due to build dependencies, they should
485 // already exist by the time we run unit tests.
486
487 // The L2TPIPSecDriver path constants are absolute. FilePath::Append asserts
488 // that its argument is not an absolute path, so we need to strip the leading
489 // separators. There's nothing built into FilePath to do so.
490 static const char *kPaths[] = {
491 L2TPIPSecDriver::kL2TPIPSecVPNPath,
492 L2TPIPSecDriver::kPPPDPlugin,
493 };
494 for (size_t i = 0; i < arraysize(kPaths); i++) {
495 string path(kPaths[i]);
496 TrimString(path, FilePath::kSeparators, &path);
497 EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path)))
498 << kPaths[i];
499 }
500}
501
Darin Petkov7476a262012-04-12 16:30:46 +0200502} // namespace shill