blob: 645f67d36e5728d98239b2ff9ee82592ed88ef4a [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_service.h"
6
Darin Petkov02867712012-03-12 14:25:05 +01007#include <chromeos/dbus/service_constants.h>
Darin Petkov33af05c2012-02-28 10:10:30 +01008#include <gtest/gtest.h>
9
10#include "shill/error.h"
11#include "shill/nice_mock_control.h"
12#include "shill/mock_adaptors.h"
Darin Petkov5eb05422012-05-11 15:45:25 +020013#include "shill/mock_connection.h"
14#include "shill/mock_device_info.h"
Darin Petkova0e645e2012-04-25 11:38:59 +020015#include "shill/mock_manager.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010016#include "shill/mock_metrics.h"
Darin Petkov5eb05422012-05-11 15:45:25 +020017#include "shill/mock_sockets.h"
Darin Petkovf3c71d72012-03-21 12:32:15 +010018#include "shill/mock_store.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010019#include "shill/mock_vpn_driver.h"
Paul Stewart8c116a92012-05-02 18:30:03 -070020#include "shill/mock_vpn_provider.h"
Darin Petkov33af05c2012-02-28 10:10:30 +010021
Darin Petkov5eb05422012-05-11 15:45:25 +020022using std::string;
Darin Petkov79d74c92012-03-07 17:20:32 +010023using testing::_;
Darin Petkovf3c71d72012-03-21 12:32:15 +010024using testing::NiceMock;
25using testing::Return;
Darin Petkov5eb05422012-05-11 15:45:25 +020026using testing::ReturnRef;
Darin Petkov79d74c92012-03-07 17:20:32 +010027
Darin Petkov33af05c2012-02-28 10:10:30 +010028namespace shill {
29
30class VPNServiceTest : public testing::Test {
31 public:
32 VPNServiceTest()
Darin Petkov5eb05422012-05-11 15:45:25 +020033 : interface_name_("test-interface"),
34 driver_(new MockVPNDriver()),
Darin Petkova0e645e2012-04-25 11:38:59 +020035 manager_(&control_, NULL, NULL, NULL),
Darin Petkov5eb05422012-05-11 15:45:25 +020036 device_info_(&control_, NULL, NULL, NULL),
37 connection_(new NiceMock<MockConnection>(&device_info_)),
38 sockets_(new MockSockets()),
Darin Petkova0e645e2012-04-25 11:38:59 +020039 service_(new VPNService(&control_, NULL, &metrics_, &manager_,
Darin Petkov5eb05422012-05-11 15:45:25 +020040 driver_)) {
41 service_->sockets_.reset(sockets_); // Passes ownership.
42 }
Darin Petkov33af05c2012-02-28 10:10:30 +010043
44 virtual ~VPNServiceTest() {}
45
46 protected:
Darin Petkov5eb05422012-05-11 15:45:25 +020047 virtual void SetUp() {
48 ON_CALL(*connection_, interface_name())
49 .WillByDefault(ReturnRef(interface_name_));
Paul Stewart1e3bc4962012-09-14 12:20:22 -070050 ON_CALL(*connection_, ipconfig_rpc_identifier())
51 .WillByDefault(ReturnRef(ipconfig_rpc_identifier_));
Darin Petkov5eb05422012-05-11 15:45:25 +020052 }
53
54 virtual void TearDown() {
55 EXPECT_CALL(device_info_, FlushAddresses(0));
56 }
57
58 void SetServiceState(Service::ConnectState state) {
59 service_->state_ = state;
60 }
61
62 std::string interface_name_;
Paul Stewart1e3bc4962012-09-14 12:20:22 -070063 std::string ipconfig_rpc_identifier_;
Darin Petkov33af05c2012-02-28 10:10:30 +010064 MockVPNDriver *driver_; // Owned by |service_|.
65 NiceMockControl control_;
Darin Petkova0e645e2012-04-25 11:38:59 +020066 MockManager manager_;
Darin Petkov33af05c2012-02-28 10:10:30 +010067 MockMetrics metrics_;
Darin Petkov5eb05422012-05-11 15:45:25 +020068 MockDeviceInfo device_info_;
69 scoped_refptr<NiceMock<MockConnection> > connection_;
70 MockSockets *sockets_; // Owned by |service_|.
Darin Petkov33af05c2012-02-28 10:10:30 +010071 VPNServiceRefPtr service_;
72};
73
74TEST_F(VPNServiceTest, Connect) {
Darin Petkov2f903b32012-04-18 12:56:43 +020075 EXPECT_TRUE(service_->connectable());
Darin Petkov33af05c2012-02-28 10:10:30 +010076 Error error;
Darin Petkov79d74c92012-03-07 17:20:32 +010077 EXPECT_CALL(*driver_, Connect(_, &error));
Darin Petkov33af05c2012-02-28 10:10:30 +010078 service_->Connect(&error);
Darin Petkov79d74c92012-03-07 17:20:32 +010079 EXPECT_TRUE(error.IsSuccess());
Darin Petkov33af05c2012-02-28 10:10:30 +010080}
81
Darin Petkov2f903b32012-04-18 12:56:43 +020082TEST_F(VPNServiceTest, ConnectAlreadyConnected) {
83 Error error;
84 EXPECT_CALL(*driver_, Connect(_, _)).Times(0);
Darin Petkov5eb05422012-05-11 15:45:25 +020085 SetServiceState(Service::kStateOnline);
Darin Petkov2f903b32012-04-18 12:56:43 +020086 service_->Connect(&error);
87 EXPECT_EQ(Error::kAlreadyConnected, error.type());
88 error.Reset();
Darin Petkov5eb05422012-05-11 15:45:25 +020089 SetServiceState(Service::kStateConfiguring);
Darin Petkov2f903b32012-04-18 12:56:43 +020090 service_->Connect(&error);
91 EXPECT_EQ(Error::kAlreadyConnected, error.type());
92}
93
Darin Petkov6aa21872012-03-09 16:10:19 +010094TEST_F(VPNServiceTest, Disconnect) {
95 Error error;
96 EXPECT_CALL(*driver_, Disconnect());
97 service_->Disconnect(&error);
98 EXPECT_TRUE(error.IsSuccess());
99}
100
Darin Petkov02867712012-03-12 14:25:05 +0100101TEST_F(VPNServiceTest, CreateStorageIdentifierNoHost) {
102 KeyValueStore args;
103 Error error;
104 args.SetString(flimflam::kProviderNameProperty, "vpn-name");
105 EXPECT_EQ("", VPNService::CreateStorageIdentifier(args, &error));
106 EXPECT_EQ(Error::kInvalidProperty, error.type());
107}
108
109TEST_F(VPNServiceTest, CreateStorageIdentifierNoName) {
110 KeyValueStore args;
111 Error error;
112 args.SetString(flimflam::kProviderHostProperty, "10.8.0.1");
113 EXPECT_EQ("", VPNService::CreateStorageIdentifier(args, &error));
114 EXPECT_EQ(Error::kNotSupported, error.type());
115}
116
117TEST_F(VPNServiceTest, CreateStorageIdentifier) {
118 KeyValueStore args;
119 Error error;
120 args.SetString(flimflam::kProviderNameProperty, "vpn-name");
121 args.SetString(flimflam::kProviderHostProperty, "10.8.0.1");
122 EXPECT_EQ("vpn_10_8_0_1_vpn_name",
123 VPNService::CreateStorageIdentifier(args, &error));
124 EXPECT_TRUE(error.IsSuccess());
125}
126
Darin Petkov33af05c2012-02-28 10:10:30 +0100127TEST_F(VPNServiceTest, GetStorageIdentifier) {
128 EXPECT_EQ("", service_->GetStorageIdentifier());
Darin Petkov02867712012-03-12 14:25:05 +0100129 service_->set_storage_id("foo");
130 EXPECT_EQ("foo", service_->GetStorageIdentifier());
Darin Petkov33af05c2012-02-28 10:10:30 +0100131}
132
133TEST_F(VPNServiceTest, GetDeviceRpcId) {
134 Error error;
135 EXPECT_EQ("/", service_->GetDeviceRpcId(&error));
136 EXPECT_EQ(Error::kNotSupported, error.type());
137}
138
Darin Petkovf3c71d72012-03-21 12:32:15 +0100139TEST_F(VPNServiceTest, Load) {
140 NiceMock<MockStore> storage;
141 static const char kStorageID[] = "storage-id";
142 service_->set_storage_id(kStorageID);
143 EXPECT_CALL(storage, ContainsGroup(kStorageID)).WillOnce(Return(true));
Darin Petkovcb715292012-04-25 13:04:37 +0200144 EXPECT_CALL(*driver_, Load(&storage, kStorageID))
145 .WillOnce(Return(true));
Darin Petkovf3c71d72012-03-21 12:32:15 +0100146 EXPECT_TRUE(service_->Load(&storage));
147}
148
149TEST_F(VPNServiceTest, Save) {
150 NiceMock<MockStore> storage;
151 static const char kStorageID[] = "storage-id";
152 service_->set_storage_id(kStorageID);
Darin Petkovcb715292012-04-25 13:04:37 +0200153 EXPECT_CALL(*driver_, Save(&storage, kStorageID, false))
154 .WillOnce(Return(true));
Darin Petkovf3c71d72012-03-21 12:32:15 +0100155 EXPECT_TRUE(service_->Save(&storage));
156}
157
Darin Petkovcb715292012-04-25 13:04:37 +0200158TEST_F(VPNServiceTest, SaveCredentials) {
159 NiceMock<MockStore> storage;
160 static const char kStorageID[] = "storage-id";
161 service_->set_storage_id(kStorageID);
162 service_->set_save_credentials(true);
163 EXPECT_CALL(*driver_, Save(&storage, kStorageID, true))
164 .WillOnce(Return(true));
165 EXPECT_TRUE(service_->Save(&storage));
166}
167
168TEST_F(VPNServiceTest, Unload) {
169 service_->set_auto_connect(true);
170 service_->set_save_credentials(true);
171 EXPECT_CALL(*driver_, Disconnect());
172 EXPECT_CALL(*driver_, UnloadCredentials());
Paul Stewart8c116a92012-05-02 18:30:03 -0700173 MockVPNProvider provider;
174 EXPECT_CALL(manager_, vpn_provider()).WillRepeatedly(Return(&provider));
175 provider.services_.push_back(service_);
Darin Petkovcb715292012-04-25 13:04:37 +0200176 service_->Unload();
177 EXPECT_FALSE(service_->auto_connect());
178 EXPECT_FALSE(service_->save_credentials());
Paul Stewart8c116a92012-05-02 18:30:03 -0700179 EXPECT_TRUE(provider.services_.empty());
Darin Petkovcb715292012-04-25 13:04:37 +0200180}
181
Paul Stewartebd38562012-03-23 13:06:40 -0700182TEST_F(VPNServiceTest, InitPropertyStore) {
183 EXPECT_CALL(*driver_, InitPropertyStore(service_->mutable_store()));
184 service_->InitDriverPropertyStore();
185}
186
Darin Petkov1d0080a2012-04-30 17:10:36 +0200187TEST_F(VPNServiceTest, MakeFavorite) {
188 EXPECT_FALSE(service_->favorite());
189 EXPECT_FALSE(service_->auto_connect());
190 service_->MakeFavorite();
191 EXPECT_TRUE(service_->favorite());
192 EXPECT_FALSE(service_->auto_connect());
193}
194
Darin Petkov5eb05422012-05-11 15:45:25 +0200195TEST_F(VPNServiceTest, SetConnection) {
196 EXPECT_FALSE(service_->connection_binder_.get());
197 EXPECT_FALSE(service_->connection());
198 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
199 service_->SetConnection(connection_);
200 ASSERT_TRUE(service_->connection_binder_.get());
201 EXPECT_EQ(connection_.get(),
202 service_->connection_binder_->connection().get());
203 EXPECT_EQ(connection_.get(), service_->connection().get());
204 EXPECT_CALL(*driver_, OnConnectionDisconnected()).Times(0);
205}
206
207TEST_F(VPNServiceTest, OnConnectionDisconnected) {
208 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
209 service_->SetConnection(connection_);
210 EXPECT_CALL(*driver_, OnConnectionDisconnected()).Times(1);
211 connection_->OnLowerDisconnect();
212}
213
Darin Petkov33af05c2012-02-28 10:10:30 +0100214} // namespace shill