Home | History | Annotate | Download | only in vpn
      1 //
      2 // Copyright (C) 2012 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include "shill/vpn/openvpn_management_server.h"
     18 
     19 #include <netinet/in.h>
     20 
     21 #if defined(__ANDROID__)
     22 #include <dbus/service_constants.h>
     23 #else
     24 #include <chromeos/dbus/service_constants.h>
     25 #endif  // __ANDROID__
     26 #include <gtest/gtest.h>
     27 
     28 #include "shill/key_value_store.h"
     29 #include "shill/mock_event_dispatcher.h"
     30 #include "shill/net/mock_sockets.h"
     31 #include "shill/vpn/mock_openvpn_driver.h"
     32 
     33 using base::Bind;
     34 using base::Unretained;
     35 using std::string;
     36 using std::vector;
     37 using testing::_;
     38 using testing::Assign;
     39 using testing::InSequence;
     40 using testing::Return;
     41 using testing::ReturnNew;
     42 
     43 namespace shill {
     44 
     45 namespace {
     46 MATCHER_P(VoidStringEq, value, "") {
     47   return value == reinterpret_cast<const char*>(arg);
     48 }
     49 }  // namespace
     50 
     51 class OpenVPNManagementServerTest : public testing::Test {
     52  public:
     53   OpenVPNManagementServerTest()
     54       : server_(&driver_) {}
     55 
     56   virtual ~OpenVPNManagementServerTest() {}
     57 
     58  protected:
     59   static const int kConnectedSocket;
     60 
     61   void SetSockets() { server_.sockets_ = &sockets_; }
     62   void SetDispatcher() { server_.dispatcher_ = &dispatcher_; }
     63   void ExpectNotStarted() { EXPECT_FALSE(server_.IsStarted()); }
     64 
     65   void SetConnectedSocket() {
     66     server_.connected_socket_ = kConnectedSocket;
     67     SetSockets();
     68   }
     69 
     70   void ExpectSend(const string& value) {
     71     EXPECT_CALL(sockets_,
     72                 Send(kConnectedSocket, VoidStringEq(value), value.size(), 0))
     73         .WillOnce(Return(value.size()));
     74   }
     75 
     76   void ExpectOTPStaticChallengeResponse() {
     77     driver_.args()->SetString(kOpenVPNUserProperty, "jojo");
     78     driver_.args()->SetString(kOpenVPNPasswordProperty, "yoyo");
     79     driver_.args()->SetString(kOpenVPNOTPProperty, "123456");
     80     SetConnectedSocket();
     81     ExpectSend("username \"Auth\" jojo\n");
     82     ExpectSend("password \"Auth\" \"SCRV1:eW95bw==:MTIzNDU2\"\n");
     83   }
     84 
     85   void ExpectTokenStaticChallengeResponse() {
     86     driver_.args()->SetString(kOpenVPNUserProperty, "jojo");
     87     driver_.args()->SetString(kOpenVPNTokenProperty, "toto");
     88     SetConnectedSocket();
     89     ExpectSend("username \"Auth\" jojo\n");
     90     ExpectSend("password \"Auth\" \"toto\"\n");
     91   }
     92 
     93   void ExpectAuthenticationResponse() {
     94     driver_.args()->SetString(kOpenVPNUserProperty, "jojo");
     95     driver_.args()->SetString(kOpenVPNPasswordProperty, "yoyo");
     96     SetConnectedSocket();
     97     ExpectSend("username \"Auth\" jojo\n");
     98     ExpectSend("password \"Auth\" \"yoyo\"\n");
     99   }
    100 
    101   void ExpectPINResponse() {
    102     driver_.args()->SetString(kOpenVPNPinProperty, "987654");
    103     SetConnectedSocket();
    104     ExpectSend("password \"User-Specific TPM Token FOO\" \"987654\"\n");
    105   }
    106 
    107   void ExpectHoldRelease() {
    108     SetConnectedSocket();
    109     ExpectSend("hold release\n");
    110   }
    111 
    112   void ExpectRestart() {
    113     SetConnectedSocket();
    114     ExpectSend("signal SIGUSR1\n");
    115   }
    116 
    117   InputData CreateInputDataFromString(const string& str) {
    118     InputData data(
    119         reinterpret_cast<unsigned char*>(const_cast<char*>(str.data())),
    120         str.size());
    121     return data;
    122   }
    123 
    124   void SendSignal(const string& signal) {
    125     server_.SendSignal(signal);
    126   }
    127 
    128   void OnInput(InputData* data) {
    129     server_.OnInput(data);
    130   }
    131 
    132   void ProcessMessage(const string& message) {
    133     server_.ProcessMessage(message);
    134   }
    135 
    136   bool ProcessSuccessMessage(const string& message) {
    137     return server_.ProcessSuccessMessage(message);
    138   }
    139 
    140   bool ProcessStateMessage(const string& message) {
    141     return server_.ProcessStateMessage(message);
    142   }
    143 
    144   bool ProcessAuthTokenMessage(const string& message) {
    145     return server_.ProcessAuthTokenMessage(message);
    146   }
    147 
    148   bool GetHoldWaiting() { return server_.hold_waiting_; }
    149 
    150   static string ParseSubstring(
    151       const string& message, const string& start, const string& end) {
    152     return OpenVPNManagementServer::ParseSubstring(message, start, end);
    153   }
    154 
    155   static string ParsePasswordTag(const string& message) {
    156     return OpenVPNManagementServer::ParsePasswordTag(message);
    157   }
    158 
    159   static string ParsePasswordFailedReason(const string& message) {
    160     return OpenVPNManagementServer::ParsePasswordFailedReason(message);
    161   }
    162 
    163   void SetClientState(const string& state) {
    164     server_.state_ = state;
    165   }
    166 
    167   MockOpenVPNDriver driver_;
    168   MockSockets sockets_;
    169   MockEventDispatcher dispatcher_;
    170   OpenVPNManagementServer server_;  // Destroy before anything it references.
    171 };
    172 
    173 // static
    174 const int OpenVPNManagementServerTest::kConnectedSocket = 555;
    175 
    176 TEST_F(OpenVPNManagementServerTest, StartStarted) {
    177   SetSockets();
    178   EXPECT_TRUE(server_.Start(nullptr, nullptr, nullptr));
    179 }
    180 
    181 TEST_F(OpenVPNManagementServerTest, StartSocketFail) {
    182   EXPECT_CALL(sockets_, Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
    183       .WillOnce(Return(-1));
    184   EXPECT_FALSE(server_.Start(nullptr, &sockets_, nullptr));
    185   ExpectNotStarted();
    186 }
    187 
    188 TEST_F(OpenVPNManagementServerTest, StartGetSockNameFail) {
    189   const int kSocket = 123;
    190   EXPECT_CALL(sockets_, Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
    191       .WillOnce(Return(kSocket));
    192   EXPECT_CALL(sockets_, Bind(kSocket, _, _)).WillOnce(Return(0));
    193   EXPECT_CALL(sockets_, Listen(kSocket, 1)).WillOnce(Return(0));
    194   EXPECT_CALL(sockets_, GetSockName(kSocket, _, _)).WillOnce(Return(-1));
    195   EXPECT_CALL(sockets_, Close(kSocket)).WillOnce(Return(0));
    196   EXPECT_FALSE(server_.Start(nullptr, &sockets_, nullptr));
    197   ExpectNotStarted();
    198 }
    199 
    200 TEST_F(OpenVPNManagementServerTest, Start) {
    201   const string kStaticChallenge = "static-challenge";
    202   driver_.args()->SetString(kOpenVPNStaticChallengeProperty, kStaticChallenge);
    203   const int kSocket = 123;
    204   EXPECT_CALL(sockets_, Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
    205       .WillOnce(Return(kSocket));
    206   EXPECT_CALL(sockets_, Bind(kSocket, _, _)).WillOnce(Return(0));
    207   EXPECT_CALL(sockets_, Listen(kSocket, 1)).WillOnce(Return(0));
    208   EXPECT_CALL(sockets_, GetSockName(kSocket, _, _)).WillOnce(Return(0));
    209   EXPECT_CALL(dispatcher_,
    210               CreateReadyHandler(kSocket, IOHandler::kModeInput, _))
    211       .WillOnce(ReturnNew<IOHandler>());
    212   vector<vector<string>> options;
    213   EXPECT_TRUE(server_.Start(&dispatcher_, &sockets_, &options));
    214   EXPECT_EQ(&sockets_, server_.sockets_);
    215   EXPECT_EQ(kSocket, server_.socket_);
    216   EXPECT_TRUE(server_.ready_handler_.get());
    217   EXPECT_EQ(&dispatcher_, server_.dispatcher_);
    218   vector<vector<string>> expected_options {
    219       { "management", "127.0.0.1", "0" },
    220       { "management-client" },
    221       { "management-hold" },
    222       { "management-query-passwords" },
    223       { "static-challenge", kStaticChallenge, "1" }
    224   };
    225   EXPECT_EQ(expected_options, options);
    226 }
    227 
    228 TEST_F(OpenVPNManagementServerTest, Stop) {
    229   EXPECT_TRUE(server_.state().empty());
    230   SetSockets();
    231   server_.input_handler_.reset(new IOHandler());
    232   const int kConnectedSocket = 234;
    233   server_.connected_socket_ = kConnectedSocket;
    234   EXPECT_CALL(sockets_, Close(kConnectedSocket)).WillOnce(Return(0));
    235   SetDispatcher();
    236   server_.ready_handler_.reset(new IOHandler());
    237   const int kSocket = 345;
    238   server_.socket_ = kSocket;
    239   SetClientState(OpenVPNManagementServer::kStateReconnecting);
    240   EXPECT_CALL(sockets_, Close(kSocket)).WillOnce(Return(0));
    241   server_.Stop();
    242   EXPECT_FALSE(server_.input_handler_.get());
    243   EXPECT_EQ(-1, server_.connected_socket_);
    244   EXPECT_FALSE(server_.dispatcher_);
    245   EXPECT_FALSE(server_.ready_handler_.get());
    246   EXPECT_EQ(-1, server_.socket_);
    247   EXPECT_TRUE(server_.state().empty());
    248   ExpectNotStarted();
    249 }
    250 
    251 TEST_F(OpenVPNManagementServerTest, OnReadyAcceptFail) {
    252   const int kSocket = 333;
    253   SetSockets();
    254   EXPECT_CALL(sockets_, Accept(kSocket, nullptr, nullptr)).WillOnce(Return(-1));
    255   server_.OnReady(kSocket);
    256   EXPECT_EQ(-1, server_.connected_socket_);
    257 }
    258 
    259 TEST_F(OpenVPNManagementServerTest, OnReady) {
    260   const int kSocket = 111;
    261   SetConnectedSocket();
    262   SetDispatcher();
    263   EXPECT_CALL(sockets_, Accept(kSocket, nullptr, nullptr))
    264       .WillOnce(Return(kConnectedSocket));
    265   server_.ready_handler_.reset(new IOHandler());
    266   EXPECT_CALL(dispatcher_, CreateInputHandler(kConnectedSocket, _, _))
    267       .WillOnce(ReturnNew<IOHandler>());
    268   ExpectSend("state on\n");
    269   server_.OnReady(kSocket);
    270   EXPECT_EQ(kConnectedSocket, server_.connected_socket_);
    271   EXPECT_FALSE(server_.ready_handler_.get());
    272   EXPECT_TRUE(server_.input_handler_.get());
    273 }
    274 
    275 TEST_F(OpenVPNManagementServerTest, OnInput) {
    276   {
    277     string s;
    278     InputData data = CreateInputDataFromString(s);
    279     OnInput(&data);
    280   }
    281   {
    282     string s = "foo\n"
    283         ">INFO:...\n"
    284         ">PASSWORD:Need 'Auth' SC:user/password/otp\n"
    285         ">PASSWORD:Need 'User-Specific TPM Token FOO' ...\n"
    286         ">PASSWORD:Verification Failed: .\n"
    287         ">PASSWORD:Auth-Token:ToKeN==\n"
    288         ">STATE:123,RECONNECTING,detail,...,...\n"
    289         ">HOLD:Waiting for hold release\n"
    290         "SUCCESS: Hold released.";
    291     InputData data = CreateInputDataFromString(s);
    292     ExpectOTPStaticChallengeResponse();
    293     ExpectPINResponse();
    294     EXPECT_CALL(driver_, FailService(Service::kFailureConnect,
    295                                      Service::kErrorDetailsNone));
    296     EXPECT_CALL(driver_, OnReconnecting(_));
    297     EXPECT_FALSE(GetHoldWaiting());
    298     OnInput(&data);
    299     EXPECT_TRUE(GetHoldWaiting());
    300   }
    301 }
    302 
    303 TEST_F(OpenVPNManagementServerTest, OnInputStop) {
    304   string s =
    305       ">PASSWORD:Verification Failed: .\n"
    306       ">STATE:123,RECONNECTING,detail,...,...";
    307   InputData data = CreateInputDataFromString(s);
    308   SetSockets();
    309   // Stops the server after the first message is processed.
    310   EXPECT_CALL(driver_, FailService(Service::kFailureConnect,
    311                                    Service::kErrorDetailsNone))
    312       .WillOnce(Assign(&server_.sockets_, nullptr));
    313   // The second message should not be processed.
    314   EXPECT_CALL(driver_, OnReconnecting(_)).Times(0);
    315   OnInput(&data);
    316 }
    317 
    318 TEST_F(OpenVPNManagementServerTest, ProcessMessage) {
    319   ProcessMessage("foo");
    320   ProcessMessage(">INFO:");
    321 
    322   EXPECT_CALL(driver_, OnReconnecting(_));
    323   ProcessMessage(">STATE:123,RECONNECTING,detail,...,...");
    324 }
    325 
    326 TEST_F(OpenVPNManagementServerTest, ProcessSuccessMessage) {
    327   EXPECT_FALSE(ProcessSuccessMessage("foo"));
    328   EXPECT_TRUE(ProcessSuccessMessage("SUCCESS: foo"));
    329 }
    330 
    331 TEST_F(OpenVPNManagementServerTest, ProcessInfoMessage) {
    332   EXPECT_FALSE(server_.ProcessInfoMessage("foo"));
    333   EXPECT_TRUE(server_.ProcessInfoMessage(">INFO:foo"));
    334 }
    335 
    336 TEST_F(OpenVPNManagementServerTest, ProcessStateMessage) {
    337   EXPECT_TRUE(server_.state().empty());
    338   EXPECT_FALSE(ProcessStateMessage("foo"));
    339   EXPECT_TRUE(server_.state().empty());
    340   EXPECT_TRUE(ProcessStateMessage(">STATE:123,WAIT,detail,...,..."));
    341   EXPECT_EQ("WAIT", server_.state());
    342   {
    343     InSequence seq;
    344     EXPECT_CALL(driver_,
    345                 OnReconnecting(OpenVPNDriver::kReconnectReasonUnknown));
    346     EXPECT_CALL(driver_,
    347                 OnReconnecting(OpenVPNDriver::kReconnectReasonTLSError));
    348   }
    349   EXPECT_TRUE(ProcessStateMessage(">STATE:123,RECONNECTING,detail,...,..."));
    350   EXPECT_EQ(OpenVPNManagementServer::kStateReconnecting, server_.state());
    351   EXPECT_TRUE(ProcessStateMessage(">STATE:123,RECONNECTING,tls-error,...,..."));
    352 }
    353 
    354 TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageAuthSC) {
    355   ExpectOTPStaticChallengeResponse();
    356   EXPECT_TRUE(
    357       server_.ProcessNeedPasswordMessage(
    358           ">PASSWORD:Need 'Auth' SC:user/password/otp"));
    359   EXPECT_FALSE(driver_.args()->ContainsString(kOpenVPNOTPProperty));
    360 }
    361 
    362 TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageAuth) {
    363   ExpectAuthenticationResponse();
    364   EXPECT_TRUE(
    365       server_.ProcessNeedPasswordMessage(
    366           ">PASSWORD:Need 'Auth' username/password"));
    367 }
    368 
    369 TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageTPMToken) {
    370   ExpectPINResponse();
    371   EXPECT_TRUE(
    372       server_.ProcessNeedPasswordMessage(
    373           ">PASSWORD:Need 'User-Specific TPM Token FOO' ..."));
    374 }
    375 
    376 TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageUnknown) {
    377   EXPECT_FALSE(server_.ProcessNeedPasswordMessage("foo"));
    378 }
    379 
    380 TEST_F(OpenVPNManagementServerTest, ParseSubstring) {
    381   EXPECT_EQ("", ParseSubstring("", "'", "'"));
    382   EXPECT_EQ("", ParseSubstring(" ", "'", "'"));
    383   EXPECT_EQ("", ParseSubstring("'", "'", "'"));
    384   EXPECT_EQ("", ParseSubstring("''", "'", "'"));
    385   EXPECT_EQ("", ParseSubstring("] [", "[", "]"));
    386   EXPECT_EQ("", ParseSubstring("[]", "[", "]"));
    387   EXPECT_EQ("bar", ParseSubstring("foo['bar']zoo", "['", "']"));
    388   EXPECT_EQ("bar", ParseSubstring("foo['bar']", "['", "']"));
    389   EXPECT_EQ("bar", ParseSubstring("['bar']zoo", "['", "']"));
    390   EXPECT_EQ("bar", ParseSubstring("['bar']['zoo']", "['", "']"));
    391 }
    392 
    393 TEST_F(OpenVPNManagementServerTest, ParsePasswordTag) {
    394   EXPECT_EQ("", ParsePasswordTag(""));
    395   EXPECT_EQ("Auth",
    396             ParsePasswordTag(
    397                 ">PASSWORD:Verification Failed: 'Auth' "
    398                 "['REVOKED: client certificate has been revoked']"));
    399 }
    400 
    401 TEST_F(OpenVPNManagementServerTest, ParsePasswordFailedReason) {
    402   EXPECT_EQ("", ParsePasswordFailedReason(""));
    403   EXPECT_EQ("REVOKED: client certificate has been revoked",
    404             ParsePasswordFailedReason(
    405                 ">PASSWORD:Verification Failed: 'Auth' "
    406                 "['REVOKED: client certificate has been revoked']"));
    407 }
    408 
    409 TEST_F(OpenVPNManagementServerTest, PerformStaticChallengeNoCreds) {
    410   EXPECT_CALL(driver_, FailService(Service::kFailureInternal,
    411                                    Service::kErrorDetailsNone)).Times(4);
    412   server_.PerformStaticChallenge("Auth");
    413   driver_.args()->SetString(kOpenVPNUserProperty, "jojo");
    414   server_.PerformStaticChallenge("Auth");
    415   driver_.args()->SetString(kOpenVPNPasswordProperty, "yoyo");
    416   server_.PerformStaticChallenge("Auth");
    417   driver_.args()->Clear();
    418   driver_.args()->SetString(kOpenVPNTokenProperty, "toto");
    419   server_.PerformStaticChallenge("Auth");
    420 }
    421 
    422 TEST_F(OpenVPNManagementServerTest, PerformStaticChallengeOTP) {
    423   ExpectOTPStaticChallengeResponse();
    424   server_.PerformStaticChallenge("Auth");
    425   EXPECT_FALSE(driver_.args()->ContainsString(kOpenVPNOTPProperty));
    426 }
    427 
    428 TEST_F(OpenVPNManagementServerTest, PerformStaticChallengeToken) {
    429   ExpectTokenStaticChallengeResponse();
    430   server_.PerformStaticChallenge("Auth");
    431   EXPECT_FALSE(driver_.args()->ContainsString(kOpenVPNTokenProperty));
    432 }
    433 
    434 TEST_F(OpenVPNManagementServerTest, PerformAuthenticationNoCreds) {
    435   EXPECT_CALL(driver_, FailService(Service::kFailureInternal,
    436                                    Service::kErrorDetailsNone)).Times(2);
    437   server_.PerformAuthentication("Auth");
    438   driver_.args()->SetString(kOpenVPNUserProperty, "jojo");
    439   server_.PerformAuthentication("Auth");
    440 }
    441 
    442 TEST_F(OpenVPNManagementServerTest, PerformAuthentication) {
    443   ExpectAuthenticationResponse();
    444   server_.PerformAuthentication("Auth");
    445 }
    446 
    447 TEST_F(OpenVPNManagementServerTest, ProcessHoldMessage) {
    448   EXPECT_FALSE(server_.hold_release_);
    449   EXPECT_FALSE(server_.hold_waiting_);
    450 
    451   EXPECT_FALSE(server_.ProcessHoldMessage("foo"));
    452 
    453   EXPECT_TRUE(server_.ProcessHoldMessage(">HOLD:Waiting for hold release"));
    454   EXPECT_FALSE(server_.hold_release_);
    455   EXPECT_TRUE(server_.hold_waiting_);
    456 
    457   ExpectHoldRelease();
    458   server_.hold_release_ = true;
    459   server_.hold_waiting_ = false;
    460   EXPECT_TRUE(server_.ProcessHoldMessage(">HOLD:Waiting for hold release"));
    461   EXPECT_TRUE(server_.hold_release_);
    462   EXPECT_FALSE(server_.hold_waiting_);
    463 }
    464 
    465 TEST_F(OpenVPNManagementServerTest, SupplyTPMTokenNoPIN) {
    466   EXPECT_CALL(driver_, FailService(Service::kFailureInternal,
    467                                    Service::kErrorDetailsNone));
    468   server_.SupplyTPMToken("User-Specific TPM Token FOO");
    469 }
    470 
    471 TEST_F(OpenVPNManagementServerTest, SupplyTPMToken) {
    472   ExpectPINResponse();
    473   server_.SupplyTPMToken("User-Specific TPM Token FOO");
    474 }
    475 
    476 TEST_F(OpenVPNManagementServerTest, Send) {
    477   const char kMessage[] = "foo\n";
    478   SetConnectedSocket();
    479   ExpectSend(kMessage);
    480   server_.Send(kMessage);
    481 }
    482 
    483 TEST_F(OpenVPNManagementServerTest, SendState) {
    484   SetConnectedSocket();
    485   ExpectSend("state off\n");
    486   server_.SendState("off");
    487 }
    488 
    489 TEST_F(OpenVPNManagementServerTest, SendUsername) {
    490   SetConnectedSocket();
    491   ExpectSend("username \"Auth\" joesmith\n");
    492   server_.SendUsername("Auth", "joesmith");
    493 }
    494 
    495 TEST_F(OpenVPNManagementServerTest, SendPassword) {
    496   SetConnectedSocket();
    497   ExpectSend("password \"Auth\" \"foo\\\"bar\"\n");
    498   server_.SendPassword("Auth", "foo\"bar");
    499 }
    500 
    501 TEST_F(OpenVPNManagementServerTest, ProcessFailedPasswordMessage) {
    502   EXPECT_FALSE(server_.ProcessFailedPasswordMessage("foo"));
    503   EXPECT_CALL(driver_, FailService(Service::kFailureConnect,
    504                                    Service::kErrorDetailsNone)).Times(3);
    505   EXPECT_CALL(driver_, FailService(Service::kFailureConnect, "Revoked."));
    506   EXPECT_TRUE(
    507       server_.ProcessFailedPasswordMessage(">PASSWORD:Verification Failed: ."));
    508   EXPECT_TRUE(
    509       server_.ProcessFailedPasswordMessage(
    510           ">PASSWORD:Verification Failed: 'Private Key' ['Reason']"));
    511   EXPECT_TRUE(
    512       server_.ProcessFailedPasswordMessage(
    513           ">PASSWORD:Verification Failed: 'Auth'"));
    514   EXPECT_TRUE(
    515       server_.ProcessFailedPasswordMessage(
    516           ">PASSWORD:Verification Failed: 'Auth' ['Revoked.']"));
    517 }
    518 
    519 TEST_F(OpenVPNManagementServerTest, ProcessAuthTokenMessage) {
    520   EXPECT_FALSE(ProcessAuthTokenMessage("foo"));
    521   EXPECT_TRUE(ProcessAuthTokenMessage(">PASSWORD:Auth-Token:ToKeN=="));
    522 }
    523 
    524 TEST_F(OpenVPNManagementServerTest, SendSignal) {
    525   SetConnectedSocket();
    526   ExpectSend("signal SIGUSR2\n");
    527   SendSignal("SIGUSR2");
    528 }
    529 
    530 TEST_F(OpenVPNManagementServerTest, Restart) {
    531   ExpectRestart();
    532   server_.Restart();
    533 }
    534 
    535 TEST_F(OpenVPNManagementServerTest, SendHoldRelease) {
    536   ExpectHoldRelease();
    537   server_.SendHoldRelease();
    538 }
    539 
    540 TEST_F(OpenVPNManagementServerTest, Hold) {
    541   EXPECT_FALSE(server_.hold_release_);
    542   EXPECT_FALSE(server_.hold_waiting_);
    543 
    544   server_.ReleaseHold();
    545   EXPECT_TRUE(server_.hold_release_);
    546   EXPECT_FALSE(server_.hold_waiting_);
    547 
    548   server_.Hold();
    549   EXPECT_FALSE(server_.hold_release_);
    550   EXPECT_FALSE(server_.hold_waiting_);
    551 
    552   server_.hold_waiting_ = true;
    553   ExpectHoldRelease();
    554   server_.ReleaseHold();
    555   EXPECT_TRUE(server_.hold_release_);
    556   EXPECT_FALSE(server_.hold_waiting_);
    557 }
    558 
    559 TEST_F(OpenVPNManagementServerTest, EscapeToQuote) {
    560   EXPECT_EQ("", OpenVPNManagementServer::EscapeToQuote(""));
    561   EXPECT_EQ("foo './", OpenVPNManagementServer::EscapeToQuote("foo './"));
    562   EXPECT_EQ("\\\\", OpenVPNManagementServer::EscapeToQuote("\\"));
    563   EXPECT_EQ("\\\"", OpenVPNManagementServer::EscapeToQuote("\""));
    564   EXPECT_EQ("\\\\\\\"foo\\\\bar\\\"",
    565             OpenVPNManagementServer::EscapeToQuote("\\\"foo\\bar\""));
    566 }
    567 
    568 }  // namespace shill
    569