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