blob: 5aae991fbc735e0c270e83edbe7323208d40c2c1 [file] [log] [blame]
Darin Petkov1c115202012-03-22 15:35:47 +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_management_server.h"
6
Darin Petkov271fe522012-03-27 13:47:29 +02007#include <netinet/in.h>
8
Darin Petkov683942b2012-03-27 18:00:04 +02009#include <chromeos/dbus/service_constants.h>
Darin Petkov1c115202012-03-22 15:35:47 +010010#include <gtest/gtest.h>
11
Darin Petkov683942b2012-03-27 18:00:04 +020012#include "shill/glib.h"
Darin Petkov1c115202012-03-22 15:35:47 +010013#include "shill/key_value_store.h"
Darin Petkov271fe522012-03-27 13:47:29 +020014#include "shill/mock_event_dispatcher.h"
Darin Petkov1c115202012-03-22 15:35:47 +010015#include "shill/mock_openvpn_driver.h"
Darin Petkov271fe522012-03-27 13:47:29 +020016#include "shill/mock_sockets.h"
17
Darin Petkov3273da72013-02-13 11:50:25 +010018using base::Bind;
19using base::Unretained;
Darin Petkov271fe522012-03-27 13:47:29 +020020using std::string;
Darin Petkov46463022012-03-29 14:57:32 +020021using std::vector;
Darin Petkov271fe522012-03-27 13:47:29 +020022using testing::_;
Darin Petkove08084d2012-06-11 13:19:35 +020023using testing::Assign;
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010024using testing::InSequence;
Darin Petkov271fe522012-03-27 13:47:29 +020025using testing::Return;
26using testing::ReturnNew;
Darin Petkov1c115202012-03-22 15:35:47 +010027
28namespace shill {
29
Darin Petkov271fe522012-03-27 13:47:29 +020030namespace {
Darin Petkov271fe522012-03-27 13:47:29 +020031MATCHER_P(VoidStringEq, value, "") {
32 return value == reinterpret_cast<const char *>(arg);
33}
34} // namespace {}
35
Darin Petkov1c115202012-03-22 15:35:47 +010036class OpenVPNManagementServerTest : public testing::Test {
37 public:
38 OpenVPNManagementServerTest()
Paul Stewart451aa7f2012-04-11 19:07:58 -070039 : server_(&driver_, &glib_) {}
Darin Petkov1c115202012-03-22 15:35:47 +010040
41 virtual ~OpenVPNManagementServerTest() {}
42
Darin Petkova42afe32013-02-05 16:53:52 +010043 protected:
44 static const int kConnectedSocket;
45
Darin Petkov271fe522012-03-27 13:47:29 +020046 void SetSockets() { server_.sockets_ = &sockets_; }
47 void SetDispatcher() { server_.dispatcher_ = &dispatcher_; }
Darin Petkovffd33062012-06-11 19:23:42 +020048 void ExpectNotStarted() { EXPECT_FALSE(server_.IsStarted()); }
Darin Petkov271fe522012-03-27 13:47:29 +020049
Darin Petkov683942b2012-03-27 18:00:04 +020050 void SetConnectedSocket() {
51 server_.connected_socket_ = kConnectedSocket;
52 SetSockets();
53 }
54
55 void ExpectSend(const string &value) {
56 EXPECT_CALL(sockets_,
57 Send(kConnectedSocket, VoidStringEq(value), value.size(), 0))
Darin Petkov271fe522012-03-27 13:47:29 +020058 .WillOnce(Return(value.size()));
59 }
60
Darin Petkov683942b2012-03-27 18:00:04 +020061 void ExpectStaticChallengeResponse() {
62 driver_.args()->SetString(flimflam::kOpenVPNUserProperty, "jojo");
63 driver_.args()->SetString(flimflam::kOpenVPNPasswordProperty, "yoyo");
64 driver_.args()->SetString(flimflam::kOpenVPNOTPProperty, "123456");
65 SetConnectedSocket();
66 ExpectSend("username \"Auth\" jojo\n");
67 ExpectSend("password \"Auth\" \"SCRV1:eW95bw==:MTIzNDU2\"\n");
68 }
69
Darin Petkovdaaa5532012-07-24 15:37:55 +020070 void ExpectAuthenticationResponse() {
71 driver_.args()->SetString(flimflam::kOpenVPNUserProperty, "jojo");
72 driver_.args()->SetString(flimflam::kOpenVPNPasswordProperty, "yoyo");
73 SetConnectedSocket();
74 ExpectSend("username \"Auth\" jojo\n");
75 ExpectSend("password \"Auth\" \"yoyo\"\n");
76 }
77
Darin Petkove0d5dd12012-04-04 16:10:48 +020078 void ExpectPINResponse() {
79 driver_.args()->SetString(flimflam::kOpenVPNPinProperty, "987654");
80 SetConnectedSocket();
81 ExpectSend("password \"User-Specific TPM Token FOO\" \"987654\"\n");
82 }
83
Darin Petkova5e07ef2012-07-09 14:27:57 +020084 void ExpectHoldRelease() {
85 SetConnectedSocket();
86 ExpectSend("hold release\n");
87 }
88
Darin Petkova42afe32013-02-05 16:53:52 +010089 void ExpectRestart() {
90 SetConnectedSocket();
91 ExpectSend("signal SIGUSR1\n");
92 }
93
Darin Petkov271fe522012-03-27 13:47:29 +020094 InputData CreateInputDataFromString(const string &str) {
95 InputData data(
96 reinterpret_cast<unsigned char *>(const_cast<char *>(str.data())),
97 str.size());
98 return data;
99 }
100
Darin Petkova42afe32013-02-05 16:53:52 +0100101 void SendSignal(const string &signal) {
102 server_.SendSignal(signal);
103 }
104
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100105 void OnInput(InputData *data) {
106 server_.OnInput(data);
107 }
108
109 void ProcessMessage(const string &message) {
110 server_.ProcessMessage(message);
111 }
112
Darin Petkova42afe32013-02-05 16:53:52 +0100113 bool ProcessSuccessMessage(const string &message) {
114 return server_.ProcessSuccessMessage(message);
115 }
Darin Petkov683942b2012-03-27 18:00:04 +0200116
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100117 bool ProcessStateMessage(const string &message) {
118 return server_.ProcessStateMessage(message);
119 }
120
Darin Petkov16e70322013-03-07 15:54:23 +0100121 bool ProcessAuthTokenMessage(const string &message) {
122 return server_.ProcessAuthTokenMessage(message);
123 }
124
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100125 bool GetHoldWaiting() { return server_.hold_waiting_; }
126
Darin Petkovaba89322013-03-11 14:48:22 +0100127 static string ParseSubstring(
128 const string &message, const string &start, const string &end) {
129 return OpenVPNManagementServer::ParseSubstring(message, start, end);
130 }
131
132 static string ParsePasswordTag(const string &message) {
133 return OpenVPNManagementServer::ParsePasswordTag(message);
134 }
135
136 static string ParsePasswordFailedReason(const string &message) {
137 return OpenVPNManagementServer::ParsePasswordFailedReason(message);
138 }
139
Darin Petkov1c049c72013-03-21 13:15:45 +0100140 void SetClientState(const string &state) {
141 server_.state_ = state;
142 }
143
Darin Petkov683942b2012-03-27 18:00:04 +0200144 GLib glib_;
Darin Petkov1c115202012-03-22 15:35:47 +0100145 MockOpenVPNDriver driver_;
Darin Petkov271fe522012-03-27 13:47:29 +0200146 MockSockets sockets_;
147 MockEventDispatcher dispatcher_;
mukesh agrawal7efde5b2013-05-08 11:36:58 -0700148 OpenVPNManagementServer server_; // Destroy before anything it references.
Darin Petkov1c115202012-03-22 15:35:47 +0100149};
150
Darin Petkov683942b2012-03-27 18:00:04 +0200151// static
152const int OpenVPNManagementServerTest::kConnectedSocket = 555;
153
Darin Petkov271fe522012-03-27 13:47:29 +0200154TEST_F(OpenVPNManagementServerTest, StartStarted) {
155 SetSockets();
Darin Petkov46463022012-03-29 14:57:32 +0200156 EXPECT_TRUE(server_.Start(NULL, NULL, NULL));
Darin Petkov271fe522012-03-27 13:47:29 +0200157}
158
159TEST_F(OpenVPNManagementServerTest, StartSocketFail) {
160 EXPECT_CALL(sockets_, Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
161 .WillOnce(Return(-1));
Darin Petkov46463022012-03-29 14:57:32 +0200162 EXPECT_FALSE(server_.Start(NULL, &sockets_, NULL));
Darin Petkov271fe522012-03-27 13:47:29 +0200163 ExpectNotStarted();
164}
165
166TEST_F(OpenVPNManagementServerTest, StartGetSockNameFail) {
167 const int kSocket = 123;
168 EXPECT_CALL(sockets_, Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
169 .WillOnce(Return(kSocket));
170 EXPECT_CALL(sockets_, Bind(kSocket, _, _)).WillOnce(Return(0));
171 EXPECT_CALL(sockets_, Listen(kSocket, 1)).WillOnce(Return(0));
172 EXPECT_CALL(sockets_, GetSockName(kSocket, _, _)).WillOnce(Return(-1));
173 EXPECT_CALL(sockets_, Close(kSocket)).WillOnce(Return(0));
Darin Petkov46463022012-03-29 14:57:32 +0200174 EXPECT_FALSE(server_.Start(NULL, &sockets_, NULL));
Darin Petkov271fe522012-03-27 13:47:29 +0200175 ExpectNotStarted();
176}
177
Darin Petkov78f63262012-03-26 01:30:24 +0200178TEST_F(OpenVPNManagementServerTest, Start) {
Darin Petkov271fe522012-03-27 13:47:29 +0200179 const int kSocket = 123;
180 EXPECT_CALL(sockets_, Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
181 .WillOnce(Return(kSocket));
182 EXPECT_CALL(sockets_, Bind(kSocket, _, _)).WillOnce(Return(0));
183 EXPECT_CALL(sockets_, Listen(kSocket, 1)).WillOnce(Return(0));
184 EXPECT_CALL(sockets_, GetSockName(kSocket, _, _)).WillOnce(Return(0));
185 EXPECT_CALL(dispatcher_,
Darin Petkov3273da72013-02-13 11:50:25 +0100186 CreateReadyHandler(kSocket, IOHandler::kModeInput, _))
Darin Petkov271fe522012-03-27 13:47:29 +0200187 .WillOnce(ReturnNew<IOHandler>());
Darin Petkov46463022012-03-29 14:57:32 +0200188 vector<string> options;
189 EXPECT_TRUE(server_.Start(&dispatcher_, &sockets_, &options));
Darin Petkov271fe522012-03-27 13:47:29 +0200190 EXPECT_EQ(&sockets_, server_.sockets_);
191 EXPECT_EQ(kSocket, server_.socket_);
192 EXPECT_TRUE(server_.ready_handler_.get());
193 EXPECT_EQ(&dispatcher_, server_.dispatcher_);
Darin Petkov46463022012-03-29 14:57:32 +0200194 EXPECT_FALSE(options.empty());
Darin Petkov271fe522012-03-27 13:47:29 +0200195}
196
197TEST_F(OpenVPNManagementServerTest, Stop) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100198 EXPECT_TRUE(server_.state().empty());
Darin Petkov271fe522012-03-27 13:47:29 +0200199 SetSockets();
200 server_.input_handler_.reset(new IOHandler());
201 const int kConnectedSocket = 234;
202 server_.connected_socket_ = kConnectedSocket;
203 EXPECT_CALL(sockets_, Close(kConnectedSocket)).WillOnce(Return(0));
204 SetDispatcher();
205 server_.ready_handler_.reset(new IOHandler());
206 const int kSocket = 345;
207 server_.socket_ = kSocket;
Darin Petkov1c049c72013-03-21 13:15:45 +0100208 SetClientState(OpenVPNManagementServer::kStateReconnecting);
Darin Petkov271fe522012-03-27 13:47:29 +0200209 EXPECT_CALL(sockets_, Close(kSocket)).WillOnce(Return(0));
210 server_.Stop();
211 EXPECT_FALSE(server_.input_handler_.get());
212 EXPECT_EQ(-1, server_.connected_socket_);
213 EXPECT_FALSE(server_.dispatcher_);
214 EXPECT_FALSE(server_.ready_handler_.get());
215 EXPECT_EQ(-1, server_.socket_);
Darin Petkov1c049c72013-03-21 13:15:45 +0100216 EXPECT_TRUE(server_.state().empty());
Darin Petkov271fe522012-03-27 13:47:29 +0200217 ExpectNotStarted();
218}
219
220TEST_F(OpenVPNManagementServerTest, OnReadyAcceptFail) {
221 const int kSocket = 333;
222 SetSockets();
223 EXPECT_CALL(sockets_, Accept(kSocket, NULL, NULL)).WillOnce(Return(-1));
224 server_.OnReady(kSocket);
225 EXPECT_EQ(-1, server_.connected_socket_);
226}
227
228TEST_F(OpenVPNManagementServerTest, OnReady) {
229 const int kSocket = 111;
Darin Petkov683942b2012-03-27 18:00:04 +0200230 SetConnectedSocket();
Darin Petkov271fe522012-03-27 13:47:29 +0200231 SetDispatcher();
232 EXPECT_CALL(sockets_, Accept(kSocket, NULL, NULL))
233 .WillOnce(Return(kConnectedSocket));
234 server_.ready_handler_.reset(new IOHandler());
Darin Petkov3273da72013-02-13 11:50:25 +0100235 EXPECT_CALL(dispatcher_, CreateInputHandler(kConnectedSocket, _, _))
Darin Petkov271fe522012-03-27 13:47:29 +0200236 .WillOnce(ReturnNew<IOHandler>());
Darin Petkov683942b2012-03-27 18:00:04 +0200237 ExpectSend("state on\n");
Darin Petkov271fe522012-03-27 13:47:29 +0200238 server_.OnReady(kSocket);
239 EXPECT_EQ(kConnectedSocket, server_.connected_socket_);
240 EXPECT_FALSE(server_.ready_handler_.get());
241 EXPECT_TRUE(server_.input_handler_.get());
242}
243
244TEST_F(OpenVPNManagementServerTest, OnInput) {
245 {
246 string s;
247 InputData data = CreateInputDataFromString(s);
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100248 OnInput(&data);
Darin Petkov271fe522012-03-27 13:47:29 +0200249 }
250 {
251 string s = "foo\n"
252 ">INFO:...\n"
Darin Petkov683942b2012-03-27 18:00:04 +0200253 ">PASSWORD:Need 'Auth' SC:user/password/otp\n"
Darin Petkove0d5dd12012-04-04 16:10:48 +0200254 ">PASSWORD:Need 'User-Specific TPM Token FOO' ...\n"
Darin Petkov0440b9b2012-04-17 16:11:56 +0200255 ">PASSWORD:Verification Failed: .\n"
Darin Petkov16e70322013-03-07 15:54:23 +0100256 ">PASSWORD:Auth-Token:ToKeN==\n"
Darin Petkova5e07ef2012-07-09 14:27:57 +0200257 ">STATE:123,RECONNECTING,detail,...,...\n"
Darin Petkova42afe32013-02-05 16:53:52 +0100258 ">HOLD:Waiting for hold release\n"
259 "SUCCESS: Hold released.";
Darin Petkov271fe522012-03-27 13:47:29 +0200260 InputData data = CreateInputDataFromString(s);
Darin Petkov683942b2012-03-27 18:00:04 +0200261 ExpectStaticChallengeResponse();
Darin Petkove0d5dd12012-04-04 16:10:48 +0200262 ExpectPINResponse();
Darin Petkov1c049c72013-03-21 13:15:45 +0100263 EXPECT_CALL(driver_, FailService(Service::kFailureConnect,
264 Service::kErrorDetailsNone));
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100265 EXPECT_CALL(driver_, OnReconnecting(_));
266 EXPECT_FALSE(GetHoldWaiting());
267 OnInput(&data);
268 EXPECT_TRUE(GetHoldWaiting());
Darin Petkov271fe522012-03-27 13:47:29 +0200269 }
270}
271
Darin Petkove08084d2012-06-11 13:19:35 +0200272TEST_F(OpenVPNManagementServerTest, OnInputStop) {
273 string s =
274 ">PASSWORD:Verification Failed: .\n"
275 ">STATE:123,RECONNECTING,detail,...,...";
276 InputData data = CreateInputDataFromString(s);
277 SetSockets();
278 // Stops the server after the first message is processed.
Darin Petkov1c049c72013-03-21 13:15:45 +0100279 EXPECT_CALL(driver_, FailService(Service::kFailureConnect,
280 Service::kErrorDetailsNone))
Darin Petkove08084d2012-06-11 13:19:35 +0200281 .WillOnce(Assign(&server_.sockets_, reinterpret_cast<Sockets *>(NULL)));
282 // The second message should not be processed.
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100283 EXPECT_CALL(driver_, OnReconnecting(_)).Times(0);
284 OnInput(&data);
Darin Petkove08084d2012-06-11 13:19:35 +0200285}
286
Darin Petkov271fe522012-03-27 13:47:29 +0200287TEST_F(OpenVPNManagementServerTest, ProcessMessage) {
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100288 ProcessMessage("foo");
289 ProcessMessage(">INFO:");
Darin Petkov271fe522012-03-27 13:47:29 +0200290
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100291 EXPECT_CALL(driver_, OnReconnecting(_));
292 ProcessMessage(">STATE:123,RECONNECTING,detail,...,...");
Darin Petkov271fe522012-03-27 13:47:29 +0200293}
294
Darin Petkova42afe32013-02-05 16:53:52 +0100295TEST_F(OpenVPNManagementServerTest, ProcessSuccessMessage) {
296 EXPECT_FALSE(ProcessSuccessMessage("foo"));
297 EXPECT_TRUE(ProcessSuccessMessage("SUCCESS: foo"));
298}
299
Darin Petkov271fe522012-03-27 13:47:29 +0200300TEST_F(OpenVPNManagementServerTest, ProcessInfoMessage) {
301 EXPECT_FALSE(server_.ProcessInfoMessage("foo"));
Darin Petkova42afe32013-02-05 16:53:52 +0100302 EXPECT_TRUE(server_.ProcessInfoMessage(">INFO:foo"));
Darin Petkov271fe522012-03-27 13:47:29 +0200303}
304
305TEST_F(OpenVPNManagementServerTest, ProcessStateMessage) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100306 EXPECT_TRUE(server_.state().empty());
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100307 EXPECT_FALSE(ProcessStateMessage("foo"));
Darin Petkov1c049c72013-03-21 13:15:45 +0100308 EXPECT_TRUE(server_.state().empty());
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100309 EXPECT_TRUE(ProcessStateMessage(">STATE:123,WAIT,detail,...,..."));
Darin Petkov1c049c72013-03-21 13:15:45 +0100310 EXPECT_EQ("WAIT", server_.state());
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100311 {
312 InSequence seq;
313 EXPECT_CALL(driver_,
314 OnReconnecting(OpenVPNDriver::kReconnectReasonUnknown));
315 EXPECT_CALL(driver_,
316 OnReconnecting(OpenVPNDriver::kReconnectReasonTLSError));
317 }
318 EXPECT_TRUE(ProcessStateMessage(">STATE:123,RECONNECTING,detail,...,..."));
Darin Petkov1c049c72013-03-21 13:15:45 +0100319 EXPECT_EQ(OpenVPNManagementServer::kStateReconnecting, server_.state());
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100320 EXPECT_TRUE(ProcessStateMessage(">STATE:123,RECONNECTING,tls-error,...,..."));
Darin Petkov271fe522012-03-27 13:47:29 +0200321}
322
Darin Petkov683942b2012-03-27 18:00:04 +0200323TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageAuthSC) {
Darin Petkov683942b2012-03-27 18:00:04 +0200324 ExpectStaticChallengeResponse();
325 EXPECT_TRUE(
326 server_.ProcessNeedPasswordMessage(
327 ">PASSWORD:Need 'Auth' SC:user/password/otp"));
328 EXPECT_FALSE(driver_.args()->ContainsString(flimflam::kOpenVPNOTPProperty));
329}
330
Darin Petkovdaaa5532012-07-24 15:37:55 +0200331TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageAuth) {
332 ExpectAuthenticationResponse();
333 EXPECT_TRUE(
334 server_.ProcessNeedPasswordMessage(
335 ">PASSWORD:Need 'Auth' username/password"));
336}
337
Darin Petkove0d5dd12012-04-04 16:10:48 +0200338TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageTPMToken) {
339 ExpectPINResponse();
340 EXPECT_TRUE(
341 server_.ProcessNeedPasswordMessage(
342 ">PASSWORD:Need 'User-Specific TPM Token FOO' ..."));
343}
344
345TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageUnknown) {
346 EXPECT_FALSE(server_.ProcessNeedPasswordMessage("foo"));
347}
348
Darin Petkovaba89322013-03-11 14:48:22 +0100349TEST_F(OpenVPNManagementServerTest, ParseSubstring) {
350 EXPECT_EQ("", ParseSubstring("", "'", "'"));
351 EXPECT_EQ("", ParseSubstring(" ", "'", "'"));
352 EXPECT_EQ("", ParseSubstring("'", "'", "'"));
353 EXPECT_EQ("", ParseSubstring("''", "'", "'"));
354 EXPECT_EQ("", ParseSubstring("] [", "[", "]"));
355 EXPECT_EQ("", ParseSubstring("[]", "[", "]"));
356 EXPECT_EQ("bar", ParseSubstring("foo['bar']zoo", "['", "']"));
357 EXPECT_EQ("bar", ParseSubstring("foo['bar']", "['", "']"));
358 EXPECT_EQ("bar", ParseSubstring("['bar']zoo", "['", "']"));
359 EXPECT_EQ("bar", ParseSubstring("['bar']['zoo']", "['", "']"));
360}
361
362TEST_F(OpenVPNManagementServerTest, ParsePasswordTag) {
363 EXPECT_EQ("", ParsePasswordTag(""));
364 EXPECT_EQ("Auth",
365 ParsePasswordTag(
366 ">PASSWORD:Verification Failed: 'Auth' "
367 "['REVOKED: client certificate has been revoked']"));
368}
369
370TEST_F(OpenVPNManagementServerTest, ParsePasswordFailedReason) {
371 EXPECT_EQ("", ParsePasswordFailedReason(""));
372 EXPECT_EQ("REVOKED: client certificate has been revoked",
373 ParsePasswordFailedReason(
374 ">PASSWORD:Verification Failed: 'Auth' "
375 "['REVOKED: client certificate has been revoked']"));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200376}
377
Darin Petkov683942b2012-03-27 18:00:04 +0200378TEST_F(OpenVPNManagementServerTest, PerformStaticChallengeNoCreds) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100379 EXPECT_CALL(driver_, FailService(Service::kFailureInternal,
380 Service::kErrorDetailsNone)).Times(3);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200381 server_.PerformStaticChallenge("Auth");
Darin Petkov683942b2012-03-27 18:00:04 +0200382 driver_.args()->SetString(flimflam::kOpenVPNUserProperty, "jojo");
Darin Petkove0d5dd12012-04-04 16:10:48 +0200383 server_.PerformStaticChallenge("Auth");
Darin Petkov683942b2012-03-27 18:00:04 +0200384 driver_.args()->SetString(flimflam::kOpenVPNPasswordProperty, "yoyo");
Darin Petkove0d5dd12012-04-04 16:10:48 +0200385 server_.PerformStaticChallenge("Auth");
Darin Petkov683942b2012-03-27 18:00:04 +0200386}
387
388TEST_F(OpenVPNManagementServerTest, PerformStaticChallenge) {
389 ExpectStaticChallengeResponse();
Darin Petkove0d5dd12012-04-04 16:10:48 +0200390 server_.PerformStaticChallenge("Auth");
Darin Petkov683942b2012-03-27 18:00:04 +0200391 EXPECT_FALSE(driver_.args()->ContainsString(flimflam::kOpenVPNOTPProperty));
392}
393
Darin Petkovdaaa5532012-07-24 15:37:55 +0200394TEST_F(OpenVPNManagementServerTest, PerformAuthenticationNoCreds) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100395 EXPECT_CALL(driver_, FailService(Service::kFailureInternal,
396 Service::kErrorDetailsNone)).Times(2);
Darin Petkovdaaa5532012-07-24 15:37:55 +0200397 server_.PerformAuthentication("Auth");
398 driver_.args()->SetString(flimflam::kOpenVPNUserProperty, "jojo");
399 server_.PerformAuthentication("Auth");
400}
401
402TEST_F(OpenVPNManagementServerTest, PerformAuthentication) {
403 ExpectAuthenticationResponse();
404 server_.PerformAuthentication("Auth");
405}
406
Darin Petkova5e07ef2012-07-09 14:27:57 +0200407TEST_F(OpenVPNManagementServerTest, ProcessHoldMessage) {
408 EXPECT_FALSE(server_.hold_release_);
409 EXPECT_FALSE(server_.hold_waiting_);
410
411 EXPECT_FALSE(server_.ProcessHoldMessage("foo"));
412
413 EXPECT_TRUE(server_.ProcessHoldMessage(">HOLD:Waiting for hold release"));
414 EXPECT_FALSE(server_.hold_release_);
415 EXPECT_TRUE(server_.hold_waiting_);
416
417 ExpectHoldRelease();
418 server_.hold_release_ = true;
419 server_.hold_waiting_ = false;
420 EXPECT_TRUE(server_.ProcessHoldMessage(">HOLD:Waiting for hold release"));
421 EXPECT_TRUE(server_.hold_release_);
422 EXPECT_FALSE(server_.hold_waiting_);
423}
424
Darin Petkove0d5dd12012-04-04 16:10:48 +0200425TEST_F(OpenVPNManagementServerTest, SupplyTPMTokenNoPIN) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100426 EXPECT_CALL(driver_, FailService(Service::kFailureInternal,
427 Service::kErrorDetailsNone));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200428 server_.SupplyTPMToken("User-Specific TPM Token FOO");
429}
430
431TEST_F(OpenVPNManagementServerTest, SupplyTPMToken) {
432 ExpectPINResponse();
433 server_.SupplyTPMToken("User-Specific TPM Token FOO");
434}
435
Darin Petkov271fe522012-03-27 13:47:29 +0200436TEST_F(OpenVPNManagementServerTest, Send) {
Darin Petkov271fe522012-03-27 13:47:29 +0200437 const char kMessage[] = "foo\n";
Darin Petkov683942b2012-03-27 18:00:04 +0200438 SetConnectedSocket();
439 ExpectSend(kMessage);
Darin Petkov271fe522012-03-27 13:47:29 +0200440 server_.Send(kMessage);
441}
442
443TEST_F(OpenVPNManagementServerTest, SendState) {
Darin Petkov683942b2012-03-27 18:00:04 +0200444 SetConnectedSocket();
445 ExpectSend("state off\n");
Darin Petkov271fe522012-03-27 13:47:29 +0200446 server_.SendState("off");
Darin Petkov1c115202012-03-22 15:35:47 +0100447}
448
Darin Petkov683942b2012-03-27 18:00:04 +0200449TEST_F(OpenVPNManagementServerTest, SendUsername) {
450 SetConnectedSocket();
451 ExpectSend("username \"Auth\" joesmith\n");
452 server_.SendUsername("Auth", "joesmith");
453}
454
455TEST_F(OpenVPNManagementServerTest, SendPassword) {
456 SetConnectedSocket();
Darin Petkovdaaa5532012-07-24 15:37:55 +0200457 ExpectSend("password \"Auth\" \"foo\\\"bar\"\n");
458 server_.SendPassword("Auth", "foo\"bar");
Darin Petkov683942b2012-03-27 18:00:04 +0200459}
460
Darin Petkov0440b9b2012-04-17 16:11:56 +0200461TEST_F(OpenVPNManagementServerTest, ProcessFailedPasswordMessage) {
462 EXPECT_FALSE(server_.ProcessFailedPasswordMessage("foo"));
Darin Petkov1c049c72013-03-21 13:15:45 +0100463 EXPECT_CALL(driver_, FailService(Service::kFailureConnect,
464 Service::kErrorDetailsNone)).Times(3);
465 EXPECT_CALL(driver_, FailService(Service::kFailureConnect, "Revoked."));
Darin Petkov0440b9b2012-04-17 16:11:56 +0200466 EXPECT_TRUE(
467 server_.ProcessFailedPasswordMessage(">PASSWORD:Verification Failed: ."));
Darin Petkovaba89322013-03-11 14:48:22 +0100468 EXPECT_TRUE(
469 server_.ProcessFailedPasswordMessage(
470 ">PASSWORD:Verification Failed: 'Private Key' ['Reason']"));
471 EXPECT_TRUE(
472 server_.ProcessFailedPasswordMessage(
473 ">PASSWORD:Verification Failed: 'Auth'"));
474 EXPECT_TRUE(
475 server_.ProcessFailedPasswordMessage(
476 ">PASSWORD:Verification Failed: 'Auth' ['Revoked.']"));
Darin Petkov0440b9b2012-04-17 16:11:56 +0200477}
478
Darin Petkov16e70322013-03-07 15:54:23 +0100479TEST_F(OpenVPNManagementServerTest, ProcessAuthTokenMessage) {
480 EXPECT_FALSE(ProcessAuthTokenMessage("foo"));
481 EXPECT_TRUE(ProcessAuthTokenMessage(">PASSWORD:Auth-Token:ToKeN=="));
482}
483
Darin Petkova42afe32013-02-05 16:53:52 +0100484TEST_F(OpenVPNManagementServerTest, SendSignal) {
485 SetConnectedSocket();
486 ExpectSend("signal SIGUSR2\n");
487 SendSignal("SIGUSR2");
488}
489
490TEST_F(OpenVPNManagementServerTest, Restart) {
491 ExpectRestart();
492 server_.Restart();
493}
494
Darin Petkova5e07ef2012-07-09 14:27:57 +0200495TEST_F(OpenVPNManagementServerTest, SendHoldRelease) {
496 ExpectHoldRelease();
497 server_.SendHoldRelease();
498}
499
500TEST_F(OpenVPNManagementServerTest, Hold) {
501 EXPECT_FALSE(server_.hold_release_);
502 EXPECT_FALSE(server_.hold_waiting_);
503
504 server_.ReleaseHold();
505 EXPECT_TRUE(server_.hold_release_);
506 EXPECT_FALSE(server_.hold_waiting_);
507
508 server_.Hold();
509 EXPECT_FALSE(server_.hold_release_);
510 EXPECT_FALSE(server_.hold_waiting_);
511
512 server_.hold_waiting_ = true;
513 ExpectHoldRelease();
514 server_.ReleaseHold();
515 EXPECT_TRUE(server_.hold_release_);
516 EXPECT_FALSE(server_.hold_waiting_);
517}
518
Darin Petkovdaaa5532012-07-24 15:37:55 +0200519TEST_F(OpenVPNManagementServerTest, EscapeToQuote) {
520 EXPECT_EQ("", OpenVPNManagementServer::EscapeToQuote(""));
521 EXPECT_EQ("foo './", OpenVPNManagementServer::EscapeToQuote("foo './"));
522 EXPECT_EQ("\\\\", OpenVPNManagementServer::EscapeToQuote("\\"));
523 EXPECT_EQ("\\\"", OpenVPNManagementServer::EscapeToQuote("\""));
524 EXPECT_EQ("\\\\\\\"foo\\\\bar\\\"",
525 OpenVPNManagementServer::EscapeToQuote("\\\"foo\\bar\""));
526}
527
Darin Petkov1c115202012-03-22 15:35:47 +0100528} // namespace shill