blob: 1221c3780ae03af83eac609fc328b166be7195c3 [file] [log] [blame]
Darin Petkov33af05c2012-02-28 10:10:30 +01001// 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/openvpn_driver.h"
6
Darin Petkova9b1fed2012-02-29 11:49:05 +01007#include <algorithm>
8
Paul Stewart291a4732012-03-14 19:19:02 -07009#include <base/file_path.h>
10#include <base/file_util.h>
11#include <base/string_util.h>
Darin Petkovfe6a9372012-02-28 16:25:06 +010012#include <chromeos/dbus/service_constants.h>
Darin Petkov33af05c2012-02-28 10:10:30 +010013#include <gtest/gtest.h>
14
Paul Stewartebd38562012-03-23 13:06:40 -070015#include "shill/dbus_adaptor.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010016#include "shill/error.h"
Darin Petkov14c29ec2012-03-02 11:34:19 +010017#include "shill/ipconfig.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070018#include "shill/logging.h"
Darin Petkova9b1fed2012-02-29 11:49:05 +010019#include "shill/mock_adaptors.h"
Paul Stewart5baebb72013-03-14 11:43:29 -070020#include "shill/mock_certificate_file.h"
Paul Stewartca6abd42012-03-01 15:45:29 -080021#include "shill/mock_device_info.h"
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010022#include "shill/mock_event_dispatcher.h"
Darin Petkovf20994f2012-03-05 16:12:19 +010023#include "shill/mock_glib.h"
24#include "shill/mock_manager.h"
25#include "shill/mock_metrics.h"
Darin Petkov3c5e4dc2012-04-02 14:44:27 +020026#include "shill/mock_nss.h"
Darin Petkov46463022012-03-29 14:57:32 +020027#include "shill/mock_openvpn_management_server.h"
Darin Petkov5a850472012-06-06 15:44:24 +020028#include "shill/mock_process_killer.h"
Darin Petkova5e07ef2012-07-09 14:27:57 +020029#include "shill/mock_service.h"
Darin Petkovf3c71d72012-03-21 12:32:15 +010030#include "shill/mock_store.h"
Darin Petkov36a3ace2012-03-06 17:22:14 +010031#include "shill/mock_vpn.h"
Darin Petkov79d74c92012-03-07 17:20:32 +010032#include "shill/mock_vpn_service.h"
Darin Petkova9b1fed2012-02-29 11:49:05 +010033#include "shill/nice_mock_control.h"
34#include "shill/rpc_task.h"
Darin Petkovf20994f2012-03-05 16:12:19 +010035#include "shill/vpn.h"
Darin Petkov79d74c92012-03-07 17:20:32 +010036#include "shill/vpn_service.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010037
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080038using base::FilePath;
Darin Petkov5a850472012-06-06 15:44:24 +020039using base::WeakPtr;
Darin Petkova9b1fed2012-02-29 11:49:05 +010040using std::map;
Darin Petkovfe6a9372012-02-28 16:25:06 +010041using std::string;
42using std::vector;
Paul Stewartca6abd42012-03-01 15:45:29 -080043using testing::_;
Darin Petkovf3c71d72012-03-21 12:32:15 +010044using testing::AnyNumber;
Paul Stewartca6abd42012-03-01 15:45:29 -080045using testing::DoAll;
Darin Petkov3c5e4dc2012-04-02 14:44:27 +020046using testing::ElementsAreArray;
Darin Petkove8587e32012-07-02 13:56:07 +020047using testing::Field;
Darin Petkovf3c71d72012-03-21 12:32:15 +010048using testing::Ne;
Paul Stewartce4ec192012-03-14 12:53:46 -070049using testing::NiceMock;
Paul Stewartca6abd42012-03-01 15:45:29 -080050using testing::Return;
51using testing::SetArgumentPointee;
Paul Stewartce4ec192012-03-14 12:53:46 -070052using testing::StrictMock;
Darin Petkovfe6a9372012-02-28 16:25:06 +010053
Darin Petkov33af05c2012-02-28 10:10:30 +010054namespace shill {
55
Darin Petkova9b1fed2012-02-29 11:49:05 +010056class OpenVPNDriverTest : public testing::Test,
57 public RPCTaskDelegate {
Darin Petkov33af05c2012-02-28 10:10:30 +010058 public:
Darin Petkovfe6a9372012-02-28 16:25:06 +010059 OpenVPNDriverTest()
Darin Petkov0e9735d2012-04-24 12:33:45 +020060 : device_info_(&control_, &dispatcher_, &metrics_, &manager_),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080061 metrics_(&dispatcher_),
Darin Petkovf20994f2012-03-05 16:12:19 +010062 manager_(&control_, &dispatcher_, &metrics_, &glib_),
Darin Petkov79d74c92012-03-07 17:20:32 +010063 driver_(new OpenVPNDriver(&control_, &dispatcher_, &metrics_, &manager_,
Paul Stewart451aa7f2012-04-11 19:07:58 -070064 &device_info_, &glib_)),
Darin Petkov79d74c92012-03-07 17:20:32 +010065 service_(new MockVPNService(&control_, &dispatcher_, &metrics_,
66 &manager_, driver_)),
67 device_(new MockVPN(&control_, &dispatcher_, &metrics_, &manager_,
Darin Petkov46463022012-03-29 14:57:32 +020068 kInterfaceName, kInterfaceIndex)),
Paul Stewart5baebb72013-03-14 11:43:29 -070069 certificate_file_(new MockCertificateFile()),
Darin Petkov46463022012-03-29 14:57:32 +020070 management_server_(new NiceMock<MockOpenVPNManagementServer>()) {
71 driver_->management_server_.reset(management_server_);
Darin Petkov3c5e4dc2012-04-02 14:44:27 +020072 driver_->nss_ = &nss_;
Paul Stewart5baebb72013-03-14 11:43:29 -070073 driver_->certificate_file_.reset(certificate_file_); // Passes ownership.
Darin Petkov5a850472012-06-06 15:44:24 +020074 driver_->process_killer_ = &process_killer_;
Darin Petkov46463022012-03-29 14:57:32 +020075 }
Darin Petkovfe6a9372012-02-28 16:25:06 +010076
Darin Petkov33af05c2012-02-28 10:10:30 +010077 virtual ~OpenVPNDriverTest() {}
78
Darin Petkov36a3ace2012-03-06 17:22:14 +010079 virtual void TearDown() {
Darin Petkova5e07ef2012-07-09 14:27:57 +020080 driver_->default_service_callback_tag_ = 0;
Darin Petkov79d74c92012-03-07 17:20:32 +010081 driver_->child_watch_tag_ = 0;
82 driver_->pid_ = 0;
83 driver_->device_ = NULL;
84 driver_->service_ = NULL;
Darin Petkov1a462de2012-05-02 11:10:48 +020085 if (!lsb_release_file_.empty()) {
86 EXPECT_TRUE(file_util::Delete(lsb_release_file_, false));
87 lsb_release_file_.clear();
88 }
Darin Petkov36a3ace2012-03-06 17:22:14 +010089 }
Darin Petkova9b1fed2012-02-29 11:49:05 +010090
Darin Petkov33af05c2012-02-28 10:10:30 +010091 protected:
Darin Petkovfe6a9372012-02-28 16:25:06 +010092 static const char kOption[];
93 static const char kProperty[];
94 static const char kValue[];
95 static const char kOption2[];
96 static const char kProperty2[];
97 static const char kValue2[];
Darin Petkov60596742012-03-05 12:17:17 +010098 static const char kGateway1[];
99 static const char kNetmask1[];
100 static const char kNetwork1[];
101 static const char kGateway2[];
102 static const char kNetmask2[];
103 static const char kNetwork2[];
Darin Petkov79d74c92012-03-07 17:20:32 +0100104 static const char kInterfaceName[];
105 static const int kInterfaceIndex;
Darin Petkovfe6a9372012-02-28 16:25:06 +0100106
Darin Petkovb451d6e2012-04-23 11:56:41 +0200107 void SetArg(const string &arg, const string &value) {
108 driver_->args()->SetString(arg, value);
Darin Petkovfe6a9372012-02-28 16:25:06 +0100109 }
110
Darin Petkovf3c71d72012-03-21 12:32:15 +0100111 KeyValueStore *GetArgs() {
Darin Petkovb451d6e2012-04-23 11:56:41 +0200112 return driver_->args();
Darin Petkovf3c71d72012-03-21 12:32:15 +0100113 }
114
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200115 void RemoveStringArg(const string &arg) {
116 driver_->args()->RemoveString(arg);
117 }
118
Darin Petkov3189a472012-10-05 09:55:33 +0200119 const ServiceRefPtr &GetSelectedService() {
120 return device_->selected_service();
121 }
122
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100123 bool InitManagementChannelOptions(vector<string> *options, Error *error) {
124 return driver_->InitManagementChannelOptions(options, error);
125 }
126
127 Sockets *GetSockets() {
128 return &driver_->sockets_;
129 }
130
Darin Petkova42afe32013-02-05 16:53:52 +0100131 void SetDevice(const VPNRefPtr &device) {
132 driver_->device_ = device;
133 }
134
135 void SetService(const VPNServiceRefPtr &service) {
136 driver_->service_ = service;
137 }
138
139 VPNServiceRefPtr GetService() {
140 return driver_->service_;
141 }
142
143 void OnConnectionDisconnected() {
144 driver_->OnConnectionDisconnected();
145 }
146
147 void OnConnectTimeout() {
148 driver_->OnConnectTimeout();
149 }
150
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100151 void StartConnectTimeout(int timeout_seconds) {
152 driver_->StartConnectTimeout(timeout_seconds);
Darin Petkova42afe32013-02-05 16:53:52 +0100153 }
154
155 bool IsConnectTimeoutStarted() {
156 return driver_->IsConnectTimeoutStarted();
157 }
158
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100159 static int GetDefaultConnectTimeoutSeconds() {
160 return OpenVPNDriver::kDefaultConnectTimeoutSeconds;
161 }
162
163 static int GetReconnectOfflineTimeoutSeconds() {
164 return OpenVPNDriver::kReconnectOfflineTimeoutSeconds;
165 }
166
167 static int GetReconnectTLSErrorTimeoutSeconds() {
168 return OpenVPNDriver::kReconnectTLSErrorTimeoutSeconds;
169 }
170
171 static int GetReconnectTimeoutSeconds(OpenVPNDriver::ReconnectReason reason) {
172 return OpenVPNDriver::GetReconnectTimeoutSeconds(reason);
173 }
174
Darin Petkov1c049c72013-03-21 13:15:45 +0100175 void SetClientState(const string &state) {
176 management_server_->state_ = state;
177 }
178
Paul Stewartca6abd42012-03-01 15:45:29 -0800179 // Used to assert that a flag appears in the options.
180 void ExpectInFlags(const vector<string> &options, const string &flag,
181 const string &value);
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200182 void ExpectInFlags(const vector<string> &options, const string &flag);
183 void ExpectNotInFlags(const vector<string> &options, const string &flag);
Paul Stewartca6abd42012-03-01 15:45:29 -0800184
Darin Petkov1a462de2012-05-02 11:10:48 +0200185 void SetupLSBRelease();
186
Darin Petkov36a3ace2012-03-06 17:22:14 +0100187 // Inherited from RPCTaskDelegate.
Darin Petkov209e6292012-04-20 11:33:32 +0200188 virtual void GetLogin(string *user, string *password);
Darin Petkov36a3ace2012-03-06 17:22:14 +0100189 virtual void Notify(const string &reason, const map<string, string> &dict);
Paul Stewartca6abd42012-03-01 15:45:29 -0800190
Darin Petkova9b1fed2012-02-29 11:49:05 +0100191 NiceMockControl control_;
Darin Petkov0e9735d2012-04-24 12:33:45 +0200192 NiceMock<MockDeviceInfo> device_info_;
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100193 MockEventDispatcher dispatcher_;
Darin Petkovf20994f2012-03-05 16:12:19 +0100194 MockMetrics metrics_;
195 MockGLib glib_;
196 MockManager manager_;
Darin Petkov46463022012-03-29 14:57:32 +0200197 OpenVPNDriver *driver_; // Owned by |service_|.
Darin Petkov79d74c92012-03-07 17:20:32 +0100198 scoped_refptr<MockVPNService> service_;
199 scoped_refptr<MockVPN> device_;
Paul Stewart5baebb72013-03-14 11:43:29 -0700200 MockCertificateFile *certificate_file_; // Owned by |driver_|.
Darin Petkov3c5e4dc2012-04-02 14:44:27 +0200201 MockNSS nss_;
Darin Petkov5a850472012-06-06 15:44:24 +0200202 MockProcessKiller process_killer_;
Darin Petkov46463022012-03-29 14:57:32 +0200203
204 // Owned by |driver_|.
205 NiceMock<MockOpenVPNManagementServer> *management_server_;
Darin Petkov1a462de2012-05-02 11:10:48 +0200206
207 FilePath lsb_release_file_;
Darin Petkov33af05c2012-02-28 10:10:30 +0100208};
209
Darin Petkovfe6a9372012-02-28 16:25:06 +0100210const char OpenVPNDriverTest::kOption[] = "--openvpn-option";
211const char OpenVPNDriverTest::kProperty[] = "OpenVPN.SomeProperty";
212const char OpenVPNDriverTest::kValue[] = "some-property-value";
213const char OpenVPNDriverTest::kOption2[] = "--openvpn-option2";
214const char OpenVPNDriverTest::kProperty2[] = "OpenVPN.SomeProperty2";
215const char OpenVPNDriverTest::kValue2[] = "some-property-value2";
Darin Petkov60596742012-03-05 12:17:17 +0100216const char OpenVPNDriverTest::kGateway1[] = "10.242.2.13";
217const char OpenVPNDriverTest::kNetmask1[] = "255.255.255.255";
218const char OpenVPNDriverTest::kNetwork1[] = "10.242.2.1";
219const char OpenVPNDriverTest::kGateway2[] = "10.242.2.14";
220const char OpenVPNDriverTest::kNetmask2[] = "255.255.0.0";
221const char OpenVPNDriverTest::kNetwork2[] = "192.168.0.0";
Darin Petkov79d74c92012-03-07 17:20:32 +0100222const char OpenVPNDriverTest::kInterfaceName[] = "tun0";
223const int OpenVPNDriverTest::kInterfaceIndex = 123;
Darin Petkovfe6a9372012-02-28 16:25:06 +0100224
Darin Petkov209e6292012-04-20 11:33:32 +0200225void OpenVPNDriverTest::GetLogin(string */*user*/, string */*password*/) {}
226
Darin Petkova9b1fed2012-02-29 11:49:05 +0100227void OpenVPNDriverTest::Notify(const string &/*reason*/,
228 const map<string, string> &/*dict*/) {}
229
Paul Stewartca6abd42012-03-01 15:45:29 -0800230void OpenVPNDriverTest::ExpectInFlags(const vector<string> &options,
231 const string &flag,
232 const string &value) {
233 vector<string>::const_iterator it =
234 std::find(options.begin(), options.end(), flag);
235
236 EXPECT_TRUE(it != options.end());
237 if (it != options.end())
Darin Petkov36a3ace2012-03-06 17:22:14 +0100238 return; // Don't crash below.
Paul Stewartca6abd42012-03-01 15:45:29 -0800239 it++;
240 EXPECT_TRUE(it != options.end());
241 if (it != options.end())
Darin Petkov36a3ace2012-03-06 17:22:14 +0100242 return; // Don't crash below.
Paul Stewartca6abd42012-03-01 15:45:29 -0800243 EXPECT_EQ(value, *it);
244}
245
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200246void OpenVPNDriverTest::ExpectInFlags(const vector<string> &options,
247 const string &flag) {
248 EXPECT_TRUE(std::find(options.begin(), options.end(), flag) !=
249 options.end());
250}
251
252void OpenVPNDriverTest::ExpectNotInFlags(const vector<string> &options,
253 const string &flag) {
254 EXPECT_TRUE(std::find(options.begin(), options.end(), flag) ==
255 options.end());
256}
257
Darin Petkov1a462de2012-05-02 11:10:48 +0200258void OpenVPNDriverTest::SetupLSBRelease() {
259 static const char kLSBReleaseContents[] =
260 "\n"
261 "=\n"
262 "foo=\n"
263 "=bar\n"
264 "zoo==\n"
265 "CHROMEOS_RELEASE_BOARD=x86-alex\n"
266 "CHROMEOS_RELEASE_NAME=Chromium OS\n"
267 "CHROMEOS_RELEASE_VERSION=2202.0\n";
268 EXPECT_TRUE(file_util::CreateTemporaryFile(&lsb_release_file_));
269 EXPECT_EQ(arraysize(kLSBReleaseContents),
270 file_util::WriteFile(lsb_release_file_,
271 kLSBReleaseContents,
272 arraysize(kLSBReleaseContents)));
273 EXPECT_EQ(OpenVPNDriver::kLSBReleaseFile, driver_->lsb_release_file_.value());
274 driver_->lsb_release_file_ = lsb_release_file_;
275}
276
Darin Petkov33af05c2012-02-28 10:10:30 +0100277TEST_F(OpenVPNDriverTest, Connect) {
Darin Petkov79d74c92012-03-07 17:20:32 +0100278 EXPECT_CALL(*service_, SetState(Service::kStateConfiguring));
279 const string interface = kInterfaceName;
Darin Petkovf20994f2012-03-05 16:12:19 +0100280 EXPECT_CALL(device_info_, CreateTunnelInterface(_))
Darin Petkov79d74c92012-03-07 17:20:32 +0100281 .WillOnce(DoAll(SetArgumentPointee<0>(interface), Return(true)));
282 Error error;
283 driver_->Connect(service_, &error);
284 EXPECT_TRUE(error.IsSuccess());
285 EXPECT_EQ(kInterfaceName, driver_->tunnel_interface_);
Darin Petkov602303f2012-06-06 12:15:59 +0200286 EXPECT_TRUE(driver_->IsConnectTimeoutStarted());
Darin Petkov79d74c92012-03-07 17:20:32 +0100287}
288
289TEST_F(OpenVPNDriverTest, ConnectTunnelFailure) {
290 EXPECT_CALL(*service_, SetState(Service::kStateConfiguring));
Darin Petkov0e9735d2012-04-24 12:33:45 +0200291 EXPECT_CALL(device_info_, CreateTunnelInterface(_)).WillOnce(Return(false));
Darin Petkov1c049c72013-03-21 13:15:45 +0100292 EXPECT_CALL(*service_, SetFailure(Service::kFailureInternal));
Darin Petkov79d74c92012-03-07 17:20:32 +0100293 Error error;
294 driver_->Connect(service_, &error);
295 EXPECT_EQ(Error::kInternalError, error.type());
296 EXPECT_TRUE(driver_->tunnel_interface_.empty());
Darin Petkov602303f2012-06-06 12:15:59 +0200297 EXPECT_FALSE(driver_->IsConnectTimeoutStarted());
Darin Petkov33af05c2012-02-28 10:10:30 +0100298}
299
Darin Petkov0e9735d2012-04-24 12:33:45 +0200300namespace {
301MATCHER_P(IsIPAddress, address, "") {
302 IPAddress ip_address(IPAddress::kFamilyIPv4);
303 EXPECT_TRUE(ip_address.SetAddressFromString(address));
304 return ip_address.Equals(arg);
305}
306} // namespace
307
Darin Petkov14c29ec2012-03-02 11:34:19 +0100308TEST_F(OpenVPNDriverTest, Notify) {
Darin Petkov0e9735d2012-04-24 12:33:45 +0200309 map<string, string> config;
Darin Petkov3189a472012-10-05 09:55:33 +0200310 driver_->service_ = service_;
Darin Petkov79d74c92012-03-07 17:20:32 +0100311 driver_->device_ = device_;
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100312 StartConnectTimeout(0);
Darin Petkove8587e32012-07-02 13:56:07 +0200313 EXPECT_CALL(*device_,
314 UpdateIPConfig(Field(&IPConfig::Properties::address, "")));
Darin Petkov0e9735d2012-04-24 12:33:45 +0200315 driver_->Notify("up", config);
Darin Petkov602303f2012-06-06 12:15:59 +0200316 EXPECT_FALSE(driver_->IsConnectTimeoutStarted());
Darin Petkov3189a472012-10-05 09:55:33 +0200317 EXPECT_TRUE(GetSelectedService().get() == service_.get());
Darin Petkove8587e32012-07-02 13:56:07 +0200318
319 // Tests that existing properties are reused if no new ones provided.
Darin Petkov3189a472012-10-05 09:55:33 +0200320 driver_->ip_properties_.address = "1.2.3.4";
Darin Petkove8587e32012-07-02 13:56:07 +0200321 EXPECT_CALL(*device_,
322 UpdateIPConfig(Field(&IPConfig::Properties::address, "1.2.3.4")));
323 driver_->Notify("up", config);
Darin Petkov79d74c92012-03-07 17:20:32 +0100324}
325
Paul Stewart91a43cb2013-03-02 21:34:15 -0800326TEST_F(OpenVPNDriverTest, NotifyUMA) {
327 map<string, string> config;
328 driver_->service_ = service_;
329 driver_->device_ = device_;
330
331 // Check that UMA metrics are emitted on Notify.
332 EXPECT_CALL(*device_, UpdateIPConfig(_));
333 EXPECT_CALL(metrics_, SendEnumToUMA(
334 Metrics::kMetricVpnDriver,
335 Metrics::kVpnDriverOpenVpn,
336 Metrics::kMetricVpnDriverMax));
337 EXPECT_CALL(metrics_, SendEnumToUMA(
338 Metrics::kMetricVpnRemoteAuthenticationType,
339 Metrics::kVpnRemoteAuthenticationTypeOpenVpnCertificate,
340 Metrics::kVpnRemoteAuthenticationTypeMax));
341 EXPECT_CALL(metrics_, SendEnumToUMA(
342 Metrics::kMetricVpnUserAuthenticationType,
343 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernamePassword,
344 Metrics::kVpnUserAuthenticationTypeMax));
345
346 Error unused_error;
347 PropertyStore store;
348 driver_->InitPropertyStore(&store);
Paul Stewarte8e71da2013-03-20 08:48:33 -0700349 store.SetStringProperty(flimflam::kOpenVPNCaCertProperty, "x",
Paul Stewart91a43cb2013-03-02 21:34:15 -0800350 &unused_error);
Paul Stewarte8e71da2013-03-20 08:48:33 -0700351 store.SetStringProperty(flimflam::kOpenVPNUserProperty, "y",
Paul Stewart91a43cb2013-03-02 21:34:15 -0800352 &unused_error);
353 driver_->Notify("up", config);
354}
355
Darin Petkov79d74c92012-03-07 17:20:32 +0100356TEST_F(OpenVPNDriverTest, NotifyFail) {
357 map<string, string> dict;
358 driver_->device_ = device_;
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100359 StartConnectTimeout(0);
Darin Petkov79d74c92012-03-07 17:20:32 +0100360 EXPECT_CALL(*device_, OnDisconnected());
361 driver_->Notify("fail", dict);
Darin Petkov602303f2012-06-06 12:15:59 +0200362 EXPECT_TRUE(driver_->IsConnectTimeoutStarted());
Darin Petkov14c29ec2012-03-02 11:34:19 +0100363}
364
Darin Petkov60596742012-03-05 12:17:17 +0100365TEST_F(OpenVPNDriverTest, GetRouteOptionEntry) {
366 OpenVPNDriver::RouteOptions routes;
367 EXPECT_EQ(NULL, OpenVPNDriver::GetRouteOptionEntry("foo", "bar", &routes));
368 EXPECT_TRUE(routes.empty());
369 EXPECT_EQ(NULL, OpenVPNDriver::GetRouteOptionEntry("foo", "foo", &routes));
370 EXPECT_TRUE(routes.empty());
371 EXPECT_EQ(NULL, OpenVPNDriver::GetRouteOptionEntry("foo", "fooZ", &routes));
372 EXPECT_TRUE(routes.empty());
373 IPConfig::Route *route =
374 OpenVPNDriver::GetRouteOptionEntry("foo", "foo12", &routes);
375 EXPECT_EQ(1, routes.size());
376 EXPECT_EQ(route, &routes[12]);
377 route = OpenVPNDriver::GetRouteOptionEntry("foo", "foo13", &routes);
378 EXPECT_EQ(2, routes.size());
379 EXPECT_EQ(route, &routes[13]);
380}
381
382TEST_F(OpenVPNDriverTest, ParseRouteOption) {
383 OpenVPNDriver::RouteOptions routes;
384 OpenVPNDriver::ParseRouteOption("foo", "bar", &routes);
385 EXPECT_TRUE(routes.empty());
386 OpenVPNDriver::ParseRouteOption("gateway_2", kGateway2, &routes);
387 OpenVPNDriver::ParseRouteOption("netmask_2", kNetmask2, &routes);
388 OpenVPNDriver::ParseRouteOption("network_2", kNetwork2, &routes);
389 EXPECT_EQ(1, routes.size());
390 OpenVPNDriver::ParseRouteOption("gateway_1", kGateway1, &routes);
391 OpenVPNDriver::ParseRouteOption("netmask_1", kNetmask1, &routes);
392 OpenVPNDriver::ParseRouteOption("network_1", kNetwork1, &routes);
393 EXPECT_EQ(2, routes.size());
394 EXPECT_EQ(kGateway1, routes[1].gateway);
395 EXPECT_EQ(kNetmask1, routes[1].netmask);
396 EXPECT_EQ(kNetwork1, routes[1].host);
397 EXPECT_EQ(kGateway2, routes[2].gateway);
398 EXPECT_EQ(kNetmask2, routes[2].netmask);
399 EXPECT_EQ(kNetwork2, routes[2].host);
400}
401
402TEST_F(OpenVPNDriverTest, SetRoutes) {
403 OpenVPNDriver::RouteOptions routes;
404 routes[1].gateway = "1.2.3.4";
405 routes[1].host= "1.2.3.4";
406 routes[2].host = "2.3.4.5";
407 routes[2].netmask = "255.0.0.0";
408 routes[3].netmask = "255.0.0.0";
409 routes[3].gateway = "1.2.3.5";
410 routes[5].host = kNetwork2;
411 routes[5].netmask = kNetmask2;
412 routes[5].gateway = kGateway2;
413 routes[4].host = kNetwork1;
414 routes[4].netmask = kNetmask1;
415 routes[4].gateway = kGateway1;
416 IPConfig::Properties props;
417 OpenVPNDriver::SetRoutes(routes, &props);
418 ASSERT_EQ(2, props.routes.size());
419 EXPECT_EQ(kGateway1, props.routes[0].gateway);
420 EXPECT_EQ(kNetmask1, props.routes[0].netmask);
421 EXPECT_EQ(kNetwork1, props.routes[0].host);
422 EXPECT_EQ(kGateway2, props.routes[1].gateway);
423 EXPECT_EQ(kNetmask2, props.routes[1].netmask);
424 EXPECT_EQ(kNetwork2, props.routes[1].host);
Darin Petkove8587e32012-07-02 13:56:07 +0200425
426 // Tests that the routes are not reset if no new routes are supplied.
427 OpenVPNDriver::SetRoutes(OpenVPNDriver::RouteOptions(), &props);
428 EXPECT_EQ(2, props.routes.size());
Darin Petkov60596742012-03-05 12:17:17 +0100429}
430
Darin Petkov4b944842012-09-21 10:48:48 +0200431TEST_F(OpenVPNDriverTest, SplitPortFromHost) {
432 string name, port;
433 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("", NULL, NULL));
434 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("", &name, &port));
435 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com", &name, &port));
436 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:", &name, &port));
437 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost(":1234", &name, &port));
438 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:f:1234", &name, &port));
439 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:x", &name, &port));
440 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:-1", &name, &port));
441 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:+1", &name, &port));
442 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:65536", &name, &port));
443 EXPECT_TRUE(OpenVPNDriver::SplitPortFromHost("v.com:0", &name, &port));
444 EXPECT_EQ("v.com", name);
445 EXPECT_EQ("0", port);
446 EXPECT_TRUE(OpenVPNDriver::SplitPortFromHost("w.com:65535", &name, &port));
447 EXPECT_EQ("w.com", name);
448 EXPECT_EQ("65535", port);
449 EXPECT_TRUE(OpenVPNDriver::SplitPortFromHost("x.com:12345", &name, &port));
450 EXPECT_EQ("x.com", name);
451 EXPECT_EQ("12345", port);
452}
453
Darin Petkov14c29ec2012-03-02 11:34:19 +0100454TEST_F(OpenVPNDriverTest, ParseForeignOption) {
Darin Petkove8587e32012-07-02 13:56:07 +0200455 vector<string> domain_search;
456 vector<string> dns_servers;
Darin Petkov14c29ec2012-03-02 11:34:19 +0100457 IPConfig::Properties props;
Darin Petkove8587e32012-07-02 13:56:07 +0200458 OpenVPNDriver::ParseForeignOption("", &domain_search, &dns_servers);
459 OpenVPNDriver::ParseForeignOption(
460 "dhcp-option DOMAIN", &domain_search, &dns_servers);
461 OpenVPNDriver::ParseForeignOption(
462 "dhcp-option DOMAIN zzz.com foo", &domain_search, &dns_servers);
463 OpenVPNDriver::ParseForeignOption(
464 "dhcp-Option DOmAIN xyz.com", &domain_search, &dns_servers);
465 ASSERT_EQ(1, domain_search.size());
466 EXPECT_EQ("xyz.com", domain_search[0]);
467 OpenVPNDriver::ParseForeignOption(
468 "dhcp-option DnS 1.2.3.4", &domain_search, &dns_servers);
469 ASSERT_EQ(1, dns_servers.size());
470 EXPECT_EQ("1.2.3.4", dns_servers[0]);
Darin Petkov14c29ec2012-03-02 11:34:19 +0100471}
472
473TEST_F(OpenVPNDriverTest, ParseForeignOptions) {
Darin Petkove8587e32012-07-02 13:56:07 +0200474 // This also tests that std::map is a sorted container.
Darin Petkov14c29ec2012-03-02 11:34:19 +0100475 map<int, string> options;
476 options[5] = "dhcp-option DOMAIN five.com";
477 options[2] = "dhcp-option DOMAIN two.com";
478 options[8] = "dhcp-option DOMAIN eight.com";
479 options[7] = "dhcp-option DOMAIN seven.com";
480 options[4] = "dhcp-option DOMAIN four.com";
Darin Petkove8587e32012-07-02 13:56:07 +0200481 options[10] = "dhcp-option dns 1.2.3.4";
Darin Petkov14c29ec2012-03-02 11:34:19 +0100482 IPConfig::Properties props;
483 OpenVPNDriver::ParseForeignOptions(options, &props);
484 ASSERT_EQ(5, props.domain_search.size());
485 EXPECT_EQ("two.com", props.domain_search[0]);
486 EXPECT_EQ("four.com", props.domain_search[1]);
487 EXPECT_EQ("five.com", props.domain_search[2]);
488 EXPECT_EQ("seven.com", props.domain_search[3]);
489 EXPECT_EQ("eight.com", props.domain_search[4]);
Darin Petkove8587e32012-07-02 13:56:07 +0200490 ASSERT_EQ(1, props.dns_servers.size());
491 EXPECT_EQ("1.2.3.4", props.dns_servers[0]);
492
493 // Test that the DNS properties are not updated if no new DNS properties are
494 // supplied.
495 OpenVPNDriver::ParseForeignOptions(map<int, string>(), &props);
496 EXPECT_EQ(5, props.domain_search.size());
497 ASSERT_EQ(1, props.dns_servers.size());
Darin Petkov14c29ec2012-03-02 11:34:19 +0100498}
499
500TEST_F(OpenVPNDriverTest, ParseIPConfiguration) {
501 map<string, string> config;
Darin Petkove8587e32012-07-02 13:56:07 +0200502 IPConfig::Properties props;
503
504 OpenVPNDriver::ParseIPConfiguration(config, &props);
505 EXPECT_EQ(IPAddress::kFamilyIPv4, props.address_family);
506 EXPECT_EQ(32, props.subnet_prefix);
507
508 props.subnet_prefix = 18;
509 OpenVPNDriver::ParseIPConfiguration(config, &props);
510 EXPECT_EQ(18, props.subnet_prefix);
511
Paul Stewart4698c1a2013-05-16 15:42:19 -0700512 // An "ifconfig_remote" parameter that looks like a netmask should be
513 // applied to the subnet prefix instead of to the peer address.
514 config["ifconfig_remotE"] = "255.255.0.0";
515 OpenVPNDriver::ParseIPConfiguration(config, &props);
516 EXPECT_EQ(16, props.subnet_prefix);
517 EXPECT_EQ("", props.peer_address);
518
Darin Petkov14c29ec2012-03-02 11:34:19 +0100519 config["ifconfig_loCal"] = "4.5.6.7";
520 config["ifconfiG_broadcast"] = "1.2.255.255";
521 config["ifconFig_netmAsk"] = "255.255.255.0";
522 config["ifconfig_remotE"] = "33.44.55.66";
523 config["route_vpN_gateway"] = "192.168.1.1";
Paul Stewartce4ec192012-03-14 12:53:46 -0700524 config["trusted_ip"] = "99.88.77.66";
Darin Petkov14c29ec2012-03-02 11:34:19 +0100525 config["tun_mtu"] = "1000";
526 config["foreign_option_2"] = "dhcp-option DNS 4.4.4.4";
527 config["foreign_option_1"] = "dhcp-option DNS 1.1.1.1";
528 config["foreign_option_3"] = "dhcp-option DNS 2.2.2.2";
Darin Petkov60596742012-03-05 12:17:17 +0100529 config["route_network_2"] = kNetwork2;
530 config["route_network_1"] = kNetwork1;
531 config["route_netmask_2"] = kNetmask2;
532 config["route_netmask_1"] = kNetmask1;
533 config["route_gateway_2"] = kGateway2;
534 config["route_gateway_1"] = kGateway1;
Darin Petkov14c29ec2012-03-02 11:34:19 +0100535 config["foo"] = "bar";
Darin Petkov14c29ec2012-03-02 11:34:19 +0100536 OpenVPNDriver::ParseIPConfiguration(config, &props);
537 EXPECT_EQ(IPAddress::kFamilyIPv4, props.address_family);
538 EXPECT_EQ("4.5.6.7", props.address);
539 EXPECT_EQ("1.2.255.255", props.broadcast_address);
Paul Stewart48100b02012-03-19 07:53:52 -0700540 EXPECT_EQ(24, props.subnet_prefix);
Darin Petkov14c29ec2012-03-02 11:34:19 +0100541 EXPECT_EQ("33.44.55.66", props.peer_address);
542 EXPECT_EQ("192.168.1.1", props.gateway);
Paul Stewartce4ec192012-03-14 12:53:46 -0700543 EXPECT_EQ("99.88.77.66", props.trusted_ip);
Darin Petkov14c29ec2012-03-02 11:34:19 +0100544 EXPECT_EQ(1000, props.mtu);
545 ASSERT_EQ(3, props.dns_servers.size());
546 EXPECT_EQ("1.1.1.1", props.dns_servers[0]);
547 EXPECT_EQ("4.4.4.4", props.dns_servers[1]);
548 EXPECT_EQ("2.2.2.2", props.dns_servers[2]);
Darin Petkov60596742012-03-05 12:17:17 +0100549 ASSERT_EQ(2, props.routes.size());
550 EXPECT_EQ(kGateway1, props.routes[0].gateway);
551 EXPECT_EQ(kNetmask1, props.routes[0].netmask);
552 EXPECT_EQ(kNetwork1, props.routes[0].host);
553 EXPECT_EQ(kGateway2, props.routes[1].gateway);
554 EXPECT_EQ(kNetmask2, props.routes[1].netmask);
555 EXPECT_EQ(kNetwork2, props.routes[1].host);
Ben Chana0163122012-09-25 15:10:52 -0700556 EXPECT_FALSE(props.blackhole_ipv6);
Darin Petkov14c29ec2012-03-02 11:34:19 +0100557}
558
Darin Petkovfe6a9372012-02-28 16:25:06 +0100559TEST_F(OpenVPNDriverTest, InitOptionsNoHost) {
560 Error error;
561 vector<string> options;
Darin Petkov79d74c92012-03-07 17:20:32 +0100562 driver_->InitOptions(&options, &error);
Darin Petkovfe6a9372012-02-28 16:25:06 +0100563 EXPECT_EQ(Error::kInvalidArguments, error.type());
564 EXPECT_TRUE(options.empty());
565}
566
567TEST_F(OpenVPNDriverTest, InitOptions) {
568 static const char kHost[] = "192.168.2.254";
Darin Petkov1fa81942012-04-02 11:38:08 +0200569 static const char kTLSAuthContents[] = "SOME-RANDOM-CONTENTS\n";
Darin Petkove0d5dd12012-04-04 16:10:48 +0200570 static const char kID[] = "TestPKCS11ID";
571 FilePath empty_cert;
572 SetArg(flimflam::kProviderHostProperty, kHost);
573 SetArg(flimflam::kOpenVPNTLSAuthContentsProperty, kTLSAuthContents);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200574 SetArg(flimflam::kOpenVPNClientCertIdProperty, kID);
Darin Petkov79d74c92012-03-07 17:20:32 +0100575 driver_->rpc_task_.reset(new RPCTask(&control_, this));
Darin Petkov79d74c92012-03-07 17:20:32 +0100576 driver_->tunnel_interface_ = kInterfaceName;
Darin Petkove0d5dd12012-04-04 16:10:48 +0200577 EXPECT_CALL(*management_server_, Start(_, _, _)).WillOnce(Return(true));
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100578 EXPECT_CALL(manager_, IsOnline()).WillOnce(Return(false));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200579
580 Error error;
581 vector<string> options;
582 driver_->InitOptions(&options, &error);
583 EXPECT_TRUE(error.IsSuccess());
584 EXPECT_EQ("--client", options[0]);
585 ExpectInFlags(options, "--remote", kHost);
Darin Petkov728faa92012-10-12 11:25:47 +0200586 ExpectInFlags(options, kRPCTaskPathVariable, RPCTaskMockAdaptor::kRpcId);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200587 ExpectInFlags(options, "--dev", kInterfaceName);
588 ExpectInFlags(options, "--group", "openvpn");
589 EXPECT_EQ(kInterfaceName, driver_->tunnel_interface_);
590 ASSERT_FALSE(driver_->tls_auth_file_.empty());
591 ExpectInFlags(options, "--tls-auth", driver_->tls_auth_file_.value());
592 string contents;
593 EXPECT_TRUE(
594 file_util::ReadFileToString(driver_->tls_auth_file_, &contents));
595 EXPECT_EQ(kTLSAuthContents, contents);
596 ExpectInFlags(options, "--pkcs11-id", kID);
Darin Petkovc418b4b2012-10-05 11:42:52 +0200597 ExpectInFlags(options, "--ca", OpenVPNDriver::kDefaultCACertificates);
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200598 ExpectInFlags(options, "--syslog");
599 ExpectInFlags(options, "--auth-user-pass");
Darin Petkove0d5dd12012-04-04 16:10:48 +0200600}
601
Darin Petkov4b944842012-09-21 10:48:48 +0200602TEST_F(OpenVPNDriverTest, InitOptionsHostWithPort) {
603 SetArg(flimflam::kProviderHostProperty, "v.com:1234");
604 driver_->rpc_task_.reset(new RPCTask(&control_, this));
605 driver_->tunnel_interface_ = kInterfaceName;
606 EXPECT_CALL(*management_server_, Start(_, _, _)).WillOnce(Return(true));
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100607 EXPECT_CALL(manager_, IsOnline()).WillOnce(Return(false));
Darin Petkov4b944842012-09-21 10:48:48 +0200608
609 Error error;
610 vector<string> options;
611 driver_->InitOptions(&options, &error);
612 EXPECT_TRUE(error.IsSuccess());
613 vector<string>::const_iterator it =
614 std::find(options.begin(), options.end(), "--remote");
615 ASSERT_TRUE(it != options.end());
616 ASSERT_TRUE(++it != options.end());
617 EXPECT_EQ("v.com", *it);
618 ASSERT_TRUE(++it != options.end());
619 EXPECT_EQ("1234", *it);
620}
621
Darin Petkovca8a0e62012-09-26 13:16:52 +0200622TEST_F(OpenVPNDriverTest, InitCAOptions) {
Darin Petkove0d5dd12012-04-04 16:10:48 +0200623 static const char kHost[] = "192.168.2.254";
Darin Petkovca8a0e62012-09-26 13:16:52 +0200624 static const char kCaCert[] = "foo";
Darin Petkove0d5dd12012-04-04 16:10:48 +0200625 static const char kCaCertNSS[] = "{1234}";
626 static const char kNSSCertfile[] = "/tmp/nss-cert";
Darin Petkovca8a0e62012-09-26 13:16:52 +0200627
628 Error error;
629 vector<string> options;
630 EXPECT_TRUE(driver_->InitCAOptions(&options, &error));
631 EXPECT_TRUE(error.IsSuccess());
Darin Petkovc418b4b2012-10-05 11:42:52 +0200632 ExpectInFlags(options, "--ca", OpenVPNDriver::kDefaultCACertificates);
Darin Petkovca8a0e62012-09-26 13:16:52 +0200633
634 options.clear();
635 SetArg(flimflam::kOpenVPNCaCertProperty, kCaCert);
636 EXPECT_TRUE(driver_->InitCAOptions(&options, &error));
637 ExpectInFlags(options, "--ca", kCaCert);
638 EXPECT_TRUE(error.IsSuccess());
639
640 SetArg(flimflam::kOpenVPNCaCertNSSProperty, kCaCertNSS);
641 EXPECT_FALSE(driver_->InitCAOptions(&options, &error));
642 EXPECT_EQ(Error::kInvalidArguments, error.type());
Paul Stewart5baebb72013-03-14 11:43:29 -0700643 EXPECT_EQ("Can't specify more than one of CACert, CACertNSS and CACertPEM.",
644 error.message());
Darin Petkovca8a0e62012-09-26 13:16:52 +0200645
646 SetArg(flimflam::kOpenVPNCaCertProperty, "");
647 SetArg(flimflam::kProviderHostProperty, kHost);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200648 FilePath empty_cert;
649 FilePath nss_cert(kNSSCertfile);
Darin Petkov3c5e4dc2012-04-02 14:44:27 +0200650 EXPECT_CALL(nss_,
651 GetPEMCertfile(kCaCertNSS,
652 ElementsAreArray(kHost, arraysize(kHost) - 1)))
Darin Petkove0d5dd12012-04-04 16:10:48 +0200653 .WillOnce(Return(empty_cert))
654 .WillOnce(Return(nss_cert));
655
Darin Petkovca8a0e62012-09-26 13:16:52 +0200656 error.Reset();
657 EXPECT_FALSE(driver_->InitCAOptions(&options, &error));
658 EXPECT_EQ(Error::kInvalidArguments, error.type());
659 EXPECT_EQ("Unable to extract NSS CA certificate: {1234}", error.message());
660
661 error.Reset();
662 options.clear();
663 EXPECT_TRUE(driver_->InitCAOptions(&options, &error));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200664 ExpectInFlags(options, "--ca", kNSSCertfile);
665 EXPECT_TRUE(error.IsSuccess());
Paul Stewart5baebb72013-03-14 11:43:29 -0700666
667 static const char kCaCertPEM[] = "---PEM CONTENTS---";
668 SetArg(kOpenVPNCaCertPemProperty, kCaCertPEM);
669 EXPECT_FALSE(driver_->InitCAOptions(&options, &error));
670 EXPECT_EQ(Error::kInvalidArguments, error.type());
671 EXPECT_EQ("Can't specify more than one of CACert, CACertNSS and CACertPEM.",
672 error.message());
673
674 options.clear();
675 SetArg(flimflam::kOpenVPNCaCertNSSProperty, "");
676 SetArg(flimflam::kProviderHostProperty, "");
677 static const char kPEMCertfile[] = "/tmp/pem-cert";
678 FilePath pem_cert(kPEMCertfile);
679 EXPECT_CALL(*certificate_file_, CreatePEMFromString(kCaCertPEM))
680 .WillOnce(Return(empty_cert))
681 .WillOnce(Return(pem_cert));
682
683 error.Reset();
684 EXPECT_FALSE(driver_->InitCAOptions(&options, &error));
685 EXPECT_EQ(Error::kInvalidArguments, error.type());
686 EXPECT_EQ("Unable to extract PEM CA certificate.", error.message());
687
688 error.Reset();
689 options.clear();
690 EXPECT_TRUE(driver_->InitCAOptions(&options, &error));
691 ExpectInFlags(options, "--ca", kPEMCertfile);
692 EXPECT_TRUE(error.IsSuccess());
Darin Petkove0d5dd12012-04-04 16:10:48 +0200693}
694
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200695TEST_F(OpenVPNDriverTest, InitClientAuthOptions) {
696 static const char kTestValue[] = "foo";
697 vector<string> options;
698
699 // No key or cert, assume user/password authentication.
700 driver_->InitClientAuthOptions(&options);
701 ExpectInFlags(options, "--auth-user-pass");
702 ExpectNotInFlags(options, "--key");
703 ExpectNotInFlags(options, "--cert");
704
705 // Cert available, no user/password.
706 options.clear();
707 SetArg(OpenVPNDriver::kOpenVPNCertProperty, kTestValue);
708 driver_->InitClientAuthOptions(&options);
709 ExpectNotInFlags(options, "--auth-user-pass");
710 ExpectNotInFlags(options, "--key");
711 ExpectInFlags(options, "--cert", kTestValue);
712
713 // Key available, no user/password.
714 options.clear();
715 SetArg(OpenVPNDriver::kOpenVPNKeyProperty, kTestValue);
716 driver_->InitClientAuthOptions(&options);
717 ExpectNotInFlags(options, "--auth-user-pass");
718 ExpectInFlags(options, "--key", kTestValue);
719
720 // Key available, AuthUserPass set.
721 options.clear();
722 SetArg(flimflam::kOpenVPNAuthUserPassProperty, kTestValue);
723 driver_->InitClientAuthOptions(&options);
724 ExpectInFlags(options, "--auth-user-pass");
725 ExpectInFlags(options, "--key", kTestValue);
726
727 // Key available, User set.
728 options.clear();
729 RemoveStringArg(flimflam::kOpenVPNAuthUserPassProperty);
730 SetArg(flimflam::kOpenVPNUserProperty, "user");
731 driver_->InitClientAuthOptions(&options);
732 ExpectInFlags(options, "--auth-user-pass");
733 ExpectInFlags(options, "--key", kTestValue);
734}
735
Darin Petkove0d5dd12012-04-04 16:10:48 +0200736TEST_F(OpenVPNDriverTest, InitPKCS11Options) {
737 vector<string> options;
738 driver_->InitPKCS11Options(&options);
739 EXPECT_TRUE(options.empty());
740
741 static const char kID[] = "TestPKCS11ID";
742 SetArg(flimflam::kOpenVPNClientCertIdProperty, kID);
743 driver_->InitPKCS11Options(&options);
744 ExpectInFlags(options, "--pkcs11-id", kID);
745 ExpectInFlags(options, "--pkcs11-providers", "libchaps.so");
746
747 static const char kProvider[] = "libpkcs11.so";
748 SetArg(flimflam::kOpenVPNProviderProperty, kProvider);
749 options.clear();
750 driver_->InitPKCS11Options(&options);
751 ExpectInFlags(options, "--pkcs11-id", kID);
752 ExpectInFlags(options, "--pkcs11-providers", kProvider);
753}
754
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100755TEST_F(OpenVPNDriverTest, InitManagementChannelOptionsServerFail) {
Darin Petkove0d5dd12012-04-04 16:10:48 +0200756 vector<string> options;
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100757 EXPECT_CALL(*management_server_, Start(&dispatcher_, GetSockets(), &options))
758 .WillOnce(Return(false));
Darin Petkova5e07ef2012-07-09 14:27:57 +0200759 Error error;
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100760 EXPECT_FALSE(InitManagementChannelOptions(&options, &error));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200761 EXPECT_EQ(Error::kInternalError, error.type());
762 EXPECT_EQ("Unable to setup management channel.", error.message());
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100763}
Darin Petkove0d5dd12012-04-04 16:10:48 +0200764
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100765TEST_F(OpenVPNDriverTest, InitManagementChannelOptionsOnline) {
766 vector<string> options;
767 EXPECT_CALL(*management_server_, Start(&dispatcher_, GetSockets(), &options))
768 .WillOnce(Return(true));
769 EXPECT_CALL(manager_, IsOnline()).WillOnce(Return(true));
Darin Petkova5e07ef2012-07-09 14:27:57 +0200770 EXPECT_CALL(*management_server_, ReleaseHold());
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100771 Error error;
772 EXPECT_TRUE(InitManagementChannelOptions(&options, &error));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200773 EXPECT_TRUE(error.IsSuccess());
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100774}
Darin Petkova5e07ef2012-07-09 14:27:57 +0200775
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100776TEST_F(OpenVPNDriverTest, InitManagementChannelOptionsOffline) {
777 vector<string> options;
778 EXPECT_CALL(*management_server_, Start(&dispatcher_, GetSockets(), &options))
779 .WillOnce(Return(true));
780 EXPECT_CALL(manager_, IsOnline()).WillOnce(Return(false));
Darin Petkova5e07ef2012-07-09 14:27:57 +0200781 EXPECT_CALL(*management_server_, ReleaseHold()).Times(0);
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100782 Error error;
783 EXPECT_TRUE(InitManagementChannelOptions(&options, &error));
Darin Petkova5e07ef2012-07-09 14:27:57 +0200784 EXPECT_TRUE(error.IsSuccess());
Darin Petkovfe6a9372012-02-28 16:25:06 +0100785}
786
Darin Petkov55771b72012-04-25 09:25:19 +0200787TEST_F(OpenVPNDriverTest, InitLoggingOptions) {
788 vector<string> options;
789 bool vpn_logging = SLOG_IS_ON(VPN, 0);
790 ScopeLogger::GetInstance()->EnableScopesByName("-vpn");
791 driver_->InitLoggingOptions(&options);
792 ASSERT_EQ(1, options.size());
793 EXPECT_EQ("--syslog", options[0]);
794 ScopeLogger::GetInstance()->EnableScopesByName("+vpn");
795 options.clear();
796 driver_->InitLoggingOptions(&options);
797 ExpectInFlags(options, "--verb", "3");
798 ScopeLogger::GetInstance()->EnableScopesByName("-vpn");
799 SetArg("OpenVPN.Verb", "2");
800 options.clear();
801 driver_->InitLoggingOptions(&options);
802 ExpectInFlags(options, "--verb", "2");
803 ScopeLogger::GetInstance()->EnableScopesByName("+vpn");
804 SetArg("OpenVPN.Verb", "1");
805 options.clear();
806 driver_->InitLoggingOptions(&options);
807 ExpectInFlags(options, "--verb", "1");
808 if (!vpn_logging) {
809 ScopeLogger::GetInstance()->EnableScopesByName("-vpn");
810 }
811}
812
Darin Petkovfe6a9372012-02-28 16:25:06 +0100813TEST_F(OpenVPNDriverTest, AppendValueOption) {
814 vector<string> options;
Darin Petkov46463022012-03-29 14:57:32 +0200815 EXPECT_FALSE(
816 driver_->AppendValueOption("OpenVPN.UnknownProperty", kOption, &options));
Darin Petkovfe6a9372012-02-28 16:25:06 +0100817 EXPECT_TRUE(options.empty());
818
Darin Petkove0d5dd12012-04-04 16:10:48 +0200819 SetArg(kProperty, "");
Darin Petkov46463022012-03-29 14:57:32 +0200820 EXPECT_FALSE(driver_->AppendValueOption(kProperty, kOption, &options));
Darin Petkovfe6a9372012-02-28 16:25:06 +0100821 EXPECT_TRUE(options.empty());
822
Darin Petkove0d5dd12012-04-04 16:10:48 +0200823 SetArg(kProperty, kValue);
824 SetArg(kProperty2, kValue2);
Darin Petkov46463022012-03-29 14:57:32 +0200825 EXPECT_TRUE(driver_->AppendValueOption(kProperty, kOption, &options));
826 EXPECT_TRUE(driver_->AppendValueOption(kProperty2, kOption2, &options));
Darin Petkovfe6a9372012-02-28 16:25:06 +0100827 EXPECT_EQ(4, options.size());
828 EXPECT_EQ(kOption, options[0]);
829 EXPECT_EQ(kValue, options[1]);
830 EXPECT_EQ(kOption2, options[2]);
831 EXPECT_EQ(kValue2, options[3]);
832}
833
834TEST_F(OpenVPNDriverTest, AppendFlag) {
835 vector<string> options;
Darin Petkov46463022012-03-29 14:57:32 +0200836 EXPECT_FALSE(
837 driver_->AppendFlag("OpenVPN.UnknownProperty", kOption, &options));
Darin Petkovfe6a9372012-02-28 16:25:06 +0100838 EXPECT_TRUE(options.empty());
839
Darin Petkove0d5dd12012-04-04 16:10:48 +0200840 SetArg(kProperty, "");
841 SetArg(kProperty2, kValue2);
Darin Petkov46463022012-03-29 14:57:32 +0200842 EXPECT_TRUE(driver_->AppendFlag(kProperty, kOption, &options));
843 EXPECT_TRUE(driver_->AppendFlag(kProperty2, kOption2, &options));
Darin Petkovfe6a9372012-02-28 16:25:06 +0100844 EXPECT_EQ(2, options.size());
845 EXPECT_EQ(kOption, options[0]);
846 EXPECT_EQ(kOption2, options[1]);
847}
848
Paul Stewartca6abd42012-03-01 15:45:29 -0800849TEST_F(OpenVPNDriverTest, ClaimInterface) {
Darin Petkov79d74c92012-03-07 17:20:32 +0100850 driver_->tunnel_interface_ = kInterfaceName;
851 EXPECT_FALSE(driver_->ClaimInterface(string(kInterfaceName) + "XXX",
852 kInterfaceIndex));
853 EXPECT_FALSE(driver_->device_);
Paul Stewartca6abd42012-03-01 15:45:29 -0800854
Darin Petkov36a3ace2012-03-06 17:22:14 +0100855 static const char kHost[] = "192.168.2.254";
Darin Petkove0d5dd12012-04-04 16:10:48 +0200856 SetArg(flimflam::kProviderHostProperty, kHost);
Darin Petkov46463022012-03-29 14:57:32 +0200857 EXPECT_CALL(*management_server_, Start(_, _, _)).WillOnce(Return(true));
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100858 EXPECT_CALL(manager_, IsOnline()).WillOnce(Return(false));
Darin Petkov68710d72013-02-13 14:22:56 +0100859 EXPECT_CALL(glib_, SpawnAsync(_, _, _, _, _, _, _, _)).WillOnce(Return(true));
Darin Petkov36a3ace2012-03-06 17:22:14 +0100860 EXPECT_CALL(glib_, ChildWatchAdd(_, _, _)).WillOnce(Return(1));
Darin Petkova5e07ef2012-07-09 14:27:57 +0200861 const int kServiceCallbackTag = 1;
862 EXPECT_EQ(0, driver_->default_service_callback_tag_);
863 EXPECT_CALL(manager_, RegisterDefaultServiceCallback(_))
864 .WillOnce(Return(kServiceCallbackTag));
Darin Petkov79d74c92012-03-07 17:20:32 +0100865 EXPECT_TRUE(driver_->ClaimInterface(kInterfaceName, kInterfaceIndex));
866 ASSERT_TRUE(driver_->device_);
867 EXPECT_EQ(kInterfaceIndex, driver_->device_->interface_index());
Darin Petkova5e07ef2012-07-09 14:27:57 +0200868 EXPECT_EQ(kServiceCallbackTag, driver_->default_service_callback_tag_);
Paul Stewartca6abd42012-03-01 15:45:29 -0800869}
870
Darin Petkovaba89322013-03-11 14:48:22 +0100871TEST_F(OpenVPNDriverTest, IdleService) {
872 SetService(service_);
Darin Petkovaba89322013-03-11 14:48:22 +0100873 EXPECT_CALL(*service_, SetState(Service::kStateIdle));
874 driver_->IdleService();
Darin Petkovaba89322013-03-11 14:48:22 +0100875}
876
877TEST_F(OpenVPNDriverTest, FailService) {
878 static const char kErrorDetails[] = "Bad password.";
879 SetService(service_);
Darin Petkov1c049c72013-03-21 13:15:45 +0100880 EXPECT_CALL(*service_, SetFailure(Service::kFailureConnect));
881 driver_->FailService(Service::kFailureConnect, kErrorDetails);
Darin Petkovaba89322013-03-11 14:48:22 +0100882 EXPECT_EQ(kErrorDetails, service_->error_details());
883}
884
Darin Petkov36a3ace2012-03-06 17:22:14 +0100885TEST_F(OpenVPNDriverTest, Cleanup) {
Darin Petkovaba89322013-03-11 14:48:22 +0100886 // Ensure no crash.
Darin Petkov1c049c72013-03-21 13:15:45 +0100887 driver_->Cleanup(Service::kStateIdle,
888 Service::kFailureUnknown,
889 Service::kErrorDetailsNone);
Darin Petkov1fa81942012-04-02 11:38:08 +0200890
Darin Petkova5e07ef2012-07-09 14:27:57 +0200891 const unsigned int kChildTag = 123;
Darin Petkov36a3ace2012-03-06 17:22:14 +0100892 const int kPID = 123456;
Darin Petkova5e07ef2012-07-09 14:27:57 +0200893 const int kServiceCallbackTag = 5;
Darin Petkovaba89322013-03-11 14:48:22 +0100894 static const char kErrorDetails[] = "Certificate revoked.";
Darin Petkova5e07ef2012-07-09 14:27:57 +0200895 driver_->default_service_callback_tag_ = kServiceCallbackTag;
896 driver_->child_watch_tag_ = kChildTag;
Darin Petkov79d74c92012-03-07 17:20:32 +0100897 driver_->pid_ = kPID;
898 driver_->rpc_task_.reset(new RPCTask(&control_, this));
899 driver_->tunnel_interface_ = kInterfaceName;
900 driver_->device_ = device_;
901 driver_->service_ = service_;
Darin Petkov3189a472012-10-05 09:55:33 +0200902 driver_->ip_properties_.address = "1.2.3.4";
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100903 StartConnectTimeout(0);
Darin Petkov1fa81942012-04-02 11:38:08 +0200904 FilePath tls_auth_file;
905 EXPECT_TRUE(file_util::CreateTemporaryFile(&tls_auth_file));
906 EXPECT_FALSE(tls_auth_file.empty());
907 EXPECT_TRUE(file_util::PathExists(tls_auth_file));
908 driver_->tls_auth_file_ = tls_auth_file;
Darin Petkov46463022012-03-29 14:57:32 +0200909 // Stop will be called twice -- once by Cleanup and once by the destructor.
910 EXPECT_CALL(*management_server_, Stop()).Times(2);
Darin Petkova5e07ef2012-07-09 14:27:57 +0200911 EXPECT_CALL(glib_, SourceRemove(kChildTag));
912 EXPECT_CALL(manager_, DeregisterDefaultServiceCallback(kServiceCallbackTag));
Darin Petkov5a850472012-06-06 15:44:24 +0200913 EXPECT_CALL(process_killer_, Kill(kPID, _));
914 EXPECT_CALL(device_info_, DeleteInterface(_)).Times(0);
Darin Petkov029d3532012-04-18 14:38:04 +0200915 EXPECT_CALL(*device_, OnDisconnected());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500916 EXPECT_CALL(*device_, SetEnabled(false));
Darin Petkov1c049c72013-03-21 13:15:45 +0100917 EXPECT_CALL(*service_, SetFailure(Service::kFailureInternal));
918 driver_->Cleanup(
919 Service::kStateFailure, Service::kFailureInternal, kErrorDetails);
Darin Petkov79d74c92012-03-07 17:20:32 +0100920 EXPECT_EQ(0, driver_->child_watch_tag_);
Darin Petkova5e07ef2012-07-09 14:27:57 +0200921 EXPECT_EQ(0, driver_->default_service_callback_tag_);
Darin Petkov79d74c92012-03-07 17:20:32 +0100922 EXPECT_EQ(0, driver_->pid_);
923 EXPECT_FALSE(driver_->rpc_task_.get());
924 EXPECT_TRUE(driver_->tunnel_interface_.empty());
925 EXPECT_FALSE(driver_->device_);
926 EXPECT_FALSE(driver_->service_);
Darin Petkovaba89322013-03-11 14:48:22 +0100927 EXPECT_EQ(kErrorDetails, service_->error_details());
Darin Petkov1fa81942012-04-02 11:38:08 +0200928 EXPECT_FALSE(file_util::PathExists(tls_auth_file));
929 EXPECT_TRUE(driver_->tls_auth_file_.empty());
Darin Petkov3189a472012-10-05 09:55:33 +0200930 EXPECT_TRUE(driver_->ip_properties_.address.empty());
Darin Petkov602303f2012-06-06 12:15:59 +0200931 EXPECT_FALSE(driver_->IsConnectTimeoutStarted());
Darin Petkov36a3ace2012-03-06 17:22:14 +0100932}
933
Darin Petkov1a462de2012-05-02 11:10:48 +0200934namespace {
935MATCHER(CheckEnv, "") {
936 if (!arg || !arg[0] || !arg[1] || arg[2]) {
937 return false;
938 }
939 return (string(arg[0]) == "IV_PLAT=Chromium OS" &&
940 string(arg[1]) == "IV_PLAT_REL=2202.0");
941}
942} // namespace
943
Darin Petkov36a3ace2012-03-06 17:22:14 +0100944TEST_F(OpenVPNDriverTest, SpawnOpenVPN) {
Darin Petkov1a462de2012-05-02 11:10:48 +0200945 SetupLSBRelease();
946
Darin Petkov79d74c92012-03-07 17:20:32 +0100947 EXPECT_FALSE(driver_->SpawnOpenVPN());
Darin Petkov36a3ace2012-03-06 17:22:14 +0100948
949 static const char kHost[] = "192.168.2.254";
Darin Petkove0d5dd12012-04-04 16:10:48 +0200950 SetArg(flimflam::kProviderHostProperty, kHost);
Darin Petkov79d74c92012-03-07 17:20:32 +0100951 driver_->tunnel_interface_ = "tun0";
952 driver_->rpc_task_.reset(new RPCTask(&control_, this));
Darin Petkov46463022012-03-29 14:57:32 +0200953 EXPECT_CALL(*management_server_, Start(_, _, _))
954 .Times(2)
955 .WillRepeatedly(Return(true));
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100956 EXPECT_CALL(manager_, IsOnline()).Times(2).WillRepeatedly(Return(false));
Darin Petkov36a3ace2012-03-06 17:22:14 +0100957
958 const int kPID = 234678;
Darin Petkov68710d72013-02-13 14:22:56 +0100959 EXPECT_CALL(glib_, SpawnAsync(_, _, CheckEnv(), _, _, _, _, _))
Darin Petkov36a3ace2012-03-06 17:22:14 +0100960 .WillOnce(Return(false))
Darin Petkov68710d72013-02-13 14:22:56 +0100961 .WillOnce(DoAll(SetArgumentPointee<6>(kPID), Return(true)));
Darin Petkov36a3ace2012-03-06 17:22:14 +0100962 const int kTag = 6;
Darin Petkov79d74c92012-03-07 17:20:32 +0100963 EXPECT_CALL(glib_, ChildWatchAdd(kPID, &driver_->OnOpenVPNDied, driver_))
Darin Petkov36a3ace2012-03-06 17:22:14 +0100964 .WillOnce(Return(kTag));
Darin Petkov79d74c92012-03-07 17:20:32 +0100965 EXPECT_FALSE(driver_->SpawnOpenVPN());
966 EXPECT_TRUE(driver_->SpawnOpenVPN());
967 EXPECT_EQ(kPID, driver_->pid_);
968 EXPECT_EQ(kTag, driver_->child_watch_tag_);
Darin Petkov36a3ace2012-03-06 17:22:14 +0100969}
970
971TEST_F(OpenVPNDriverTest, OnOpenVPNDied) {
972 const int kPID = 99999;
Darin Petkov5a850472012-06-06 15:44:24 +0200973 driver_->device_ = device_;
Darin Petkov79d74c92012-03-07 17:20:32 +0100974 driver_->child_watch_tag_ = 333;
975 driver_->pid_ = kPID;
Darin Petkov5a850472012-06-06 15:44:24 +0200976 EXPECT_CALL(*device_, OnDisconnected());
977 EXPECT_CALL(*device_, SetEnabled(false));
978 EXPECT_CALL(process_killer_, Kill(_, _)).Times(0);
979 EXPECT_CALL(device_info_, DeleteInterface(kInterfaceIndex));
Darin Petkov79d74c92012-03-07 17:20:32 +0100980 OpenVPNDriver::OnOpenVPNDied(kPID, 2, driver_);
981 EXPECT_EQ(0, driver_->child_watch_tag_);
982 EXPECT_EQ(0, driver_->pid_);
Darin Petkov36a3ace2012-03-06 17:22:14 +0100983}
984
Darin Petkov6aa21872012-03-09 16:10:19 +0100985TEST_F(OpenVPNDriverTest, Disconnect) {
986 driver_->device_ = device_;
987 driver_->service_ = service_;
Darin Petkov029d3532012-04-18 14:38:04 +0200988 EXPECT_CALL(*device_, OnDisconnected());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500989 EXPECT_CALL(*device_, SetEnabled(false));
Darin Petkov6aa21872012-03-09 16:10:19 +0100990 EXPECT_CALL(device_info_, DeleteInterface(kInterfaceIndex));
991 EXPECT_CALL(*service_, SetState(Service::kStateIdle));
992 driver_->Disconnect();
Darin Petkova0e645e2012-04-25 11:38:59 +0200993 EXPECT_FALSE(driver_->device_);
Darin Petkov6aa21872012-03-09 16:10:19 +0100994 EXPECT_FALSE(driver_->service_);
995}
996
Darin Petkov5eb05422012-05-11 15:45:25 +0200997TEST_F(OpenVPNDriverTest, OnConnectionDisconnected) {
Darin Petkova42afe32013-02-05 16:53:52 +0100998 EXPECT_CALL(*management_server_, Restart());
999 SetDevice(device_);
1000 SetService(service_);
1001 EXPECT_CALL(*device_, OnDisconnected());
1002 EXPECT_CALL(*service_, SetState(Service::kStateAssociating));
1003 OnConnectionDisconnected();
1004 EXPECT_TRUE(IsConnectTimeoutStarted());
1005}
1006
1007TEST_F(OpenVPNDriverTest, OnConnectTimeout) {
Darin Petkov0cd0d1e2013-02-11 12:49:10 +01001008 StartConnectTimeout(0);
Darin Petkova42afe32013-02-05 16:53:52 +01001009 SetService(service_);
Darin Petkov1c049c72013-03-21 13:15:45 +01001010 EXPECT_CALL(*service_, SetFailure(Service::kFailureConnect));
1011 OnConnectTimeout();
1012 EXPECT_FALSE(GetService());
1013 EXPECT_FALSE(IsConnectTimeoutStarted());
1014}
1015
1016TEST_F(OpenVPNDriverTest, OnConnectTimeoutResolve) {
1017 StartConnectTimeout(0);
1018 SetService(service_);
1019 SetClientState(OpenVPNManagementServer::kStateResolve);
1020 EXPECT_CALL(*service_, SetFailure(Service::kFailureDNSLookup));
Darin Petkova42afe32013-02-05 16:53:52 +01001021 OnConnectTimeout();
1022 EXPECT_FALSE(GetService());
1023 EXPECT_FALSE(IsConnectTimeoutStarted());
Darin Petkov5eb05422012-05-11 15:45:25 +02001024}
1025
Darin Petkov0cd0d1e2013-02-11 12:49:10 +01001026TEST_F(OpenVPNDriverTest, OnReconnectingUnknown) {
1027 EXPECT_FALSE(IsConnectTimeoutStarted());
1028 EXPECT_CALL(dispatcher_,
1029 PostDelayedTask(_, GetDefaultConnectTimeoutSeconds() * 1000))
1030 .WillOnce(Return(true));
1031 SetDevice(device_);
1032 SetService(service_);
Darin Petkov271fe522012-03-27 13:47:29 +02001033 EXPECT_CALL(*device_, OnDisconnected());
1034 EXPECT_CALL(*service_, SetState(Service::kStateAssociating));
Darin Petkov0cd0d1e2013-02-11 12:49:10 +01001035 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonUnknown);
1036 EXPECT_TRUE(IsConnectTimeoutStarted());
1037}
1038
1039TEST_F(OpenVPNDriverTest, OnReconnectingTLSError) {
1040 EXPECT_CALL(dispatcher_,
1041 PostDelayedTask(_, GetReconnectOfflineTimeoutSeconds() * 1000))
1042 .WillOnce(Return(true));
1043 EXPECT_CALL(dispatcher_,
1044 PostDelayedTask(_, GetReconnectTLSErrorTimeoutSeconds() * 1000))
1045 .WillOnce(Return(true));
1046
1047 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonOffline);
1048 EXPECT_TRUE(IsConnectTimeoutStarted());
1049
1050 // The scheduled timeout should not be affected for unknown reason.
1051 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonUnknown);
1052 EXPECT_TRUE(IsConnectTimeoutStarted());
1053
1054 // Reconnect on TLS error reschedules the timeout once.
1055 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonTLSError);
1056 EXPECT_TRUE(IsConnectTimeoutStarted());
1057 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonTLSError);
1058 EXPECT_TRUE(IsConnectTimeoutStarted());
Darin Petkov271fe522012-03-27 13:47:29 +02001059}
1060
Paul Stewart291a4732012-03-14 19:19:02 -07001061TEST_F(OpenVPNDriverTest, VerifyPaths) {
1062 // Ensure that the various path constants that the OpenVPN driver uses
Darin Petkova0e645e2012-04-25 11:38:59 +02001063 // actually exists in the build image. Due to build dependencies, they should
1064 // already exist by the time we run unit tests.
Paul Stewart291a4732012-03-14 19:19:02 -07001065
Darin Petkova0e645e2012-04-25 11:38:59 +02001066 // The OpenVPNDriver path constants are absolute. FilePath::Append asserts
1067 // that its argument is not an absolute path, so we need to strip the leading
1068 // separators. There's nothing built into FilePath to do so.
1069 static const char *kPaths[] = {
1070 OpenVPNDriver::kOpenVPNPath,
1071 OpenVPNDriver::kOpenVPNScript,
1072 };
1073 for (size_t i = 0; i < arraysize(kPaths); i++) {
1074 string path(kPaths[i]);
1075 TrimString(path, FilePath::kSeparators, &path);
1076 EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path)))
1077 << kPaths[i];
1078 }
Paul Stewart291a4732012-03-14 19:19:02 -07001079}
1080
Darin Petkovd4325392012-04-23 15:48:22 +02001081TEST_F(OpenVPNDriverTest, InitPropertyStore) {
1082 // Sanity test property store initialization.
1083 PropertyStore store;
1084 driver_->InitPropertyStore(&store);
1085 const string kUser = "joe";
1086 Error error;
1087 EXPECT_TRUE(
1088 store.SetStringProperty(flimflam::kOpenVPNUserProperty, kUser, &error));
1089 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb536a742012-04-26 11:31:28 +02001090 EXPECT_EQ(kUser, GetArgs()->LookupString(flimflam::kOpenVPNUserProperty, ""));
1091}
1092
1093TEST_F(OpenVPNDriverTest, GetProvider) {
1094 PropertyStore store;
1095 driver_->InitPropertyStore(&store);
1096 {
Darin Petkovb536a742012-04-26 11:31:28 +02001097 KeyValueStore props;
Paul Stewarte6e8e492013-01-17 11:00:50 -08001098 Error error;
Darin Petkovb536a742012-04-26 11:31:28 +02001099 EXPECT_TRUE(
Paul Stewarte6e8e492013-01-17 11:00:50 -08001100 store.GetKeyValueStoreProperty(
1101 flimflam::kProviderProperty, &props, &error));
Darin Petkovb536a742012-04-26 11:31:28 +02001102 EXPECT_TRUE(props.LookupBool(flimflam::kPassphraseRequiredProperty, false));
1103 }
1104 {
Darin Petkovb536a742012-04-26 11:31:28 +02001105 KeyValueStore props;
1106 SetArg(flimflam::kOpenVPNPasswordProperty, "random-password");
Paul Stewarte6e8e492013-01-17 11:00:50 -08001107 Error error;
Darin Petkovb536a742012-04-26 11:31:28 +02001108 EXPECT_TRUE(
Paul Stewarte6e8e492013-01-17 11:00:50 -08001109 store.GetKeyValueStoreProperty(
1110 flimflam::kProviderProperty, &props, &error));
Darin Petkovb536a742012-04-26 11:31:28 +02001111 EXPECT_FALSE(props.LookupBool(flimflam::kPassphraseRequiredProperty, true));
Darin Petkov02236552012-06-11 13:15:19 +02001112 EXPECT_FALSE(props.ContainsString(flimflam::kOpenVPNPasswordProperty));
Darin Petkovb536a742012-04-26 11:31:28 +02001113 }
Darin Petkovd4325392012-04-23 15:48:22 +02001114}
1115
Darin Petkov1a462de2012-05-02 11:10:48 +02001116TEST_F(OpenVPNDriverTest, ParseLSBRelease) {
1117 SetupLSBRelease();
1118 map<string, string> lsb_release;
1119 EXPECT_TRUE(driver_->ParseLSBRelease(&lsb_release));
1120 EXPECT_TRUE(ContainsKey(lsb_release, "foo") && lsb_release["foo"] == "");
1121 EXPECT_EQ("=", lsb_release["zoo"]);
1122 EXPECT_EQ("Chromium OS", lsb_release[OpenVPNDriver::kChromeOSReleaseName]);
1123 EXPECT_EQ("2202.0", lsb_release[OpenVPNDriver::kChromeOSReleaseVersion]);
1124 driver_->lsb_release_file_ = FilePath("/non/existent/file");
1125 EXPECT_FALSE(driver_->ParseLSBRelease(NULL));
1126}
1127
1128TEST_F(OpenVPNDriverTest, InitEnvironment) {
1129 vector<string> env;
1130 SetupLSBRelease();
1131 driver_->InitEnvironment(&env);
1132 ASSERT_EQ(2, env.size());
1133 EXPECT_EQ("IV_PLAT=Chromium OS", env[0]);
1134 EXPECT_EQ("IV_PLAT_REL=2202.0", env[1]);
1135 env.clear();
1136 EXPECT_EQ(0, file_util::WriteFile(lsb_release_file_, "", 0));
1137 driver_->InitEnvironment(&env);
1138 EXPECT_EQ(0, env.size());
1139}
1140
Darin Petkov5a850472012-06-06 15:44:24 +02001141TEST_F(OpenVPNDriverTest, DeleteInterface) {
1142 scoped_ptr<MockDeviceInfo> device_info(
1143 new MockDeviceInfo(&control_, &dispatcher_, &metrics_, &manager_));
1144 EXPECT_CALL(*device_info, DeleteInterface(kInterfaceIndex))
1145 .WillOnce(Return(true));
1146 WeakPtr<DeviceInfo> weak = device_info->AsWeakPtr();
1147 EXPECT_TRUE(weak);
1148 OpenVPNDriver::DeleteInterface(weak, kInterfaceIndex);
1149 device_info.reset();
1150 EXPECT_FALSE(weak);
1151 // Expect no crash.
1152 OpenVPNDriver::DeleteInterface(weak, kInterfaceIndex);
1153}
1154
Darin Petkova5e07ef2012-07-09 14:27:57 +02001155TEST_F(OpenVPNDriverTest, OnDefaultServiceChanged) {
1156 driver_->service_ = service_;
1157
1158 ServiceRefPtr null_service;
1159 EXPECT_CALL(*management_server_, Hold());
1160 driver_->OnDefaultServiceChanged(null_service);
1161
1162 EXPECT_CALL(*management_server_, Hold());
1163 driver_->OnDefaultServiceChanged(service_);
1164
1165 scoped_refptr<MockService> mock_service(
1166 new MockService(&control_, &dispatcher_, &metrics_, &manager_));
1167
1168 EXPECT_CALL(*mock_service, IsConnected()).WillOnce(Return(false));
1169 EXPECT_CALL(*management_server_, Hold());
1170 driver_->OnDefaultServiceChanged(mock_service);
1171
1172 EXPECT_CALL(*mock_service, IsConnected()).WillOnce(Return(true));
1173 EXPECT_CALL(*management_server_, ReleaseHold());
1174 driver_->OnDefaultServiceChanged(mock_service);
1175}
1176
Darin Petkov0cd0d1e2013-02-11 12:49:10 +01001177TEST_F(OpenVPNDriverTest, GetReconnectTimeoutSeconds) {
1178 EXPECT_EQ(GetDefaultConnectTimeoutSeconds(),
1179 GetReconnectTimeoutSeconds(OpenVPNDriver::kReconnectReasonUnknown));
1180 EXPECT_EQ(GetReconnectOfflineTimeoutSeconds(),
1181 GetReconnectTimeoutSeconds(OpenVPNDriver::kReconnectReasonOffline));
1182 EXPECT_EQ(GetReconnectTLSErrorTimeoutSeconds(),
1183 GetReconnectTimeoutSeconds(
1184 OpenVPNDriver::kReconnectReasonTLSError));
1185}
1186
Darin Petkov33af05c2012-02-28 10:10:30 +01001187} // namespace shill