blob: 8d2d3457dfe045962d026416af319110bb8cf5e1 [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 Petkov7476a262012-04-12 16:30:46 +02009#include <gtest/gtest.h>
10
11#include "shill/event_dispatcher.h"
12#include "shill/nice_mock_control.h"
13#include "shill/mock_glib.h"
14#include "shill/mock_manager.h"
15#include "shill/mock_metrics.h"
Darin Petkovf7ef50a2012-04-16 20:54:31 +020016#include "shill/mock_nss.h"
Darin Petkov7476a262012-04-12 16:30:46 +020017#include "shill/mock_vpn_service.h"
18
Darin Petkovf7ef50a2012-04-16 20:54:31 +020019using std::find;
20using std::string;
21using std::vector;
22using testing::_;
23using testing::ElementsAreArray;
24using testing::Return;
25using testing::ReturnRef;
26
Darin Petkov7476a262012-04-12 16:30:46 +020027namespace shill {
28
29class L2TPIPSecDriverTest : public testing::Test {
30 public:
31 L2TPIPSecDriverTest()
32 : manager_(&control_, &dispatcher_, &metrics_, &glib_),
Darin Petkovf7ef50a2012-04-16 20:54:31 +020033 driver_(new L2TPIPSecDriver(&manager_)),
Darin Petkov7476a262012-04-12 16:30:46 +020034 service_(new MockVPNService(&control_, &dispatcher_, &metrics_,
Darin Petkovf7ef50a2012-04-16 20:54:31 +020035 &manager_, driver_)) {
36 driver_->nss_ = &nss_;
37 }
Darin Petkov7476a262012-04-12 16:30:46 +020038
39 virtual ~L2TPIPSecDriverTest() {}
40
Darin Petkovf7ef50a2012-04-16 20:54:31 +020041 virtual void SetUp() {
42 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
43 }
44
45 virtual void TearDown() {
46 ASSERT_TRUE(temp_dir_.Delete());
47 }
48
Darin Petkov7476a262012-04-12 16:30:46 +020049 protected:
Darin Petkovf7ef50a2012-04-16 20:54:31 +020050 void SetArg(const string &arg, const string &value) {
51 driver_->args_.SetString(arg, value);
52 }
53
54 // Used to assert that a flag appears in the options.
55 void ExpectInFlags(const vector<string> &options, const string &flag,
56 const string &value);
57
58 ScopedTempDir temp_dir_;
Darin Petkov7476a262012-04-12 16:30:46 +020059 NiceMockControl control_;
60 EventDispatcher dispatcher_;
61 MockMetrics metrics_;
62 MockGLib glib_;
63 MockManager manager_;
64 L2TPIPSecDriver *driver_; // Owned by |service_|.
65 scoped_refptr<MockVPNService> service_;
Darin Petkovf7ef50a2012-04-16 20:54:31 +020066 MockNSS nss_;
Darin Petkov7476a262012-04-12 16:30:46 +020067};
68
Darin Petkovf7ef50a2012-04-16 20:54:31 +020069void L2TPIPSecDriverTest::ExpectInFlags(
70 const vector<string> &options, const string &flag, const string &value) {
71 vector<string>::const_iterator it =
72 find(options.begin(), options.end(), flag);
73
74 EXPECT_TRUE(it != options.end());
75 if (it != options.end())
76 return; // Don't crash below.
77 it++;
78 EXPECT_TRUE(it != options.end());
79 if (it != options.end())
80 return; // Don't crash below.
81 EXPECT_EQ(value, *it);
82}
83
Darin Petkov7476a262012-04-12 16:30:46 +020084TEST_F(L2TPIPSecDriverTest, GetProviderType) {
85 EXPECT_EQ(flimflam::kProviderL2tpIpsec, driver_->GetProviderType());
86}
87
Darin Petkovf7ef50a2012-04-16 20:54:31 +020088TEST_F(L2TPIPSecDriverTest, Cleanup) {
89 driver_->Cleanup(); // Ensure no crash.
90
91 FilePath psk_file;
92 EXPECT_TRUE(file_util::CreateTemporaryFileInDir(temp_dir_.path(), &psk_file));
93 EXPECT_FALSE(psk_file.empty());
94 EXPECT_TRUE(file_util::PathExists(psk_file));
95 driver_->psk_file_ = psk_file;
96 driver_->Cleanup();
97 EXPECT_FALSE(file_util::PathExists(psk_file));
98 EXPECT_TRUE(driver_->psk_file_.empty());
99}
100
101TEST_F(L2TPIPSecDriverTest, InitOptionsNoHost) {
102 Error error;
103 vector<string> options;
104 driver_->InitOptions(&options, &error);
105 EXPECT_EQ(Error::kInvalidArguments, error.type());
106 EXPECT_TRUE(options.empty());
107}
108
109TEST_F(L2TPIPSecDriverTest, InitOptions) {
110 static const char kHost[] = "192.168.2.254";
111 static const char kCaCertNSS[] = "{1234}";
112 static const char kPSK[] = "foobar";
113
114 SetArg(flimflam::kProviderHostProperty, kHost);
115 SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS);
116 SetArg(flimflam::kL2tpIpsecPskProperty, kPSK);
117
118 FilePath empty_cert;
119 EXPECT_CALL(nss_, GetDERCertfile(kCaCertNSS, _)).WillOnce(Return(empty_cert));
120
121 const FilePath temp_dir(temp_dir_.path());
122 EXPECT_CALL(manager_, run_path()).WillOnce(ReturnRef(temp_dir));
123
124 Error error;
125 vector<string> options;
126 driver_->InitOptions(&options, &error);
127 EXPECT_TRUE(error.IsSuccess());
128
129 ExpectInFlags(options, "--remote_host", kHost);
130 ASSERT_FALSE(driver_->psk_file_.empty());
131 ExpectInFlags(options, "--psk_file", driver_->psk_file_.value());
132}
133
134TEST_F(L2TPIPSecDriverTest, InitPSKOptions) {
135 Error error;
136 vector<string> options;
137 static const char kPSK[] = "foobar";
138 const FilePath bad_dir("/non/existent/directory");
139 const FilePath temp_dir(temp_dir_.path());
140 EXPECT_CALL(manager_, run_path())
141 .WillOnce(ReturnRef(bad_dir))
142 .WillOnce(ReturnRef(temp_dir));
143
144 EXPECT_TRUE(driver_->InitPSKOptions(&options, &error));
145 EXPECT_TRUE(options.empty());
146 EXPECT_TRUE(error.IsSuccess());
147
148 SetArg(flimflam::kL2tpIpsecPskProperty, kPSK);
149
150 EXPECT_FALSE(driver_->InitPSKOptions(&options, &error));
151 EXPECT_TRUE(options.empty());
152 EXPECT_EQ(Error::kInternalError, error.type());
153 error.Reset();
154
155 EXPECT_TRUE(driver_->InitPSKOptions(&options, &error));
156 ASSERT_FALSE(driver_->psk_file_.empty());
157 ExpectInFlags(options, "--psk_file", driver_->psk_file_.value());
158 EXPECT_TRUE(error.IsSuccess());
159 string contents;
160 EXPECT_TRUE(
161 file_util::ReadFileToString(driver_->psk_file_, &contents));
162 EXPECT_EQ(kPSK, contents);
163 struct stat buf;
164 ASSERT_EQ(0, stat(driver_->psk_file_.value().c_str(), &buf));
165 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, buf.st_mode);
166}
167
168TEST_F(L2TPIPSecDriverTest, InitNSSOptions) {
169 static const char kHost[] = "192.168.2.254";
170 static const char kCaCertNSS[] = "{1234}";
171 static const char kNSSCertfile[] = "/tmp/nss-cert";
172 FilePath empty_cert;
173 FilePath nss_cert(kNSSCertfile);
174 SetArg(flimflam::kProviderHostProperty, kHost);
175 SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS);
176 EXPECT_CALL(nss_,
177 GetDERCertfile(kCaCertNSS,
178 ElementsAreArray(kHost, arraysize(kHost) - 1)))
179 .WillOnce(Return(empty_cert))
180 .WillOnce(Return(nss_cert));
181
182 vector<string> options;
183 driver_->InitNSSOptions(&options);
184 EXPECT_TRUE(options.empty());
185 driver_->InitNSSOptions(&options);
186 ExpectInFlags(options, "--server_ca_file", kNSSCertfile);
187}
188
189TEST_F(L2TPIPSecDriverTest, AppendValueOption) {
190 static const char kOption[] = "--l2tpipsec-option";
191 static const char kProperty[] = "L2TPIPSec.SomeProperty";
192 static const char kValue[] = "some-property-value";
193 static const char kOption2[] = "--l2tpipsec-option2";
194 static const char kProperty2[] = "L2TPIPSec.SomeProperty2";
195 static const char kValue2[] = "some-property-value2";
196
197 vector<string> options;
198 EXPECT_FALSE(
199 driver_->AppendValueOption(
200 "L2TPIPSec.UnknownProperty", kOption, &options));
201 EXPECT_TRUE(options.empty());
202
203 SetArg(kProperty, "");
204 EXPECT_FALSE(driver_->AppendValueOption(kProperty, kOption, &options));
205 EXPECT_TRUE(options.empty());
206
207 SetArg(kProperty, kValue);
208 SetArg(kProperty2, kValue2);
209 EXPECT_TRUE(driver_->AppendValueOption(kProperty, kOption, &options));
210 EXPECT_TRUE(driver_->AppendValueOption(kProperty2, kOption2, &options));
211 EXPECT_EQ(4, options.size());
212 EXPECT_EQ(kOption, options[0]);
213 EXPECT_EQ(kValue, options[1]);
214 EXPECT_EQ(kOption2, options[2]);
215 EXPECT_EQ(kValue2, options[3]);
216}
217
218TEST_F(L2TPIPSecDriverTest, AppendFlag) {
219 static const char kTrueOption[] = "--l2tpipsec-option";
220 static const char kFalseOption[] = "--nol2tpipsec-option";
221 static const char kProperty[] = "L2TPIPSec.SomeProperty";
222 static const char kTrueOption2[] = "--l2tpipsec-option2";
223 static const char kFalseOption2[] = "--nol2tpipsec-option2";
224 static const char kProperty2[] = "L2TPIPSec.SomeProperty2";
225
226 vector<string> options;
227 EXPECT_FALSE(driver_->AppendFlag("L2TPIPSec.UnknownProperty",
228 kTrueOption, kFalseOption, &options));
229 EXPECT_TRUE(options.empty());
230
231 SetArg(kProperty, "");
232 EXPECT_FALSE(
233 driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options));
234 EXPECT_TRUE(options.empty());
235
236 SetArg(kProperty, "true");
237 SetArg(kProperty2, "false");
238 EXPECT_TRUE(
239 driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options));
240 EXPECT_TRUE(
241 driver_->AppendFlag(kProperty2, kTrueOption2, kFalseOption2, &options));
242 EXPECT_EQ(2, options.size());
243 EXPECT_EQ(kTrueOption, options[0]);
244 EXPECT_EQ(kFalseOption2, options[1]);
245}
246
Darin Petkov7476a262012-04-12 16:30:46 +0200247} // namespace shill