blob: 631e7fbe0a18d664fa53b8e381513f822fb9b54c [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"
Paul Stewart8e7e4592012-04-29 09:47:48 -070022#include "shill/property_store_inspector.h"
Darin Petkovf8046b82012-04-24 16:29:23 +020023#include "shill/vpn.h"
Darin Petkov7476a262012-04-12 16:30:46 +020024
Darin Petkovf7ef50a2012-04-16 20:54:31 +020025using std::find;
Darin Petkov209e6292012-04-20 11:33:32 +020026using std::map;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020027using std::string;
28using std::vector;
29using testing::_;
30using testing::ElementsAreArray;
Darin Petkov0e9735d2012-04-24 12:33:45 +020031using testing::NiceMock;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020032using testing::Return;
33using testing::ReturnRef;
Darin Petkov209e6292012-04-20 11:33:32 +020034using testing::SetArgumentPointee;
Darin Petkov0e9735d2012-04-24 12:33:45 +020035using testing::StrictMock;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020036
Darin Petkov7476a262012-04-12 16:30:46 +020037namespace shill {
38
Darin Petkov209e6292012-04-20 11:33:32 +020039class L2TPIPSecDriverTest : public testing::Test,
40 public RPCTaskDelegate {
Darin Petkov7476a262012-04-12 16:30:46 +020041 public:
42 L2TPIPSecDriverTest()
Darin Petkov0e9735d2012-04-24 12:33:45 +020043 : device_info_(&control_, &dispatcher_, &metrics_, &manager_),
44 manager_(&control_, &dispatcher_, &metrics_, &glib_),
Darin Petkovf8046b82012-04-24 16:29:23 +020045 driver_(new L2TPIPSecDriver(&control_, &dispatcher_, &metrics_,
46 &manager_, &device_info_, &glib_)),
Darin Petkov7476a262012-04-12 16:30:46 +020047 service_(new MockVPNService(&control_, &dispatcher_, &metrics_,
Darin Petkovf8046b82012-04-24 16:29:23 +020048 &manager_, driver_)),
49 device_(new MockVPN(&control_, &dispatcher_, &metrics_, &manager_,
50 kInterfaceName, kInterfaceIndex)) {
Darin Petkovf7ef50a2012-04-16 20:54:31 +020051 driver_->nss_ = &nss_;
52 }
Darin Petkov7476a262012-04-12 16:30:46 +020053
54 virtual ~L2TPIPSecDriverTest() {}
55
Darin Petkovf7ef50a2012-04-16 20:54:31 +020056 virtual void SetUp() {
57 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
58 }
59
60 virtual void TearDown() {
Darin Petkov209e6292012-04-20 11:33:32 +020061 driver_->child_watch_tag_ = 0;
62 driver_->pid_ = 0;
Darin Petkovf8046b82012-04-24 16:29:23 +020063 driver_->device_ = NULL;
Darin Petkov209e6292012-04-20 11:33:32 +020064 driver_->service_ = NULL;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020065 ASSERT_TRUE(temp_dir_.Delete());
66 }
67
Darin Petkov7476a262012-04-12 16:30:46 +020068 protected:
Darin Petkovf8046b82012-04-24 16:29:23 +020069 static const char kInterfaceName[];
70 static const int kInterfaceIndex;
71
Darin Petkovf7ef50a2012-04-16 20:54:31 +020072 void SetArg(const string &arg, const string &value) {
Darin Petkov01c66042012-04-26 11:10:45 +020073 driver_->args()->SetString(arg, value);
Darin Petkovf7ef50a2012-04-16 20:54:31 +020074 }
75
Darin Petkovd4325392012-04-23 15:48:22 +020076 KeyValueStore *GetArgs() {
77 return driver_->args();
78 }
79
Darin Petkovf7ef50a2012-04-16 20:54:31 +020080 // Used to assert that a flag appears in the options.
81 void ExpectInFlags(const vector<string> &options, const string &flag,
82 const string &value);
83
Darin Petkov0e9735d2012-04-24 12:33:45 +020084 FilePath SetupPSKFile();
85
Darin Petkov209e6292012-04-20 11:33:32 +020086 // Inherited from RPCTaskDelegate.
87 virtual void GetLogin(string *user, string *password);
88 virtual void Notify(const string &reason, const map<string, string> &dict);
89
Darin Petkovf7ef50a2012-04-16 20:54:31 +020090 ScopedTempDir temp_dir_;
Darin Petkov7476a262012-04-12 16:30:46 +020091 NiceMockControl control_;
Darin Petkov0e9735d2012-04-24 12:33:45 +020092 NiceMock<MockDeviceInfo> device_info_;
Darin Petkov7476a262012-04-12 16:30:46 +020093 EventDispatcher dispatcher_;
94 MockMetrics metrics_;
95 MockGLib glib_;
96 MockManager manager_;
97 L2TPIPSecDriver *driver_; // Owned by |service_|.
98 scoped_refptr<MockVPNService> service_;
Darin Petkovf8046b82012-04-24 16:29:23 +020099 scoped_refptr<MockVPN> device_;
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200100 MockNSS nss_;
Darin Petkov7476a262012-04-12 16:30:46 +0200101};
102
Darin Petkovf8046b82012-04-24 16:29:23 +0200103const char L2TPIPSecDriverTest::kInterfaceName[] = "ppp0";
104const int L2TPIPSecDriverTest::kInterfaceIndex = 123;
105
Darin Petkov209e6292012-04-20 11:33:32 +0200106void L2TPIPSecDriverTest::GetLogin(string */*user*/, string */*password*/) {}
107
108void L2TPIPSecDriverTest::Notify(
109 const string &/*reason*/, const map<string, string> &/*dict*/) {}
110
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200111void L2TPIPSecDriverTest::ExpectInFlags(
112 const vector<string> &options, const string &flag, const string &value) {
113 vector<string>::const_iterator it =
114 find(options.begin(), options.end(), flag);
115
116 EXPECT_TRUE(it != options.end());
117 if (it != options.end())
118 return; // Don't crash below.
119 it++;
120 EXPECT_TRUE(it != options.end());
121 if (it != options.end())
122 return; // Don't crash below.
123 EXPECT_EQ(value, *it);
124}
125
Darin Petkov0e9735d2012-04-24 12:33:45 +0200126FilePath L2TPIPSecDriverTest::SetupPSKFile() {
127 FilePath psk_file;
128 EXPECT_TRUE(file_util::CreateTemporaryFileInDir(temp_dir_.path(), &psk_file));
129 EXPECT_FALSE(psk_file.empty());
130 EXPECT_TRUE(file_util::PathExists(psk_file));
131 driver_->psk_file_ = psk_file;
132 return psk_file;
133}
134
Darin Petkov7476a262012-04-12 16:30:46 +0200135TEST_F(L2TPIPSecDriverTest, GetProviderType) {
136 EXPECT_EQ(flimflam::kProviderL2tpIpsec, driver_->GetProviderType());
137}
138
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200139TEST_F(L2TPIPSecDriverTest, Cleanup) {
Darin Petkov209e6292012-04-20 11:33:32 +0200140 driver_->Cleanup(Service::kStateIdle); // Ensure no crash.
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200141
Darin Petkov209e6292012-04-20 11:33:32 +0200142 const unsigned int kTag = 123;
143 driver_->child_watch_tag_ = kTag;
144 EXPECT_CALL(glib_, SourceRemove(kTag));
145 const int kPID = 123456;
146 driver_->pid_ = kPID;
147 EXPECT_CALL(glib_, SpawnClosePID(kPID));
Darin Petkova0e645e2012-04-25 11:38:59 +0200148 driver_->device_ = device_;
Darin Petkov209e6292012-04-20 11:33:32 +0200149 driver_->service_ = service_;
Darin Petkova0e645e2012-04-25 11:38:59 +0200150 EXPECT_CALL(*device_, OnDisconnected());
151 EXPECT_CALL(*device_, SetEnabled(false));
Darin Petkov209e6292012-04-20 11:33:32 +0200152 EXPECT_CALL(*service_, SetState(Service::kStateFailure));
153 driver_->rpc_task_.reset(new RPCTask(&control_, this));
Darin Petkov0e9735d2012-04-24 12:33:45 +0200154 FilePath psk_file = SetupPSKFile();
Darin Petkov209e6292012-04-20 11:33:32 +0200155 driver_->Cleanup(Service::kStateFailure);
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200156 EXPECT_FALSE(file_util::PathExists(psk_file));
157 EXPECT_TRUE(driver_->psk_file_.empty());
Darin Petkov209e6292012-04-20 11:33:32 +0200158 EXPECT_EQ(0, driver_->child_watch_tag_);
159 EXPECT_EQ(0, driver_->pid_);
160 EXPECT_FALSE(driver_->rpc_task_.get());
Darin Petkova0e645e2012-04-25 11:38:59 +0200161 EXPECT_FALSE(driver_->device_);
Darin Petkov209e6292012-04-20 11:33:32 +0200162 EXPECT_FALSE(driver_->service_);
163}
164
Darin Petkov0e9735d2012-04-24 12:33:45 +0200165TEST_F(L2TPIPSecDriverTest, DeletePSKFile) {
166 FilePath psk_file = SetupPSKFile();
167 driver_->DeletePSKFile();
168 EXPECT_FALSE(file_util::PathExists(psk_file));
169 EXPECT_TRUE(driver_->psk_file_.empty());
170}
171
Darin Petkov209e6292012-04-20 11:33:32 +0200172TEST_F(L2TPIPSecDriverTest, InitEnvironment) {
173 vector<string> env;
174 driver_->rpc_task_.reset(new RPCTask(&control_, this));
175 driver_->InitEnvironment(&env);
176 ASSERT_EQ(3, env.size());
177 EXPECT_EQ(string("CONNMAN_BUSNAME=") + RPCTaskMockAdaptor::kRpcConnId,
178 env[0]);
179 EXPECT_EQ(string("CONNMAN_INTERFACE=") + RPCTaskMockAdaptor::kRpcInterfaceId,
180 env[1]);
181 EXPECT_EQ(string("CONNMAN_PATH=") + RPCTaskMockAdaptor::kRpcId, env[2]);
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200182}
183
184TEST_F(L2TPIPSecDriverTest, InitOptionsNoHost) {
185 Error error;
186 vector<string> options;
Darin Petkov209e6292012-04-20 11:33:32 +0200187 EXPECT_FALSE(driver_->InitOptions(&options, &error));
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200188 EXPECT_EQ(Error::kInvalidArguments, error.type());
189 EXPECT_TRUE(options.empty());
190}
191
192TEST_F(L2TPIPSecDriverTest, InitOptions) {
193 static const char kHost[] = "192.168.2.254";
194 static const char kCaCertNSS[] = "{1234}";
195 static const char kPSK[] = "foobar";
196
197 SetArg(flimflam::kProviderHostProperty, kHost);
198 SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS);
199 SetArg(flimflam::kL2tpIpsecPskProperty, kPSK);
200
201 FilePath empty_cert;
202 EXPECT_CALL(nss_, GetDERCertfile(kCaCertNSS, _)).WillOnce(Return(empty_cert));
203
204 const FilePath temp_dir(temp_dir_.path());
205 EXPECT_CALL(manager_, run_path()).WillOnce(ReturnRef(temp_dir));
206
207 Error error;
208 vector<string> options;
Darin Petkov209e6292012-04-20 11:33:32 +0200209 EXPECT_TRUE(driver_->InitOptions(&options, &error));
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200210 EXPECT_TRUE(error.IsSuccess());
211
212 ExpectInFlags(options, "--remote_host", kHost);
213 ASSERT_FALSE(driver_->psk_file_.empty());
214 ExpectInFlags(options, "--psk_file", driver_->psk_file_.value());
215}
216
217TEST_F(L2TPIPSecDriverTest, InitPSKOptions) {
218 Error error;
219 vector<string> options;
220 static const char kPSK[] = "foobar";
221 const FilePath bad_dir("/non/existent/directory");
222 const FilePath temp_dir(temp_dir_.path());
223 EXPECT_CALL(manager_, run_path())
224 .WillOnce(ReturnRef(bad_dir))
225 .WillOnce(ReturnRef(temp_dir));
226
227 EXPECT_TRUE(driver_->InitPSKOptions(&options, &error));
228 EXPECT_TRUE(options.empty());
229 EXPECT_TRUE(error.IsSuccess());
230
231 SetArg(flimflam::kL2tpIpsecPskProperty, kPSK);
232
233 EXPECT_FALSE(driver_->InitPSKOptions(&options, &error));
234 EXPECT_TRUE(options.empty());
235 EXPECT_EQ(Error::kInternalError, error.type());
236 error.Reset();
237
238 EXPECT_TRUE(driver_->InitPSKOptions(&options, &error));
239 ASSERT_FALSE(driver_->psk_file_.empty());
240 ExpectInFlags(options, "--psk_file", driver_->psk_file_.value());
241 EXPECT_TRUE(error.IsSuccess());
242 string contents;
243 EXPECT_TRUE(
244 file_util::ReadFileToString(driver_->psk_file_, &contents));
245 EXPECT_EQ(kPSK, contents);
246 struct stat buf;
247 ASSERT_EQ(0, stat(driver_->psk_file_.value().c_str(), &buf));
248 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, buf.st_mode);
249}
250
251TEST_F(L2TPIPSecDriverTest, InitNSSOptions) {
252 static const char kHost[] = "192.168.2.254";
253 static const char kCaCertNSS[] = "{1234}";
254 static const char kNSSCertfile[] = "/tmp/nss-cert";
255 FilePath empty_cert;
256 FilePath nss_cert(kNSSCertfile);
257 SetArg(flimflam::kProviderHostProperty, kHost);
258 SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS);
259 EXPECT_CALL(nss_,
260 GetDERCertfile(kCaCertNSS,
261 ElementsAreArray(kHost, arraysize(kHost) - 1)))
262 .WillOnce(Return(empty_cert))
263 .WillOnce(Return(nss_cert));
264
265 vector<string> options;
266 driver_->InitNSSOptions(&options);
267 EXPECT_TRUE(options.empty());
268 driver_->InitNSSOptions(&options);
269 ExpectInFlags(options, "--server_ca_file", kNSSCertfile);
270}
271
272TEST_F(L2TPIPSecDriverTest, AppendValueOption) {
273 static const char kOption[] = "--l2tpipsec-option";
274 static const char kProperty[] = "L2TPIPSec.SomeProperty";
275 static const char kValue[] = "some-property-value";
276 static const char kOption2[] = "--l2tpipsec-option2";
277 static const char kProperty2[] = "L2TPIPSec.SomeProperty2";
278 static const char kValue2[] = "some-property-value2";
279
280 vector<string> options;
281 EXPECT_FALSE(
282 driver_->AppendValueOption(
283 "L2TPIPSec.UnknownProperty", kOption, &options));
284 EXPECT_TRUE(options.empty());
285
286 SetArg(kProperty, "");
287 EXPECT_FALSE(driver_->AppendValueOption(kProperty, kOption, &options));
288 EXPECT_TRUE(options.empty());
289
290 SetArg(kProperty, kValue);
291 SetArg(kProperty2, kValue2);
292 EXPECT_TRUE(driver_->AppendValueOption(kProperty, kOption, &options));
293 EXPECT_TRUE(driver_->AppendValueOption(kProperty2, kOption2, &options));
294 EXPECT_EQ(4, options.size());
295 EXPECT_EQ(kOption, options[0]);
296 EXPECT_EQ(kValue, options[1]);
297 EXPECT_EQ(kOption2, options[2]);
298 EXPECT_EQ(kValue2, options[3]);
299}
300
301TEST_F(L2TPIPSecDriverTest, AppendFlag) {
302 static const char kTrueOption[] = "--l2tpipsec-option";
303 static const char kFalseOption[] = "--nol2tpipsec-option";
304 static const char kProperty[] = "L2TPIPSec.SomeProperty";
305 static const char kTrueOption2[] = "--l2tpipsec-option2";
306 static const char kFalseOption2[] = "--nol2tpipsec-option2";
307 static const char kProperty2[] = "L2TPIPSec.SomeProperty2";
308
309 vector<string> options;
310 EXPECT_FALSE(driver_->AppendFlag("L2TPIPSec.UnknownProperty",
311 kTrueOption, kFalseOption, &options));
312 EXPECT_TRUE(options.empty());
313
314 SetArg(kProperty, "");
315 EXPECT_FALSE(
316 driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options));
317 EXPECT_TRUE(options.empty());
318
319 SetArg(kProperty, "true");
320 SetArg(kProperty2, "false");
321 EXPECT_TRUE(
322 driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options));
323 EXPECT_TRUE(
324 driver_->AppendFlag(kProperty2, kTrueOption2, kFalseOption2, &options));
325 EXPECT_EQ(2, options.size());
326 EXPECT_EQ(kTrueOption, options[0]);
327 EXPECT_EQ(kFalseOption2, options[1]);
328}
329
Darin Petkov209e6292012-04-20 11:33:32 +0200330TEST_F(L2TPIPSecDriverTest, GetLogin) {
331 static const char kUser[] = "joesmith";
332 static const char kPassword[] = "random-password";
333 string user, password;
334 SetArg(flimflam::kL2tpIpsecUserProperty, kUser);
335 driver_->GetLogin(&user, &password);
336 EXPECT_TRUE(user.empty());
337 EXPECT_TRUE(password.empty());
338 SetArg(flimflam::kL2tpIpsecUserProperty, "");
339 SetArg(flimflam::kL2tpIpsecPasswordProperty, kPassword);
340 driver_->GetLogin(&user, &password);
341 EXPECT_TRUE(user.empty());
342 EXPECT_TRUE(password.empty());
343 SetArg(flimflam::kL2tpIpsecUserProperty, kUser);
344 driver_->GetLogin(&user, &password);
345 EXPECT_EQ(kUser, user);
346 EXPECT_EQ(kPassword, password);
347}
348
349TEST_F(L2TPIPSecDriverTest, OnL2TPIPSecVPNDied) {
350 const int kPID = 99999;
351 driver_->child_watch_tag_ = 333;
352 driver_->pid_ = kPID;
353 EXPECT_CALL(glib_, SpawnClosePID(kPID));
354 L2TPIPSecDriver::OnL2TPIPSecVPNDied(kPID, 2, driver_);
355 EXPECT_EQ(0, driver_->child_watch_tag_);
356 EXPECT_EQ(0, driver_->pid_);
357}
358
359namespace {
360MATCHER(CheckEnv, "") {
361 if (!arg || !arg[0] || !arg[1] || !arg[2] || arg[3]) {
362 return false;
363 }
364 return StartsWithASCII(arg[0], "CONNMAN_", true);
365}
366} // namespace
367
368TEST_F(L2TPIPSecDriverTest, SpawnL2TPIPSecVPN) {
369 Error error;
370 EXPECT_FALSE(driver_->SpawnL2TPIPSecVPN(&error));
371 EXPECT_TRUE(error.IsFailure());
372
373 static const char kHost[] = "192.168.2.254";
374 SetArg(flimflam::kProviderHostProperty, kHost);
375 driver_->rpc_task_.reset(new RPCTask(&control_, this));
376
377 const int kPID = 234678;
378 EXPECT_CALL(glib_,
379 SpawnAsyncWithPipesCWD(_, CheckEnv(), _, _, _, _, _, _, _, _))
380 .WillOnce(Return(false))
381 .WillOnce(DoAll(SetArgumentPointee<5>(kPID), Return(true)));
382 const int kTag = 6;
383 EXPECT_CALL(glib_, ChildWatchAdd(kPID, &driver_->OnL2TPIPSecVPNDied, driver_))
384 .WillOnce(Return(kTag));
385 error.Reset();
386 EXPECT_FALSE(driver_->SpawnL2TPIPSecVPN(&error));
387 EXPECT_EQ(Error::kInternalError, error.type());
388 error.Reset();
389 EXPECT_TRUE(driver_->SpawnL2TPIPSecVPN(&error));
390 EXPECT_TRUE(error.IsSuccess());
391 EXPECT_EQ(kPID, driver_->pid_);
392 EXPECT_EQ(kTag, driver_->child_watch_tag_);
393}
394
395TEST_F(L2TPIPSecDriverTest, Connect) {
396 EXPECT_CALL(*service_, SetState(Service::kStateConfiguring));
397 static const char kHost[] = "192.168.2.254";
398 SetArg(flimflam::kProviderHostProperty, kHost);
399 EXPECT_CALL(glib_, SpawnAsyncWithPipesCWD(_, _, _, _, _, _, _, _, _, _))
400 .WillOnce(Return(true));
401 EXPECT_CALL(glib_, ChildWatchAdd(_, _, _)).WillOnce(Return(1));
402 Error error;
403 driver_->Connect(service_, &error);
404 EXPECT_TRUE(error.IsSuccess());
405}
406
Darin Petkova0e645e2012-04-25 11:38:59 +0200407TEST_F(L2TPIPSecDriverTest, Disconnect) {
408 driver_->device_ = device_;
409 driver_->service_ = service_;
410 EXPECT_CALL(*device_, OnDisconnected());
411 EXPECT_CALL(*device_, SetEnabled(false));
412 EXPECT_CALL(*service_, SetState(Service::kStateIdle));
413 driver_->Disconnect();
414 EXPECT_FALSE(driver_->device_);
415 EXPECT_FALSE(driver_->service_);
416}
417
Darin Petkov5eb05422012-05-11 15:45:25 +0200418TEST_F(L2TPIPSecDriverTest, OnConnectionDisconnected) {
419 driver_->service_ = service_;
420 EXPECT_CALL(*service_, SetState(Service::kStateFailure));
421 driver_->OnConnectionDisconnected();
422 EXPECT_FALSE(driver_->service_);
423}
424
Darin Petkovd4325392012-04-23 15:48:22 +0200425TEST_F(L2TPIPSecDriverTest, InitPropertyStore) {
426 // Sanity test property store initialization.
427 PropertyStore store;
428 driver_->InitPropertyStore(&store);
429 const string kUser = "joe";
430 Error error;
431 EXPECT_TRUE(
432 store.SetStringProperty(flimflam::kL2tpIpsecUserProperty, kUser, &error));
433 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb536a742012-04-26 11:31:28 +0200434 EXPECT_EQ(kUser,
435 GetArgs()->LookupString(flimflam::kL2tpIpsecUserProperty, ""));
436}
437
438TEST_F(L2TPIPSecDriverTest, GetProvider) {
439 PropertyStore store;
440 driver_->InitPropertyStore(&store);
Paul Stewart8e7e4592012-04-29 09:47:48 -0700441 PropertyStoreInspector inspector(&store);
Darin Petkovb536a742012-04-26 11:31:28 +0200442 {
443 Error error;
444 KeyValueStore props;
Paul Stewart8e7e4592012-04-29 09:47:48 -0700445 EXPECT_TRUE(inspector.GetKeyValueStoreProperty(
446 flimflam::kProviderProperty, &props, &error));
Darin Petkovb536a742012-04-26 11:31:28 +0200447 EXPECT_TRUE(props.LookupBool(flimflam::kPassphraseRequiredProperty, false));
448 EXPECT_TRUE(
449 props.LookupBool(flimflam::kL2tpIpsecPskRequiredProperty, false));
450 }
451 {
452 Error error;
453 KeyValueStore props;
454 SetArg(flimflam::kL2tpIpsecPasswordProperty, "random-password");
455 SetArg(flimflam::kL2tpIpsecPskProperty, "random-psk");
Paul Stewart8e7e4592012-04-29 09:47:48 -0700456 EXPECT_TRUE(inspector.GetKeyValueStoreProperty(
457 flimflam::kProviderProperty, &props, &error));
Darin Petkovb536a742012-04-26 11:31:28 +0200458 EXPECT_FALSE(props.LookupBool(flimflam::kPassphraseRequiredProperty, true));
459 EXPECT_FALSE(
460 props.LookupBool(flimflam::kL2tpIpsecPskRequiredProperty, true));
461 }
Darin Petkovd4325392012-04-23 15:48:22 +0200462}
463
Darin Petkov0e9735d2012-04-24 12:33:45 +0200464TEST_F(L2TPIPSecDriverTest, ParseIPConfiguration) {
465 map<string, string> config;
466 config["INTERNAL_IP4_ADDRESS"] = "4.5.6.7";
467 config["EXTERNAL_IP4_ADDRESS"] = "33.44.55.66";
468 config["GATEWAY_ADDRESS"] = "192.168.1.1";
469 config["DNS1"] = "1.1.1.1";
470 config["DNS2"] = "2.2.2.2";
471 config["INTERNAL_IFNAME"] = "ppp0";
472 config["LNS_ADDRESS"] = "99.88.77.66";
473 config["foo"] = "bar";
474 IPConfig::Properties props;
475 string interface_name;
476 L2TPIPSecDriver::ParseIPConfiguration(config, &props, &interface_name);
477 EXPECT_EQ(IPAddress::kFamilyIPv4, props.address_family);
478 EXPECT_EQ("4.5.6.7", props.address);
479 EXPECT_EQ("33.44.55.66", props.peer_address);
480 EXPECT_EQ("192.168.1.1", props.gateway);
481 EXPECT_EQ("99.88.77.66", props.trusted_ip);
482 ASSERT_EQ(2, props.dns_servers.size());
483 EXPECT_EQ("1.1.1.1", props.dns_servers[0]);
484 EXPECT_EQ("2.2.2.2", props.dns_servers[1]);
485 EXPECT_EQ("ppp0", interface_name);
486}
487
488namespace {
489MATCHER_P(IsIPAddress, address, "") {
490 IPAddress ip_address(IPAddress::kFamilyIPv4);
491 EXPECT_TRUE(ip_address.SetAddressFromString(address));
492 return ip_address.Equals(arg);
493}
494} // namespace
495
496TEST_F(L2TPIPSecDriverTest, Notify) {
497 map<string, string> config;
Darin Petkovf8046b82012-04-24 16:29:23 +0200498 config["INTERNAL_IFNAME"] = kInterfaceName;
Darin Petkovf8046b82012-04-24 16:29:23 +0200499 EXPECT_CALL(device_info_, GetIndex(kInterfaceName))
500 .WillOnce(Return(kInterfaceIndex));
Darin Petkovf8046b82012-04-24 16:29:23 +0200501 EXPECT_CALL(*device_, SetEnabled(true));
502 EXPECT_CALL(*device_, UpdateIPConfig(_));
503 driver_->device_ = device_;
Darin Petkov0e9735d2012-04-24 12:33:45 +0200504 FilePath psk_file = SetupPSKFile();
505 driver_->Notify("connect", config);
506 EXPECT_FALSE(file_util::PathExists(psk_file));
507 EXPECT_TRUE(driver_->psk_file_.empty());
508}
509
Darin Petkova0e645e2012-04-25 11:38:59 +0200510TEST_F(L2TPIPSecDriverTest, NotifyFail) {
511 map<string, string> dict;
512 driver_->device_ = device_;
513 EXPECT_CALL(*device_, OnDisconnected());
514 driver_->Notify("fail", dict);
515}
516
517TEST_F(L2TPIPSecDriverTest, VerifyPaths) {
518 // Ensure that the various path constants that the L2TP/IPSec driver uses
519 // actually exists in the build image. Due to build dependencies, they should
520 // already exist by the time we run unit tests.
521
522 // The L2TPIPSecDriver path constants are absolute. FilePath::Append asserts
523 // that its argument is not an absolute path, so we need to strip the leading
524 // separators. There's nothing built into FilePath to do so.
525 static const char *kPaths[] = {
526 L2TPIPSecDriver::kL2TPIPSecVPNPath,
527 L2TPIPSecDriver::kPPPDPlugin,
528 };
529 for (size_t i = 0; i < arraysize(kPaths); i++) {
530 string path(kPaths[i]);
531 TrimString(path, FilePath::kSeparators, &path);
532 EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path)))
533 << kPaths[i];
534 }
535}
536
Darin Petkov7476a262012-04-12 16:30:46 +0200537} // namespace shill