third_party_vpn_driver_unittest.cc revision 2240e8c03451c6b6f21eb8944d8a1c0747ac10b3
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(Service::kStateConnected)).Times(1);
163  driver_->UpdateConnectionState(Service::kStateConnected, &error);
164  EXPECT_TRUE(error.empty());
165}
166
167TEST_F(ThirdPartyVpnDriverTest, SetParameters) {
168  std::map<std::string, std::string> parameters;
169  std::string error;
170  driver_->SetParameters(parameters, &error);
171  EXPECT_EQ(error, "Unexpected call");
172
173  error.clear();
174  ThirdPartyVpnDriver::active_client_ = driver_;
175  driver_->parameters_expected_ = true;
176  driver_->SetParameters(parameters, &error);
177  EXPECT_EQ(error,
178            "address is missing;subnet_prefix is missing;"
179            "dns_servers is missing;bypass_tunnel_for_ip is missing;");
180
181  error.clear();
182  parameters["address"] = "1234.1.1.1";
183  driver_->SetParameters(parameters, &error);
184  EXPECT_EQ(error,
185            "address is not a valid IP;subnet_prefix is missing;"
186            "dns_servers is missing;bypass_tunnel_for_ip is missing;");
187
188  error.clear();
189  parameters["address"] = "123.211.21.18";
190  driver_->SetParameters(parameters, &error);
191  EXPECT_EQ(error,
192            "subnet_prefix is missing;dns_servers is missing;"
193            "bypass_tunnel_for_ip is missing;");
194
195  error.clear();
196  parameters["bypass_tunnel_for_ip"] = "1234.1.1.1";
197  driver_->SetParameters(parameters, &error);
198  EXPECT_EQ(error,
199            "subnet_prefix is missing;dns_servers is missing;"
200            "bypass_tunnel_for_ip has no valid values or is empty;");
201
202  error.clear();
203  parameters["bypass_tunnel_for_ip"] = "123.211.21.18";
204  driver_->SetParameters(parameters, &error);
205  EXPECT_EQ(error, "subnet_prefix is missing;dns_servers is missing;");
206
207  error.clear();
208  parameters["subnet_prefix"] = "123";
209  driver_->SetParameters(parameters, &error);
210  EXPECT_EQ(error,
211            "subnet_prefix not in expected range;dns_servers is missing;");
212
213  error.clear();
214  parameters["subnet_prefix"] = "12";
215  driver_->SetParameters(parameters, &error);
216  EXPECT_EQ(error, "dns_servers is missing;");
217
218  error.clear();
219  parameters["dns_servers"] = "12 123123 43902374";
220  driver_->SetParameters(parameters, &error);
221  EXPECT_EQ(error, "dns_servers has no valid values or is empty;");
222
223  driver_->device_ =
224      new MockVirtualDevice(&control_, &dispatcher_, &metrics_, &manager_,
225                            kInterfaceName, kInterfaceIndex, Technology::kVPN);
226  error.clear();
227  parameters["dns_servers"] = "123.211.21.18 123.211.21.19";
228  driver_->SetParameters(parameters, &error);
229  EXPECT_TRUE(error.empty());
230  EXPECT_FALSE(driver_->parameters_expected_);
231  driver_->device_ = nullptr;
232}
233
234}  // namespace shill
235