| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. | 
|  | 2 | // Use of this source code is governed by a BSD-style license that can be | 
|  | 3 | // found in the LICENSE file. | 
|  | 4 |  | 
|  | 5 | #include "shill/l2tp_ipsec_driver.h" | 
|  | 6 |  | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 7 | #include <base/file_util.h> | 
|  | 8 | #include <base/scoped_temp_dir.h> | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 9 | #include <base/string_util.h> | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 10 | #include <gtest/gtest.h> | 
|  | 11 |  | 
|  | 12 | #include "shill/event_dispatcher.h" | 
|  | 13 | #include "shill/nice_mock_control.h" | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 14 | #include "shill/mock_adaptors.h" | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 15 | #include "shill/mock_device_info.h" | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 16 | #include "shill/mock_glib.h" | 
|  | 17 | #include "shill/mock_manager.h" | 
|  | 18 | #include "shill/mock_metrics.h" | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 19 | #include "shill/mock_nss.h" | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 20 | #include "shill/mock_vpn.h" | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 21 | #include "shill/mock_vpn_service.h" | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 22 | #include "shill/vpn.h" | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 23 |  | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 24 | using std::find; | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 25 | using std::map; | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 26 | using std::string; | 
|  | 27 | using std::vector; | 
|  | 28 | using testing::_; | 
|  | 29 | using testing::ElementsAreArray; | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 30 | using testing::NiceMock; | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 31 | using testing::Return; | 
|  | 32 | using testing::ReturnRef; | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 33 | using testing::SetArgumentPointee; | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 34 | using testing::StrictMock; | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 35 |  | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 36 | namespace shill { | 
|  | 37 |  | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 38 | class L2TPIPSecDriverTest : public testing::Test, | 
|  | 39 | public RPCTaskDelegate { | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 40 | public: | 
|  | 41 | L2TPIPSecDriverTest() | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 42 | : device_info_(&control_, &dispatcher_, &metrics_, &manager_), | 
|  | 43 | manager_(&control_, &dispatcher_, &metrics_, &glib_), | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 44 | driver_(new L2TPIPSecDriver(&control_, &dispatcher_, &metrics_, | 
|  | 45 | &manager_, &device_info_, &glib_)), | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 46 | service_(new MockVPNService(&control_, &dispatcher_, &metrics_, | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 47 | &manager_, driver_)), | 
|  | 48 | device_(new MockVPN(&control_, &dispatcher_, &metrics_, &manager_, | 
|  | 49 | kInterfaceName, kInterfaceIndex)) { | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 50 | driver_->nss_ = &nss_; | 
|  | 51 | } | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 52 |  | 
|  | 53 | virtual ~L2TPIPSecDriverTest() {} | 
|  | 54 |  | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 55 | virtual void SetUp() { | 
|  | 56 | ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 
|  | 57 | } | 
|  | 58 |  | 
|  | 59 | virtual void TearDown() { | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 60 | driver_->child_watch_tag_ = 0; | 
|  | 61 | driver_->pid_ = 0; | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 62 | driver_->device_ = NULL; | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 63 | driver_->service_ = NULL; | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 64 | ASSERT_TRUE(temp_dir_.Delete()); | 
|  | 65 | } | 
|  | 66 |  | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 67 | protected: | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 68 | static const char kInterfaceName[]; | 
|  | 69 | static const int kInterfaceIndex; | 
|  | 70 |  | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 71 | void SetArg(const string &arg, const string &value) { | 
|  | 72 | driver_->args_.SetString(arg, value); | 
|  | 73 | } | 
|  | 74 |  | 
| Darin Petkov | d432539 | 2012-04-23 15:48:22 +0200 | [diff] [blame] | 75 | KeyValueStore *GetArgs() { | 
|  | 76 | return driver_->args(); | 
|  | 77 | } | 
|  | 78 |  | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 79 | // Used to assert that a flag appears in the options. | 
|  | 80 | void ExpectInFlags(const vector<string> &options, const string &flag, | 
|  | 81 | const string &value); | 
|  | 82 |  | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 83 | FilePath SetupPSKFile(); | 
|  | 84 |  | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 85 | // Inherited from RPCTaskDelegate. | 
|  | 86 | virtual void GetLogin(string *user, string *password); | 
|  | 87 | virtual void Notify(const string &reason, const map<string, string> &dict); | 
|  | 88 |  | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 89 | ScopedTempDir temp_dir_; | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 90 | NiceMockControl control_; | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 91 | NiceMock<MockDeviceInfo> device_info_; | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 92 | EventDispatcher dispatcher_; | 
|  | 93 | MockMetrics metrics_; | 
|  | 94 | MockGLib glib_; | 
|  | 95 | MockManager manager_; | 
|  | 96 | L2TPIPSecDriver *driver_;  // Owned by |service_|. | 
|  | 97 | scoped_refptr<MockVPNService> service_; | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 98 | scoped_refptr<MockVPN> device_; | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 99 | MockNSS nss_; | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 100 | }; | 
|  | 101 |  | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 102 | const char L2TPIPSecDriverTest::kInterfaceName[] = "ppp0"; | 
|  | 103 | const int L2TPIPSecDriverTest::kInterfaceIndex = 123; | 
|  | 104 |  | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 105 | void L2TPIPSecDriverTest::GetLogin(string */*user*/, string */*password*/) {} | 
|  | 106 |  | 
|  | 107 | void L2TPIPSecDriverTest::Notify( | 
|  | 108 | const string &/*reason*/, const map<string, string> &/*dict*/) {} | 
|  | 109 |  | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 110 | void L2TPIPSecDriverTest::ExpectInFlags( | 
|  | 111 | const vector<string> &options, const string &flag, const string &value) { | 
|  | 112 | vector<string>::const_iterator it = | 
|  | 113 | find(options.begin(), options.end(), flag); | 
|  | 114 |  | 
|  | 115 | EXPECT_TRUE(it != options.end()); | 
|  | 116 | if (it != options.end()) | 
|  | 117 | return;  // Don't crash below. | 
|  | 118 | it++; | 
|  | 119 | EXPECT_TRUE(it != options.end()); | 
|  | 120 | if (it != options.end()) | 
|  | 121 | return;  // Don't crash below. | 
|  | 122 | EXPECT_EQ(value, *it); | 
|  | 123 | } | 
|  | 124 |  | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 125 | FilePath L2TPIPSecDriverTest::SetupPSKFile() { | 
|  | 126 | FilePath psk_file; | 
|  | 127 | EXPECT_TRUE(file_util::CreateTemporaryFileInDir(temp_dir_.path(), &psk_file)); | 
|  | 128 | EXPECT_FALSE(psk_file.empty()); | 
|  | 129 | EXPECT_TRUE(file_util::PathExists(psk_file)); | 
|  | 130 | driver_->psk_file_ = psk_file; | 
|  | 131 | return psk_file; | 
|  | 132 | } | 
|  | 133 |  | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 134 | TEST_F(L2TPIPSecDriverTest, GetProviderType) { | 
|  | 135 | EXPECT_EQ(flimflam::kProviderL2tpIpsec, driver_->GetProviderType()); | 
|  | 136 | } | 
|  | 137 |  | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 138 | TEST_F(L2TPIPSecDriverTest, Cleanup) { | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 139 | driver_->Cleanup(Service::kStateIdle);  // Ensure no crash. | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 140 |  | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 141 | const unsigned int kTag = 123; | 
|  | 142 | driver_->child_watch_tag_ = kTag; | 
|  | 143 | EXPECT_CALL(glib_, SourceRemove(kTag)); | 
|  | 144 | const int kPID = 123456; | 
|  | 145 | driver_->pid_ = kPID; | 
|  | 146 | EXPECT_CALL(glib_, SpawnClosePID(kPID)); | 
|  | 147 | driver_->service_ = service_; | 
|  | 148 | EXPECT_CALL(*service_, SetState(Service::kStateFailure)); | 
|  | 149 | driver_->rpc_task_.reset(new RPCTask(&control_, this)); | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 150 | FilePath psk_file = SetupPSKFile(); | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 151 | driver_->Cleanup(Service::kStateFailure); | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 152 | EXPECT_FALSE(file_util::PathExists(psk_file)); | 
|  | 153 | EXPECT_TRUE(driver_->psk_file_.empty()); | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 154 | EXPECT_EQ(0, driver_->child_watch_tag_); | 
|  | 155 | EXPECT_EQ(0, driver_->pid_); | 
|  | 156 | EXPECT_FALSE(driver_->rpc_task_.get()); | 
|  | 157 | EXPECT_FALSE(driver_->service_); | 
|  | 158 | } | 
|  | 159 |  | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 160 | TEST_F(L2TPIPSecDriverTest, DeletePSKFile) { | 
|  | 161 | FilePath psk_file = SetupPSKFile(); | 
|  | 162 | driver_->DeletePSKFile(); | 
|  | 163 | EXPECT_FALSE(file_util::PathExists(psk_file)); | 
|  | 164 | EXPECT_TRUE(driver_->psk_file_.empty()); | 
|  | 165 | } | 
|  | 166 |  | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 167 | TEST_F(L2TPIPSecDriverTest, InitEnvironment) { | 
|  | 168 | vector<string> env; | 
|  | 169 | driver_->rpc_task_.reset(new RPCTask(&control_, this)); | 
|  | 170 | driver_->InitEnvironment(&env); | 
|  | 171 | ASSERT_EQ(3, env.size()); | 
|  | 172 | EXPECT_EQ(string("CONNMAN_BUSNAME=") + RPCTaskMockAdaptor::kRpcConnId, | 
|  | 173 | env[0]); | 
|  | 174 | EXPECT_EQ(string("CONNMAN_INTERFACE=") + RPCTaskMockAdaptor::kRpcInterfaceId, | 
|  | 175 | env[1]); | 
|  | 176 | EXPECT_EQ(string("CONNMAN_PATH=") + RPCTaskMockAdaptor::kRpcId, env[2]); | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 177 | } | 
|  | 178 |  | 
|  | 179 | TEST_F(L2TPIPSecDriverTest, InitOptionsNoHost) { | 
|  | 180 | Error error; | 
|  | 181 | vector<string> options; | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 182 | EXPECT_FALSE(driver_->InitOptions(&options, &error)); | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 183 | EXPECT_EQ(Error::kInvalidArguments, error.type()); | 
|  | 184 | EXPECT_TRUE(options.empty()); | 
|  | 185 | } | 
|  | 186 |  | 
|  | 187 | TEST_F(L2TPIPSecDriverTest, InitOptions) { | 
|  | 188 | static const char kHost[] = "192.168.2.254"; | 
|  | 189 | static const char kCaCertNSS[] = "{1234}"; | 
|  | 190 | static const char kPSK[] = "foobar"; | 
|  | 191 |  | 
|  | 192 | SetArg(flimflam::kProviderHostProperty, kHost); | 
|  | 193 | SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS); | 
|  | 194 | SetArg(flimflam::kL2tpIpsecPskProperty, kPSK); | 
|  | 195 |  | 
|  | 196 | FilePath empty_cert; | 
|  | 197 | EXPECT_CALL(nss_, GetDERCertfile(kCaCertNSS, _)).WillOnce(Return(empty_cert)); | 
|  | 198 |  | 
|  | 199 | const FilePath temp_dir(temp_dir_.path()); | 
|  | 200 | EXPECT_CALL(manager_, run_path()).WillOnce(ReturnRef(temp_dir)); | 
|  | 201 |  | 
|  | 202 | Error error; | 
|  | 203 | vector<string> options; | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 204 | EXPECT_TRUE(driver_->InitOptions(&options, &error)); | 
| Darin Petkov | f7ef50a | 2012-04-16 20:54:31 +0200 | [diff] [blame] | 205 | EXPECT_TRUE(error.IsSuccess()); | 
|  | 206 |  | 
|  | 207 | ExpectInFlags(options, "--remote_host", kHost); | 
|  | 208 | ASSERT_FALSE(driver_->psk_file_.empty()); | 
|  | 209 | ExpectInFlags(options, "--psk_file", driver_->psk_file_.value()); | 
|  | 210 | } | 
|  | 211 |  | 
|  | 212 | TEST_F(L2TPIPSecDriverTest, InitPSKOptions) { | 
|  | 213 | Error error; | 
|  | 214 | vector<string> options; | 
|  | 215 | static const char kPSK[] = "foobar"; | 
|  | 216 | const FilePath bad_dir("/non/existent/directory"); | 
|  | 217 | const FilePath temp_dir(temp_dir_.path()); | 
|  | 218 | EXPECT_CALL(manager_, run_path()) | 
|  | 219 | .WillOnce(ReturnRef(bad_dir)) | 
|  | 220 | .WillOnce(ReturnRef(temp_dir)); | 
|  | 221 |  | 
|  | 222 | EXPECT_TRUE(driver_->InitPSKOptions(&options, &error)); | 
|  | 223 | EXPECT_TRUE(options.empty()); | 
|  | 224 | EXPECT_TRUE(error.IsSuccess()); | 
|  | 225 |  | 
|  | 226 | SetArg(flimflam::kL2tpIpsecPskProperty, kPSK); | 
|  | 227 |  | 
|  | 228 | EXPECT_FALSE(driver_->InitPSKOptions(&options, &error)); | 
|  | 229 | EXPECT_TRUE(options.empty()); | 
|  | 230 | EXPECT_EQ(Error::kInternalError, error.type()); | 
|  | 231 | error.Reset(); | 
|  | 232 |  | 
|  | 233 | EXPECT_TRUE(driver_->InitPSKOptions(&options, &error)); | 
|  | 234 | ASSERT_FALSE(driver_->psk_file_.empty()); | 
|  | 235 | ExpectInFlags(options, "--psk_file", driver_->psk_file_.value()); | 
|  | 236 | EXPECT_TRUE(error.IsSuccess()); | 
|  | 237 | string contents; | 
|  | 238 | EXPECT_TRUE( | 
|  | 239 | file_util::ReadFileToString(driver_->psk_file_, &contents)); | 
|  | 240 | EXPECT_EQ(kPSK, contents); | 
|  | 241 | struct stat buf; | 
|  | 242 | ASSERT_EQ(0, stat(driver_->psk_file_.value().c_str(), &buf)); | 
|  | 243 | EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, buf.st_mode); | 
|  | 244 | } | 
|  | 245 |  | 
|  | 246 | TEST_F(L2TPIPSecDriverTest, InitNSSOptions) { | 
|  | 247 | static const char kHost[] = "192.168.2.254"; | 
|  | 248 | static const char kCaCertNSS[] = "{1234}"; | 
|  | 249 | static const char kNSSCertfile[] = "/tmp/nss-cert"; | 
|  | 250 | FilePath empty_cert; | 
|  | 251 | FilePath nss_cert(kNSSCertfile); | 
|  | 252 | SetArg(flimflam::kProviderHostProperty, kHost); | 
|  | 253 | SetArg(flimflam::kL2tpIpsecCaCertNssProperty, kCaCertNSS); | 
|  | 254 | EXPECT_CALL(nss_, | 
|  | 255 | GetDERCertfile(kCaCertNSS, | 
|  | 256 | ElementsAreArray(kHost, arraysize(kHost) - 1))) | 
|  | 257 | .WillOnce(Return(empty_cert)) | 
|  | 258 | .WillOnce(Return(nss_cert)); | 
|  | 259 |  | 
|  | 260 | vector<string> options; | 
|  | 261 | driver_->InitNSSOptions(&options); | 
|  | 262 | EXPECT_TRUE(options.empty()); | 
|  | 263 | driver_->InitNSSOptions(&options); | 
|  | 264 | ExpectInFlags(options, "--server_ca_file", kNSSCertfile); | 
|  | 265 | } | 
|  | 266 |  | 
|  | 267 | TEST_F(L2TPIPSecDriverTest, AppendValueOption) { | 
|  | 268 | static const char kOption[] = "--l2tpipsec-option"; | 
|  | 269 | static const char kProperty[] = "L2TPIPSec.SomeProperty"; | 
|  | 270 | static const char kValue[] = "some-property-value"; | 
|  | 271 | static const char kOption2[] = "--l2tpipsec-option2"; | 
|  | 272 | static const char kProperty2[] = "L2TPIPSec.SomeProperty2"; | 
|  | 273 | static const char kValue2[] = "some-property-value2"; | 
|  | 274 |  | 
|  | 275 | vector<string> options; | 
|  | 276 | EXPECT_FALSE( | 
|  | 277 | driver_->AppendValueOption( | 
|  | 278 | "L2TPIPSec.UnknownProperty", kOption, &options)); | 
|  | 279 | EXPECT_TRUE(options.empty()); | 
|  | 280 |  | 
|  | 281 | SetArg(kProperty, ""); | 
|  | 282 | EXPECT_FALSE(driver_->AppendValueOption(kProperty, kOption, &options)); | 
|  | 283 | EXPECT_TRUE(options.empty()); | 
|  | 284 |  | 
|  | 285 | SetArg(kProperty, kValue); | 
|  | 286 | SetArg(kProperty2, kValue2); | 
|  | 287 | EXPECT_TRUE(driver_->AppendValueOption(kProperty, kOption, &options)); | 
|  | 288 | EXPECT_TRUE(driver_->AppendValueOption(kProperty2, kOption2, &options)); | 
|  | 289 | EXPECT_EQ(4, options.size()); | 
|  | 290 | EXPECT_EQ(kOption, options[0]); | 
|  | 291 | EXPECT_EQ(kValue, options[1]); | 
|  | 292 | EXPECT_EQ(kOption2, options[2]); | 
|  | 293 | EXPECT_EQ(kValue2, options[3]); | 
|  | 294 | } | 
|  | 295 |  | 
|  | 296 | TEST_F(L2TPIPSecDriverTest, AppendFlag) { | 
|  | 297 | static const char kTrueOption[] = "--l2tpipsec-option"; | 
|  | 298 | static const char kFalseOption[] = "--nol2tpipsec-option"; | 
|  | 299 | static const char kProperty[] = "L2TPIPSec.SomeProperty"; | 
|  | 300 | static const char kTrueOption2[] = "--l2tpipsec-option2"; | 
|  | 301 | static const char kFalseOption2[] = "--nol2tpipsec-option2"; | 
|  | 302 | static const char kProperty2[] = "L2TPIPSec.SomeProperty2"; | 
|  | 303 |  | 
|  | 304 | vector<string> options; | 
|  | 305 | EXPECT_FALSE(driver_->AppendFlag("L2TPIPSec.UnknownProperty", | 
|  | 306 | kTrueOption, kFalseOption, &options)); | 
|  | 307 | EXPECT_TRUE(options.empty()); | 
|  | 308 |  | 
|  | 309 | SetArg(kProperty, ""); | 
|  | 310 | EXPECT_FALSE( | 
|  | 311 | driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options)); | 
|  | 312 | EXPECT_TRUE(options.empty()); | 
|  | 313 |  | 
|  | 314 | SetArg(kProperty, "true"); | 
|  | 315 | SetArg(kProperty2, "false"); | 
|  | 316 | EXPECT_TRUE( | 
|  | 317 | driver_->AppendFlag(kProperty, kTrueOption, kFalseOption, &options)); | 
|  | 318 | EXPECT_TRUE( | 
|  | 319 | driver_->AppendFlag(kProperty2, kTrueOption2, kFalseOption2, &options)); | 
|  | 320 | EXPECT_EQ(2, options.size()); | 
|  | 321 | EXPECT_EQ(kTrueOption, options[0]); | 
|  | 322 | EXPECT_EQ(kFalseOption2, options[1]); | 
|  | 323 | } | 
|  | 324 |  | 
| Darin Petkov | 209e629 | 2012-04-20 11:33:32 +0200 | [diff] [blame] | 325 | TEST_F(L2TPIPSecDriverTest, GetLogin) { | 
|  | 326 | static const char kUser[] = "joesmith"; | 
|  | 327 | static const char kPassword[] = "random-password"; | 
|  | 328 | string user, password; | 
|  | 329 | SetArg(flimflam::kL2tpIpsecUserProperty, kUser); | 
|  | 330 | driver_->GetLogin(&user, &password); | 
|  | 331 | EXPECT_TRUE(user.empty()); | 
|  | 332 | EXPECT_TRUE(password.empty()); | 
|  | 333 | SetArg(flimflam::kL2tpIpsecUserProperty, ""); | 
|  | 334 | SetArg(flimflam::kL2tpIpsecPasswordProperty, kPassword); | 
|  | 335 | driver_->GetLogin(&user, &password); | 
|  | 336 | EXPECT_TRUE(user.empty()); | 
|  | 337 | EXPECT_TRUE(password.empty()); | 
|  | 338 | SetArg(flimflam::kL2tpIpsecUserProperty, kUser); | 
|  | 339 | driver_->GetLogin(&user, &password); | 
|  | 340 | EXPECT_EQ(kUser, user); | 
|  | 341 | EXPECT_EQ(kPassword, password); | 
|  | 342 | } | 
|  | 343 |  | 
|  | 344 | TEST_F(L2TPIPSecDriverTest, OnL2TPIPSecVPNDied) { | 
|  | 345 | const int kPID = 99999; | 
|  | 346 | driver_->child_watch_tag_ = 333; | 
|  | 347 | driver_->pid_ = kPID; | 
|  | 348 | EXPECT_CALL(glib_, SpawnClosePID(kPID)); | 
|  | 349 | L2TPIPSecDriver::OnL2TPIPSecVPNDied(kPID, 2, driver_); | 
|  | 350 | EXPECT_EQ(0, driver_->child_watch_tag_); | 
|  | 351 | EXPECT_EQ(0, driver_->pid_); | 
|  | 352 | } | 
|  | 353 |  | 
|  | 354 | namespace { | 
|  | 355 | MATCHER(CheckEnv, "") { | 
|  | 356 | if (!arg || !arg[0] || !arg[1] || !arg[2] || arg[3]) { | 
|  | 357 | return false; | 
|  | 358 | } | 
|  | 359 | return StartsWithASCII(arg[0], "CONNMAN_", true); | 
|  | 360 | } | 
|  | 361 | }  // namespace | 
|  | 362 |  | 
|  | 363 | TEST_F(L2TPIPSecDriverTest, SpawnL2TPIPSecVPN) { | 
|  | 364 | Error error; | 
|  | 365 | EXPECT_FALSE(driver_->SpawnL2TPIPSecVPN(&error)); | 
|  | 366 | EXPECT_TRUE(error.IsFailure()); | 
|  | 367 |  | 
|  | 368 | static const char kHost[] = "192.168.2.254"; | 
|  | 369 | SetArg(flimflam::kProviderHostProperty, kHost); | 
|  | 370 | driver_->rpc_task_.reset(new RPCTask(&control_, this)); | 
|  | 371 |  | 
|  | 372 | const int kPID = 234678; | 
|  | 373 | EXPECT_CALL(glib_, | 
|  | 374 | SpawnAsyncWithPipesCWD(_, CheckEnv(), _, _, _, _, _, _, _, _)) | 
|  | 375 | .WillOnce(Return(false)) | 
|  | 376 | .WillOnce(DoAll(SetArgumentPointee<5>(kPID), Return(true))); | 
|  | 377 | const int kTag = 6; | 
|  | 378 | EXPECT_CALL(glib_, ChildWatchAdd(kPID, &driver_->OnL2TPIPSecVPNDied, driver_)) | 
|  | 379 | .WillOnce(Return(kTag)); | 
|  | 380 | error.Reset(); | 
|  | 381 | EXPECT_FALSE(driver_->SpawnL2TPIPSecVPN(&error)); | 
|  | 382 | EXPECT_EQ(Error::kInternalError, error.type()); | 
|  | 383 | error.Reset(); | 
|  | 384 | EXPECT_TRUE(driver_->SpawnL2TPIPSecVPN(&error)); | 
|  | 385 | EXPECT_TRUE(error.IsSuccess()); | 
|  | 386 | EXPECT_EQ(kPID, driver_->pid_); | 
|  | 387 | EXPECT_EQ(kTag, driver_->child_watch_tag_); | 
|  | 388 | } | 
|  | 389 |  | 
|  | 390 | TEST_F(L2TPIPSecDriverTest, Connect) { | 
|  | 391 | EXPECT_CALL(*service_, SetState(Service::kStateConfiguring)); | 
|  | 392 | static const char kHost[] = "192.168.2.254"; | 
|  | 393 | SetArg(flimflam::kProviderHostProperty, kHost); | 
|  | 394 | EXPECT_CALL(glib_, SpawnAsyncWithPipesCWD(_, _, _, _, _, _, _, _, _, _)) | 
|  | 395 | .WillOnce(Return(true)); | 
|  | 396 | EXPECT_CALL(glib_, ChildWatchAdd(_, _, _)).WillOnce(Return(1)); | 
|  | 397 | Error error; | 
|  | 398 | driver_->Connect(service_, &error); | 
|  | 399 | EXPECT_TRUE(error.IsSuccess()); | 
|  | 400 | } | 
|  | 401 |  | 
| Darin Petkov | d432539 | 2012-04-23 15:48:22 +0200 | [diff] [blame] | 402 | TEST_F(L2TPIPSecDriverTest, InitPropertyStore) { | 
|  | 403 | // Sanity test property store initialization. | 
|  | 404 | PropertyStore store; | 
|  | 405 | driver_->InitPropertyStore(&store); | 
|  | 406 | const string kUser = "joe"; | 
|  | 407 | Error error; | 
|  | 408 | EXPECT_TRUE( | 
|  | 409 | store.SetStringProperty(flimflam::kL2tpIpsecUserProperty, kUser, &error)); | 
|  | 410 | EXPECT_TRUE(error.IsSuccess()); | 
|  | 411 | EXPECT_EQ(kUser, GetArgs()->GetString(flimflam::kL2tpIpsecUserProperty)); | 
|  | 412 | } | 
|  | 413 |  | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 414 | TEST_F(L2TPIPSecDriverTest, ParseIPConfiguration) { | 
|  | 415 | map<string, string> config; | 
|  | 416 | config["INTERNAL_IP4_ADDRESS"] = "4.5.6.7"; | 
|  | 417 | config["EXTERNAL_IP4_ADDRESS"] = "33.44.55.66"; | 
|  | 418 | config["GATEWAY_ADDRESS"] = "192.168.1.1"; | 
|  | 419 | config["DNS1"] = "1.1.1.1"; | 
|  | 420 | config["DNS2"] = "2.2.2.2"; | 
|  | 421 | config["INTERNAL_IFNAME"] = "ppp0"; | 
|  | 422 | config["LNS_ADDRESS"] = "99.88.77.66"; | 
|  | 423 | config["foo"] = "bar"; | 
|  | 424 | IPConfig::Properties props; | 
|  | 425 | string interface_name; | 
|  | 426 | L2TPIPSecDriver::ParseIPConfiguration(config, &props, &interface_name); | 
|  | 427 | EXPECT_EQ(IPAddress::kFamilyIPv4, props.address_family); | 
|  | 428 | EXPECT_EQ("4.5.6.7", props.address); | 
|  | 429 | EXPECT_EQ("33.44.55.66", props.peer_address); | 
|  | 430 | EXPECT_EQ("192.168.1.1", props.gateway); | 
|  | 431 | EXPECT_EQ("99.88.77.66", props.trusted_ip); | 
|  | 432 | ASSERT_EQ(2, props.dns_servers.size()); | 
|  | 433 | EXPECT_EQ("1.1.1.1", props.dns_servers[0]); | 
|  | 434 | EXPECT_EQ("2.2.2.2", props.dns_servers[1]); | 
|  | 435 | EXPECT_EQ("ppp0", interface_name); | 
|  | 436 | } | 
|  | 437 |  | 
|  | 438 | namespace { | 
|  | 439 | MATCHER_P(IsIPAddress, address, "") { | 
|  | 440 | IPAddress ip_address(IPAddress::kFamilyIPv4); | 
|  | 441 | EXPECT_TRUE(ip_address.SetAddressFromString(address)); | 
|  | 442 | return ip_address.Equals(arg); | 
|  | 443 | } | 
|  | 444 | }  // namespace | 
|  | 445 |  | 
|  | 446 | TEST_F(L2TPIPSecDriverTest, Notify) { | 
|  | 447 | map<string, string> config; | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 448 | config["INTERNAL_IFNAME"] = kInterfaceName; | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 449 | EXPECT_CALL(device_info_, GetIndex(kInterfaceName)) | 
|  | 450 | .WillOnce(Return(kInterfaceIndex)); | 
| Darin Petkov | f8046b8 | 2012-04-24 16:29:23 +0200 | [diff] [blame] | 451 | EXPECT_CALL(*device_, SetEnabled(true)); | 
|  | 452 | EXPECT_CALL(*device_, UpdateIPConfig(_)); | 
|  | 453 | driver_->device_ = device_; | 
| Darin Petkov | 0e9735d | 2012-04-24 12:33:45 +0200 | [diff] [blame] | 454 | FilePath psk_file = SetupPSKFile(); | 
|  | 455 | driver_->Notify("connect", config); | 
|  | 456 | EXPECT_FALSE(file_util::PathExists(psk_file)); | 
|  | 457 | EXPECT_TRUE(driver_->psk_file_.empty()); | 
|  | 458 | } | 
|  | 459 |  | 
| Darin Petkov | 7476a26 | 2012-04-12 16:30:46 +0200 | [diff] [blame] | 460 | }  // namespace shill |