third_party_vpn_driver_unittest.cc revision a63da1dc556b1ec9a5b3676a75665ad1a5fda0bc
1// Copyright 2014 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/vpn/third_party_vpn_driver.h" 6 7#include <gtest/gtest.h> 8 9#include "shill/mock_adaptors.h" 10#include "shill/mock_device_info.h" 11#include "shill/mock_event_dispatcher.h" 12#include "shill/mock_file_io.h" 13#include "shill/mock_glib.h" 14#include "shill/mock_manager.h" 15#include "shill/mock_metrics.h" 16#include "shill/mock_service.h" 17#include "shill/mock_store.h" 18#include "shill/mock_virtual_device.h" 19#include "shill/nice_mock_control.h" 20#include "shill/vpn/mock_vpn_service.h" 21 22using testing::_; 23using testing::Mock; 24using testing::NiceMock; 25using testing::Return; 26using testing::SetArgumentPointee; 27 28namespace shill { 29 30class ThirdPartyVpnDriverTest : public testing::Test { 31 public: 32 ThirdPartyVpnDriverTest() 33 : device_info_(&control_, &dispatcher_, &metrics_, &manager_), 34 metrics_(&dispatcher_), 35 manager_(&control_, &dispatcher_, &metrics_, &glib_), 36 driver_(new ThirdPartyVpnDriver(&control_, &dispatcher_, &metrics_, 37 &manager_, &device_info_)), 38 adaptor_interface_(new ThirdPartyVpnMockAdaptor()), 39 service_(new MockVPNService(&control_, &dispatcher_, &metrics_, 40 &manager_, driver_)), 41 device_(new MockVirtualDevice(&control_, &dispatcher_, &metrics_, 42 &manager_, kInterfaceName, 43 kInterfaceIndex, Technology::kVPN)) {} 44 45 virtual ~ThirdPartyVpnDriverTest() {} 46 47 virtual void SetUp() { 48 driver_->adaptor_interface_.reset(adaptor_interface_); 49 driver_->file_io_ = &mock_file_io_; 50 } 51 52 virtual void TearDown() { 53 driver_->device_ = nullptr; 54 driver_->service_ = nullptr; 55 driver_->file_io_ = nullptr; 56 } 57 58 protected: 59 static const char kConfigName[]; 60 static const char kInterfaceName[]; 61 static const int kInterfaceIndex; 62 63 NiceMockControl control_; 64 NiceMock<MockDeviceInfo> device_info_; 65 MockEventDispatcher dispatcher_; 66 MockMetrics metrics_; 67 MockFileIO mock_file_io_; 68 MockGLib glib_; 69 MockManager manager_; 70 ThirdPartyVpnDriver* driver_; // Owned by |service_| 71 ThirdPartyVpnMockAdaptor* adaptor_interface_; // Owned by |driver_| 72 scoped_refptr<MockVPNService> service_; 73 scoped_refptr<MockVirtualDevice> device_; 74}; 75 76const char ThirdPartyVpnDriverTest::kConfigName[] = "default-1"; 77const char ThirdPartyVpnDriverTest::kInterfaceName[] = "tun0"; 78const int ThirdPartyVpnDriverTest::kInterfaceIndex = 123; 79 80TEST_F(ThirdPartyVpnDriverTest, ConnectAndDisconnect) { 81 const std::string interface = kInterfaceName; 82 IOHandler* io_handler = new IOHandler(); // Owned by |driver_| 83 int fd = 1; 84 85 EXPECT_CALL(*service_, SetState(Service::kStateConfiguring)).Times(1); 86 EXPECT_CALL(device_info_, CreateTunnelInterface(_)) 87 .WillOnce(DoAll(SetArgumentPointee<0>(interface), Return(true))); 88 Error error; 89 driver_->Connect(service_, &error); 90 EXPECT_TRUE(error.IsSuccess()); 91 EXPECT_EQ(kInterfaceName, driver_->tunnel_interface_); 92 EXPECT_TRUE(driver_->IsConnectTimeoutStarted()); 93 94 EXPECT_CALL(device_info_, OpenTunnelInterface(interface)) 95 .WillOnce(Return(fd)); 96 EXPECT_CALL(dispatcher_, CreateInputHandler(fd, _, _)) 97 .WillOnce(Return(io_handler)); 98 EXPECT_CALL(*adaptor_interface_, EmitPlatformMessage(static_cast<uint32_t>( 99 ThirdPartyVpnDriver::kConnected))); 100 EXPECT_FALSE(driver_->ClaimInterface("eth1", kInterfaceIndex)); 101 EXPECT_TRUE(driver_->ClaimInterface(interface, kInterfaceIndex)); 102 EXPECT_EQ(driver_->active_client_, driver_); 103 EXPECT_TRUE(driver_->parameters_expected_); 104 EXPECT_EQ(driver_->io_handler_.get(), io_handler); 105 ASSERT_TRUE(driver_->device_); 106 EXPECT_EQ(kInterfaceIndex, driver_->device_->interface_index()); 107 108 EXPECT_CALL(*service_, SetState(Service::kStateIdle)).Times(1); 109 EXPECT_CALL(*adaptor_interface_, EmitPlatformMessage(static_cast<uint32_t>( 110 ThirdPartyVpnDriver::kDisconnected))); 111 EXPECT_CALL(mock_file_io_, Close(fd)); 112 driver_->Disconnect(); 113 EXPECT_EQ(driver_->io_handler_.get(), nullptr); 114} 115 116TEST_F(ThirdPartyVpnDriverTest, SendPacket) { 117 int fd = 1; 118 std::string error; 119 std::vector<uint8_t> ip_packet(5, 0); 120 driver_->SendPacket(ip_packet, &error); 121 EXPECT_EQ(error, "Unexpected call"); 122 123 error.clear(); 124 ThirdPartyVpnDriver::active_client_ = driver_; 125 driver_->SendPacket(ip_packet, &error); 126 EXPECT_EQ(error, "Device not open"); 127 128 driver_->tun_fd_ = fd; 129 error.clear(); 130 EXPECT_CALL(mock_file_io_, Write(fd, ip_packet.data(), ip_packet.size())) 131 .WillOnce(Return(ip_packet.size() - 1)); 132 EXPECT_CALL( 133 *adaptor_interface_, 134 EmitPlatformMessage(static_cast<uint32_t>(ThirdPartyVpnDriver::kError))); 135 driver_->SendPacket(ip_packet, &error); 136 EXPECT_EQ(error, "Partial write"); 137 138 error.clear(); 139 EXPECT_CALL(mock_file_io_, Write(fd, ip_packet.data(), ip_packet.size())) 140 .WillOnce(Return(ip_packet.size())); 141 driver_->SendPacket(ip_packet, &error); 142 EXPECT_TRUE(error.empty()); 143 144 driver_->tun_fd_ = -1; 145 146 EXPECT_CALL(*adaptor_interface_, EmitPlatformMessage(static_cast<uint32_t>( 147 ThirdPartyVpnDriver::kDisconnected))); 148} 149 150TEST_F(ThirdPartyVpnDriverTest, UpdateConnectionState) { 151 std::string error; 152 driver_->UpdateConnectionState(Service::kStateConfiguring, &error); 153 EXPECT_EQ(error, "Unexpected call"); 154 155 error.clear(); 156 ThirdPartyVpnDriver::active_client_ = driver_; 157 driver_->UpdateConnectionState(Service::kStateConfiguring, &error); 158 EXPECT_EQ(error, "Invalid argument"); 159 160 error.clear(); 161 driver_->service_ = service_; 162 EXPECT_CALL(*service_, SetState(_)).Times(0); 163 driver_->UpdateConnectionState(Service::kStateOnline, &error); 164 EXPECT_TRUE(error.empty()); 165 Mock::VerifyAndClearExpectations(service_.get()); 166 167 EXPECT_CALL(*service_, SetState(Service::kStateFailure)).Times(1); 168 EXPECT_CALL(*adaptor_interface_, EmitPlatformMessage(static_cast<uint32_t>( 169 ThirdPartyVpnDriver::kDisconnected))) 170 .Times(1); 171 driver_->UpdateConnectionState(Service::kStateFailure, &error); 172 EXPECT_TRUE(error.empty()); 173 Mock::VerifyAndClearExpectations(service_.get()); 174 Mock::VerifyAndClearExpectations(adaptor_interface_); 175} 176 177TEST_F(ThirdPartyVpnDriverTest, SetParameters) { 178 std::map<std::string, std::string> parameters; 179 std::string error; 180 std::string warning; 181 driver_->SetParameters(parameters, &error, &warning); 182 EXPECT_EQ(error, "Unexpected call"); 183 184 error.clear(); 185 ThirdPartyVpnDriver::active_client_ = driver_; 186 driver_->parameters_expected_ = true; 187 driver_->SetParameters(parameters, &error, &warning); 188 EXPECT_EQ(error, 189 "address is missing;subnet_prefix is missing;" 190 "dns_servers is missing;" 191 "exclusion_list is missing;inclusion_list is missing;"); 192 EXPECT_TRUE(warning.empty()); 193 194 error.clear(); 195 parameters["address"] = "1234.1.1.1"; 196 driver_->SetParameters(parameters, &error, &warning); 197 EXPECT_EQ(error, 198 "address is not a valid IP;subnet_prefix is missing;" 199 "dns_servers is missing;" 200 "exclusion_list is missing;inclusion_list is missing;"); 201 EXPECT_TRUE(warning.empty()); 202 203 error.clear(); 204 parameters["address"] = "123.211.21.18"; 205 driver_->SetParameters(parameters, &error, &warning); 206 EXPECT_EQ(error, 207 "subnet_prefix is missing;dns_servers is missing;" 208 "exclusion_list is missing;inclusion_list is missing;"); 209 EXPECT_TRUE(warning.empty()); 210 211 error.clear(); 212 parameters["subnet_prefix"] = "123"; 213 driver_->SetParameters(parameters, &error, &warning); 214 EXPECT_EQ(error, 215 "subnet_prefix not in expected range;dns_servers is missing;" 216 "exclusion_list is missing;inclusion_list is missing;"); 217 EXPECT_TRUE(warning.empty()); 218 219 error.clear(); 220 parameters["subnet_prefix"] = "12"; 221 driver_->SetParameters(parameters, &error, &warning); 222 EXPECT_EQ(error, "dns_servers is missing;" 223 "exclusion_list is missing;inclusion_list is missing;"); 224 EXPECT_TRUE(warning.empty()); 225 226 error.clear(); 227 parameters["dns_servers"] = "12 123123 43902374"; 228 driver_->SetParameters(parameters, &error, &warning); 229 EXPECT_EQ(error, "dns_servers has no valid values or is empty;" 230 "exclusion_list is missing;inclusion_list is missing;"); 231 EXPECT_EQ(warning, "12 for dns_servers is invalid;" 232 "123123 for dns_servers is invalid;" 233 "43902374 for dns_servers is invalid;"); 234 235 driver_->device_ = 236 new MockVirtualDevice(&control_, &dispatcher_, &metrics_, &manager_, 237 kInterfaceName, kInterfaceIndex, Technology::kVPN); 238 error.clear(); 239 warning.clear(); 240 parameters["exclusion_list"] = 241 "400.400.400.400/12 1.1.1.1/44 1.1.1.1/-1 " 242 "123.211.21.0/23 123.211.21.1/23 123.211.21.0/25 " 243 "1.1.1.1.1/12 1.1.1/13"; 244 parameters["dns_servers"] = ""; 245 driver_->SetParameters(parameters, &error, &warning); 246 EXPECT_EQ(error, "dns_servers has no valid values or is empty;" 247 "inclusion_list is missing;"); 248 EXPECT_EQ(warning, 249 "400.400.400.400/12 for exclusion_list is invalid;" 250 "1.1.1.1/44 for exclusion_list is invalid;" 251 "1.1.1.1/-1 for exclusion_list is invalid;" 252 "Duplicate entry for 123.211.21.1/23 in exclusion_list found;" 253 "1.1.1.1.1/12 for exclusion_list is invalid;" 254 "1.1.1/13 for exclusion_list is invalid;"); 255 256 error.clear(); 257 warning.clear(); 258 parameters["exclusion_list"] = "0.0.0.0/0 123.211.21.29/31 123.211.21.1/24"; 259 parameters["inclusion_list"] = 260 "400.400.400.400/12 1.1.1.1/44 1.1.1.1/-1 " 261 "123.211.22.0/24 123.211.22.1/24 " 262 "1.1.1.1.1/12 1.1.1/13 123.211.21.0/24"; 263 driver_->SetParameters(parameters, &error, &warning); 264 EXPECT_EQ(error, "dns_servers has no valid values or is empty;"); 265 EXPECT_EQ(warning, 266 "400.400.400.400/12 for inclusion_list is invalid;" 267 "1.1.1.1/44 for inclusion_list is invalid;" 268 "1.1.1.1/-1 for inclusion_list is invalid;" 269 "Duplicate entry for 123.211.22.1/24 in inclusion_list found;" 270 "1.1.1.1.1/12 for inclusion_list is invalid;" 271 "1.1.1/13 for inclusion_list is invalid;" 272 "Duplicate entry for 123.211.21.0/24 in inclusion_list found;"); 273 274 error.clear(); 275 warning.clear(); 276 parameters["dns_servers"] = "123.211.21.18 123.211.21.19"; 277 parameters["inclusion_list"] = "123.211.61.29/7 123.211.42.29/17"; 278 driver_->SetParameters(parameters, &error, &warning); 279 EXPECT_EQ(driver_->ip_properties_.exclusion_list.size(), 3); 280 EXPECT_EQ(driver_->ip_properties_.exclusion_list[0], "123.211.21.29/31"); 281 EXPECT_EQ(driver_->ip_properties_.exclusion_list[1], "0.0.0.0/0"); 282 EXPECT_EQ(driver_->ip_properties_.exclusion_list[2], "123.211.21.1/24"); 283 EXPECT_EQ(driver_->ip_properties_.routes.size(), 2); 284 EXPECT_EQ(driver_->ip_properties_.routes[0].host, "123.211.61.29"); 285 EXPECT_EQ(driver_->ip_properties_.routes[1].host, "123.211.42.29"); 286 EXPECT_EQ(driver_->ip_properties_.routes[0].netmask, "254.0.0.0"); 287 EXPECT_EQ(driver_->ip_properties_.routes[1].netmask, "255.255.128.0"); 288 EXPECT_EQ(driver_->ip_properties_.routes[0].gateway, parameters["address"]); 289 EXPECT_EQ(driver_->ip_properties_.routes[1].gateway, parameters["address"]); 290 EXPECT_TRUE(error.empty()); 291 EXPECT_TRUE(warning.empty()); 292 EXPECT_FALSE(driver_->parameters_expected_); 293 driver_->device_ = nullptr; 294} 295 296} // namespace shill 297