blob: 456e6133c6490ec3757f1abb3aa600f8553a9e94 [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
Ben Chana0ddf462014-02-06 11:32:42 -08009#include <base/files/file_path.h>
Paul Stewart291a4732012-03-14 19:19:02 -070010#include <base/file_util.h>
Paul Stewartb26347a2013-08-02 12:12:09 -070011#include <base/files/scoped_temp_dir.h>
Ben Chana0ddf462014-02-06 11:32:42 -080012#include <base/strings/string_util.h>
13#include <base/strings/stringprintf.h>
Darin Petkovfe6a9372012-02-28 16:25:06 +010014#include <chromeos/dbus/service_constants.h>
Darin Petkov33af05c2012-02-28 10:10:30 +010015#include <gtest/gtest.h>
16
Paul Stewartebd38562012-03-23 13:06:40 -070017#include "shill/dbus_adaptor.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010018#include "shill/error.h"
Darin Petkov14c29ec2012-03-02 11:34:19 +010019#include "shill/ipconfig.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070020#include "shill/logging.h"
Darin Petkova9b1fed2012-02-29 11:49:05 +010021#include "shill/mock_adaptors.h"
Paul Stewart5baebb72013-03-14 11:43:29 -070022#include "shill/mock_certificate_file.h"
Paul Stewartca6abd42012-03-01 15:45:29 -080023#include "shill/mock_device_info.h"
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010024#include "shill/mock_event_dispatcher.h"
Darin Petkovf20994f2012-03-05 16:12:19 +010025#include "shill/mock_glib.h"
26#include "shill/mock_manager.h"
27#include "shill/mock_metrics.h"
Darin Petkov46463022012-03-29 14:57:32 +020028#include "shill/mock_openvpn_management_server.h"
Darin Petkov5a850472012-06-06 15:44:24 +020029#include "shill/mock_process_killer.h"
Darin Petkova5e07ef2012-07-09 14:27:57 +020030#include "shill/mock_service.h"
Darin Petkovf3c71d72012-03-21 12:32:15 +010031#include "shill/mock_store.h"
mukesh agrawal9da07772013-05-15 14:15:17 -070032#include "shill/mock_virtual_device.h"
Darin Petkov79d74c92012-03-07 17:20:32 +010033#include "shill/mock_vpn_service.h"
Darin Petkova9b1fed2012-02-29 11:49:05 +010034#include "shill/nice_mock_control.h"
35#include "shill/rpc_task.h"
mukesh agrawal9da07772013-05-15 14:15:17 -070036#include "shill/technology.h"
37#include "shill/virtual_device.h"
Darin Petkov79d74c92012-03-07 17:20:32 +010038#include "shill/vpn_service.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010039
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080040using base::FilePath;
Darin Petkov5a850472012-06-06 15:44:24 +020041using base::WeakPtr;
Darin Petkova9b1fed2012-02-29 11:49:05 +010042using std::map;
Darin Petkovfe6a9372012-02-28 16:25:06 +010043using std::string;
44using std::vector;
Paul Stewartca6abd42012-03-01 15:45:29 -080045using testing::_;
Darin Petkovf3c71d72012-03-21 12:32:15 +010046using testing::AnyNumber;
Paul Stewartca6abd42012-03-01 15:45:29 -080047using testing::DoAll;
Darin Petkov3c5e4dc2012-04-02 14:44:27 +020048using testing::ElementsAreArray;
Darin Petkove8587e32012-07-02 13:56:07 +020049using testing::Field;
Paul Stewartb5768232014-02-27 07:21:34 -080050using testing::Mock;
Darin Petkovf3c71d72012-03-21 12:32:15 +010051using testing::Ne;
Paul Stewartce4ec192012-03-14 12:53:46 -070052using testing::NiceMock;
Paul Stewartca6abd42012-03-01 15:45:29 -080053using testing::Return;
54using testing::SetArgumentPointee;
Paul Stewartce4ec192012-03-14 12:53:46 -070055using testing::StrictMock;
Darin Petkovfe6a9372012-02-28 16:25:06 +010056
Darin Petkov33af05c2012-02-28 10:10:30 +010057namespace shill {
58
Paul Stewartb5768232014-02-27 07:21:34 -080059struct AuthenticationExpectations {
60 AuthenticationExpectations()
61 : remote_authentication_type(Metrics::kVpnRemoteAuthenticationTypeMax) {}
62 AuthenticationExpectations(
63 const string &ca_cert_in,
64 const string &client_cert_in,
65 const string &user_in,
66 const string &otp_in,
67 const string &token_in,
68 Metrics::VpnRemoteAuthenticationType remote_authentication_type_in,
69 const vector<Metrics::VpnUserAuthenticationType>
70 &user_authentication_types_in)
71 : ca_cert(ca_cert_in),
72 client_cert(client_cert_in),
73 user(user_in),
74 otp(otp_in),
75 token(token_in),
76 remote_authentication_type(remote_authentication_type_in),
77 user_authentication_types(user_authentication_types_in) {}
78 string ca_cert;
79 string client_cert;
80 string user;
81 string otp;
82 string token;
83 Metrics::VpnRemoteAuthenticationType remote_authentication_type;
84 vector<Metrics::VpnUserAuthenticationType> user_authentication_types;
85};
86
87class OpenVPNDriverTest
88 : public testing::TestWithParam<AuthenticationExpectations>,
89 public RPCTaskDelegate {
Darin Petkov33af05c2012-02-28 10:10:30 +010090 public:
Darin Petkovfe6a9372012-02-28 16:25:06 +010091 OpenVPNDriverTest()
Darin Petkov0e9735d2012-04-24 12:33:45 +020092 : device_info_(&control_, &dispatcher_, &metrics_, &manager_),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080093 metrics_(&dispatcher_),
Darin Petkovf20994f2012-03-05 16:12:19 +010094 manager_(&control_, &dispatcher_, &metrics_, &glib_),
Darin Petkov79d74c92012-03-07 17:20:32 +010095 driver_(new OpenVPNDriver(&control_, &dispatcher_, &metrics_, &manager_,
Paul Stewart451aa7f2012-04-11 19:07:58 -070096 &device_info_, &glib_)),
Darin Petkov79d74c92012-03-07 17:20:32 +010097 service_(new MockVPNService(&control_, &dispatcher_, &metrics_,
98 &manager_, driver_)),
mukesh agrawal9da07772013-05-15 14:15:17 -070099 device_(new MockVirtualDevice(
100 &control_, &dispatcher_, &metrics_, &manager_,
101 kInterfaceName, kInterfaceIndex, Technology::kVPN)),
Paul Stewart5baebb72013-03-14 11:43:29 -0700102 certificate_file_(new MockCertificateFile()),
Paul Stewart8343c0b2013-09-30 11:58:54 -0700103 extra_certificates_file_(new MockCertificateFile()),
Darin Petkov46463022012-03-29 14:57:32 +0200104 management_server_(new NiceMock<MockOpenVPNManagementServer>()) {
105 driver_->management_server_.reset(management_server_);
Paul Stewart5baebb72013-03-14 11:43:29 -0700106 driver_->certificate_file_.reset(certificate_file_); // Passes ownership.
Paul Stewart8343c0b2013-09-30 11:58:54 -0700107 driver_->extra_certificates_file_.reset(
108 extra_certificates_file_); // Passes ownership.
Darin Petkov5a850472012-06-06 15:44:24 +0200109 driver_->process_killer_ = &process_killer_;
mukesh agrawal62ba51c2014-04-18 16:09:58 -0700110 CHECK(temporary_directory_.CreateUniqueTempDir());
Paul Stewartb26347a2013-08-02 12:12:09 -0700111 driver_->openvpn_config_directory_ =
112 temporary_directory_.path().Append(kOpenVPNConfigDirectory);
Darin Petkov46463022012-03-29 14:57:32 +0200113 }
Darin Petkovfe6a9372012-02-28 16:25:06 +0100114
Darin Petkov33af05c2012-02-28 10:10:30 +0100115 virtual ~OpenVPNDriverTest() {}
116
Darin Petkov36a3ace2012-03-06 17:22:14 +0100117 virtual void TearDown() {
Darin Petkova5e07ef2012-07-09 14:27:57 +0200118 driver_->default_service_callback_tag_ = 0;
Darin Petkov79d74c92012-03-07 17:20:32 +0100119 driver_->child_watch_tag_ = 0;
120 driver_->pid_ = 0;
121 driver_->device_ = NULL;
122 driver_->service_ = NULL;
Darin Petkov1a462de2012-05-02 11:10:48 +0200123 if (!lsb_release_file_.empty()) {
Ben Chana0ddf462014-02-06 11:32:42 -0800124 EXPECT_TRUE(base::DeleteFile(lsb_release_file_, false));
Darin Petkov1a462de2012-05-02 11:10:48 +0200125 lsb_release_file_.clear();
126 }
Darin Petkov36a3ace2012-03-06 17:22:14 +0100127 }
Darin Petkova9b1fed2012-02-29 11:49:05 +0100128
Darin Petkov33af05c2012-02-28 10:10:30 +0100129 protected:
Darin Petkovfe6a9372012-02-28 16:25:06 +0100130 static const char kOption[];
131 static const char kProperty[];
132 static const char kValue[];
133 static const char kOption2[];
134 static const char kProperty2[];
135 static const char kValue2[];
Darin Petkov60596742012-03-05 12:17:17 +0100136 static const char kGateway1[];
137 static const char kNetmask1[];
138 static const char kNetwork1[];
139 static const char kGateway2[];
140 static const char kNetmask2[];
141 static const char kNetwork2[];
Darin Petkov79d74c92012-03-07 17:20:32 +0100142 static const char kInterfaceName[];
143 static const int kInterfaceIndex;
Paul Stewartb26347a2013-08-02 12:12:09 -0700144 static const char kOpenVPNConfigDirectory[];
Darin Petkovfe6a9372012-02-28 16:25:06 +0100145
Darin Petkovb451d6e2012-04-23 11:56:41 +0200146 void SetArg(const string &arg, const string &value) {
147 driver_->args()->SetString(arg, value);
Darin Petkovfe6a9372012-02-28 16:25:06 +0100148 }
149
Paul Stewart0f9c9302013-06-14 15:41:28 -0700150 void SetArgArray(const string &arg, const vector<string> &value) {
151 driver_->args()->SetStrings(arg, value);
152 }
153
Darin Petkovf3c71d72012-03-21 12:32:15 +0100154 KeyValueStore *GetArgs() {
Darin Petkovb451d6e2012-04-23 11:56:41 +0200155 return driver_->args();
Darin Petkovf3c71d72012-03-21 12:32:15 +0100156 }
157
Paul Stewartb5768232014-02-27 07:21:34 -0800158 KeyValueStore GetProviderProperties(const PropertyStore &store) {
159 KeyValueStore props;
160 Error error;
161 EXPECT_TRUE(
162 store.GetKeyValueStoreProperty(kProviderProperty, &props, &error));
163 return props;
164 }
165
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200166 void RemoveStringArg(const string &arg) {
167 driver_->args()->RemoveString(arg);
168 }
169
Darin Petkov3189a472012-10-05 09:55:33 +0200170 const ServiceRefPtr &GetSelectedService() {
171 return device_->selected_service();
172 }
173
Paul Stewart406c4732013-08-01 09:30:12 -0700174 bool InitManagementChannelOptions(
175 vector<vector<string>> *options, Error *error) {
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100176 return driver_->InitManagementChannelOptions(options, error);
177 }
178
179 Sockets *GetSockets() {
180 return &driver_->sockets_;
181 }
182
mukesh agrawal9da07772013-05-15 14:15:17 -0700183 void SetDevice(const VirtualDeviceRefPtr &device) {
Darin Petkova42afe32013-02-05 16:53:52 +0100184 driver_->device_ = device;
185 }
186
187 void SetService(const VPNServiceRefPtr &service) {
188 driver_->service_ = service;
189 }
190
191 VPNServiceRefPtr GetService() {
192 return driver_->service_;
193 }
194
195 void OnConnectionDisconnected() {
196 driver_->OnConnectionDisconnected();
197 }
198
199 void OnConnectTimeout() {
200 driver_->OnConnectTimeout();
201 }
202
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100203 void StartConnectTimeout(int timeout_seconds) {
204 driver_->StartConnectTimeout(timeout_seconds);
Darin Petkova42afe32013-02-05 16:53:52 +0100205 }
206
207 bool IsConnectTimeoutStarted() {
208 return driver_->IsConnectTimeoutStarted();
209 }
210
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100211 static int GetDefaultConnectTimeoutSeconds() {
212 return OpenVPNDriver::kDefaultConnectTimeoutSeconds;
213 }
214
215 static int GetReconnectOfflineTimeoutSeconds() {
216 return OpenVPNDriver::kReconnectOfflineTimeoutSeconds;
217 }
218
219 static int GetReconnectTLSErrorTimeoutSeconds() {
220 return OpenVPNDriver::kReconnectTLSErrorTimeoutSeconds;
221 }
222
223 static int GetReconnectTimeoutSeconds(OpenVPNDriver::ReconnectReason reason) {
224 return OpenVPNDriver::GetReconnectTimeoutSeconds(reason);
225 }
226
Darin Petkov1c049c72013-03-21 13:15:45 +0100227 void SetClientState(const string &state) {
228 management_server_->state_ = state;
229 }
230
Paul Stewartca6abd42012-03-01 15:45:29 -0800231 // Used to assert that a flag appears in the options.
Paul Stewart406c4732013-08-01 09:30:12 -0700232 void ExpectInFlags(const vector<vector<string>> &options, const string &flag);
233 void ExpectInFlags(const vector<vector<string>> &options, const string &flag,
Paul Stewartca6abd42012-03-01 15:45:29 -0800234 const string &value);
Paul Stewart406c4732013-08-01 09:30:12 -0700235 void ExpectInFlags(const vector<vector<string>> &options,
236 const vector<string> &arguments);
237 void ExpectNotInFlags(const vector<vector<string>> &options,
238 const string &flag);
Paul Stewartca6abd42012-03-01 15:45:29 -0800239
Darin Petkov1a462de2012-05-02 11:10:48 +0200240 void SetupLSBRelease();
241
Darin Petkov36a3ace2012-03-06 17:22:14 +0100242 // Inherited from RPCTaskDelegate.
Darin Petkov209e6292012-04-20 11:33:32 +0200243 virtual void GetLogin(string *user, string *password);
Darin Petkov36a3ace2012-03-06 17:22:14 +0100244 virtual void Notify(const string &reason, const map<string, string> &dict);
Paul Stewartca6abd42012-03-01 15:45:29 -0800245
Darin Petkova9b1fed2012-02-29 11:49:05 +0100246 NiceMockControl control_;
Darin Petkov0e9735d2012-04-24 12:33:45 +0200247 NiceMock<MockDeviceInfo> device_info_;
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100248 MockEventDispatcher dispatcher_;
Darin Petkovf20994f2012-03-05 16:12:19 +0100249 MockMetrics metrics_;
250 MockGLib glib_;
251 MockManager manager_;
Darin Petkov46463022012-03-29 14:57:32 +0200252 OpenVPNDriver *driver_; // Owned by |service_|.
Darin Petkov79d74c92012-03-07 17:20:32 +0100253 scoped_refptr<MockVPNService> service_;
mukesh agrawal9da07772013-05-15 14:15:17 -0700254 scoped_refptr<MockVirtualDevice> device_;
Paul Stewart5baebb72013-03-14 11:43:29 -0700255 MockCertificateFile *certificate_file_; // Owned by |driver_|.
Paul Stewart8343c0b2013-09-30 11:58:54 -0700256 MockCertificateFile *extra_certificates_file_; // Owned by |driver_|.
Darin Petkov5a850472012-06-06 15:44:24 +0200257 MockProcessKiller process_killer_;
Paul Stewartb26347a2013-08-02 12:12:09 -0700258 base::ScopedTempDir temporary_directory_;
Darin Petkov46463022012-03-29 14:57:32 +0200259
260 // Owned by |driver_|.
261 NiceMock<MockOpenVPNManagementServer> *management_server_;
Darin Petkov1a462de2012-05-02 11:10:48 +0200262
263 FilePath lsb_release_file_;
Darin Petkov33af05c2012-02-28 10:10:30 +0100264};
265
Paul Stewartb26347a2013-08-02 12:12:09 -0700266const char OpenVPNDriverTest::kOption[] = "openvpn-option";
Darin Petkovfe6a9372012-02-28 16:25:06 +0100267const char OpenVPNDriverTest::kProperty[] = "OpenVPN.SomeProperty";
268const char OpenVPNDriverTest::kValue[] = "some-property-value";
Paul Stewartb26347a2013-08-02 12:12:09 -0700269const char OpenVPNDriverTest::kOption2[] = "openvpn-option2";
Darin Petkovfe6a9372012-02-28 16:25:06 +0100270const char OpenVPNDriverTest::kProperty2[] = "OpenVPN.SomeProperty2";
271const char OpenVPNDriverTest::kValue2[] = "some-property-value2";
Darin Petkov60596742012-03-05 12:17:17 +0100272const char OpenVPNDriverTest::kGateway1[] = "10.242.2.13";
273const char OpenVPNDriverTest::kNetmask1[] = "255.255.255.255";
274const char OpenVPNDriverTest::kNetwork1[] = "10.242.2.1";
275const char OpenVPNDriverTest::kGateway2[] = "10.242.2.14";
276const char OpenVPNDriverTest::kNetmask2[] = "255.255.0.0";
277const char OpenVPNDriverTest::kNetwork2[] = "192.168.0.0";
Darin Petkov79d74c92012-03-07 17:20:32 +0100278const char OpenVPNDriverTest::kInterfaceName[] = "tun0";
279const int OpenVPNDriverTest::kInterfaceIndex = 123;
Paul Stewartb26347a2013-08-02 12:12:09 -0700280const char OpenVPNDriverTest::kOpenVPNConfigDirectory[] = "openvpn";
Darin Petkovfe6a9372012-02-28 16:25:06 +0100281
Darin Petkov209e6292012-04-20 11:33:32 +0200282void OpenVPNDriverTest::GetLogin(string */*user*/, string */*password*/) {}
283
Darin Petkova9b1fed2012-02-29 11:49:05 +0100284void OpenVPNDriverTest::Notify(const string &/*reason*/,
285 const map<string, string> &/*dict*/) {}
286
Paul Stewart406c4732013-08-01 09:30:12 -0700287void OpenVPNDriverTest::ExpectInFlags(const vector<vector<string>> &options,
288 const string &flag) {
289 ExpectInFlags(options, vector<string> { flag });
290}
291
292void OpenVPNDriverTest::ExpectInFlags(const vector<vector<string>> &options,
Paul Stewartca6abd42012-03-01 15:45:29 -0800293 const string &flag,
294 const string &value) {
Paul Stewart406c4732013-08-01 09:30:12 -0700295 ExpectInFlags(options, vector<string> { flag, value });
Paul Stewartca6abd42012-03-01 15:45:29 -0800296}
297
Paul Stewart406c4732013-08-01 09:30:12 -0700298void OpenVPNDriverTest::ExpectInFlags(const vector<vector<string>> &options,
299 const vector<string> &arguments) {
300 EXPECT_TRUE(std::find(options.begin(), options.end(), arguments) !=
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200301 options.end());
302}
303
Paul Stewart406c4732013-08-01 09:30:12 -0700304void OpenVPNDriverTest::ExpectNotInFlags(const vector<vector<string>> &options,
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200305 const string &flag) {
Paul Stewart406c4732013-08-01 09:30:12 -0700306 for (const auto &option : options) {
307 EXPECT_NE(flag, option[0]);
308 }
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200309}
310
Darin Petkov1a462de2012-05-02 11:10:48 +0200311void OpenVPNDriverTest::SetupLSBRelease() {
312 static const char kLSBReleaseContents[] =
313 "\n"
314 "=\n"
315 "foo=\n"
316 "=bar\n"
317 "zoo==\n"
318 "CHROMEOS_RELEASE_BOARD=x86-alex\n"
319 "CHROMEOS_RELEASE_NAME=Chromium OS\n"
320 "CHROMEOS_RELEASE_VERSION=2202.0\n";
Ben Chana0ddf462014-02-06 11:32:42 -0800321 EXPECT_TRUE(base::CreateTemporaryFile(&lsb_release_file_));
Darin Petkov1a462de2012-05-02 11:10:48 +0200322 EXPECT_EQ(arraysize(kLSBReleaseContents),
Ben Chan6fbf64f2014-05-21 18:07:01 -0700323 base::WriteFile(lsb_release_file_,
324 kLSBReleaseContents,
325 arraysize(kLSBReleaseContents)));
Darin Petkov1a462de2012-05-02 11:10:48 +0200326 EXPECT_EQ(OpenVPNDriver::kLSBReleaseFile, driver_->lsb_release_file_.value());
327 driver_->lsb_release_file_ = lsb_release_file_;
328}
329
Darin Petkov33af05c2012-02-28 10:10:30 +0100330TEST_F(OpenVPNDriverTest, Connect) {
Darin Petkov79d74c92012-03-07 17:20:32 +0100331 EXPECT_CALL(*service_, SetState(Service::kStateConfiguring));
332 const string interface = kInterfaceName;
Darin Petkovf20994f2012-03-05 16:12:19 +0100333 EXPECT_CALL(device_info_, CreateTunnelInterface(_))
Darin Petkov79d74c92012-03-07 17:20:32 +0100334 .WillOnce(DoAll(SetArgumentPointee<0>(interface), Return(true)));
335 Error error;
336 driver_->Connect(service_, &error);
337 EXPECT_TRUE(error.IsSuccess());
338 EXPECT_EQ(kInterfaceName, driver_->tunnel_interface_);
Darin Petkov602303f2012-06-06 12:15:59 +0200339 EXPECT_TRUE(driver_->IsConnectTimeoutStarted());
Darin Petkov79d74c92012-03-07 17:20:32 +0100340}
341
342TEST_F(OpenVPNDriverTest, ConnectTunnelFailure) {
343 EXPECT_CALL(*service_, SetState(Service::kStateConfiguring));
Darin Petkov0e9735d2012-04-24 12:33:45 +0200344 EXPECT_CALL(device_info_, CreateTunnelInterface(_)).WillOnce(Return(false));
Darin Petkov1c049c72013-03-21 13:15:45 +0100345 EXPECT_CALL(*service_, SetFailure(Service::kFailureInternal));
Darin Petkov79d74c92012-03-07 17:20:32 +0100346 Error error;
347 driver_->Connect(service_, &error);
348 EXPECT_EQ(Error::kInternalError, error.type());
349 EXPECT_TRUE(driver_->tunnel_interface_.empty());
Darin Petkov602303f2012-06-06 12:15:59 +0200350 EXPECT_FALSE(driver_->IsConnectTimeoutStarted());
Darin Petkov33af05c2012-02-28 10:10:30 +0100351}
352
Darin Petkov0e9735d2012-04-24 12:33:45 +0200353namespace {
354MATCHER_P(IsIPAddress, address, "") {
355 IPAddress ip_address(IPAddress::kFamilyIPv4);
356 EXPECT_TRUE(ip_address.SetAddressFromString(address));
357 return ip_address.Equals(arg);
358}
359} // namespace
360
Darin Petkov14c29ec2012-03-02 11:34:19 +0100361TEST_F(OpenVPNDriverTest, Notify) {
Darin Petkov0e9735d2012-04-24 12:33:45 +0200362 map<string, string> config;
Darin Petkov3189a472012-10-05 09:55:33 +0200363 driver_->service_ = service_;
Darin Petkov79d74c92012-03-07 17:20:32 +0100364 driver_->device_ = device_;
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100365 StartConnectTimeout(0);
Darin Petkove8587e32012-07-02 13:56:07 +0200366 EXPECT_CALL(*device_,
367 UpdateIPConfig(Field(&IPConfig::Properties::address, "")));
Darin Petkov0e9735d2012-04-24 12:33:45 +0200368 driver_->Notify("up", config);
Darin Petkov602303f2012-06-06 12:15:59 +0200369 EXPECT_FALSE(driver_->IsConnectTimeoutStarted());
Darin Petkov3189a472012-10-05 09:55:33 +0200370 EXPECT_TRUE(GetSelectedService().get() == service_.get());
Darin Petkove8587e32012-07-02 13:56:07 +0200371
372 // Tests that existing properties are reused if no new ones provided.
Darin Petkov3189a472012-10-05 09:55:33 +0200373 driver_->ip_properties_.address = "1.2.3.4";
Darin Petkove8587e32012-07-02 13:56:07 +0200374 EXPECT_CALL(*device_,
375 UpdateIPConfig(Field(&IPConfig::Properties::address, "1.2.3.4")));
376 driver_->Notify("up", config);
Darin Petkov79d74c92012-03-07 17:20:32 +0100377}
378
Paul Stewartb5768232014-02-27 07:21:34 -0800379TEST_P(OpenVPNDriverTest, NotifyUMA) {
Paul Stewart91a43cb2013-03-02 21:34:15 -0800380 map<string, string> config;
381 driver_->service_ = service_;
382 driver_->device_ = device_;
383
384 // Check that UMA metrics are emitted on Notify.
385 EXPECT_CALL(*device_, UpdateIPConfig(_));
386 EXPECT_CALL(metrics_, SendEnumToUMA(
387 Metrics::kMetricVpnDriver,
388 Metrics::kVpnDriverOpenVpn,
389 Metrics::kMetricVpnDriverMax));
390 EXPECT_CALL(metrics_, SendEnumToUMA(
391 Metrics::kMetricVpnRemoteAuthenticationType,
Paul Stewartb5768232014-02-27 07:21:34 -0800392 GetParam().remote_authentication_type,
Paul Stewart91a43cb2013-03-02 21:34:15 -0800393 Metrics::kVpnRemoteAuthenticationTypeMax));
Paul Stewartb5768232014-02-27 07:21:34 -0800394 for (const auto &authentication_type : GetParam().user_authentication_types) {
395 EXPECT_CALL(metrics_, SendEnumToUMA(
396 Metrics::kMetricVpnUserAuthenticationType,
397 authentication_type,
398 Metrics::kVpnUserAuthenticationTypeMax));
399 }
Paul Stewart91a43cb2013-03-02 21:34:15 -0800400
401 Error unused_error;
402 PropertyStore store;
403 driver_->InitPropertyStore(&store);
Paul Stewartb5768232014-02-27 07:21:34 -0800404 if (!GetParam().ca_cert.empty()) {
405 store.SetStringsProperty(kOpenVPNCaCertPemProperty,
406 vector<string>{ GetParam().ca_cert },
407 &unused_error);
408 }
409 if (!GetParam().client_cert.empty()) {
410 store.SetStringProperty(kOpenVPNClientCertIdProperty,
411 GetParam().client_cert,
412 &unused_error);
413 }
414 if (!GetParam().user.empty()) {
415 store.SetStringProperty(kOpenVPNUserProperty, GetParam().user,
416 &unused_error);
417 }
418 if (!GetParam().otp.empty()) {
419 store.SetStringProperty(kOpenVPNOTPProperty, GetParam().otp, &unused_error);
420 }
421 if (!GetParam().token.empty()) {
422 store.SetStringProperty(kOpenVPNTokenProperty, GetParam().token,
423 &unused_error);
424 }
Paul Stewart91a43cb2013-03-02 21:34:15 -0800425 driver_->Notify("up", config);
Paul Stewartb5768232014-02-27 07:21:34 -0800426 Mock::VerifyAndClearExpectations(&metrics_);
Paul Stewart91a43cb2013-03-02 21:34:15 -0800427}
428
Paul Stewartb5768232014-02-27 07:21:34 -0800429INSTANTIATE_TEST_CASE_P(
430 OpenVPNDriverAuthenticationTypes,
431 OpenVPNDriverTest,
432 ::testing::Values(
433 AuthenticationExpectations(
434 "", "", "", "", "",
435 Metrics::kVpnRemoteAuthenticationTypeOpenVpnDefault,
436 vector<Metrics::VpnUserAuthenticationType> {
437 Metrics::kVpnUserAuthenticationTypeOpenVpnNone }),
438 AuthenticationExpectations(
439 "", "client_cert", "", "", "",
440 Metrics::kVpnRemoteAuthenticationTypeOpenVpnDefault,
441 vector<Metrics::VpnUserAuthenticationType> {
442 Metrics::kVpnUserAuthenticationTypeOpenVpnCertificate }),
443 AuthenticationExpectations(
444 "", "client_cert", "user", "", "",
445 Metrics::kVpnRemoteAuthenticationTypeOpenVpnDefault,
446 vector<Metrics::VpnUserAuthenticationType> {
447 Metrics::kVpnUserAuthenticationTypeOpenVpnCertificate,
448 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernamePassword }),
449 AuthenticationExpectations(
450 "", "", "user", "", "",
451 Metrics::kVpnRemoteAuthenticationTypeOpenVpnDefault,
452 vector<Metrics::VpnUserAuthenticationType> {
453 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernamePassword }),
454 AuthenticationExpectations(
455 "", "client_cert", "user", "otp", "",
456 Metrics::kVpnRemoteAuthenticationTypeOpenVpnDefault,
457 vector<Metrics::VpnUserAuthenticationType> {
458 Metrics::kVpnUserAuthenticationTypeOpenVpnCertificate,
459 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernamePassword,
460 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernamePasswordOtp }),
461 AuthenticationExpectations(
462 "", "client_cert", "user", "otp", "token",
463 Metrics::kVpnRemoteAuthenticationTypeOpenVpnDefault,
464 vector<Metrics::VpnUserAuthenticationType> {
465 Metrics::kVpnUserAuthenticationTypeOpenVpnCertificate,
466 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernamePassword,
467 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernamePasswordOtp,
468 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernameToken }),
469 AuthenticationExpectations(
470 "ca_cert", "client_cert", "user", "otp", "token",
471 Metrics::kVpnRemoteAuthenticationTypeOpenVpnCertificate,
472 vector<Metrics::VpnUserAuthenticationType> {
473 Metrics::kVpnUserAuthenticationTypeOpenVpnCertificate,
474 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernamePassword,
475 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernamePasswordOtp,
476 Metrics::kVpnUserAuthenticationTypeOpenVpnUsernameToken })));
477
Darin Petkov79d74c92012-03-07 17:20:32 +0100478TEST_F(OpenVPNDriverTest, NotifyFail) {
479 map<string, string> dict;
480 driver_->device_ = device_;
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100481 StartConnectTimeout(0);
mukesh agrawal9da07772013-05-15 14:15:17 -0700482 EXPECT_CALL(*device_, DropConnection());
Darin Petkov79d74c92012-03-07 17:20:32 +0100483 driver_->Notify("fail", dict);
Darin Petkov602303f2012-06-06 12:15:59 +0200484 EXPECT_TRUE(driver_->IsConnectTimeoutStarted());
Darin Petkov14c29ec2012-03-02 11:34:19 +0100485}
486
Darin Petkov60596742012-03-05 12:17:17 +0100487TEST_F(OpenVPNDriverTest, GetRouteOptionEntry) {
488 OpenVPNDriver::RouteOptions routes;
489 EXPECT_EQ(NULL, OpenVPNDriver::GetRouteOptionEntry("foo", "bar", &routes));
490 EXPECT_TRUE(routes.empty());
491 EXPECT_EQ(NULL, OpenVPNDriver::GetRouteOptionEntry("foo", "foo", &routes));
492 EXPECT_TRUE(routes.empty());
493 EXPECT_EQ(NULL, OpenVPNDriver::GetRouteOptionEntry("foo", "fooZ", &routes));
494 EXPECT_TRUE(routes.empty());
495 IPConfig::Route *route =
496 OpenVPNDriver::GetRouteOptionEntry("foo", "foo12", &routes);
497 EXPECT_EQ(1, routes.size());
498 EXPECT_EQ(route, &routes[12]);
499 route = OpenVPNDriver::GetRouteOptionEntry("foo", "foo13", &routes);
500 EXPECT_EQ(2, routes.size());
501 EXPECT_EQ(route, &routes[13]);
502}
503
504TEST_F(OpenVPNDriverTest, ParseRouteOption) {
505 OpenVPNDriver::RouteOptions routes;
506 OpenVPNDriver::ParseRouteOption("foo", "bar", &routes);
507 EXPECT_TRUE(routes.empty());
508 OpenVPNDriver::ParseRouteOption("gateway_2", kGateway2, &routes);
509 OpenVPNDriver::ParseRouteOption("netmask_2", kNetmask2, &routes);
510 OpenVPNDriver::ParseRouteOption("network_2", kNetwork2, &routes);
511 EXPECT_EQ(1, routes.size());
512 OpenVPNDriver::ParseRouteOption("gateway_1", kGateway1, &routes);
513 OpenVPNDriver::ParseRouteOption("netmask_1", kNetmask1, &routes);
514 OpenVPNDriver::ParseRouteOption("network_1", kNetwork1, &routes);
515 EXPECT_EQ(2, routes.size());
516 EXPECT_EQ(kGateway1, routes[1].gateway);
517 EXPECT_EQ(kNetmask1, routes[1].netmask);
518 EXPECT_EQ(kNetwork1, routes[1].host);
519 EXPECT_EQ(kGateway2, routes[2].gateway);
520 EXPECT_EQ(kNetmask2, routes[2].netmask);
521 EXPECT_EQ(kNetwork2, routes[2].host);
522}
523
524TEST_F(OpenVPNDriverTest, SetRoutes) {
525 OpenVPNDriver::RouteOptions routes;
526 routes[1].gateway = "1.2.3.4";
527 routes[1].host= "1.2.3.4";
528 routes[2].host = "2.3.4.5";
529 routes[2].netmask = "255.0.0.0";
530 routes[3].netmask = "255.0.0.0";
531 routes[3].gateway = "1.2.3.5";
532 routes[5].host = kNetwork2;
533 routes[5].netmask = kNetmask2;
534 routes[5].gateway = kGateway2;
535 routes[4].host = kNetwork1;
536 routes[4].netmask = kNetmask1;
537 routes[4].gateway = kGateway1;
538 IPConfig::Properties props;
539 OpenVPNDriver::SetRoutes(routes, &props);
540 ASSERT_EQ(2, props.routes.size());
541 EXPECT_EQ(kGateway1, props.routes[0].gateway);
542 EXPECT_EQ(kNetmask1, props.routes[0].netmask);
543 EXPECT_EQ(kNetwork1, props.routes[0].host);
544 EXPECT_EQ(kGateway2, props.routes[1].gateway);
545 EXPECT_EQ(kNetmask2, props.routes[1].netmask);
546 EXPECT_EQ(kNetwork2, props.routes[1].host);
Darin Petkove8587e32012-07-02 13:56:07 +0200547
548 // Tests that the routes are not reset if no new routes are supplied.
549 OpenVPNDriver::SetRoutes(OpenVPNDriver::RouteOptions(), &props);
550 EXPECT_EQ(2, props.routes.size());
Darin Petkov60596742012-03-05 12:17:17 +0100551}
552
Darin Petkov4b944842012-09-21 10:48:48 +0200553TEST_F(OpenVPNDriverTest, SplitPortFromHost) {
554 string name, port;
555 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("", NULL, NULL));
556 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("", &name, &port));
557 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com", &name, &port));
558 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:", &name, &port));
559 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost(":1234", &name, &port));
560 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:f:1234", &name, &port));
561 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:x", &name, &port));
562 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:-1", &name, &port));
563 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:+1", &name, &port));
564 EXPECT_FALSE(OpenVPNDriver::SplitPortFromHost("v.com:65536", &name, &port));
565 EXPECT_TRUE(OpenVPNDriver::SplitPortFromHost("v.com:0", &name, &port));
566 EXPECT_EQ("v.com", name);
567 EXPECT_EQ("0", port);
568 EXPECT_TRUE(OpenVPNDriver::SplitPortFromHost("w.com:65535", &name, &port));
569 EXPECT_EQ("w.com", name);
570 EXPECT_EQ("65535", port);
571 EXPECT_TRUE(OpenVPNDriver::SplitPortFromHost("x.com:12345", &name, &port));
572 EXPECT_EQ("x.com", name);
573 EXPECT_EQ("12345", port);
574}
575
Darin Petkov14c29ec2012-03-02 11:34:19 +0100576TEST_F(OpenVPNDriverTest, ParseForeignOption) {
Darin Petkove8587e32012-07-02 13:56:07 +0200577 vector<string> domain_search;
578 vector<string> dns_servers;
Darin Petkov14c29ec2012-03-02 11:34:19 +0100579 IPConfig::Properties props;
Darin Petkove8587e32012-07-02 13:56:07 +0200580 OpenVPNDriver::ParseForeignOption("", &domain_search, &dns_servers);
581 OpenVPNDriver::ParseForeignOption(
582 "dhcp-option DOMAIN", &domain_search, &dns_servers);
583 OpenVPNDriver::ParseForeignOption(
584 "dhcp-option DOMAIN zzz.com foo", &domain_search, &dns_servers);
585 OpenVPNDriver::ParseForeignOption(
586 "dhcp-Option DOmAIN xyz.com", &domain_search, &dns_servers);
587 ASSERT_EQ(1, domain_search.size());
588 EXPECT_EQ("xyz.com", domain_search[0]);
589 OpenVPNDriver::ParseForeignOption(
590 "dhcp-option DnS 1.2.3.4", &domain_search, &dns_servers);
591 ASSERT_EQ(1, dns_servers.size());
592 EXPECT_EQ("1.2.3.4", dns_servers[0]);
Darin Petkov14c29ec2012-03-02 11:34:19 +0100593}
594
595TEST_F(OpenVPNDriverTest, ParseForeignOptions) {
Darin Petkove8587e32012-07-02 13:56:07 +0200596 // This also tests that std::map is a sorted container.
Darin Petkov14c29ec2012-03-02 11:34:19 +0100597 map<int, string> options;
598 options[5] = "dhcp-option DOMAIN five.com";
599 options[2] = "dhcp-option DOMAIN two.com";
600 options[8] = "dhcp-option DOMAIN eight.com";
601 options[7] = "dhcp-option DOMAIN seven.com";
602 options[4] = "dhcp-option DOMAIN four.com";
Darin Petkove8587e32012-07-02 13:56:07 +0200603 options[10] = "dhcp-option dns 1.2.3.4";
Darin Petkov14c29ec2012-03-02 11:34:19 +0100604 IPConfig::Properties props;
605 OpenVPNDriver::ParseForeignOptions(options, &props);
606 ASSERT_EQ(5, props.domain_search.size());
607 EXPECT_EQ("two.com", props.domain_search[0]);
608 EXPECT_EQ("four.com", props.domain_search[1]);
609 EXPECT_EQ("five.com", props.domain_search[2]);
610 EXPECT_EQ("seven.com", props.domain_search[3]);
611 EXPECT_EQ("eight.com", props.domain_search[4]);
Darin Petkove8587e32012-07-02 13:56:07 +0200612 ASSERT_EQ(1, props.dns_servers.size());
613 EXPECT_EQ("1.2.3.4", props.dns_servers[0]);
614
615 // Test that the DNS properties are not updated if no new DNS properties are
616 // supplied.
617 OpenVPNDriver::ParseForeignOptions(map<int, string>(), &props);
618 EXPECT_EQ(5, props.domain_search.size());
619 ASSERT_EQ(1, props.dns_servers.size());
Darin Petkov14c29ec2012-03-02 11:34:19 +0100620}
621
622TEST_F(OpenVPNDriverTest, ParseIPConfiguration) {
623 map<string, string> config;
Darin Petkove8587e32012-07-02 13:56:07 +0200624 IPConfig::Properties props;
625
Paul Stewartc8e3ef92014-05-08 13:27:25 -0700626 driver_->ParseIPConfiguration(config, &props);
Darin Petkove8587e32012-07-02 13:56:07 +0200627 EXPECT_EQ(IPAddress::kFamilyIPv4, props.address_family);
628 EXPECT_EQ(32, props.subnet_prefix);
629
630 props.subnet_prefix = 18;
Paul Stewartc8e3ef92014-05-08 13:27:25 -0700631 driver_->ParseIPConfiguration(config, &props);
Darin Petkove8587e32012-07-02 13:56:07 +0200632 EXPECT_EQ(18, props.subnet_prefix);
633
Paul Stewart4698c1a2013-05-16 15:42:19 -0700634 // An "ifconfig_remote" parameter that looks like a netmask should be
635 // applied to the subnet prefix instead of to the peer address.
636 config["ifconfig_remotE"] = "255.255.0.0";
Paul Stewartc8e3ef92014-05-08 13:27:25 -0700637 driver_->ParseIPConfiguration(config, &props);
Paul Stewart4698c1a2013-05-16 15:42:19 -0700638 EXPECT_EQ(16, props.subnet_prefix);
639 EXPECT_EQ("", props.peer_address);
640
Darin Petkov14c29ec2012-03-02 11:34:19 +0100641 config["ifconfig_loCal"] = "4.5.6.7";
642 config["ifconfiG_broadcast"] = "1.2.255.255";
643 config["ifconFig_netmAsk"] = "255.255.255.0";
644 config["ifconfig_remotE"] = "33.44.55.66";
645 config["route_vpN_gateway"] = "192.168.1.1";
Paul Stewartce4ec192012-03-14 12:53:46 -0700646 config["trusted_ip"] = "99.88.77.66";
Darin Petkov14c29ec2012-03-02 11:34:19 +0100647 config["tun_mtu"] = "1000";
648 config["foreign_option_2"] = "dhcp-option DNS 4.4.4.4";
649 config["foreign_option_1"] = "dhcp-option DNS 1.1.1.1";
650 config["foreign_option_3"] = "dhcp-option DNS 2.2.2.2";
Darin Petkov60596742012-03-05 12:17:17 +0100651 config["route_network_2"] = kNetwork2;
652 config["route_network_1"] = kNetwork1;
653 config["route_netmask_2"] = kNetmask2;
654 config["route_netmask_1"] = kNetmask1;
655 config["route_gateway_2"] = kGateway2;
656 config["route_gateway_1"] = kGateway1;
Darin Petkov14c29ec2012-03-02 11:34:19 +0100657 config["foo"] = "bar";
Paul Stewartc8e3ef92014-05-08 13:27:25 -0700658 driver_->ParseIPConfiguration(config, &props);
Darin Petkov14c29ec2012-03-02 11:34:19 +0100659 EXPECT_EQ(IPAddress::kFamilyIPv4, props.address_family);
660 EXPECT_EQ("4.5.6.7", props.address);
661 EXPECT_EQ("1.2.255.255", props.broadcast_address);
Paul Stewart48100b02012-03-19 07:53:52 -0700662 EXPECT_EQ(24, props.subnet_prefix);
Darin Petkov14c29ec2012-03-02 11:34:19 +0100663 EXPECT_EQ("33.44.55.66", props.peer_address);
664 EXPECT_EQ("192.168.1.1", props.gateway);
Paul Stewartce4ec192012-03-14 12:53:46 -0700665 EXPECT_EQ("99.88.77.66", props.trusted_ip);
Darin Petkov14c29ec2012-03-02 11:34:19 +0100666 EXPECT_EQ(1000, props.mtu);
667 ASSERT_EQ(3, props.dns_servers.size());
668 EXPECT_EQ("1.1.1.1", props.dns_servers[0]);
669 EXPECT_EQ("4.4.4.4", props.dns_servers[1]);
670 EXPECT_EQ("2.2.2.2", props.dns_servers[2]);
Darin Petkov60596742012-03-05 12:17:17 +0100671 ASSERT_EQ(2, props.routes.size());
672 EXPECT_EQ(kGateway1, props.routes[0].gateway);
673 EXPECT_EQ(kNetmask1, props.routes[0].netmask);
674 EXPECT_EQ(kNetwork1, props.routes[0].host);
675 EXPECT_EQ(kGateway2, props.routes[1].gateway);
676 EXPECT_EQ(kNetmask2, props.routes[1].netmask);
677 EXPECT_EQ(kNetwork2, props.routes[1].host);
Ben Chana0163122012-09-25 15:10:52 -0700678 EXPECT_FALSE(props.blackhole_ipv6);
Paul Stewartc8e3ef92014-05-08 13:27:25 -0700679
680 // If the driver is configured to ignore the gateway provided, it will
681 // not set the "gateway" property for the properties, however the
682 // explicitly supplied routes should still be set.
683 SetArg(kOpenVPNIgnoreDefaultRouteProperty, "some value");
684 IPConfig::Properties props_without_gateway;
685 driver_->ParseIPConfiguration(config, &props_without_gateway);
686 EXPECT_EQ(kGateway1, props_without_gateway.routes[0].gateway);
687 EXPECT_EQ("", props_without_gateway.gateway);
Paul Stewarta64b7d72014-05-09 10:11:39 -0700688
689 // A pushed redirect flag should override the IgnoreDefaultRoute property.
690 config["redirect_gateway"] = "def1";
691 IPConfig::Properties props_with_override;
692 driver_->ParseIPConfiguration(config, &props_with_override);
693 EXPECT_EQ("192.168.1.1", props_with_override.gateway);
Darin Petkov14c29ec2012-03-02 11:34:19 +0100694}
695
Darin Petkovfe6a9372012-02-28 16:25:06 +0100696TEST_F(OpenVPNDriverTest, InitOptionsNoHost) {
697 Error error;
Paul Stewart406c4732013-08-01 09:30:12 -0700698 vector<vector<string>> options;
Darin Petkov79d74c92012-03-07 17:20:32 +0100699 driver_->InitOptions(&options, &error);
Darin Petkovfe6a9372012-02-28 16:25:06 +0100700 EXPECT_EQ(Error::kInvalidArguments, error.type());
701 EXPECT_TRUE(options.empty());
702}
703
704TEST_F(OpenVPNDriverTest, InitOptions) {
705 static const char kHost[] = "192.168.2.254";
Darin Petkov1fa81942012-04-02 11:38:08 +0200706 static const char kTLSAuthContents[] = "SOME-RANDOM-CONTENTS\n";
Darin Petkove0d5dd12012-04-04 16:10:48 +0200707 static const char kID[] = "TestPKCS11ID";
Paul Stewart18145e92014-01-16 11:30:38 -0800708 static const char kKU0[] = "00";
709 static const char kKU1[] = "01";
Darin Petkove0d5dd12012-04-04 16:10:48 +0200710 FilePath empty_cert;
Ben Chan73728782013-09-20 13:40:54 -0700711 SetArg(kProviderHostProperty, kHost);
712 SetArg(kOpenVPNTLSAuthContentsProperty, kTLSAuthContents);
713 SetArg(kOpenVPNClientCertIdProperty, kID);
Paul Stewart18145e92014-01-16 11:30:38 -0800714 SetArg(kOpenVPNRemoteCertKUProperty, string(kKU0) + " " + string(kKU1));
Darin Petkov79d74c92012-03-07 17:20:32 +0100715 driver_->rpc_task_.reset(new RPCTask(&control_, this));
Darin Petkov79d74c92012-03-07 17:20:32 +0100716 driver_->tunnel_interface_ = kInterfaceName;
Darin Petkove0d5dd12012-04-04 16:10:48 +0200717 EXPECT_CALL(*management_server_, Start(_, _, _)).WillOnce(Return(true));
Peter Qiu700de642014-07-14 16:31:30 -0700718 EXPECT_CALL(manager_, IsConnected()).WillOnce(Return(false));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200719
720 Error error;
Paul Stewart406c4732013-08-01 09:30:12 -0700721 vector<vector<string>> options;
Darin Petkove0d5dd12012-04-04 16:10:48 +0200722 driver_->InitOptions(&options, &error);
723 EXPECT_TRUE(error.IsSuccess());
Paul Stewartb26347a2013-08-02 12:12:09 -0700724 EXPECT_EQ(vector<string> { "client" }, options[0]);
725 ExpectInFlags(options, "remote", kHost);
726 ExpectInFlags(options, vector<string> { "setenv", kRPCTaskPathVariable,
Paul Stewart406c4732013-08-01 09:30:12 -0700727 RPCTaskMockAdaptor::kRpcId });
Paul Stewartb26347a2013-08-02 12:12:09 -0700728 ExpectInFlags(options, "dev", kInterfaceName);
729 ExpectInFlags(options, "group", "openvpn");
Darin Petkove0d5dd12012-04-04 16:10:48 +0200730 EXPECT_EQ(kInterfaceName, driver_->tunnel_interface_);
731 ASSERT_FALSE(driver_->tls_auth_file_.empty());
Paul Stewartb26347a2013-08-02 12:12:09 -0700732 ExpectInFlags(options, "tls-auth", driver_->tls_auth_file_.value());
Darin Petkove0d5dd12012-04-04 16:10:48 +0200733 string contents;
Ben Chana0ddf462014-02-06 11:32:42 -0800734 EXPECT_TRUE(base::ReadFileToString(driver_->tls_auth_file_, &contents));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200735 EXPECT_EQ(kTLSAuthContents, contents);
Paul Stewartb26347a2013-08-02 12:12:09 -0700736 ExpectInFlags(options, "pkcs11-id", kID);
737 ExpectInFlags(options, "ca", OpenVPNDriver::kDefaultCACertificates);
738 ExpectInFlags(options, "syslog");
739 ExpectNotInFlags(options, "auth-user-pass");
Paul Stewart18145e92014-01-16 11:30:38 -0800740 ExpectInFlags(options, vector<string> { "remote-cert-ku", kKU0, kKU1 });
Darin Petkove0d5dd12012-04-04 16:10:48 +0200741}
742
Darin Petkov4b944842012-09-21 10:48:48 +0200743TEST_F(OpenVPNDriverTest, InitOptionsHostWithPort) {
Ben Chan73728782013-09-20 13:40:54 -0700744 SetArg(kProviderHostProperty, "v.com:1234");
Darin Petkov4b944842012-09-21 10:48:48 +0200745 driver_->rpc_task_.reset(new RPCTask(&control_, this));
746 driver_->tunnel_interface_ = kInterfaceName;
747 EXPECT_CALL(*management_server_, Start(_, _, _)).WillOnce(Return(true));
Peter Qiu700de642014-07-14 16:31:30 -0700748 EXPECT_CALL(manager_, IsConnected()).WillOnce(Return(false));
Darin Petkov4b944842012-09-21 10:48:48 +0200749
750 Error error;
Paul Stewart406c4732013-08-01 09:30:12 -0700751 vector<vector<string>> options;
Darin Petkov4b944842012-09-21 10:48:48 +0200752 driver_->InitOptions(&options, &error);
753 EXPECT_TRUE(error.IsSuccess());
Paul Stewartb26347a2013-08-02 12:12:09 -0700754 ExpectInFlags(options, vector<string> { "remote", "v.com", "1234" });
Darin Petkov4b944842012-09-21 10:48:48 +0200755}
756
Darin Petkovca8a0e62012-09-26 13:16:52 +0200757TEST_F(OpenVPNDriverTest, InitCAOptions) {
Darin Petkove0d5dd12012-04-04 16:10:48 +0200758 static const char kHost[] = "192.168.2.254";
Darin Petkovca8a0e62012-09-26 13:16:52 +0200759 static const char kCaCert[] = "foo";
Darin Petkove0d5dd12012-04-04 16:10:48 +0200760 static const char kCaCertNSS[] = "{1234}";
Darin Petkovca8a0e62012-09-26 13:16:52 +0200761
762 Error error;
Paul Stewart406c4732013-08-01 09:30:12 -0700763 vector<vector<string>> options;
Darin Petkovca8a0e62012-09-26 13:16:52 +0200764 EXPECT_TRUE(driver_->InitCAOptions(&options, &error));
765 EXPECT_TRUE(error.IsSuccess());
Paul Stewartb26347a2013-08-02 12:12:09 -0700766 ExpectInFlags(options, "ca", OpenVPNDriver::kDefaultCACertificates);
Darin Petkovca8a0e62012-09-26 13:16:52 +0200767
768 options.clear();
Ben Chan73728782013-09-20 13:40:54 -0700769 SetArg(kOpenVPNCaCertProperty, kCaCert);
Darin Petkovca8a0e62012-09-26 13:16:52 +0200770 EXPECT_TRUE(driver_->InitCAOptions(&options, &error));
Paul Stewartb26347a2013-08-02 12:12:09 -0700771 ExpectInFlags(options, "ca", kCaCert);
Darin Petkovca8a0e62012-09-26 13:16:52 +0200772 EXPECT_TRUE(error.IsSuccess());
773
Paul Stewartc350e682014-06-19 15:44:30 -0700774 // We should ignore the CaCertNSS property.
Ben Chan73728782013-09-20 13:40:54 -0700775 SetArg(kOpenVPNCaCertNSSProperty, kCaCertNSS);
Paul Stewartc350e682014-06-19 15:44:30 -0700776 EXPECT_TRUE(driver_->InitCAOptions(&options, &error));
777 ExpectInFlags(options, "ca", kCaCert);
778 EXPECT_TRUE(error.IsSuccess());
Darin Petkovca8a0e62012-09-26 13:16:52 +0200779
Ben Chan73728782013-09-20 13:40:54 -0700780 SetArg(kOpenVPNCaCertProperty, "");
781 SetArg(kProviderHostProperty, kHost);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200782 FilePath empty_cert;
Darin Petkovca8a0e62012-09-26 13:16:52 +0200783 error.Reset();
Darin Petkovca8a0e62012-09-26 13:16:52 +0200784 EXPECT_TRUE(driver_->InitCAOptions(&options, &error));
Paul Stewartc350e682014-06-19 15:44:30 -0700785 ExpectInFlags(options, "ca", OpenVPNDriver::kDefaultCACertificates);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200786 EXPECT_TRUE(error.IsSuccess());
Paul Stewart5baebb72013-03-14 11:43:29 -0700787
Paul Stewartc350e682014-06-19 15:44:30 -0700788 SetArg(kOpenVPNCaCertProperty, kCaCert);
Paul Stewart0f9c9302013-06-14 15:41:28 -0700789 const vector<string> kCaCertPEM{ "---PEM CONTENTS---" };
790 SetArgArray(kOpenVPNCaCertPemProperty, kCaCertPEM);
Paul Stewart5baebb72013-03-14 11:43:29 -0700791 EXPECT_FALSE(driver_->InitCAOptions(&options, &error));
792 EXPECT_EQ(Error::kInvalidArguments, error.type());
Paul Stewartc350e682014-06-19 15:44:30 -0700793 EXPECT_EQ("Can't specify more than one of CACert and CACertPEM.",
Paul Stewart5baebb72013-03-14 11:43:29 -0700794 error.message());
795
796 options.clear();
Paul Stewartc350e682014-06-19 15:44:30 -0700797 SetArg(kOpenVPNCaCertProperty, "");
Ben Chan73728782013-09-20 13:40:54 -0700798 SetArg(kProviderHostProperty, "");
Paul Stewart5baebb72013-03-14 11:43:29 -0700799 static const char kPEMCertfile[] = "/tmp/pem-cert";
800 FilePath pem_cert(kPEMCertfile);
Paul Stewart0f9c9302013-06-14 15:41:28 -0700801 EXPECT_CALL(*certificate_file_, CreatePEMFromStrings(kCaCertPEM))
Paul Stewart5baebb72013-03-14 11:43:29 -0700802 .WillOnce(Return(empty_cert))
803 .WillOnce(Return(pem_cert));
804
805 error.Reset();
806 EXPECT_FALSE(driver_->InitCAOptions(&options, &error));
807 EXPECT_EQ(Error::kInvalidArguments, error.type());
Paul Stewart0f9c9302013-06-14 15:41:28 -0700808 EXPECT_EQ("Unable to extract PEM CA certificates.", error.message());
Paul Stewart5baebb72013-03-14 11:43:29 -0700809
810 error.Reset();
811 options.clear();
812 EXPECT_TRUE(driver_->InitCAOptions(&options, &error));
Paul Stewartb26347a2013-08-02 12:12:09 -0700813 ExpectInFlags(options, "ca", kPEMCertfile);
Paul Stewart5baebb72013-03-14 11:43:29 -0700814 EXPECT_TRUE(error.IsSuccess());
Darin Petkove0d5dd12012-04-04 16:10:48 +0200815}
816
Paul Stewart8343c0b2013-09-30 11:58:54 -0700817TEST_F(OpenVPNDriverTest, InitCertificateVerifyOptions) {
818 {
819 Error error;
820 vector<vector<string>> options;
821 // No options supplied.
822 driver_->InitCertificateVerifyOptions(&options);
823 EXPECT_TRUE(options.empty());
824 }
825 const char kName[] = "x509-name";
826 {
827 Error error;
828 vector<vector<string>> options;
829 // With Name property alone, we should have the 1-parameter version of the
830 // "x509-verify-name" parameter provided.
831 SetArg(kOpenVPNVerifyX509NameProperty, kName);
832 driver_->InitCertificateVerifyOptions(&options);
833 ExpectInFlags(options, "verify-x509-name", kName);
834 }
835 const char kType[] = "x509-type";
836 {
837 Error error;
838 vector<vector<string>> options;
839 // With both Name property and Type property set, we should have the
840 // 2-parameter version of the "x509-verify-name" parameter provided.
841 SetArg(kOpenVPNVerifyX509TypeProperty, kType);
842 driver_->InitCertificateVerifyOptions(&options);
843 ExpectInFlags(options, vector<string> { "verify-x509-name", kName, kType });
844 }
845 {
846 Error error;
847 vector<vector<string>> options;
848 // We should ignore the Type parameter if no Name parameter is specified.
849 SetArg(kOpenVPNVerifyX509NameProperty, "");
850 driver_->InitCertificateVerifyOptions(&options);
851 EXPECT_TRUE(options.empty());
852 }
853}
854
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200855TEST_F(OpenVPNDriverTest, InitClientAuthOptions) {
856 static const char kTestValue[] = "foo";
Paul Stewart406c4732013-08-01 09:30:12 -0700857 vector<vector<string>> options;
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200858
859 // No key or cert, assume user/password authentication.
860 driver_->InitClientAuthOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700861 ExpectInFlags(options, "auth-user-pass");
862 ExpectNotInFlags(options, "key");
863 ExpectNotInFlags(options, "cert");
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200864
865 // Cert available, no user/password.
866 options.clear();
Paul Stewart70804412013-06-17 15:00:59 -0700867 SetArg(kOpenVPNCertProperty, kTestValue);
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200868 driver_->InitClientAuthOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700869 ExpectNotInFlags(options, "auth-user-pass");
870 ExpectNotInFlags(options, "key");
871 ExpectInFlags(options, "cert", kTestValue);
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200872
873 // Key available, no user/password.
874 options.clear();
Paul Stewart70804412013-06-17 15:00:59 -0700875 SetArg(kOpenVPNKeyProperty, kTestValue);
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200876 driver_->InitClientAuthOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700877 ExpectNotInFlags(options, "auth-user-pass");
878 ExpectInFlags(options, "key", kTestValue);
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200879
880 // Key available, AuthUserPass set.
881 options.clear();
Ben Chan73728782013-09-20 13:40:54 -0700882 SetArg(kOpenVPNAuthUserPassProperty, kTestValue);
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200883 driver_->InitClientAuthOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700884 ExpectInFlags(options, "auth-user-pass");
885 ExpectInFlags(options, "key", kTestValue);
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200886
887 // Key available, User set.
888 options.clear();
Ben Chan73728782013-09-20 13:40:54 -0700889 RemoveStringArg(kOpenVPNAuthUserPassProperty);
890 SetArg(kOpenVPNUserProperty, "user");
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200891 driver_->InitClientAuthOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700892 ExpectInFlags(options, "auth-user-pass");
893 ExpectInFlags(options, "key", kTestValue);
Paul Stewartbb985102013-06-27 16:51:11 -0700894
895 // Empty PKCS11 certificate id, no user/password/cert.
896 options.clear();
897 RemoveStringArg(kOpenVPNKeyProperty);
898 RemoveStringArg(kOpenVPNCertProperty);
Ben Chan73728782013-09-20 13:40:54 -0700899 RemoveStringArg(kOpenVPNUserProperty);
900 SetArg(kOpenVPNClientCertIdProperty, "");
Paul Stewartbb985102013-06-27 16:51:11 -0700901 driver_->InitClientAuthOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700902 ExpectInFlags(options, "auth-user-pass");
903 ExpectNotInFlags(options, "key");
904 ExpectNotInFlags(options, "cert");
905 ExpectNotInFlags(options, "pkcs11-id");
Paul Stewartbb985102013-06-27 16:51:11 -0700906
907 // Non-empty PKCS11 certificate id, no user/password/cert.
908 options.clear();
Ben Chan73728782013-09-20 13:40:54 -0700909 SetArg(kOpenVPNClientCertIdProperty, kTestValue);
Paul Stewartbb985102013-06-27 16:51:11 -0700910 driver_->InitClientAuthOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700911 ExpectNotInFlags(options, "auth-user-pass");
912 ExpectNotInFlags(options, "key");
913 ExpectNotInFlags(options, "cert");
Paul Stewartbb985102013-06-27 16:51:11 -0700914 // The "--pkcs11-id" option is added in InitPKCS11Options(), not here.
Paul Stewartb26347a2013-08-02 12:12:09 -0700915 ExpectNotInFlags(options, "pkcs11-id");
Paul Stewartbb985102013-06-27 16:51:11 -0700916
917 // PKCS11 certificate id available, AuthUserPass set.
918 options.clear();
Ben Chan73728782013-09-20 13:40:54 -0700919 SetArg(kOpenVPNAuthUserPassProperty, kTestValue);
Paul Stewartbb985102013-06-27 16:51:11 -0700920 driver_->InitClientAuthOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700921 ExpectInFlags(options, "auth-user-pass");
922 ExpectNotInFlags(options, "key");
923 ExpectNotInFlags(options, "cert");
Paul Stewartbb985102013-06-27 16:51:11 -0700924
925 // PKCS11 certificate id available, User set.
926 options.clear();
Ben Chan73728782013-09-20 13:40:54 -0700927 RemoveStringArg(kOpenVPNAuthUserPassProperty);
928 SetArg(kOpenVPNUserProperty, "user");
Paul Stewartbb985102013-06-27 16:51:11 -0700929 driver_->InitClientAuthOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700930 ExpectInFlags(options, "auth-user-pass");
931 ExpectNotInFlags(options, "key");
932 ExpectNotInFlags(options, "cert");
Darin Petkov4e1b3f82012-09-27 13:22:37 +0200933}
934
Paul Stewart8343c0b2013-09-30 11:58:54 -0700935TEST_F(OpenVPNDriverTest, InitExtraCertOptions) {
936 {
937 Error error;
938 vector<vector<string>> options;
939 // No ExtraCertOptions supplied.
940 EXPECT_TRUE(driver_->InitExtraCertOptions(&options, &error));
941 EXPECT_TRUE(error.IsSuccess());
942 EXPECT_TRUE(options.empty());
943 }
944 {
945 Error error;
946 vector<vector<string>> options;
947 SetArgArray(kOpenVPNExtraCertPemProperty, vector<string>());
948 // Empty ExtraCertOptions supplied.
949 EXPECT_TRUE(driver_->InitExtraCertOptions(&options, &error));
950 EXPECT_TRUE(error.IsSuccess());
951 EXPECT_TRUE(options.empty());
952 }
953 const vector<string> kExtraCerts{ "---PEM CONTENTS---" };
954 SetArgArray(kOpenVPNExtraCertPemProperty, kExtraCerts);
955 static const char kPEMCertfile[] = "/tmp/pem-cert";
956 FilePath pem_cert(kPEMCertfile);
957 EXPECT_CALL(*extra_certificates_file_, CreatePEMFromStrings(kExtraCerts))
958 .WillOnce(Return(FilePath()))
959 .WillOnce(Return(pem_cert));
960 // CreatePemFromStrings fails.
961 {
962 Error error;
963 vector<vector<string>> options;
964 EXPECT_FALSE(driver_->InitExtraCertOptions(&options, &error));
965 EXPECT_EQ(Error::kInvalidArguments, error.type());
966 EXPECT_TRUE(options.empty());
967 }
968 // CreatePemFromStrings succeeds.
969 {
970 Error error;
971 vector<vector<string>> options;
972 EXPECT_TRUE(driver_->InitExtraCertOptions(&options, &error));
973 EXPECT_TRUE(error.IsSuccess());
974 ExpectInFlags(options, "extra-certs", kPEMCertfile);
975 }
976}
977
Darin Petkove0d5dd12012-04-04 16:10:48 +0200978TEST_F(OpenVPNDriverTest, InitPKCS11Options) {
Paul Stewart406c4732013-08-01 09:30:12 -0700979 vector<vector<string>> options;
Darin Petkove0d5dd12012-04-04 16:10:48 +0200980 driver_->InitPKCS11Options(&options);
981 EXPECT_TRUE(options.empty());
982
983 static const char kID[] = "TestPKCS11ID";
Ben Chan73728782013-09-20 13:40:54 -0700984 SetArg(kOpenVPNClientCertIdProperty, kID);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200985 driver_->InitPKCS11Options(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700986 ExpectInFlags(options, "pkcs11-id", kID);
987 ExpectInFlags(options, "pkcs11-providers", "libchaps.so");
Darin Petkove0d5dd12012-04-04 16:10:48 +0200988
989 static const char kProvider[] = "libpkcs11.so";
Ben Chan73728782013-09-20 13:40:54 -0700990 SetArg(kOpenVPNProviderProperty, kProvider);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200991 options.clear();
992 driver_->InitPKCS11Options(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -0700993 ExpectInFlags(options, "pkcs11-id", kID);
994 ExpectInFlags(options, "pkcs11-providers", kProvider);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200995}
996
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100997TEST_F(OpenVPNDriverTest, InitManagementChannelOptionsServerFail) {
Paul Stewart406c4732013-08-01 09:30:12 -0700998 vector<vector<string>> options;
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100999 EXPECT_CALL(*management_server_, Start(&dispatcher_, GetSockets(), &options))
1000 .WillOnce(Return(false));
Darin Petkova5e07ef2012-07-09 14:27:57 +02001001 Error error;
Darin Petkov4cbff5b2013-01-29 16:29:05 +01001002 EXPECT_FALSE(InitManagementChannelOptions(&options, &error));
Darin Petkove0d5dd12012-04-04 16:10:48 +02001003 EXPECT_EQ(Error::kInternalError, error.type());
1004 EXPECT_EQ("Unable to setup management channel.", error.message());
Darin Petkov4cbff5b2013-01-29 16:29:05 +01001005}
Darin Petkove0d5dd12012-04-04 16:10:48 +02001006
Darin Petkov4cbff5b2013-01-29 16:29:05 +01001007TEST_F(OpenVPNDriverTest, InitManagementChannelOptionsOnline) {
Paul Stewart406c4732013-08-01 09:30:12 -07001008 vector<vector<string>> options;
Darin Petkov4cbff5b2013-01-29 16:29:05 +01001009 EXPECT_CALL(*management_server_, Start(&dispatcher_, GetSockets(), &options))
1010 .WillOnce(Return(true));
Peter Qiu700de642014-07-14 16:31:30 -07001011 EXPECT_CALL(manager_, IsConnected()).WillOnce(Return(true));
Darin Petkova5e07ef2012-07-09 14:27:57 +02001012 EXPECT_CALL(*management_server_, ReleaseHold());
Darin Petkov4cbff5b2013-01-29 16:29:05 +01001013 Error error;
1014 EXPECT_TRUE(InitManagementChannelOptions(&options, &error));
Darin Petkove0d5dd12012-04-04 16:10:48 +02001015 EXPECT_TRUE(error.IsSuccess());
Darin Petkov4cbff5b2013-01-29 16:29:05 +01001016}
Darin Petkova5e07ef2012-07-09 14:27:57 +02001017
Darin Petkov4cbff5b2013-01-29 16:29:05 +01001018TEST_F(OpenVPNDriverTest, InitManagementChannelOptionsOffline) {
Paul Stewart406c4732013-08-01 09:30:12 -07001019 vector<vector<string>> options;
Darin Petkov4cbff5b2013-01-29 16:29:05 +01001020 EXPECT_CALL(*management_server_, Start(&dispatcher_, GetSockets(), &options))
1021 .WillOnce(Return(true));
Peter Qiu700de642014-07-14 16:31:30 -07001022 EXPECT_CALL(manager_, IsConnected()).WillOnce(Return(false));
Darin Petkova5e07ef2012-07-09 14:27:57 +02001023 EXPECT_CALL(*management_server_, ReleaseHold()).Times(0);
Darin Petkov4cbff5b2013-01-29 16:29:05 +01001024 Error error;
1025 EXPECT_TRUE(InitManagementChannelOptions(&options, &error));
Darin Petkova5e07ef2012-07-09 14:27:57 +02001026 EXPECT_TRUE(error.IsSuccess());
Darin Petkovfe6a9372012-02-28 16:25:06 +01001027}
1028
Darin Petkov55771b72012-04-25 09:25:19 +02001029TEST_F(OpenVPNDriverTest, InitLoggingOptions) {
Paul Stewart406c4732013-08-01 09:30:12 -07001030 vector<vector<string>> options;
Darin Petkov55771b72012-04-25 09:25:19 +02001031 bool vpn_logging = SLOG_IS_ON(VPN, 0);
1032 ScopeLogger::GetInstance()->EnableScopesByName("-vpn");
1033 driver_->InitLoggingOptions(&options);
1034 ASSERT_EQ(1, options.size());
Paul Stewartb26347a2013-08-02 12:12:09 -07001035 EXPECT_EQ(vector<string> { "syslog" }, options[0]);
Darin Petkov55771b72012-04-25 09:25:19 +02001036 ScopeLogger::GetInstance()->EnableScopesByName("+vpn");
1037 options.clear();
1038 driver_->InitLoggingOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -07001039 ExpectInFlags(options, "verb", "3");
Darin Petkov55771b72012-04-25 09:25:19 +02001040 ScopeLogger::GetInstance()->EnableScopesByName("-vpn");
1041 SetArg("OpenVPN.Verb", "2");
1042 options.clear();
1043 driver_->InitLoggingOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -07001044 ExpectInFlags(options, "verb", "2");
Darin Petkov55771b72012-04-25 09:25:19 +02001045 ScopeLogger::GetInstance()->EnableScopesByName("+vpn");
1046 SetArg("OpenVPN.Verb", "1");
1047 options.clear();
1048 driver_->InitLoggingOptions(&options);
Paul Stewartb26347a2013-08-02 12:12:09 -07001049 ExpectInFlags(options, "verb", "1");
Darin Petkov55771b72012-04-25 09:25:19 +02001050 if (!vpn_logging) {
1051 ScopeLogger::GetInstance()->EnableScopesByName("-vpn");
1052 }
1053}
1054
Darin Petkovfe6a9372012-02-28 16:25:06 +01001055TEST_F(OpenVPNDriverTest, AppendValueOption) {
Paul Stewart406c4732013-08-01 09:30:12 -07001056 vector<vector<string>> options;
Darin Petkov46463022012-03-29 14:57:32 +02001057 EXPECT_FALSE(
1058 driver_->AppendValueOption("OpenVPN.UnknownProperty", kOption, &options));
Darin Petkovfe6a9372012-02-28 16:25:06 +01001059 EXPECT_TRUE(options.empty());
1060
Darin Petkove0d5dd12012-04-04 16:10:48 +02001061 SetArg(kProperty, "");
Darin Petkov46463022012-03-29 14:57:32 +02001062 EXPECT_FALSE(driver_->AppendValueOption(kProperty, kOption, &options));
Darin Petkovfe6a9372012-02-28 16:25:06 +01001063 EXPECT_TRUE(options.empty());
1064
Darin Petkove0d5dd12012-04-04 16:10:48 +02001065 SetArg(kProperty, kValue);
1066 SetArg(kProperty2, kValue2);
Darin Petkov46463022012-03-29 14:57:32 +02001067 EXPECT_TRUE(driver_->AppendValueOption(kProperty, kOption, &options));
1068 EXPECT_TRUE(driver_->AppendValueOption(kProperty2, kOption2, &options));
Paul Stewart406c4732013-08-01 09:30:12 -07001069 EXPECT_EQ(2, options.size());
1070 vector<string> expected_value { kOption, kValue };
1071 EXPECT_EQ(expected_value, options[0]);
1072 vector<string> expected_value2 { kOption2, kValue2 };
1073 EXPECT_EQ(expected_value2, options[1]);
Darin Petkovfe6a9372012-02-28 16:25:06 +01001074}
1075
Paul Stewart18145e92014-01-16 11:30:38 -08001076TEST_F(OpenVPNDriverTest, AppendDelimitedValueOption) {
1077 vector<vector<string>> options;
1078 EXPECT_FALSE(
1079 driver_->AppendDelimitedValueOption(
1080 "OpenVPN.UnknownProperty", kOption, ' ', &options));
1081 EXPECT_TRUE(options.empty());
1082
1083 SetArg(kProperty, "");
1084 EXPECT_FALSE(
1085 driver_->AppendDelimitedValueOption(kProperty, kOption, ' ', &options));
1086 EXPECT_TRUE(options.empty());
1087
1088 string kConcatenatedValues(string(kValue) + " " + string(kValue2));
1089 SetArg(kProperty, kConcatenatedValues);
1090 SetArg(kProperty2, kConcatenatedValues);
1091 EXPECT_TRUE(driver_->AppendDelimitedValueOption(
1092 kProperty, kOption, ':', &options));
1093 EXPECT_TRUE(driver_->AppendDelimitedValueOption(
1094 kProperty2, kOption2, ' ', &options));
1095 EXPECT_EQ(2, options.size());
1096 vector<string> expected_value { kOption, kConcatenatedValues };
1097 EXPECT_EQ(expected_value, options[0]);
1098 vector<string> expected_value2 { kOption2, kValue, kValue2 };
1099 EXPECT_EQ(expected_value2, options[1]);
1100}
1101
Darin Petkovfe6a9372012-02-28 16:25:06 +01001102TEST_F(OpenVPNDriverTest, AppendFlag) {
Paul Stewart406c4732013-08-01 09:30:12 -07001103 vector<vector<string>> options;
Darin Petkov46463022012-03-29 14:57:32 +02001104 EXPECT_FALSE(
1105 driver_->AppendFlag("OpenVPN.UnknownProperty", kOption, &options));
Darin Petkovfe6a9372012-02-28 16:25:06 +01001106 EXPECT_TRUE(options.empty());
1107
Darin Petkove0d5dd12012-04-04 16:10:48 +02001108 SetArg(kProperty, "");
1109 SetArg(kProperty2, kValue2);
Darin Petkov46463022012-03-29 14:57:32 +02001110 EXPECT_TRUE(driver_->AppendFlag(kProperty, kOption, &options));
1111 EXPECT_TRUE(driver_->AppendFlag(kProperty2, kOption2, &options));
Darin Petkovfe6a9372012-02-28 16:25:06 +01001112 EXPECT_EQ(2, options.size());
Paul Stewart406c4732013-08-01 09:30:12 -07001113 EXPECT_EQ(vector<string> { kOption }, options[0]);
1114 EXPECT_EQ(vector<string> { kOption2 }, options[1]);
Darin Petkovfe6a9372012-02-28 16:25:06 +01001115}
1116
Paul Stewartca6abd42012-03-01 15:45:29 -08001117TEST_F(OpenVPNDriverTest, ClaimInterface) {
Darin Petkov79d74c92012-03-07 17:20:32 +01001118 driver_->tunnel_interface_ = kInterfaceName;
1119 EXPECT_FALSE(driver_->ClaimInterface(string(kInterfaceName) + "XXX",
1120 kInterfaceIndex));
1121 EXPECT_FALSE(driver_->device_);
Paul Stewartca6abd42012-03-01 15:45:29 -08001122
Darin Petkov36a3ace2012-03-06 17:22:14 +01001123 static const char kHost[] = "192.168.2.254";
Ben Chan73728782013-09-20 13:40:54 -07001124 SetArg(kProviderHostProperty, kHost);
Darin Petkov46463022012-03-29 14:57:32 +02001125 EXPECT_CALL(*management_server_, Start(_, _, _)).WillOnce(Return(true));
Peter Qiu700de642014-07-14 16:31:30 -07001126 EXPECT_CALL(manager_, IsConnected()).WillOnce(Return(false));
Darin Petkov68710d72013-02-13 14:22:56 +01001127 EXPECT_CALL(glib_, SpawnAsync(_, _, _, _, _, _, _, _)).WillOnce(Return(true));
Darin Petkov36a3ace2012-03-06 17:22:14 +01001128 EXPECT_CALL(glib_, ChildWatchAdd(_, _, _)).WillOnce(Return(1));
Darin Petkova5e07ef2012-07-09 14:27:57 +02001129 const int kServiceCallbackTag = 1;
1130 EXPECT_EQ(0, driver_->default_service_callback_tag_);
1131 EXPECT_CALL(manager_, RegisterDefaultServiceCallback(_))
1132 .WillOnce(Return(kServiceCallbackTag));
Darin Petkov79d74c92012-03-07 17:20:32 +01001133 EXPECT_TRUE(driver_->ClaimInterface(kInterfaceName, kInterfaceIndex));
1134 ASSERT_TRUE(driver_->device_);
1135 EXPECT_EQ(kInterfaceIndex, driver_->device_->interface_index());
Darin Petkova5e07ef2012-07-09 14:27:57 +02001136 EXPECT_EQ(kServiceCallbackTag, driver_->default_service_callback_tag_);
Paul Stewartca6abd42012-03-01 15:45:29 -08001137}
1138
Darin Petkovaba89322013-03-11 14:48:22 +01001139TEST_F(OpenVPNDriverTest, IdleService) {
1140 SetService(service_);
Darin Petkovaba89322013-03-11 14:48:22 +01001141 EXPECT_CALL(*service_, SetState(Service::kStateIdle));
1142 driver_->IdleService();
Darin Petkovaba89322013-03-11 14:48:22 +01001143}
1144
1145TEST_F(OpenVPNDriverTest, FailService) {
1146 static const char kErrorDetails[] = "Bad password.";
1147 SetService(service_);
Darin Petkov1c049c72013-03-21 13:15:45 +01001148 EXPECT_CALL(*service_, SetFailure(Service::kFailureConnect));
1149 driver_->FailService(Service::kFailureConnect, kErrorDetails);
Darin Petkovaba89322013-03-11 14:48:22 +01001150 EXPECT_EQ(kErrorDetails, service_->error_details());
1151}
1152
Darin Petkov36a3ace2012-03-06 17:22:14 +01001153TEST_F(OpenVPNDriverTest, Cleanup) {
Darin Petkovaba89322013-03-11 14:48:22 +01001154 // Ensure no crash.
Darin Petkov1c049c72013-03-21 13:15:45 +01001155 driver_->Cleanup(Service::kStateIdle,
1156 Service::kFailureUnknown,
1157 Service::kErrorDetailsNone);
Darin Petkov1fa81942012-04-02 11:38:08 +02001158
Darin Petkova5e07ef2012-07-09 14:27:57 +02001159 const unsigned int kChildTag = 123;
Darin Petkov36a3ace2012-03-06 17:22:14 +01001160 const int kPID = 123456;
Darin Petkova5e07ef2012-07-09 14:27:57 +02001161 const int kServiceCallbackTag = 5;
Darin Petkovaba89322013-03-11 14:48:22 +01001162 static const char kErrorDetails[] = "Certificate revoked.";
Darin Petkova5e07ef2012-07-09 14:27:57 +02001163 driver_->default_service_callback_tag_ = kServiceCallbackTag;
1164 driver_->child_watch_tag_ = kChildTag;
Darin Petkov79d74c92012-03-07 17:20:32 +01001165 driver_->pid_ = kPID;
1166 driver_->rpc_task_.reset(new RPCTask(&control_, this));
1167 driver_->tunnel_interface_ = kInterfaceName;
1168 driver_->device_ = device_;
1169 driver_->service_ = service_;
Darin Petkov3189a472012-10-05 09:55:33 +02001170 driver_->ip_properties_.address = "1.2.3.4";
Darin Petkov0cd0d1e2013-02-11 12:49:10 +01001171 StartConnectTimeout(0);
Darin Petkov1fa81942012-04-02 11:38:08 +02001172 FilePath tls_auth_file;
Ben Chana0ddf462014-02-06 11:32:42 -08001173 EXPECT_TRUE(base::CreateTemporaryFile(&tls_auth_file));
Darin Petkov1fa81942012-04-02 11:38:08 +02001174 EXPECT_FALSE(tls_auth_file.empty());
Ben Chana0ddf462014-02-06 11:32:42 -08001175 EXPECT_TRUE(base::PathExists(tls_auth_file));
Darin Petkov1fa81942012-04-02 11:38:08 +02001176 driver_->tls_auth_file_ = tls_auth_file;
Darin Petkov46463022012-03-29 14:57:32 +02001177 // Stop will be called twice -- once by Cleanup and once by the destructor.
1178 EXPECT_CALL(*management_server_, Stop()).Times(2);
Darin Petkova5e07ef2012-07-09 14:27:57 +02001179 EXPECT_CALL(glib_, SourceRemove(kChildTag));
1180 EXPECT_CALL(manager_, DeregisterDefaultServiceCallback(kServiceCallbackTag));
Darin Petkov5a850472012-06-06 15:44:24 +02001181 EXPECT_CALL(process_killer_, Kill(kPID, _));
1182 EXPECT_CALL(device_info_, DeleteInterface(_)).Times(0);
mukesh agrawal9da07772013-05-15 14:15:17 -07001183 EXPECT_CALL(*device_, DropConnection());
Eric Shienbrood9a245532012-03-07 14:20:39 -05001184 EXPECT_CALL(*device_, SetEnabled(false));
Darin Petkov1c049c72013-03-21 13:15:45 +01001185 EXPECT_CALL(*service_, SetFailure(Service::kFailureInternal));
1186 driver_->Cleanup(
1187 Service::kStateFailure, Service::kFailureInternal, kErrorDetails);
Darin Petkov79d74c92012-03-07 17:20:32 +01001188 EXPECT_EQ(0, driver_->child_watch_tag_);
Darin Petkova5e07ef2012-07-09 14:27:57 +02001189 EXPECT_EQ(0, driver_->default_service_callback_tag_);
Darin Petkov79d74c92012-03-07 17:20:32 +01001190 EXPECT_EQ(0, driver_->pid_);
1191 EXPECT_FALSE(driver_->rpc_task_.get());
1192 EXPECT_TRUE(driver_->tunnel_interface_.empty());
1193 EXPECT_FALSE(driver_->device_);
1194 EXPECT_FALSE(driver_->service_);
Darin Petkovaba89322013-03-11 14:48:22 +01001195 EXPECT_EQ(kErrorDetails, service_->error_details());
Ben Chana0ddf462014-02-06 11:32:42 -08001196 EXPECT_FALSE(base::PathExists(tls_auth_file));
Darin Petkov1fa81942012-04-02 11:38:08 +02001197 EXPECT_TRUE(driver_->tls_auth_file_.empty());
Darin Petkov3189a472012-10-05 09:55:33 +02001198 EXPECT_TRUE(driver_->ip_properties_.address.empty());
Darin Petkov602303f2012-06-06 12:15:59 +02001199 EXPECT_FALSE(driver_->IsConnectTimeoutStarted());
Darin Petkov36a3ace2012-03-06 17:22:14 +01001200}
1201
Darin Petkov1a462de2012-05-02 11:10:48 +02001202namespace {
1203MATCHER(CheckEnv, "") {
1204 if (!arg || !arg[0] || !arg[1] || arg[2]) {
1205 return false;
1206 }
1207 return (string(arg[0]) == "IV_PLAT=Chromium OS" &&
1208 string(arg[1]) == "IV_PLAT_REL=2202.0");
1209}
1210} // namespace
1211
Darin Petkov36a3ace2012-03-06 17:22:14 +01001212TEST_F(OpenVPNDriverTest, SpawnOpenVPN) {
Darin Petkov1a462de2012-05-02 11:10:48 +02001213 SetupLSBRelease();
1214
Darin Petkov79d74c92012-03-07 17:20:32 +01001215 EXPECT_FALSE(driver_->SpawnOpenVPN());
Darin Petkov36a3ace2012-03-06 17:22:14 +01001216
1217 static const char kHost[] = "192.168.2.254";
Ben Chan73728782013-09-20 13:40:54 -07001218 SetArg(kProviderHostProperty, kHost);
Darin Petkov79d74c92012-03-07 17:20:32 +01001219 driver_->tunnel_interface_ = "tun0";
1220 driver_->rpc_task_.reset(new RPCTask(&control_, this));
Darin Petkov46463022012-03-29 14:57:32 +02001221 EXPECT_CALL(*management_server_, Start(_, _, _))
1222 .Times(2)
1223 .WillRepeatedly(Return(true));
Peter Qiu700de642014-07-14 16:31:30 -07001224 EXPECT_CALL(manager_, IsConnected()).Times(2).WillRepeatedly(Return(false));
Darin Petkov36a3ace2012-03-06 17:22:14 +01001225
1226 const int kPID = 234678;
Darin Petkov68710d72013-02-13 14:22:56 +01001227 EXPECT_CALL(glib_, SpawnAsync(_, _, CheckEnv(), _, _, _, _, _))
Darin Petkov36a3ace2012-03-06 17:22:14 +01001228 .WillOnce(Return(false))
Darin Petkov68710d72013-02-13 14:22:56 +01001229 .WillOnce(DoAll(SetArgumentPointee<6>(kPID), Return(true)));
Darin Petkov36a3ace2012-03-06 17:22:14 +01001230 const int kTag = 6;
Darin Petkov79d74c92012-03-07 17:20:32 +01001231 EXPECT_CALL(glib_, ChildWatchAdd(kPID, &driver_->OnOpenVPNDied, driver_))
Darin Petkov36a3ace2012-03-06 17:22:14 +01001232 .WillOnce(Return(kTag));
Darin Petkov79d74c92012-03-07 17:20:32 +01001233 EXPECT_FALSE(driver_->SpawnOpenVPN());
1234 EXPECT_TRUE(driver_->SpawnOpenVPN());
1235 EXPECT_EQ(kPID, driver_->pid_);
1236 EXPECT_EQ(kTag, driver_->child_watch_tag_);
Darin Petkov36a3ace2012-03-06 17:22:14 +01001237}
1238
1239TEST_F(OpenVPNDriverTest, OnOpenVPNDied) {
1240 const int kPID = 99999;
Darin Petkov5a850472012-06-06 15:44:24 +02001241 driver_->device_ = device_;
Darin Petkov79d74c92012-03-07 17:20:32 +01001242 driver_->child_watch_tag_ = 333;
1243 driver_->pid_ = kPID;
mukesh agrawal9da07772013-05-15 14:15:17 -07001244 EXPECT_CALL(*device_, DropConnection());
Darin Petkov5a850472012-06-06 15:44:24 +02001245 EXPECT_CALL(*device_, SetEnabled(false));
1246 EXPECT_CALL(process_killer_, Kill(_, _)).Times(0);
1247 EXPECT_CALL(device_info_, DeleteInterface(kInterfaceIndex));
Darin Petkov79d74c92012-03-07 17:20:32 +01001248 OpenVPNDriver::OnOpenVPNDied(kPID, 2, driver_);
1249 EXPECT_EQ(0, driver_->child_watch_tag_);
1250 EXPECT_EQ(0, driver_->pid_);
Darin Petkov36a3ace2012-03-06 17:22:14 +01001251}
1252
Darin Petkov6aa21872012-03-09 16:10:19 +01001253TEST_F(OpenVPNDriverTest, Disconnect) {
1254 driver_->device_ = device_;
1255 driver_->service_ = service_;
mukesh agrawal9da07772013-05-15 14:15:17 -07001256 EXPECT_CALL(*device_, DropConnection());
Eric Shienbrood9a245532012-03-07 14:20:39 -05001257 EXPECT_CALL(*device_, SetEnabled(false));
Darin Petkov6aa21872012-03-09 16:10:19 +01001258 EXPECT_CALL(device_info_, DeleteInterface(kInterfaceIndex));
1259 EXPECT_CALL(*service_, SetState(Service::kStateIdle));
1260 driver_->Disconnect();
Darin Petkova0e645e2012-04-25 11:38:59 +02001261 EXPECT_FALSE(driver_->device_);
Darin Petkov6aa21872012-03-09 16:10:19 +01001262 EXPECT_FALSE(driver_->service_);
1263}
1264
Darin Petkov5eb05422012-05-11 15:45:25 +02001265TEST_F(OpenVPNDriverTest, OnConnectionDisconnected) {
Darin Petkova42afe32013-02-05 16:53:52 +01001266 EXPECT_CALL(*management_server_, Restart());
1267 SetDevice(device_);
1268 SetService(service_);
mukesh agrawal9da07772013-05-15 14:15:17 -07001269 EXPECT_CALL(*device_, DropConnection());
Darin Petkova42afe32013-02-05 16:53:52 +01001270 EXPECT_CALL(*service_, SetState(Service::kStateAssociating));
1271 OnConnectionDisconnected();
1272 EXPECT_TRUE(IsConnectTimeoutStarted());
1273}
1274
1275TEST_F(OpenVPNDriverTest, OnConnectTimeout) {
Darin Petkov0cd0d1e2013-02-11 12:49:10 +01001276 StartConnectTimeout(0);
Darin Petkova42afe32013-02-05 16:53:52 +01001277 SetService(service_);
Darin Petkov1c049c72013-03-21 13:15:45 +01001278 EXPECT_CALL(*service_, SetFailure(Service::kFailureConnect));
1279 OnConnectTimeout();
1280 EXPECT_FALSE(GetService());
1281 EXPECT_FALSE(IsConnectTimeoutStarted());
1282}
1283
1284TEST_F(OpenVPNDriverTest, OnConnectTimeoutResolve) {
1285 StartConnectTimeout(0);
1286 SetService(service_);
1287 SetClientState(OpenVPNManagementServer::kStateResolve);
1288 EXPECT_CALL(*service_, SetFailure(Service::kFailureDNSLookup));
Darin Petkova42afe32013-02-05 16:53:52 +01001289 OnConnectTimeout();
1290 EXPECT_FALSE(GetService());
1291 EXPECT_FALSE(IsConnectTimeoutStarted());
Darin Petkov5eb05422012-05-11 15:45:25 +02001292}
1293
Darin Petkov0cd0d1e2013-02-11 12:49:10 +01001294TEST_F(OpenVPNDriverTest, OnReconnectingUnknown) {
1295 EXPECT_FALSE(IsConnectTimeoutStarted());
1296 EXPECT_CALL(dispatcher_,
1297 PostDelayedTask(_, GetDefaultConnectTimeoutSeconds() * 1000))
1298 .WillOnce(Return(true));
1299 SetDevice(device_);
1300 SetService(service_);
mukesh agrawal9da07772013-05-15 14:15:17 -07001301 EXPECT_CALL(*device_, DropConnection());
Darin Petkov271fe522012-03-27 13:47:29 +02001302 EXPECT_CALL(*service_, SetState(Service::kStateAssociating));
Darin Petkov0cd0d1e2013-02-11 12:49:10 +01001303 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonUnknown);
1304 EXPECT_TRUE(IsConnectTimeoutStarted());
1305}
1306
1307TEST_F(OpenVPNDriverTest, OnReconnectingTLSError) {
1308 EXPECT_CALL(dispatcher_,
1309 PostDelayedTask(_, GetReconnectOfflineTimeoutSeconds() * 1000))
1310 .WillOnce(Return(true));
1311 EXPECT_CALL(dispatcher_,
1312 PostDelayedTask(_, GetReconnectTLSErrorTimeoutSeconds() * 1000))
1313 .WillOnce(Return(true));
1314
1315 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonOffline);
1316 EXPECT_TRUE(IsConnectTimeoutStarted());
1317
1318 // The scheduled timeout should not be affected for unknown reason.
1319 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonUnknown);
1320 EXPECT_TRUE(IsConnectTimeoutStarted());
1321
1322 // Reconnect on TLS error reschedules the timeout once.
1323 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonTLSError);
1324 EXPECT_TRUE(IsConnectTimeoutStarted());
1325 driver_->OnReconnecting(OpenVPNDriver::kReconnectReasonTLSError);
1326 EXPECT_TRUE(IsConnectTimeoutStarted());
Darin Petkov271fe522012-03-27 13:47:29 +02001327}
1328
Darin Petkovd4325392012-04-23 15:48:22 +02001329TEST_F(OpenVPNDriverTest, InitPropertyStore) {
1330 // Sanity test property store initialization.
1331 PropertyStore store;
1332 driver_->InitPropertyStore(&store);
1333 const string kUser = "joe";
1334 Error error;
Ben Chan73728782013-09-20 13:40:54 -07001335 EXPECT_TRUE(store.SetStringProperty(kOpenVPNUserProperty, kUser, &error));
Darin Petkovd4325392012-04-23 15:48:22 +02001336 EXPECT_TRUE(error.IsSuccess());
Ben Chan73728782013-09-20 13:40:54 -07001337 EXPECT_EQ(kUser, GetArgs()->LookupString(kOpenVPNUserProperty, ""));
Darin Petkovb536a742012-04-26 11:31:28 +02001338}
1339
Paul Stewartb5768232014-02-27 07:21:34 -08001340TEST_F(OpenVPNDriverTest, PassphraseRequired) {
Darin Petkovb536a742012-04-26 11:31:28 +02001341 PropertyStore store;
1342 driver_->InitPropertyStore(&store);
Paul Stewartb5768232014-02-27 07:21:34 -08001343 KeyValueStore props = GetProviderProperties(store);
1344 EXPECT_TRUE(props.LookupBool(kPassphraseRequiredProperty, false));
1345
1346 SetArg(kOpenVPNPasswordProperty, "random-password");
1347 props = GetProviderProperties(store);
1348 EXPECT_FALSE(props.LookupBool(kPassphraseRequiredProperty, true));
1349 // This parameter should be write-only.
1350 EXPECT_FALSE(props.ContainsString(kOpenVPNPasswordProperty));
1351
1352 SetArg(kOpenVPNPasswordProperty, "");
1353 props = GetProviderProperties(store);
1354 EXPECT_TRUE(props.LookupBool(kPassphraseRequiredProperty, false));
1355
1356 SetArg(kOpenVPNTokenProperty, "random-token");
1357 props = GetProviderProperties(store);
1358 EXPECT_FALSE(props.LookupBool(kPassphraseRequiredProperty, true));
1359 // This parameter should be write-only.
1360 EXPECT_FALSE(props.ContainsString(kOpenVPNTokenProperty));
Darin Petkovd4325392012-04-23 15:48:22 +02001361}
1362
Darin Petkov1a462de2012-05-02 11:10:48 +02001363TEST_F(OpenVPNDriverTest, ParseLSBRelease) {
1364 SetupLSBRelease();
1365 map<string, string> lsb_release;
1366 EXPECT_TRUE(driver_->ParseLSBRelease(&lsb_release));
1367 EXPECT_TRUE(ContainsKey(lsb_release, "foo") && lsb_release["foo"] == "");
1368 EXPECT_EQ("=", lsb_release["zoo"]);
1369 EXPECT_EQ("Chromium OS", lsb_release[OpenVPNDriver::kChromeOSReleaseName]);
1370 EXPECT_EQ("2202.0", lsb_release[OpenVPNDriver::kChromeOSReleaseVersion]);
1371 driver_->lsb_release_file_ = FilePath("/non/existent/file");
1372 EXPECT_FALSE(driver_->ParseLSBRelease(NULL));
1373}
1374
1375TEST_F(OpenVPNDriverTest, InitEnvironment) {
1376 vector<string> env;
1377 SetupLSBRelease();
1378 driver_->InitEnvironment(&env);
1379 ASSERT_EQ(2, env.size());
1380 EXPECT_EQ("IV_PLAT=Chromium OS", env[0]);
1381 EXPECT_EQ("IV_PLAT_REL=2202.0", env[1]);
1382 env.clear();
Ben Chan6fbf64f2014-05-21 18:07:01 -07001383 EXPECT_EQ(0, base::WriteFile(lsb_release_file_, "", 0));
Darin Petkov1a462de2012-05-02 11:10:48 +02001384 driver_->InitEnvironment(&env);
1385 EXPECT_EQ(0, env.size());
1386}
1387
Darin Petkov5a850472012-06-06 15:44:24 +02001388TEST_F(OpenVPNDriverTest, DeleteInterface) {
1389 scoped_ptr<MockDeviceInfo> device_info(
1390 new MockDeviceInfo(&control_, &dispatcher_, &metrics_, &manager_));
1391 EXPECT_CALL(*device_info, DeleteInterface(kInterfaceIndex))
1392 .WillOnce(Return(true));
1393 WeakPtr<DeviceInfo> weak = device_info->AsWeakPtr();
1394 EXPECT_TRUE(weak);
1395 OpenVPNDriver::DeleteInterface(weak, kInterfaceIndex);
1396 device_info.reset();
1397 EXPECT_FALSE(weak);
1398 // Expect no crash.
1399 OpenVPNDriver::DeleteInterface(weak, kInterfaceIndex);
1400}
1401
Darin Petkova5e07ef2012-07-09 14:27:57 +02001402TEST_F(OpenVPNDriverTest, OnDefaultServiceChanged) {
1403 driver_->service_ = service_;
1404
1405 ServiceRefPtr null_service;
1406 EXPECT_CALL(*management_server_, Hold());
1407 driver_->OnDefaultServiceChanged(null_service);
1408
1409 EXPECT_CALL(*management_server_, Hold());
1410 driver_->OnDefaultServiceChanged(service_);
1411
1412 scoped_refptr<MockService> mock_service(
1413 new MockService(&control_, &dispatcher_, &metrics_, &manager_));
1414
1415 EXPECT_CALL(*mock_service, IsConnected()).WillOnce(Return(false));
1416 EXPECT_CALL(*management_server_, Hold());
1417 driver_->OnDefaultServiceChanged(mock_service);
1418
1419 EXPECT_CALL(*mock_service, IsConnected()).WillOnce(Return(true));
1420 EXPECT_CALL(*management_server_, ReleaseHold());
1421 driver_->OnDefaultServiceChanged(mock_service);
1422}
1423
Darin Petkov0cd0d1e2013-02-11 12:49:10 +01001424TEST_F(OpenVPNDriverTest, GetReconnectTimeoutSeconds) {
1425 EXPECT_EQ(GetDefaultConnectTimeoutSeconds(),
1426 GetReconnectTimeoutSeconds(OpenVPNDriver::kReconnectReasonUnknown));
1427 EXPECT_EQ(GetReconnectOfflineTimeoutSeconds(),
1428 GetReconnectTimeoutSeconds(OpenVPNDriver::kReconnectReasonOffline));
1429 EXPECT_EQ(GetReconnectTLSErrorTimeoutSeconds(),
1430 GetReconnectTimeoutSeconds(
1431 OpenVPNDriver::kReconnectReasonTLSError));
1432}
1433
Paul Stewartb26347a2013-08-02 12:12:09 -07001434TEST_F(OpenVPNDriverTest, WriteConfigFile) {
1435 const char kOption0[] = "option0";
1436 const char kOption1[] = "option1";
1437 const char kOption1Argument0[] = "option1-argument0";
1438 const char kOption2[] = "option2";
Paul Stewart7590d6f2013-08-07 12:47:39 -07001439 const char kOption2Argument0[] = "option2-argument0\n\t\"'\\";
1440 const char kOption2Argument0Transformed[] = "option2-argument0 \t\\\"'\\\\";
1441 const char kOption2Argument1[] = "option2-argument1 space";
Paul Stewartb26347a2013-08-02 12:12:09 -07001442 vector<vector<string>> options {
1443 { kOption0 },
1444 { kOption1, kOption1Argument0 },
1445 { kOption2, kOption2Argument0, kOption2Argument1 }
1446 };
1447 FilePath config_directory(
1448 temporary_directory_.path().Append(kOpenVPNConfigDirectory));
1449 FilePath config_file;
Ben Chana0ddf462014-02-06 11:32:42 -08001450 EXPECT_FALSE(base::PathExists(config_directory));
Paul Stewartb26347a2013-08-02 12:12:09 -07001451 EXPECT_TRUE(driver_->WriteConfigFile(options, &config_file));
Ben Chana0ddf462014-02-06 11:32:42 -08001452 EXPECT_TRUE(base::PathExists(config_directory));
1453 EXPECT_TRUE(base::PathExists(config_file));
1454 EXPECT_TRUE(config_directory.IsParent(config_file));
Paul Stewartb26347a2013-08-02 12:12:09 -07001455
1456 string config_contents;
Ben Chana0ddf462014-02-06 11:32:42 -08001457 EXPECT_TRUE(base::ReadFileToString(config_file, &config_contents));
1458 string expected_config_contents = base::StringPrintf(
Paul Stewart7590d6f2013-08-07 12:47:39 -07001459 "%s\n%s %s\n%s \"%s\" \"%s\"\n",
Paul Stewartb26347a2013-08-02 12:12:09 -07001460 kOption0,
1461 kOption1, kOption1Argument0,
Paul Stewart7590d6f2013-08-07 12:47:39 -07001462 kOption2, kOption2Argument0Transformed, kOption2Argument1);
Paul Stewartb26347a2013-08-02 12:12:09 -07001463 EXPECT_EQ(expected_config_contents, config_contents);
1464}
1465
Darin Petkov33af05c2012-02-28 10:10:30 +01001466} // namespace shill