blob: fa786b22b6ace5269ee33bca32ed65feb5c08fa0 [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_connection.h"
16#include "shill/mock_device_info.h"
Darin Petkov7476a262012-04-12 16:30:46 +020017#include "shill/mock_glib.h"
18#include "shill/mock_manager.h"
19#include "shill/mock_metrics.h"
Darin Petkovf7ef50a2012-04-16 20:54:31 +020020#include "shill/mock_nss.h"
Darin Petkov0e9735d2012-04-24 12:33:45 +020021#include "shill/mock_service.h"
Darin Petkovf8046b82012-04-24 16:29:23 +020022#include "shill/mock_vpn.h"
Darin Petkov7476a262012-04-12 16:30:46 +020023#include "shill/mock_vpn_service.h"
Darin Petkovf8046b82012-04-24 16:29:23 +020024#include "shill/vpn.h"
Darin Petkov7476a262012-04-12 16:30:46 +020025
Darin Petkovf7ef50a2012-04-16 20:54:31 +020026using std::find;
Darin Petkov209e6292012-04-20 11:33:32 +020027using std::map;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020028using std::string;
29using std::vector;
30using testing::_;
31using testing::ElementsAreArray;
Darin Petkov0e9735d2012-04-24 12:33:45 +020032using testing::NiceMock;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020033using testing::Return;
34using testing::ReturnRef;
Darin Petkov209e6292012-04-20 11:33:32 +020035using testing::SetArgumentPointee;
Darin Petkov0e9735d2012-04-24 12:33:45 +020036using testing::StrictMock;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020037
Darin Petkov7476a262012-04-12 16:30:46 +020038namespace shill {
39
Darin Petkov209e6292012-04-20 11:33:32 +020040class L2TPIPSecDriverTest : public testing::Test,
41 public RPCTaskDelegate {
Darin Petkov7476a262012-04-12 16:30:46 +020042 public:
43 L2TPIPSecDriverTest()
Darin Petkov0e9735d2012-04-24 12:33:45 +020044 : device_info_(&control_, &dispatcher_, &metrics_, &manager_),
45 manager_(&control_, &dispatcher_, &metrics_, &glib_),
Darin Petkovf8046b82012-04-24 16:29:23 +020046 driver_(new L2TPIPSecDriver(&control_, &dispatcher_, &metrics_,
47 &manager_, &device_info_, &glib_)),
Darin Petkov7476a262012-04-12 16:30:46 +020048 service_(new MockVPNService(&control_, &dispatcher_, &metrics_,
Darin Petkovf8046b82012-04-24 16:29:23 +020049 &manager_, driver_)),
50 device_(new MockVPN(&control_, &dispatcher_, &metrics_, &manager_,
51 kInterfaceName, kInterfaceIndex)) {
Darin Petkovf7ef50a2012-04-16 20:54:31 +020052 driver_->nss_ = &nss_;
53 }
Darin Petkov7476a262012-04-12 16:30:46 +020054
55 virtual ~L2TPIPSecDriverTest() {}
56
Darin Petkovf7ef50a2012-04-16 20:54:31 +020057 virtual void SetUp() {
58 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
59 }
60
61 virtual void TearDown() {
Darin Petkov209e6292012-04-20 11:33:32 +020062 driver_->child_watch_tag_ = 0;
63 driver_->pid_ = 0;
Darin Petkovf8046b82012-04-24 16:29:23 +020064 driver_->device_ = NULL;
Darin Petkov209e6292012-04-20 11:33:32 +020065 driver_->service_ = NULL;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020066 ASSERT_TRUE(temp_dir_.Delete());
67 }
68
Darin Petkov7476a262012-04-12 16:30:46 +020069 protected:
Darin Petkovf8046b82012-04-24 16:29:23 +020070 static const char kInterfaceName[];
71 static const int kInterfaceIndex;
72
Darin Petkovf7ef50a2012-04-16 20:54:31 +020073 void SetArg(const string &arg, const string &value) {
74 driver_->args_.SetString(arg, value);
75 }
76
Darin Petkovd4325392012-04-23 15:48:22 +020077 KeyValueStore *GetArgs() {
78 return driver_->args();
79 }
80
Darin Petkovf7ef50a2012-04-16 20:54:31 +020081 // Used to assert that a flag appears in the options.
82 void ExpectInFlags(const vector<string> &options, const string &flag,
83 const string &value);
84
Darin Petkov0e9735d2012-04-24 12:33:45 +020085 FilePath SetupPSKFile();
86
Darin Petkov209e6292012-04-20 11:33:32 +020087 // Inherited from RPCTaskDelegate.
88 virtual void GetLogin(string *user, string *password);
89 virtual void Notify(const string &reason, const map<string, string> &dict);
90
Darin Petkovf7ef50a2012-04-16 20:54:31 +020091 ScopedTempDir temp_dir_;
Darin Petkov7476a262012-04-12 16:30:46 +020092 NiceMockControl control_;
Darin Petkov0e9735d2012-04-24 12:33:45 +020093 NiceMock<MockDeviceInfo> device_info_;
Darin Petkov7476a262012-04-12 16:30:46 +020094 EventDispatcher dispatcher_;
95 MockMetrics metrics_;
96 MockGLib glib_;
97 MockManager manager_;
98 L2TPIPSecDriver *driver_; // Owned by |service_|.
99 scoped_refptr<MockVPNService> service_;
Darin Petkovf8046b82012-04-24 16:29:23 +0200100 scoped_refptr<MockVPN> device_;
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200101 MockNSS nss_;
Darin Petkov7476a262012-04-12 16:30:46 +0200102};
103
Darin Petkovf8046b82012-04-24 16:29:23 +0200104const char L2TPIPSecDriverTest::kInterfaceName[] = "ppp0";
105const int L2TPIPSecDriverTest::kInterfaceIndex = 123;
106
Darin Petkov209e6292012-04-20 11:33:32 +0200107void L2TPIPSecDriverTest::GetLogin(string */*user*/, string */*password*/) {}
108
109void L2TPIPSecDriverTest::Notify(
110 const string &/*reason*/, const map<string, string> &/*dict*/) {}
111
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200112void L2TPIPSecDriverTest::ExpectInFlags(
113 const vector<string> &options, const string &flag, const string &value) {
114 vector<string>::const_iterator it =
115 find(options.begin(), options.end(), flag);
116
117 EXPECT_TRUE(it != options.end());
118 if (it != options.end())
119 return; // Don't crash below.
120 it++;
121 EXPECT_TRUE(it != options.end());
122 if (it != options.end())
123 return; // Don't crash below.
124 EXPECT_EQ(value, *it);
125}
126
Darin Petkov0e9735d2012-04-24 12:33:45 +0200127FilePath L2TPIPSecDriverTest::SetupPSKFile() {
128 FilePath psk_file;
129 EXPECT_TRUE(file_util::CreateTemporaryFileInDir(temp_dir_.path(), &psk_file));
130 EXPECT_FALSE(psk_file.empty());
131 EXPECT_TRUE(file_util::PathExists(psk_file));
132 driver_->psk_file_ = psk_file;
133 return psk_file;
134}
135
Darin Petkov7476a262012-04-12 16:30:46 +0200136TEST_F(L2TPIPSecDriverTest, GetProviderType) {
137 EXPECT_EQ(flimflam::kProviderL2tpIpsec, driver_->GetProviderType());
138}
139
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200140TEST_F(L2TPIPSecDriverTest, Cleanup) {
Darin Petkov209e6292012-04-20 11:33:32 +0200141 driver_->Cleanup(Service::kStateIdle); // Ensure no crash.
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200142
Darin Petkov209e6292012-04-20 11:33:32 +0200143 const unsigned int kTag = 123;
144 driver_->child_watch_tag_ = kTag;
145 EXPECT_CALL(glib_, SourceRemove(kTag));
146 const int kPID = 123456;
147 driver_->pid_ = kPID;
148 EXPECT_CALL(glib_, SpawnClosePID(kPID));
149 driver_->service_ = service_;
150 EXPECT_CALL(*service_, SetState(Service::kStateFailure));
151 driver_->rpc_task_.reset(new RPCTask(&control_, this));
Darin Petkov0e9735d2012-04-24 12:33:45 +0200152 FilePath psk_file = SetupPSKFile();
Darin Petkov209e6292012-04-20 11:33:32 +0200153 driver_->Cleanup(Service::kStateFailure);
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200154 EXPECT_FALSE(file_util::PathExists(psk_file));
155 EXPECT_TRUE(driver_->psk_file_.empty());
Darin Petkov209e6292012-04-20 11:33:32 +0200156 EXPECT_EQ(0, driver_->child_watch_tag_);
157 EXPECT_EQ(0, driver_->pid_);
158 EXPECT_FALSE(driver_->rpc_task_.get());
159 EXPECT_FALSE(driver_->service_);
160}
161
Darin Petkov0e9735d2012-04-24 12:33:45 +0200162TEST_F(L2TPIPSecDriverTest, DeletePSKFile) {
163 FilePath psk_file = SetupPSKFile();
164 driver_->DeletePSKFile();
165 EXPECT_FALSE(file_util::PathExists(psk_file));
166 EXPECT_TRUE(driver_->psk_file_.empty());
167}
168
Darin Petkov209e6292012-04-20 11:33:32 +0200169TEST_F(L2TPIPSecDriverTest, InitEnvironment) {
170 vector<string> env;
171 driver_->rpc_task_.reset(new RPCTask(&control_, this));
172 driver_->InitEnvironment(&env);
173 ASSERT_EQ(3, env.size());
174 EXPECT_EQ(string("CONNMAN_BUSNAME=") + RPCTaskMockAdaptor::kRpcConnId,
175 env[0]);
176 EXPECT_EQ(string("CONNMAN_INTERFACE=") + RPCTaskMockAdaptor::kRpcInterfaceId,
177 env[1]);
178 EXPECT_EQ(string("CONNMAN_PATH=") + RPCTaskMockAdaptor::kRpcId, env[2]);
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200179}
180
181TEST_F(L2TPIPSecDriverTest, InitOptionsNoHost) {
182 Error error;
183 vector<string> options;
Darin Petkov209e6292012-04-20 11:33:32 +0200184 EXPECT_FALSE(driver_->InitOptions(&options, &error));
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200185 EXPECT_EQ(Error::kInvalidArguments, error.type());
186 EXPECT_TRUE(options.empty());
187}
188
189TEST_F(L2TPIPSecDriverTest, InitOptions) {
190 static const char kHost[] = "192.168.2.254";
191 static const char kCaCertNSS[] = "{1234}";
192 static const char kPSK[] = "foobar";
193
194 SetArg(flimflam::kProviderHostProperty, kHost);
195 SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS);
196 SetArg(flimflam::kL2tpIpsecPskProperty, kPSK);
197
198 FilePath empty_cert;
199 EXPECT_CALL(nss_, GetDERCertfile(kCaCertNSS, _)).WillOnce(Return(empty_cert));
200
201 const FilePath temp_dir(temp_dir_.path());
202 EXPECT_CALL(manager_, run_path()).WillOnce(ReturnRef(temp_dir));
203
204 Error error;
205 vector<string> options;
Darin Petkov209e6292012-04-20 11:33:32 +0200206 EXPECT_TRUE(driver_->InitOptions(&options, &error));
Darin Petkovf7ef50a2012-04-16 20:54:31 +0200207 EXPECT_TRUE(error.IsSuccess());
208
209 ExpectInFlags(options, "--remote_host", kHost);
210 ASSERT_FALSE(driver_->psk_file_.empty());
211 ExpectInFlags(options, "--psk_file", driver_->psk_file_.value());
212}
213
214TEST_F(L2TPIPSecDriverTest, InitPSKOptions) {
215 Error error;
216 vector<string> options;
217 static const char kPSK[] = "foobar";
218 const FilePath bad_dir("/non/existent/directory");
219 const FilePath temp_dir(temp_dir_.path());
220 EXPECT_CALL(manager_, run_path())
221 .WillOnce(ReturnRef(bad_dir))
222 .WillOnce(ReturnRef(temp_dir));
223
224 EXPECT_TRUE(driver_->InitPSKOptions(&options, &error));
225 EXPECT_TRUE(options.empty());
226 EXPECT_TRUE(error.IsSuccess());
227
228 SetArg(flimflam::kL2tpIpsecPskProperty, kPSK);
229
230 EXPECT_FALSE(driver_->InitPSKOptions(&options, &error));
231 EXPECT_TRUE(options.empty());
232 EXPECT_EQ(Error::kInternalError, error.type());
233 error.Reset();
234
235 EXPECT_TRUE(driver_->InitPSKOptions(&options, &error));
236 ASSERT_FALSE(driver_->psk_file_.empty());
237 ExpectInFlags(options, "--psk_file", driver_->psk_file_.value());
238 EXPECT_TRUE(error.IsSuccess());
239 string contents;
240 EXPECT_TRUE(
241 file_util::ReadFileToString(driver_->psk_file_, &contents));
242 EXPECT_EQ(kPSK, contents);
243 struct stat buf;
244 ASSERT_EQ(0, stat(driver_->psk_file_.value().c_str(), &buf));
245 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, buf.st_mode);
246}
247
248TEST_F(L2TPIPSecDriverTest, InitNSSOptions) {
249 static const char kHost[] = "192.168.2.254";
250 static const char kCaCertNSS[] = "{1234}";
251 static const char kNSSCertfile[] = "/tmp/nss-cert";
252 FilePath empty_cert;
253 FilePath nss_cert(kNSSCertfile);
254 SetArg(flimflam::kProviderHostProperty, kHost);
255 SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS);
256 EXPECT_CALL(nss_,
257 GetDERCertfile(kCaCertNSS,
258 ElementsAreArray(kHost, arraysize(kHost) - 1)))
259 .WillOnce(Return(empty_cert))
260 .WillOnce(Return(nss_cert));
261
262 vector<string> options;
263 driver_->InitNSSOptions(&options);
264 EXPECT_TRUE(options.empty());
265 driver_->InitNSSOptions(&options);
266 ExpectInFlags(options, "--server_ca_file", kNSSCertfile);
267}
268
269TEST_F(L2TPIPSecDriverTest, AppendValueOption) {
270 static const char kOption[] = "--l2tpipsec-option";
271 static const char kProperty[] = "L2TPIPSec.SomeProperty";
272 static const char kValue[] = "some-property-value";
273 static const char kOption2[] = "--l2tpipsec-option2";
274 static const char kProperty2[] = "L2TPIPSec.SomeProperty2";
275 static const char kValue2[] = "some-property-value2";
276
277 vector<string> options;
278 EXPECT_FALSE(
279 driver_->AppendValueOption(
280 "L2TPIPSec.UnknownProperty", kOption, &options));
281 EXPECT_TRUE(options.empty());
282
283 SetArg(kProperty, "");
284 EXPECT_FALSE(driver_->AppendValueOption(kProperty, kOption, &options));
285 EXPECT_TRUE(options.empty());
286
287 SetArg(kProperty, kValue);
288 SetArg(kProperty2, kValue2);
289 EXPECT_TRUE(driver_->AppendValueOption(kProperty, kOption, &options));
290 EXPECT_TRUE(driver_->AppendValueOption(kProperty2, kOption2, &options));
291 EXPECT_EQ(4, options.size());
292 EXPECT_EQ(kOption, options[0]);
293 EXPECT_EQ(kValue, options[1]);
294 EXPECT_EQ(kOption2, options[2]);
295 EXPECT_EQ(kValue2, options[3]);
296}
297
298TEST_F(L2TPIPSecDriverTest, AppendFlag) {
299 static const char kTrueOption[] = "--l2tpipsec-option";
300 static const char kFalseOption[] = "--nol2tpipsec-option";
301 static const char kProperty[] = "L2TPIPSec.SomeProperty";
302 static const char kTrueOption2[] = "--l2tpipsec-option2";
303 static const char kFalseOption2[] = "--nol2tpipsec-option2";
304 static const char kProperty2[] = "L2TPIPSec.SomeProperty2";
305
306 vector<string> options;
307 EXPECT_FALSE(driver_->AppendFlag("L2TPIPSec.UnknownProperty",
308 kTrueOption, kFalseOption, &options));
309 EXPECT_TRUE(options.empty());
310
311 SetArg(kProperty, "");
312 EXPECT_FALSE(
313 driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options));
314 EXPECT_TRUE(options.empty());
315
316 SetArg(kProperty, "true");
317 SetArg(kProperty2, "false");
318 EXPECT_TRUE(
319 driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options));
320 EXPECT_TRUE(
321 driver_->AppendFlag(kProperty2, kTrueOption2, kFalseOption2, &options));
322 EXPECT_EQ(2, options.size());
323 EXPECT_EQ(kTrueOption, options[0]);
324 EXPECT_EQ(kFalseOption2, options[1]);
325}
326
Darin Petkov209e6292012-04-20 11:33:32 +0200327TEST_F(L2TPIPSecDriverTest, GetLogin) {
328 static const char kUser[] = "joesmith";
329 static const char kPassword[] = "random-password";
330 string user, password;
331 SetArg(flimflam::kL2tpIpsecUserProperty, kUser);
332 driver_->GetLogin(&user, &password);
333 EXPECT_TRUE(user.empty());
334 EXPECT_TRUE(password.empty());
335 SetArg(flimflam::kL2tpIpsecUserProperty, "");
336 SetArg(flimflam::kL2tpIpsecPasswordProperty, kPassword);
337 driver_->GetLogin(&user, &password);
338 EXPECT_TRUE(user.empty());
339 EXPECT_TRUE(password.empty());
340 SetArg(flimflam::kL2tpIpsecUserProperty, kUser);
341 driver_->GetLogin(&user, &password);
342 EXPECT_EQ(kUser, user);
343 EXPECT_EQ(kPassword, password);
344}
345
346TEST_F(L2TPIPSecDriverTest, OnL2TPIPSecVPNDied) {
347 const int kPID = 99999;
348 driver_->child_watch_tag_ = 333;
349 driver_->pid_ = kPID;
350 EXPECT_CALL(glib_, SpawnClosePID(kPID));
351 L2TPIPSecDriver::OnL2TPIPSecVPNDied(kPID, 2, driver_);
352 EXPECT_EQ(0, driver_->child_watch_tag_);
353 EXPECT_EQ(0, driver_->pid_);
354}
355
356namespace {
357MATCHER(CheckEnv, "") {
358 if (!arg || !arg[0] || !arg[1] || !arg[2] || arg[3]) {
359 return false;
360 }
361 return StartsWithASCII(arg[0], "CONNMAN_", true);
362}
363} // namespace
364
365TEST_F(L2TPIPSecDriverTest, SpawnL2TPIPSecVPN) {
366 Error error;
367 EXPECT_FALSE(driver_->SpawnL2TPIPSecVPN(&error));
368 EXPECT_TRUE(error.IsFailure());
369
370 static const char kHost[] = "192.168.2.254";
371 SetArg(flimflam::kProviderHostProperty, kHost);
372 driver_->rpc_task_.reset(new RPCTask(&control_, this));
373
374 const int kPID = 234678;
375 EXPECT_CALL(glib_,
376 SpawnAsyncWithPipesCWD(_, CheckEnv(), _, _, _, _, _, _, _, _))
377 .WillOnce(Return(false))
378 .WillOnce(DoAll(SetArgumentPointee<5>(kPID), Return(true)));
379 const int kTag = 6;
380 EXPECT_CALL(glib_, ChildWatchAdd(kPID, &driver_->OnL2TPIPSecVPNDied, driver_))
381 .WillOnce(Return(kTag));
382 error.Reset();
383 EXPECT_FALSE(driver_->SpawnL2TPIPSecVPN(&error));
384 EXPECT_EQ(Error::kInternalError, error.type());
385 error.Reset();
386 EXPECT_TRUE(driver_->SpawnL2TPIPSecVPN(&error));
387 EXPECT_TRUE(error.IsSuccess());
388 EXPECT_EQ(kPID, driver_->pid_);
389 EXPECT_EQ(kTag, driver_->child_watch_tag_);
390}
391
392TEST_F(L2TPIPSecDriverTest, Connect) {
393 EXPECT_CALL(*service_, SetState(Service::kStateConfiguring));
394 static const char kHost[] = "192.168.2.254";
395 SetArg(flimflam::kProviderHostProperty, kHost);
396 EXPECT_CALL(glib_, SpawnAsyncWithPipesCWD(_, _, _, _, _, _, _, _, _, _))
397 .WillOnce(Return(true));
398 EXPECT_CALL(glib_, ChildWatchAdd(_, _, _)).WillOnce(Return(1));
399 Error error;
400 driver_->Connect(service_, &error);
401 EXPECT_TRUE(error.IsSuccess());
402}
403
Darin Petkovd4325392012-04-23 15:48:22 +0200404TEST_F(L2TPIPSecDriverTest, InitPropertyStore) {
405 // Sanity test property store initialization.
406 PropertyStore store;
407 driver_->InitPropertyStore(&store);
408 const string kUser = "joe";
409 Error error;
410 EXPECT_TRUE(
411 store.SetStringProperty(flimflam::kL2tpIpsecUserProperty, kUser, &error));
412 EXPECT_TRUE(error.IsSuccess());
413 EXPECT_EQ(kUser, GetArgs()->GetString(flimflam::kL2tpIpsecUserProperty));
414}
415
Darin Petkov0e9735d2012-04-24 12:33:45 +0200416TEST_F(L2TPIPSecDriverTest, ParseIPConfiguration) {
417 map<string, string> config;
418 config["INTERNAL_IP4_ADDRESS"] = "4.5.6.7";
419 config["EXTERNAL_IP4_ADDRESS"] = "33.44.55.66";
420 config["GATEWAY_ADDRESS"] = "192.168.1.1";
421 config["DNS1"] = "1.1.1.1";
422 config["DNS2"] = "2.2.2.2";
423 config["INTERNAL_IFNAME"] = "ppp0";
424 config["LNS_ADDRESS"] = "99.88.77.66";
425 config["foo"] = "bar";
426 IPConfig::Properties props;
427 string interface_name;
428 L2TPIPSecDriver::ParseIPConfiguration(config, &props, &interface_name);
429 EXPECT_EQ(IPAddress::kFamilyIPv4, props.address_family);
430 EXPECT_EQ("4.5.6.7", props.address);
431 EXPECT_EQ("33.44.55.66", props.peer_address);
432 EXPECT_EQ("192.168.1.1", props.gateway);
433 EXPECT_EQ("99.88.77.66", props.trusted_ip);
434 ASSERT_EQ(2, props.dns_servers.size());
435 EXPECT_EQ("1.1.1.1", props.dns_servers[0]);
436 EXPECT_EQ("2.2.2.2", props.dns_servers[1]);
437 EXPECT_EQ("ppp0", interface_name);
438}
439
440namespace {
441MATCHER_P(IsIPAddress, address, "") {
442 IPAddress ip_address(IPAddress::kFamilyIPv4);
443 EXPECT_TRUE(ip_address.SetAddressFromString(address));
444 return ip_address.Equals(arg);
445}
446} // namespace
447
448TEST_F(L2TPIPSecDriverTest, Notify) {
449 map<string, string> config;
450 static const char kPeer[] = "99.88.77.66";
Darin Petkovf8046b82012-04-24 16:29:23 +0200451 config["INTERNAL_IFNAME"] = kInterfaceName;
Darin Petkov0e9735d2012-04-24 12:33:45 +0200452 config["GATEWAY_ADDRESS"] = "192.168.1.1";
453 config["LNS_ADDRESS"] = kPeer;
454 scoped_refptr<MockService> service(
455 new NiceMock<MockService>(&control_, &dispatcher_, &metrics_, &manager_));
456 scoped_refptr<MockConnection> connection(
457 new StrictMock<MockConnection>(&device_info_));
458 service->set_mock_connection(connection);
Darin Petkovf8046b82012-04-24 16:29:23 +0200459 EXPECT_CALL(device_info_, GetIndex(kInterfaceName))
460 .WillOnce(Return(kInterfaceIndex));
Darin Petkov0e9735d2012-04-24 12:33:45 +0200461 EXPECT_CALL(manager_, GetDefaultService()).WillOnce(Return(service));
462 EXPECT_CALL(*connection, RequestHostRoute(IsIPAddress(kPeer)))
463 .WillOnce(Return(true));
Darin Petkovf8046b82012-04-24 16:29:23 +0200464 EXPECT_CALL(*device_, SetEnabled(true));
465 EXPECT_CALL(*device_, UpdateIPConfig(_));
466 driver_->device_ = device_;
Darin Petkov0e9735d2012-04-24 12:33:45 +0200467 FilePath psk_file = SetupPSKFile();
468 driver_->Notify("connect", config);
469 EXPECT_FALSE(file_util::PathExists(psk_file));
470 EXPECT_TRUE(driver_->psk_file_.empty());
471}
472
Darin Petkov7476a262012-04-12 16:30:46 +0200473} // namespace shill