blob: 68b763b9b3329f24cfd58e18712eef52d5108e13 [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
Alex Vakulenko8a532292014-06-16 17:18:44 -07005#include <string>
6
Darin Petkov33af05c2012-02-28 10:10:30 +01007#include "shill/vpn_service.h"
8
Darin Petkov02867712012-03-12 14:25:05 +01009#include <chromeos/dbus/service_constants.h>
Darin Petkov33af05c2012-02-28 10:10:30 +010010#include <gtest/gtest.h>
11
Darin Petkov9c6e9812013-03-26 13:49:07 +010012#include "shill/dbus_adaptor.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010013#include "shill/error.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010014#include "shill/mock_adaptors.h"
Darin Petkov5eb05422012-05-11 15:45:25 +020015#include "shill/mock_connection.h"
16#include "shill/mock_device_info.h"
Darin Petkova0e645e2012-04-25 11:38:59 +020017#include "shill/mock_manager.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010018#include "shill/mock_metrics.h"
Darin Petkov9c6e9812013-03-26 13:49:07 +010019#include "shill/mock_profile.h"
Darin Petkov5eb05422012-05-11 15:45:25 +020020#include "shill/mock_sockets.h"
Darin Petkovf3c71d72012-03-21 12:32:15 +010021#include "shill/mock_store.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010022#include "shill/mock_vpn_driver.h"
Paul Stewart8c116a92012-05-02 18:30:03 -070023#include "shill/mock_vpn_provider.h"
Alex Vakulenkoa41ab512014-07-23 14:24:23 -070024#include "shill/nice_mock_control.h"
mukesh agrawalcbfb34e2013-04-17 19:33:25 -070025#include "shill/service_property_change_test.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010026
Darin Petkov5eb05422012-05-11 15:45:25 +020027using std::string;
Darin Petkov79d74c92012-03-07 17:20:32 +010028using testing::_;
Alex Deymofddc09a2013-07-03 18:41:31 -070029using testing::Mock;
Darin Petkovf3c71d72012-03-21 12:32:15 +010030using testing::NiceMock;
31using testing::Return;
Darin Petkov5eb05422012-05-11 15:45:25 +020032using testing::ReturnRef;
Paul Stewart7f5d9c02013-12-03 18:26:00 -080033using testing::ReturnRefOfCopy;
Darin Petkov79d74c92012-03-07 17:20:32 +010034
Darin Petkov33af05c2012-02-28 10:10:30 +010035namespace shill {
36
37class VPNServiceTest : public testing::Test {
38 public:
39 VPNServiceTest()
Darin Petkov5eb05422012-05-11 15:45:25 +020040 : interface_name_("test-interface"),
41 driver_(new MockVPNDriver()),
Darin Petkova0e645e2012-04-25 11:38:59 +020042 manager_(&control_, NULL, NULL, NULL),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080043 metrics_(NULL),
Darin Petkov5eb05422012-05-11 15:45:25 +020044 device_info_(&control_, NULL, NULL, NULL),
45 connection_(new NiceMock<MockConnection>(&device_info_)),
46 sockets_(new MockSockets()),
Darin Petkova0e645e2012-04-25 11:38:59 +020047 service_(new VPNService(&control_, NULL, &metrics_, &manager_,
Darin Petkov5eb05422012-05-11 15:45:25 +020048 driver_)) {
49 service_->sockets_.reset(sockets_); // Passes ownership.
50 }
Darin Petkov33af05c2012-02-28 10:10:30 +010051
52 virtual ~VPNServiceTest() {}
53
54 protected:
Darin Petkov5eb05422012-05-11 15:45:25 +020055 virtual void SetUp() {
56 ON_CALL(*connection_, interface_name())
57 .WillByDefault(ReturnRef(interface_name_));
Paul Stewart1e3bc4962012-09-14 12:20:22 -070058 ON_CALL(*connection_, ipconfig_rpc_identifier())
59 .WillByDefault(ReturnRef(ipconfig_rpc_identifier_));
Darin Petkov5eb05422012-05-11 15:45:25 +020060 }
61
62 virtual void TearDown() {
63 EXPECT_CALL(device_info_, FlushAddresses(0));
64 }
65
66 void SetServiceState(Service::ConnectState state) {
67 service_->state_ = state;
68 }
69
Darin Petkov79349f02013-01-24 16:18:26 +010070 void SetHasEverConnected(bool connected) {
71 service_->has_ever_connected_ = connected;
72 }
73
74 void SetConnectable(bool connectable) {
75 service_->connectable_ = connectable;
76 }
77
Darin Petkov4cbff5b2013-01-29 16:29:05 +010078 const char *GetAutoConnOffline() {
79 return Service::kAutoConnOffline;
80 }
81
82 const char *GetAutoConnNeverConnected() {
83 return VPNService::kAutoConnNeverConnected;
84 }
85
86 const char *GetAutoConnVPNAlreadyActive() {
87 return VPNService::kAutoConnVPNAlreadyActive;
88 }
89
90 bool IsAutoConnectable(const char **reason) const {
91 return service_->IsAutoConnectable(reason);
92 }
93
Darin Petkovc3505a52013-03-18 15:13:29 +010094 // Takes ownership of |provider|.
95 void SetVPNProvider(VPNProvider *provider) {
96 manager_.vpn_provider_.reset(provider);
Paul Stewartb87d22b2013-07-29 11:11:37 -070097 manager_.UpdateProviderMapping();
Darin Petkovc3505a52013-03-18 15:13:29 +010098 }
99
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700100 ServiceMockAdaptor *GetAdaptor() {
101 return dynamic_cast<ServiceMockAdaptor *>(service_->adaptor());
102 }
103
Darin Petkov5eb05422012-05-11 15:45:25 +0200104 std::string interface_name_;
Paul Stewart1e3bc4962012-09-14 12:20:22 -0700105 std::string ipconfig_rpc_identifier_;
Darin Petkov33af05c2012-02-28 10:10:30 +0100106 MockVPNDriver *driver_; // Owned by |service_|.
107 NiceMockControl control_;
Darin Petkova0e645e2012-04-25 11:38:59 +0200108 MockManager manager_;
Darin Petkov33af05c2012-02-28 10:10:30 +0100109 MockMetrics metrics_;
Darin Petkov5eb05422012-05-11 15:45:25 +0200110 MockDeviceInfo device_info_;
111 scoped_refptr<NiceMock<MockConnection> > connection_;
112 MockSockets *sockets_; // Owned by |service_|.
Darin Petkov33af05c2012-02-28 10:10:30 +0100113 VPNServiceRefPtr service_;
114};
115
116TEST_F(VPNServiceTest, Connect) {
Darin Petkov2f903b32012-04-18 12:56:43 +0200117 EXPECT_TRUE(service_->connectable());
Darin Petkov33af05c2012-02-28 10:10:30 +0100118 Error error;
Darin Petkov79d74c92012-03-07 17:20:32 +0100119 EXPECT_CALL(*driver_, Connect(_, &error));
mukesh agrawaldc7b8442012-09-27 13:48:14 -0700120 service_->Connect(&error, "in test");
Darin Petkov79d74c92012-03-07 17:20:32 +0100121 EXPECT_TRUE(error.IsSuccess());
Darin Petkov33af05c2012-02-28 10:10:30 +0100122}
123
Darin Petkov2f903b32012-04-18 12:56:43 +0200124TEST_F(VPNServiceTest, ConnectAlreadyConnected) {
125 Error error;
126 EXPECT_CALL(*driver_, Connect(_, _)).Times(0);
Darin Petkov5eb05422012-05-11 15:45:25 +0200127 SetServiceState(Service::kStateOnline);
mukesh agrawaldc7b8442012-09-27 13:48:14 -0700128 service_->Connect(&error, "in test");
Darin Petkov2f903b32012-04-18 12:56:43 +0200129 EXPECT_EQ(Error::kAlreadyConnected, error.type());
130 error.Reset();
Darin Petkov5eb05422012-05-11 15:45:25 +0200131 SetServiceState(Service::kStateConfiguring);
mukesh agrawaldc7b8442012-09-27 13:48:14 -0700132 service_->Connect(&error, "in test");
mukesh agrawaldba10462013-06-04 11:36:21 -0700133 EXPECT_EQ(Error::kInProgress, error.type());
Darin Petkov2f903b32012-04-18 12:56:43 +0200134}
135
Darin Petkov6aa21872012-03-09 16:10:19 +0100136TEST_F(VPNServiceTest, Disconnect) {
137 Error error;
138 EXPECT_CALL(*driver_, Disconnect());
Samuel Tan0d061192014-07-07 15:45:15 -0700139 service_->Disconnect(&error, "in test");
Darin Petkov6aa21872012-03-09 16:10:19 +0100140 EXPECT_TRUE(error.IsSuccess());
141}
142
Darin Petkov02867712012-03-12 14:25:05 +0100143TEST_F(VPNServiceTest, CreateStorageIdentifierNoHost) {
144 KeyValueStore args;
145 Error error;
Ben Chan73728782013-09-20 13:40:54 -0700146 args.SetString(kNameProperty, "vpn-name");
Darin Petkov02867712012-03-12 14:25:05 +0100147 EXPECT_EQ("", VPNService::CreateStorageIdentifier(args, &error));
148 EXPECT_EQ(Error::kInvalidProperty, error.type());
149}
150
151TEST_F(VPNServiceTest, CreateStorageIdentifierNoName) {
152 KeyValueStore args;
153 Error error;
Ben Chan73728782013-09-20 13:40:54 -0700154 args.SetString(kProviderHostProperty, "10.8.0.1");
Darin Petkov02867712012-03-12 14:25:05 +0100155 EXPECT_EQ("", VPNService::CreateStorageIdentifier(args, &error));
156 EXPECT_EQ(Error::kNotSupported, error.type());
157}
158
159TEST_F(VPNServiceTest, CreateStorageIdentifier) {
160 KeyValueStore args;
161 Error error;
Ben Chan73728782013-09-20 13:40:54 -0700162 args.SetString(kNameProperty, "vpn-name");
163 args.SetString(kProviderHostProperty, "10.8.0.1");
Darin Petkov02867712012-03-12 14:25:05 +0100164 EXPECT_EQ("vpn_10_8_0_1_vpn_name",
165 VPNService::CreateStorageIdentifier(args, &error));
166 EXPECT_TRUE(error.IsSuccess());
167}
168
Darin Petkov33af05c2012-02-28 10:10:30 +0100169TEST_F(VPNServiceTest, GetStorageIdentifier) {
170 EXPECT_EQ("", service_->GetStorageIdentifier());
Darin Petkov02867712012-03-12 14:25:05 +0100171 service_->set_storage_id("foo");
172 EXPECT_EQ("foo", service_->GetStorageIdentifier());
Darin Petkov33af05c2012-02-28 10:10:30 +0100173}
174
175TEST_F(VPNServiceTest, GetDeviceRpcId) {
176 Error error;
177 EXPECT_EQ("/", service_->GetDeviceRpcId(&error));
178 EXPECT_EQ(Error::kNotSupported, error.type());
179}
180
Darin Petkovf3c71d72012-03-21 12:32:15 +0100181TEST_F(VPNServiceTest, Load) {
182 NiceMock<MockStore> storage;
183 static const char kStorageID[] = "storage-id";
184 service_->set_storage_id(kStorageID);
185 EXPECT_CALL(storage, ContainsGroup(kStorageID)).WillOnce(Return(true));
Darin Petkovcb715292012-04-25 13:04:37 +0200186 EXPECT_CALL(*driver_, Load(&storage, kStorageID))
187 .WillOnce(Return(true));
Darin Petkovf3c71d72012-03-21 12:32:15 +0100188 EXPECT_TRUE(service_->Load(&storage));
189}
190
191TEST_F(VPNServiceTest, Save) {
192 NiceMock<MockStore> storage;
193 static const char kStorageID[] = "storage-id";
194 service_->set_storage_id(kStorageID);
Darin Petkovcb715292012-04-25 13:04:37 +0200195 EXPECT_CALL(*driver_, Save(&storage, kStorageID, false))
196 .WillOnce(Return(true));
Darin Petkovf3c71d72012-03-21 12:32:15 +0100197 EXPECT_TRUE(service_->Save(&storage));
198}
199
Darin Petkovcb715292012-04-25 13:04:37 +0200200TEST_F(VPNServiceTest, SaveCredentials) {
201 NiceMock<MockStore> storage;
202 static const char kStorageID[] = "storage-id";
203 service_->set_storage_id(kStorageID);
204 service_->set_save_credentials(true);
205 EXPECT_CALL(*driver_, Save(&storage, kStorageID, true))
206 .WillOnce(Return(true));
207 EXPECT_TRUE(service_->Save(&storage));
208}
209
210TEST_F(VPNServiceTest, Unload) {
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700211 service_->SetAutoConnect(true);
Darin Petkovcb715292012-04-25 13:04:37 +0200212 service_->set_save_credentials(true);
213 EXPECT_CALL(*driver_, Disconnect());
214 EXPECT_CALL(*driver_, UnloadCredentials());
Darin Petkovc3505a52013-03-18 15:13:29 +0100215 MockVPNProvider *provider = new MockVPNProvider;
216 SetVPNProvider(provider);
217 provider->services_.push_back(service_);
Darin Petkovcb715292012-04-25 13:04:37 +0200218 service_->Unload();
219 EXPECT_FALSE(service_->auto_connect());
220 EXPECT_FALSE(service_->save_credentials());
Darin Petkovc3505a52013-03-18 15:13:29 +0100221 EXPECT_TRUE(provider->services_.empty());
Darin Petkovcb715292012-04-25 13:04:37 +0200222}
223
Paul Stewartebd38562012-03-23 13:06:40 -0700224TEST_F(VPNServiceTest, InitPropertyStore) {
225 EXPECT_CALL(*driver_, InitPropertyStore(service_->mutable_store()));
226 service_->InitDriverPropertyStore();
227}
228
Paul Stewart2da34c02013-10-17 15:28:56 -0700229TEST_F(VPNServiceTest, EnableAndRetainAutoConnect) {
230 EXPECT_FALSE(service_->retain_auto_connect());
Darin Petkov1d0080a2012-04-30 17:10:36 +0200231 EXPECT_FALSE(service_->auto_connect());
Paul Stewart2da34c02013-10-17 15:28:56 -0700232 service_->EnableAndRetainAutoConnect();
233 EXPECT_TRUE(service_->retain_auto_connect());
Darin Petkov1d0080a2012-04-30 17:10:36 +0200234 EXPECT_FALSE(service_->auto_connect());
235}
236
Darin Petkov5eb05422012-05-11 15:45:25 +0200237TEST_F(VPNServiceTest, SetConnection) {
238 EXPECT_FALSE(service_->connection_binder_.get());
239 EXPECT_FALSE(service_->connection());
240 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
241 service_->SetConnection(connection_);
242 ASSERT_TRUE(service_->connection_binder_.get());
243 EXPECT_EQ(connection_.get(),
244 service_->connection_binder_->connection().get());
245 EXPECT_EQ(connection_.get(), service_->connection().get());
246 EXPECT_CALL(*driver_, OnConnectionDisconnected()).Times(0);
247}
248
249TEST_F(VPNServiceTest, OnConnectionDisconnected) {
250 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
251 service_->SetConnection(connection_);
252 EXPECT_CALL(*driver_, OnConnectionDisconnected()).Times(1);
253 connection_->OnLowerDisconnect();
254}
255
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100256TEST_F(VPNServiceTest, IsAutoConnectableOffline) {
257 EXPECT_TRUE(service_->connectable());
258 const char *reason = NULL;
Peter Qiu700de642014-07-14 16:31:30 -0700259 EXPECT_CALL(manager_, IsConnected()).WillOnce(Return(false));
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100260 EXPECT_FALSE(IsAutoConnectable(&reason));
261 EXPECT_STREQ(GetAutoConnOffline(), reason);
262}
263
264TEST_F(VPNServiceTest, IsAutoConnectableNeverConnected) {
Darin Petkov79349f02013-01-24 16:18:26 +0100265 EXPECT_TRUE(service_->connectable());
266 EXPECT_FALSE(service_->has_ever_connected());
Darin Petkov79349f02013-01-24 16:18:26 +0100267 const char *reason = NULL;
Peter Qiu700de642014-07-14 16:31:30 -0700268 EXPECT_CALL(manager_, IsConnected()).WillOnce(Return(true));
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100269 EXPECT_FALSE(IsAutoConnectable(&reason));
270 EXPECT_STREQ(GetAutoConnNeverConnected(), reason);
271}
Darin Petkov79349f02013-01-24 16:18:26 +0100272
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100273TEST_F(VPNServiceTest, IsAutoConnectableVPNAlreadyActive) {
274 EXPECT_TRUE(service_->connectable());
Darin Petkov79349f02013-01-24 16:18:26 +0100275 SetHasEverConnected(true);
Peter Qiu700de642014-07-14 16:31:30 -0700276 EXPECT_CALL(manager_, IsConnected()).WillOnce(Return(true));
Darin Petkovc3505a52013-03-18 15:13:29 +0100277 MockVPNProvider *provider = new MockVPNProvider;
278 SetVPNProvider(provider);
279 EXPECT_CALL(*provider, HasActiveService()).WillOnce(Return(true));
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100280 const char *reason = NULL;
281 EXPECT_FALSE(IsAutoConnectable(&reason));
282 EXPECT_STREQ(GetAutoConnVPNAlreadyActive(), reason);
283}
Darin Petkov79349f02013-01-24 16:18:26 +0100284
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100285TEST_F(VPNServiceTest, IsAutoConnectableNotConnectable) {
286 const char *reason = NULL;
Darin Petkov79349f02013-01-24 16:18:26 +0100287 SetConnectable(false);
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100288 EXPECT_FALSE(IsAutoConnectable(&reason));
289}
290
291TEST_F(VPNServiceTest, IsAutoConnectable) {
292 EXPECT_TRUE(service_->connectable());
293 SetHasEverConnected(true);
Peter Qiu700de642014-07-14 16:31:30 -0700294 EXPECT_CALL(manager_, IsConnected()).WillOnce(Return(true));
Darin Petkovc3505a52013-03-18 15:13:29 +0100295 MockVPNProvider *provider = new MockVPNProvider;
296 SetVPNProvider(provider);
297 EXPECT_CALL(*provider, HasActiveService()).WillOnce(Return(false));
Darin Petkov4cbff5b2013-01-29 16:29:05 +0100298 const char *reason = NULL;
299 EXPECT_TRUE(IsAutoConnectable(&reason));
300 EXPECT_FALSE(reason);
Darin Petkov79349f02013-01-24 16:18:26 +0100301}
302
Darin Petkov9c6e9812013-03-26 13:49:07 +0100303TEST_F(VPNServiceTest, SetNamePropertyTrivial) {
304 DBus::Error error;
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700305 // A null change returns false, but with error set to success.
306 EXPECT_FALSE(DBusAdaptor::SetProperty(service_->mutable_store(),
Ben Chan73728782013-09-20 13:40:54 -0700307 kNameProperty,
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700308 DBusAdaptor::StringToVariant(
309 service_->friendly_name()),
310 &error));
311 EXPECT_FALSE(error.is_set());
Darin Petkov9c6e9812013-03-26 13:49:07 +0100312}
313
314TEST_F(VPNServiceTest, SetNameProperty) {
315 const string kHost = "1.2.3.4";
Ben Chan73728782013-09-20 13:40:54 -0700316 driver_->args()->SetString(kProviderHostProperty, kHost);
Darin Petkov9c6e9812013-03-26 13:49:07 +0100317 string kOldId = service_->GetStorageIdentifier();
318 DBus::Error error;
319 const string kName = "New Name";
320 scoped_refptr<MockProfile> profile(
321 new MockProfile(&control_, &metrics_, &manager_));
322 EXPECT_CALL(*profile, DeleteEntry(kOldId, _));
323 EXPECT_CALL(*profile, UpdateService(_));
324 service_->set_profile(profile);
325 EXPECT_TRUE(DBusAdaptor::SetProperty(service_->mutable_store(),
Ben Chan73728782013-09-20 13:40:54 -0700326 kNameProperty,
Darin Petkov9c6e9812013-03-26 13:49:07 +0100327 DBusAdaptor::StringToVariant(kName),
328 &error));
329 EXPECT_NE(service_->GetStorageIdentifier(), kOldId);
330 EXPECT_EQ(kName, service_->friendly_name());
331}
332
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700333TEST_F(VPNServiceTest, PropertyChanges) {
334 TestCommonPropertyChanges(service_, GetAdaptor());
335 TestAutoConnectPropertyChange(service_, GetAdaptor());
336
337 const string kHost = "1.2.3.4";
338 scoped_refptr<MockProfile> profile(
339 new NiceMock<MockProfile>(&control_, &metrics_, &manager_));
340 service_->set_profile(profile);
Ben Chan73728782013-09-20 13:40:54 -0700341 driver_->args()->SetString(kProviderHostProperty, kHost);
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700342 TestNamePropertyChange(service_, GetAdaptor());
343}
344
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700345// Custom property setters should return false, and make no changes, if
346// the new value is the same as the old value.
347TEST_F(VPNServiceTest, CustomSetterNoopChange) {
348 TestCustomSetterNoopChange(service_, &manager_);
349}
350
Alex Deymofddc09a2013-07-03 18:41:31 -0700351TEST_F(VPNServiceTest, GetPhysicalTechologyPropertyFailsIfNoCarrier) {
352 scoped_refptr<Connection> null_connection;
353
354 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
355 service_->SetConnection(connection_);
356 EXPECT_EQ(connection_.get(), service_->connection().get());
357
358 // Simulate an error in the GetCarrierConnection() returning a NULL reference.
359 EXPECT_CALL(*connection_, GetCarrierConnection())
360 .WillOnce(Return(null_connection));
361
362 Error error;
363 EXPECT_EQ("", service_->GetPhysicalTechologyProperty(&error));
364 EXPECT_EQ(Error::kOperationFailed, error.type());
365}
366
367TEST_F(VPNServiceTest, GetPhysicalTechologyPropertyOverWifi) {
368 scoped_refptr<NiceMock<MockConnection>> lower_connection_ =
369 new NiceMock<MockConnection>(&device_info_);
370
371 EXPECT_CALL(*connection_, technology())
372 .Times(0);
373 EXPECT_CALL(*connection_, GetCarrierConnection())
374 .WillOnce(Return(lower_connection_));
375
376 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
377 service_->SetConnection(connection_);
378 EXPECT_EQ(connection_.get(), service_->connection().get());
379
380 // Set the type of the lower connection to "wifi" and expect that type to be
381 // returned by GetPhysical TechnologyProperty().
382 EXPECT_CALL(*lower_connection_, technology())
383 .WillOnce(Return(Technology::kWifi));
384
385 Error error;
Ben Chan73728782013-09-20 13:40:54 -0700386 EXPECT_EQ(kTypeWifi, service_->GetPhysicalTechologyProperty(&error));
Alex Deymofddc09a2013-07-03 18:41:31 -0700387 EXPECT_TRUE(error.IsSuccess());
388
389 // Clear expectations now, so the Return(lower_connection_) action releases
390 // the reference to |lower_connection_| allowing it to be destroyed now.
391 Mock::VerifyAndClearExpectations(connection_);
392 // Destroying the |lower_connection_| at function exit will also call an extra
393 // FlushAddresses on the |device_info_| object.
394 EXPECT_CALL(device_info_, FlushAddresses(0));
395}
396
Paul Stewart7f5d9c02013-12-03 18:26:00 -0800397TEST_F(VPNServiceTest, GetTethering) {
398 scoped_refptr<Connection> null_connection;
399
400 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
401 service_->SetConnection(connection_);
402 EXPECT_EQ(connection_.get(), service_->connection().get());
403
404 // Simulate an error in the GetCarrierConnection() returning a NULL reference.
405 EXPECT_CALL(*connection_, GetCarrierConnection())
406 .WillOnce(Return(null_connection));
407
408 {
409 Error error;
410 EXPECT_EQ("", service_->GetTethering(&error));
411 EXPECT_EQ(Error::kOperationFailed, error.type());
412 }
413
414 scoped_refptr<NiceMock<MockConnection>> lower_connection_ =
415 new NiceMock<MockConnection>(&device_info_);
416
417 EXPECT_CALL(*connection_, tethering()).Times(0);
418 EXPECT_CALL(*connection_, GetCarrierConnection())
419 .WillRepeatedly(Return(lower_connection_));
420
421 const char kTethering[] = "moon unit";
422 EXPECT_CALL(*lower_connection_, tethering())
423 .WillOnce(ReturnRefOfCopy(string(kTethering)))
424 .WillOnce(ReturnRefOfCopy(string()));
425
426 {
427 Error error;
428 EXPECT_EQ(kTethering, service_->GetTethering(&error));
429 EXPECT_TRUE(error.IsSuccess());
430 }
431 {
432 Error error;
433 EXPECT_EQ("", service_->GetTethering(&error));
434 EXPECT_EQ(Error::kNotSupported, error.type());
435 }
436
437 // Clear expectations now, so the Return(lower_connection_) action releases
438 // the reference to |lower_connection_| allowing it to be destroyed now.
439 Mock::VerifyAndClearExpectations(connection_);
440 // Destroying the |lower_connection_| at function exit will also call an extra
441 // FlushAddresses on the |device_info_| object.
442 EXPECT_CALL(device_info_, FlushAddresses(0));
443}
444
Darin Petkov33af05c2012-02-28 10:10:30 +0100445} // namespace shill