blob: 9a26d81ccdd4bbb50c03c4534ad2449bfa895a97 [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_));
50 }
51
52 virtual void TearDown() {
53 EXPECT_CALL(device_info_, FlushAddresses(0));
54 }
55
56 void SetServiceState(Service::ConnectState state) {
57 service_->state_ = state;
58 }
59
60 std::string interface_name_;
Darin Petkov33af05c2012-02-28 10:10:30 +010061 MockVPNDriver *driver_; // Owned by |service_|.
62 NiceMockControl control_;
Darin Petkova0e645e2012-04-25 11:38:59 +020063 MockManager manager_;
Darin Petkov33af05c2012-02-28 10:10:30 +010064 MockMetrics metrics_;
Darin Petkov5eb05422012-05-11 15:45:25 +020065 MockDeviceInfo device_info_;
66 scoped_refptr<NiceMock<MockConnection> > connection_;
67 MockSockets *sockets_; // Owned by |service_|.
Darin Petkov33af05c2012-02-28 10:10:30 +010068 VPNServiceRefPtr service_;
69};
70
Darin Petkov2f903b32012-04-18 12:56:43 +020071TEST_F(VPNServiceTest, TechnologyIs) {
72 EXPECT_TRUE(service_->TechnologyIs(Technology::kVPN));
73 EXPECT_FALSE(service_->TechnologyIs(Technology::kEthernet));
74}
75
Darin Petkov33af05c2012-02-28 10:10:30 +010076TEST_F(VPNServiceTest, Connect) {
Darin Petkov2f903b32012-04-18 12:56:43 +020077 EXPECT_TRUE(service_->connectable());
Darin Petkov33af05c2012-02-28 10:10:30 +010078 Error error;
Darin Petkov79d74c92012-03-07 17:20:32 +010079 EXPECT_CALL(*driver_, Connect(_, &error));
Darin Petkov33af05c2012-02-28 10:10:30 +010080 service_->Connect(&error);
Darin Petkov79d74c92012-03-07 17:20:32 +010081 EXPECT_TRUE(error.IsSuccess());
Darin Petkov33af05c2012-02-28 10:10:30 +010082}
83
Darin Petkov2f903b32012-04-18 12:56:43 +020084TEST_F(VPNServiceTest, ConnectAlreadyConnected) {
85 Error error;
86 EXPECT_CALL(*driver_, Connect(_, _)).Times(0);
Darin Petkov5eb05422012-05-11 15:45:25 +020087 SetServiceState(Service::kStateOnline);
Darin Petkov2f903b32012-04-18 12:56:43 +020088 service_->Connect(&error);
89 EXPECT_EQ(Error::kAlreadyConnected, error.type());
90 error.Reset();
Darin Petkov5eb05422012-05-11 15:45:25 +020091 SetServiceState(Service::kStateConfiguring);
Darin Petkov2f903b32012-04-18 12:56:43 +020092 service_->Connect(&error);
93 EXPECT_EQ(Error::kAlreadyConnected, error.type());
94}
95
Darin Petkov6aa21872012-03-09 16:10:19 +010096TEST_F(VPNServiceTest, Disconnect) {
97 Error error;
98 EXPECT_CALL(*driver_, Disconnect());
99 service_->Disconnect(&error);
100 EXPECT_TRUE(error.IsSuccess());
101}
102
Darin Petkov02867712012-03-12 14:25:05 +0100103TEST_F(VPNServiceTest, CreateStorageIdentifierNoHost) {
104 KeyValueStore args;
105 Error error;
106 args.SetString(flimflam::kProviderNameProperty, "vpn-name");
107 EXPECT_EQ("", VPNService::CreateStorageIdentifier(args, &error));
108 EXPECT_EQ(Error::kInvalidProperty, error.type());
109}
110
111TEST_F(VPNServiceTest, CreateStorageIdentifierNoName) {
112 KeyValueStore args;
113 Error error;
114 args.SetString(flimflam::kProviderHostProperty, "10.8.0.1");
115 EXPECT_EQ("", VPNService::CreateStorageIdentifier(args, &error));
116 EXPECT_EQ(Error::kNotSupported, error.type());
117}
118
119TEST_F(VPNServiceTest, CreateStorageIdentifier) {
120 KeyValueStore args;
121 Error error;
122 args.SetString(flimflam::kProviderNameProperty, "vpn-name");
123 args.SetString(flimflam::kProviderHostProperty, "10.8.0.1");
124 EXPECT_EQ("vpn_10_8_0_1_vpn_name",
125 VPNService::CreateStorageIdentifier(args, &error));
126 EXPECT_TRUE(error.IsSuccess());
127}
128
Darin Petkov33af05c2012-02-28 10:10:30 +0100129TEST_F(VPNServiceTest, GetStorageIdentifier) {
130 EXPECT_EQ("", service_->GetStorageIdentifier());
Darin Petkov02867712012-03-12 14:25:05 +0100131 service_->set_storage_id("foo");
132 EXPECT_EQ("foo", service_->GetStorageIdentifier());
Darin Petkov33af05c2012-02-28 10:10:30 +0100133}
134
135TEST_F(VPNServiceTest, GetDeviceRpcId) {
136 Error error;
137 EXPECT_EQ("/", service_->GetDeviceRpcId(&error));
138 EXPECT_EQ(Error::kNotSupported, error.type());
139}
140
Darin Petkovf3c71d72012-03-21 12:32:15 +0100141TEST_F(VPNServiceTest, Load) {
142 NiceMock<MockStore> storage;
143 static const char kStorageID[] = "storage-id";
144 service_->set_storage_id(kStorageID);
145 EXPECT_CALL(storage, ContainsGroup(kStorageID)).WillOnce(Return(true));
Darin Petkovcb715292012-04-25 13:04:37 +0200146 EXPECT_CALL(*driver_, Load(&storage, kStorageID))
147 .WillOnce(Return(true));
Darin Petkovf3c71d72012-03-21 12:32:15 +0100148 EXPECT_TRUE(service_->Load(&storage));
149}
150
151TEST_F(VPNServiceTest, Save) {
152 NiceMock<MockStore> storage;
153 static const char kStorageID[] = "storage-id";
154 service_->set_storage_id(kStorageID);
Darin Petkovcb715292012-04-25 13:04:37 +0200155 EXPECT_CALL(*driver_, Save(&storage, kStorageID, false))
156 .WillOnce(Return(true));
Darin Petkovf3c71d72012-03-21 12:32:15 +0100157 EXPECT_TRUE(service_->Save(&storage));
158}
159
Darin Petkovcb715292012-04-25 13:04:37 +0200160TEST_F(VPNServiceTest, SaveCredentials) {
161 NiceMock<MockStore> storage;
162 static const char kStorageID[] = "storage-id";
163 service_->set_storage_id(kStorageID);
164 service_->set_save_credentials(true);
165 EXPECT_CALL(*driver_, Save(&storage, kStorageID, true))
166 .WillOnce(Return(true));
167 EXPECT_TRUE(service_->Save(&storage));
168}
169
170TEST_F(VPNServiceTest, Unload) {
171 service_->set_auto_connect(true);
172 service_->set_save_credentials(true);
173 EXPECT_CALL(*driver_, Disconnect());
174 EXPECT_CALL(*driver_, UnloadCredentials());
Paul Stewart8c116a92012-05-02 18:30:03 -0700175 MockVPNProvider provider;
176 EXPECT_CALL(manager_, vpn_provider()).WillRepeatedly(Return(&provider));
177 provider.services_.push_back(service_);
Darin Petkovcb715292012-04-25 13:04:37 +0200178 service_->Unload();
179 EXPECT_FALSE(service_->auto_connect());
180 EXPECT_FALSE(service_->save_credentials());
Paul Stewart8c116a92012-05-02 18:30:03 -0700181 EXPECT_TRUE(provider.services_.empty());
Darin Petkovcb715292012-04-25 13:04:37 +0200182}
183
Paul Stewartebd38562012-03-23 13:06:40 -0700184TEST_F(VPNServiceTest, InitPropertyStore) {
185 EXPECT_CALL(*driver_, InitPropertyStore(service_->mutable_store()));
186 service_->InitDriverPropertyStore();
187}
188
Darin Petkov1d0080a2012-04-30 17:10:36 +0200189TEST_F(VPNServiceTest, MakeFavorite) {
190 EXPECT_FALSE(service_->favorite());
191 EXPECT_FALSE(service_->auto_connect());
192 service_->MakeFavorite();
193 EXPECT_TRUE(service_->favorite());
194 EXPECT_FALSE(service_->auto_connect());
195}
196
Darin Petkov5eb05422012-05-11 15:45:25 +0200197TEST_F(VPNServiceTest, SetConnection) {
198 EXPECT_FALSE(service_->connection_binder_.get());
199 EXPECT_FALSE(service_->connection());
200 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
201 service_->SetConnection(connection_);
202 ASSERT_TRUE(service_->connection_binder_.get());
203 EXPECT_EQ(connection_.get(),
204 service_->connection_binder_->connection().get());
205 EXPECT_EQ(connection_.get(), service_->connection().get());
206 EXPECT_CALL(*driver_, OnConnectionDisconnected()).Times(0);
207}
208
209TEST_F(VPNServiceTest, OnConnectionDisconnected) {
210 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
211 service_->SetConnection(connection_);
212 EXPECT_CALL(*driver_, OnConnectionDisconnected()).Times(1);
213 connection_->OnLowerDisconnect();
214}
215
Darin Petkov33af05c2012-02-28 10:10:30 +0100216} // namespace shill