blob: 310fb1ceff327a2610f8bbdfd6ba588cfa13756a [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
71TEST_F(VPNServiceTest, Connect) {
Darin Petkov2f903b32012-04-18 12:56:43 +020072 EXPECT_TRUE(service_->connectable());
Darin Petkov33af05c2012-02-28 10:10:30 +010073 Error error;
Darin Petkov79d74c92012-03-07 17:20:32 +010074 EXPECT_CALL(*driver_, Connect(_, &error));
Darin Petkov33af05c2012-02-28 10:10:30 +010075 service_->Connect(&error);
Darin Petkov79d74c92012-03-07 17:20:32 +010076 EXPECT_TRUE(error.IsSuccess());
Darin Petkov33af05c2012-02-28 10:10:30 +010077}
78
Darin Petkov2f903b32012-04-18 12:56:43 +020079TEST_F(VPNServiceTest, ConnectAlreadyConnected) {
80 Error error;
81 EXPECT_CALL(*driver_, Connect(_, _)).Times(0);
Darin Petkov5eb05422012-05-11 15:45:25 +020082 SetServiceState(Service::kStateOnline);
Darin Petkov2f903b32012-04-18 12:56:43 +020083 service_->Connect(&error);
84 EXPECT_EQ(Error::kAlreadyConnected, error.type());
85 error.Reset();
Darin Petkov5eb05422012-05-11 15:45:25 +020086 SetServiceState(Service::kStateConfiguring);
Darin Petkov2f903b32012-04-18 12:56:43 +020087 service_->Connect(&error);
88 EXPECT_EQ(Error::kAlreadyConnected, error.type());
89}
90
Darin Petkov6aa21872012-03-09 16:10:19 +010091TEST_F(VPNServiceTest, Disconnect) {
92 Error error;
93 EXPECT_CALL(*driver_, Disconnect());
94 service_->Disconnect(&error);
95 EXPECT_TRUE(error.IsSuccess());
96}
97
Darin Petkov02867712012-03-12 14:25:05 +010098TEST_F(VPNServiceTest, CreateStorageIdentifierNoHost) {
99 KeyValueStore args;
100 Error error;
101 args.SetString(flimflam::kProviderNameProperty, "vpn-name");
102 EXPECT_EQ("", VPNService::CreateStorageIdentifier(args, &error));
103 EXPECT_EQ(Error::kInvalidProperty, error.type());
104}
105
106TEST_F(VPNServiceTest, CreateStorageIdentifierNoName) {
107 KeyValueStore args;
108 Error error;
109 args.SetString(flimflam::kProviderHostProperty, "10.8.0.1");
110 EXPECT_EQ("", VPNService::CreateStorageIdentifier(args, &error));
111 EXPECT_EQ(Error::kNotSupported, error.type());
112}
113
114TEST_F(VPNServiceTest, CreateStorageIdentifier) {
115 KeyValueStore args;
116 Error error;
117 args.SetString(flimflam::kProviderNameProperty, "vpn-name");
118 args.SetString(flimflam::kProviderHostProperty, "10.8.0.1");
119 EXPECT_EQ("vpn_10_8_0_1_vpn_name",
120 VPNService::CreateStorageIdentifier(args, &error));
121 EXPECT_TRUE(error.IsSuccess());
122}
123
Darin Petkov33af05c2012-02-28 10:10:30 +0100124TEST_F(VPNServiceTest, GetStorageIdentifier) {
125 EXPECT_EQ("", service_->GetStorageIdentifier());
Darin Petkov02867712012-03-12 14:25:05 +0100126 service_->set_storage_id("foo");
127 EXPECT_EQ("foo", service_->GetStorageIdentifier());
Darin Petkov33af05c2012-02-28 10:10:30 +0100128}
129
130TEST_F(VPNServiceTest, GetDeviceRpcId) {
131 Error error;
132 EXPECT_EQ("/", service_->GetDeviceRpcId(&error));
133 EXPECT_EQ(Error::kNotSupported, error.type());
134}
135
Darin Petkovf3c71d72012-03-21 12:32:15 +0100136TEST_F(VPNServiceTest, Load) {
137 NiceMock<MockStore> storage;
138 static const char kStorageID[] = "storage-id";
139 service_->set_storage_id(kStorageID);
140 EXPECT_CALL(storage, ContainsGroup(kStorageID)).WillOnce(Return(true));
Darin Petkovcb715292012-04-25 13:04:37 +0200141 EXPECT_CALL(*driver_, Load(&storage, kStorageID))
142 .WillOnce(Return(true));
Darin Petkovf3c71d72012-03-21 12:32:15 +0100143 EXPECT_TRUE(service_->Load(&storage));
144}
145
146TEST_F(VPNServiceTest, Save) {
147 NiceMock<MockStore> storage;
148 static const char kStorageID[] = "storage-id";
149 service_->set_storage_id(kStorageID);
Darin Petkovcb715292012-04-25 13:04:37 +0200150 EXPECT_CALL(*driver_, Save(&storage, kStorageID, false))
151 .WillOnce(Return(true));
Darin Petkovf3c71d72012-03-21 12:32:15 +0100152 EXPECT_TRUE(service_->Save(&storage));
153}
154
Darin Petkovcb715292012-04-25 13:04:37 +0200155TEST_F(VPNServiceTest, SaveCredentials) {
156 NiceMock<MockStore> storage;
157 static const char kStorageID[] = "storage-id";
158 service_->set_storage_id(kStorageID);
159 service_->set_save_credentials(true);
160 EXPECT_CALL(*driver_, Save(&storage, kStorageID, true))
161 .WillOnce(Return(true));
162 EXPECT_TRUE(service_->Save(&storage));
163}
164
165TEST_F(VPNServiceTest, Unload) {
166 service_->set_auto_connect(true);
167 service_->set_save_credentials(true);
168 EXPECT_CALL(*driver_, Disconnect());
169 EXPECT_CALL(*driver_, UnloadCredentials());
Paul Stewart8c116a92012-05-02 18:30:03 -0700170 MockVPNProvider provider;
171 EXPECT_CALL(manager_, vpn_provider()).WillRepeatedly(Return(&provider));
172 provider.services_.push_back(service_);
Darin Petkovcb715292012-04-25 13:04:37 +0200173 service_->Unload();
174 EXPECT_FALSE(service_->auto_connect());
175 EXPECT_FALSE(service_->save_credentials());
Paul Stewart8c116a92012-05-02 18:30:03 -0700176 EXPECT_TRUE(provider.services_.empty());
Darin Petkovcb715292012-04-25 13:04:37 +0200177}
178
Paul Stewartebd38562012-03-23 13:06:40 -0700179TEST_F(VPNServiceTest, InitPropertyStore) {
180 EXPECT_CALL(*driver_, InitPropertyStore(service_->mutable_store()));
181 service_->InitDriverPropertyStore();
182}
183
Darin Petkov1d0080a2012-04-30 17:10:36 +0200184TEST_F(VPNServiceTest, MakeFavorite) {
185 EXPECT_FALSE(service_->favorite());
186 EXPECT_FALSE(service_->auto_connect());
187 service_->MakeFavorite();
188 EXPECT_TRUE(service_->favorite());
189 EXPECT_FALSE(service_->auto_connect());
190}
191
Darin Petkov5eb05422012-05-11 15:45:25 +0200192TEST_F(VPNServiceTest, SetConnection) {
193 EXPECT_FALSE(service_->connection_binder_.get());
194 EXPECT_FALSE(service_->connection());
195 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
196 service_->SetConnection(connection_);
197 ASSERT_TRUE(service_->connection_binder_.get());
198 EXPECT_EQ(connection_.get(),
199 service_->connection_binder_->connection().get());
200 EXPECT_EQ(connection_.get(), service_->connection().get());
201 EXPECT_CALL(*driver_, OnConnectionDisconnected()).Times(0);
202}
203
204TEST_F(VPNServiceTest, OnConnectionDisconnected) {
205 EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
206 service_->SetConnection(connection_);
207 EXPECT_CALL(*driver_, OnConnectionDisconnected()).Times(1);
208 connection_->OnLowerDisconnect();
209}
210
Darin Petkov33af05c2012-02-28 10:10:30 +0100211} // namespace shill