blob: 07bbdfb508ff2f0c5b8a4769d770e650aed26a5c [file] [log] [blame]
Darin Petkov33af05c2012-02-28 10:10:30 +01001// 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/vpn_provider.h"
6
7#include <chromeos/dbus/service_constants.h>
8#include <gtest/gtest.h>
9
10#include "shill/error.h"
11#include "shill/nice_mock_control.h"
12#include "shill/mock_adaptors.h"
Darin Petkov79d74c92012-03-07 17:20:32 +010013#include "shill/mock_device_info.h"
Paul Stewartca6abd42012-03-01 15:45:29 -080014#include "shill/mock_manager.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010015#include "shill/mock_metrics.h"
Paul Stewart66815332012-04-09 18:09:36 -070016#include "shill/mock_profile.h"
17#include "shill/mock_store.h"
Paul Stewartca6abd42012-03-01 15:45:29 -080018#include "shill/mock_vpn_driver.h"
Paul Stewart65512e12012-03-26 18:01:08 -070019#include "shill/mock_vpn_service.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010020
Paul Stewartca6abd42012-03-01 15:45:29 -080021using std::string;
22using testing::_;
Paul Stewart66815332012-04-09 18:09:36 -070023using testing::DoAll;
24using testing::NiceMock;
Paul Stewartca6abd42012-03-01 15:45:29 -080025using testing::Return;
Paul Stewart66815332012-04-09 18:09:36 -070026using testing::SetArgumentPointee;
Paul Stewartca6abd42012-03-01 15:45:29 -080027
Darin Petkov33af05c2012-02-28 10:10:30 +010028namespace shill {
29
30class VPNProviderTest : public testing::Test {
31 public:
32 VPNProviderTest()
Paul Stewartca6abd42012-03-01 15:45:29 -080033 : manager_(&control_, NULL, &metrics_, NULL),
Darin Petkov79d74c92012-03-07 17:20:32 +010034 device_info_(&control_, NULL, &metrics_, &manager_),
Paul Stewartca6abd42012-03-01 15:45:29 -080035 provider_(&control_, NULL, &metrics_, &manager_) {}
Darin Petkov33af05c2012-02-28 10:10:30 +010036
37 virtual ~VPNProviderTest() {}
38
39 protected:
Darin Petkov02867712012-03-12 14:25:05 +010040 static const char kHost[];
41 static const char kName[];
42
Darin Petkov33af05c2012-02-28 10:10:30 +010043 NiceMockControl control_;
44 MockMetrics metrics_;
Paul Stewartca6abd42012-03-01 15:45:29 -080045 MockManager manager_;
Darin Petkov79d74c92012-03-07 17:20:32 +010046 MockDeviceInfo device_info_;
Darin Petkov33af05c2012-02-28 10:10:30 +010047 VPNProvider provider_;
48};
49
Darin Petkov02867712012-03-12 14:25:05 +010050const char VPNProviderTest::kHost[] = "10.8.0.1";
51const char VPNProviderTest::kName[] = "vpn-name";
52
53TEST_F(VPNProviderTest, GetServiceNoType) {
Darin Petkov33af05c2012-02-28 10:10:30 +010054 KeyValueStore args;
55 Error e;
56 args.SetString(flimflam::kTypeProperty, flimflam::kTypeVPN);
57 VPNServiceRefPtr service = provider_.GetService(args, &e);
58 EXPECT_EQ(Error::kNotSupported, e.type());
59 EXPECT_FALSE(service);
60}
61
Darin Petkov02867712012-03-12 14:25:05 +010062TEST_F(VPNProviderTest, GetServiceUnsupportedType) {
Darin Petkov33af05c2012-02-28 10:10:30 +010063 KeyValueStore args;
64 Error e;
65 args.SetString(flimflam::kTypeProperty, flimflam::kTypeVPN);
66 args.SetString(flimflam::kProviderTypeProperty, "unknown-vpn-type");
Darin Petkov02867712012-03-12 14:25:05 +010067 args.SetString(flimflam::kProviderHostProperty, kHost);
68 args.SetString(flimflam::kProviderNameProperty, kName);
Darin Petkov33af05c2012-02-28 10:10:30 +010069 VPNServiceRefPtr service = provider_.GetService(args, &e);
70 EXPECT_EQ(Error::kNotSupported, e.type());
71 EXPECT_FALSE(service);
72}
73
Darin Petkov02867712012-03-12 14:25:05 +010074TEST_F(VPNProviderTest, GetService) {
Darin Petkov33af05c2012-02-28 10:10:30 +010075 KeyValueStore args;
76 Error e;
77 args.SetString(flimflam::kTypeProperty, flimflam::kTypeVPN);
78 args.SetString(flimflam::kProviderTypeProperty, flimflam::kProviderOpenVpn);
Darin Petkov02867712012-03-12 14:25:05 +010079 args.SetString(flimflam::kProviderHostProperty, kHost);
80 args.SetString(flimflam::kProviderNameProperty, kName);
Darin Petkov79d74c92012-03-07 17:20:32 +010081 EXPECT_CALL(manager_, device_info()).WillOnce(Return(&device_info_));
82 EXPECT_CALL(manager_, RegisterService(_));
Paul Stewart39964fa2012-04-04 09:50:25 -070083 VPNServiceRefPtr service0 = provider_.GetService(args, &e);
Darin Petkov33af05c2012-02-28 10:10:30 +010084 EXPECT_TRUE(e.IsSuccess());
Paul Stewart39964fa2012-04-04 09:50:25 -070085 ASSERT_TRUE(service0);
86 EXPECT_EQ("vpn_10_8_0_1_vpn_name", service0->GetStorageIdentifier());
87 EXPECT_EQ(kName, service0->friendly_name());
88
89 // A second call should return the same service.
90 VPNServiceRefPtr service1 = provider_.GetService(args, &e);
91 EXPECT_TRUE(e.IsSuccess());
92 ASSERT_EQ(service0.get(), service1.get());
Darin Petkov33af05c2012-02-28 10:10:30 +010093}
94
Paul Stewartca6abd42012-03-01 15:45:29 -080095TEST_F(VPNProviderTest, OnDeviceInfoAvailable) {
96 const string kInterfaceName("tun0");
97 const int kInterfaceIndex = 1;
98
99 scoped_ptr<MockVPNDriver> bad_driver(new MockVPNDriver());
100 EXPECT_CALL(*bad_driver.get(), ClaimInterface(_, _))
101 .Times(2)
102 .WillRepeatedly(Return(false));
103 provider_.services_.push_back(
104 new VPNService(&control_, NULL, &metrics_, NULL, bad_driver.release()));
105
106 EXPECT_FALSE(provider_.OnDeviceInfoAvailable(kInterfaceName,
107 kInterfaceIndex));
108
109 scoped_ptr<MockVPNDriver> good_driver(new MockVPNDriver());
110 EXPECT_CALL(*good_driver.get(), ClaimInterface(_, _))
111 .WillOnce(Return(true));
112 provider_.services_.push_back(
113 new VPNService(&control_, NULL, &metrics_, NULL, good_driver.release()));
114
115 scoped_ptr<MockVPNDriver> dup_driver(new MockVPNDriver());
116 EXPECT_CALL(*dup_driver.get(), ClaimInterface(_, _))
117 .Times(0);
118 provider_.services_.push_back(
119 new VPNService(&control_, NULL, &metrics_, NULL, dup_driver.release()));
120
121 EXPECT_TRUE(provider_.OnDeviceInfoAvailable(kInterfaceName, kInterfaceIndex));
122 provider_.services_.clear();
123}
124
Paul Stewart65512e12012-03-26 18:01:08 -0700125TEST_F(VPNProviderTest, RemoveService) {
126 scoped_refptr<MockVPNService> service0(
127 new MockVPNService(&control_, NULL, &metrics_, NULL, NULL));
128 scoped_refptr<MockVPNService> service1(
129 new MockVPNService(&control_, NULL, &metrics_, NULL, NULL));
130 scoped_refptr<MockVPNService> service2(
131 new MockVPNService(&control_, NULL, &metrics_, NULL, NULL));
132
133 provider_.services_.push_back(service0.get());
134 provider_.services_.push_back(service1.get());
135 provider_.services_.push_back(service2.get());
136
137 ASSERT_EQ(3, provider_.services_.size());
138
139 provider_.RemoveService(service1);
140
141 EXPECT_EQ(2, provider_.services_.size());
142 EXPECT_EQ(service0, provider_.services_[0]);
143 EXPECT_EQ(service2, provider_.services_[1]);
144
145 provider_.RemoveService(service2);
146
147 EXPECT_EQ(1, provider_.services_.size());
148 EXPECT_EQ(service0, provider_.services_[0]);
149
150 provider_.RemoveService(service0);
151 EXPECT_EQ(0, provider_.services_.size());
152}
153
Paul Stewart66815332012-04-09 18:09:36 -0700154MATCHER_P(ServiceWithStorageId, storage_id, "") {
155 return arg->GetStorageIdentifier() == storage_id;
156}
157
158TEST_F(VPNProviderTest, CreateServicesFromProfile) {
159 scoped_refptr<MockProfile> profile(
160 new NiceMock<MockProfile>(&control_, &manager_, ""));
161 NiceMock<MockStore> storage;
162 EXPECT_CALL(*profile, GetConstStorage())
163 .WillRepeatedly(Return(&storage));
164 EXPECT_CALL(storage, GetString(_, _, _))
165 .WillRepeatedly(Return(false));
166
167 std::set<string> groups;
168 const string kNonVPNIdentifier("foo_123_456");
169 groups.insert(kNonVPNIdentifier);
170 const string kVPNIdentifier0("vpn_123_456");
171 const string kVPNIdentifier1("vpn_789_012");
172 groups.insert(kVPNIdentifier0);
173 groups.insert(kVPNIdentifier1);
174 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kProviderTypeProperty))
175 .WillRepeatedly(Return(groups));
176
177 EXPECT_CALL(*profile, ConfigureService(ServiceWithStorageId(kVPNIdentifier1)))
178 .WillOnce(Return(true));
179
Paul Stewart451aa7f2012-04-11 19:07:58 -0700180 const string kName("name");
181 EXPECT_CALL(storage, GetString(_, flimflam::kNameProperty, _))
182 .WillRepeatedly(DoAll(SetArgumentPointee<2>(kName), Return(true)));
183
Paul Stewart66815332012-04-09 18:09:36 -0700184 const string kProviderTypeUnknown("unknown");
185 EXPECT_CALL(storage, GetString(kVPNIdentifier0,
186 flimflam::kProviderTypeProperty,
187 _))
188 .WillRepeatedly(DoAll(SetArgumentPointee<2>(kProviderTypeUnknown),
189 Return(true)));
Paul Stewart451aa7f2012-04-11 19:07:58 -0700190
Paul Stewart66815332012-04-09 18:09:36 -0700191 const string kProviderTypeOpenVPN(flimflam::kProviderOpenVpn);
192 EXPECT_CALL(storage, GetString(kVPNIdentifier1,
193 flimflam::kProviderTypeProperty,
194 _))
195 .WillRepeatedly(DoAll(SetArgumentPointee<2>(kProviderTypeOpenVPN),
196 Return(true)));
197
198 EXPECT_CALL(manager_, device_info())
199 .WillRepeatedly(Return(reinterpret_cast<DeviceInfo *>(NULL)));
200
201 EXPECT_CALL(manager_, RegisterService(ServiceWithStorageId(kVPNIdentifier1)))
202 .Times(1);
203
204 provider_.CreateServicesFromProfile(profile);
205
206 // Calling this again should not create any more services (checked by the
207 // Times(1) above).
208 provider_.CreateServicesFromProfile(profile);
209}
210
Darin Petkov9d1bbe72012-04-25 10:58:59 +0200211TEST_F(VPNProviderTest, CreateService) {
212 static const char kName[] = "test-vpn-service";
213 static const char kStorageID[] = "test_vpn_storage_id";
214 static const char *kTypes[] = {
215 flimflam::kProviderOpenVpn,
216 flimflam::kProviderL2tpIpsec,
217 };
218 const size_t kTypesCount = arraysize(kTypes);
219 EXPECT_CALL(manager_, device_info())
220 .Times(kTypesCount)
221 .WillRepeatedly(Return(&device_info_));
222 EXPECT_CALL(manager_, RegisterService(_)).Times(kTypesCount);
223 for (size_t i = 0; i < kTypesCount; i++) {
224 Error error;
225 VPNServiceRefPtr service =
226 provider_.CreateService(kTypes[i], kName, kStorageID, &error);
227 ASSERT_TRUE(service) << kTypes[i];
228 ASSERT_TRUE(service->driver()) << kTypes[i];
229 EXPECT_EQ(kTypes[i], service->driver()->GetProviderType());
230 EXPECT_EQ(kName, service->friendly_name()) << kTypes[i];
231 EXPECT_EQ(kStorageID, service->GetStorageIdentifier()) << kTypes[i];
232 EXPECT_TRUE(error.IsSuccess()) << kTypes[i];
233 }
234 Error error;
235 VPNServiceRefPtr unknown_service =
236 provider_.CreateService("unknown-vpn-type", kName, kStorageID, &error);
237 EXPECT_FALSE(unknown_service);
238 EXPECT_EQ(Error::kNotSupported, error.type());
239}
240
Darin Petkov33af05c2012-02-28 10:10:30 +0100241} // namespace shill