blob: e65bff89943522543368fdf227552fe52ebe90b5 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "shill/vpn_provider.h"
#include <chromeos/dbus/service_constants.h>
#include <gtest/gtest.h>
#include "shill/error.h"
#include "shill/nice_mock_control.h"
#include "shill/mock_adaptors.h"
#include "shill/mock_device_info.h"
#include "shill/mock_manager.h"
#include "shill/mock_metrics.h"
#include "shill/mock_vpn_driver.h"
#include "shill/vpn_service.h"
using std::string;
using testing::_;
using testing::Return;
namespace shill {
class VPNProviderTest : public testing::Test {
public:
VPNProviderTest()
: manager_(&control_, NULL, &metrics_, NULL),
device_info_(&control_, NULL, &metrics_, &manager_),
provider_(&control_, NULL, &metrics_, &manager_) {}
virtual ~VPNProviderTest() {}
protected:
static const char kHost[];
static const char kName[];
NiceMockControl control_;
MockMetrics metrics_;
MockManager manager_;
MockDeviceInfo device_info_;
VPNProvider provider_;
};
const char VPNProviderTest::kHost[] = "10.8.0.1";
const char VPNProviderTest::kName[] = "vpn-name";
TEST_F(VPNProviderTest, GetServiceNoType) {
KeyValueStore args;
Error e;
args.SetString(flimflam::kTypeProperty, flimflam::kTypeVPN);
VPNServiceRefPtr service = provider_.GetService(args, &e);
EXPECT_EQ(Error::kNotSupported, e.type());
EXPECT_FALSE(service);
}
TEST_F(VPNProviderTest, GetServiceUnsupportedType) {
KeyValueStore args;
Error e;
args.SetString(flimflam::kTypeProperty, flimflam::kTypeVPN);
args.SetString(flimflam::kProviderTypeProperty, "unknown-vpn-type");
args.SetString(flimflam::kProviderHostProperty, kHost);
args.SetString(flimflam::kProviderNameProperty, kName);
VPNServiceRefPtr service = provider_.GetService(args, &e);
EXPECT_EQ(Error::kNotSupported, e.type());
EXPECT_FALSE(service);
}
TEST_F(VPNProviderTest, GetService) {
KeyValueStore args;
Error e;
args.SetString(flimflam::kTypeProperty, flimflam::kTypeVPN);
args.SetString(flimflam::kProviderTypeProperty, flimflam::kProviderOpenVpn);
args.SetString(flimflam::kProviderHostProperty, kHost);
args.SetString(flimflam::kProviderNameProperty, kName);
EXPECT_CALL(manager_, device_info()).WillOnce(Return(&device_info_));
EXPECT_CALL(manager_, RegisterService(_));
VPNServiceRefPtr service = provider_.GetService(args, &e);
EXPECT_TRUE(e.IsSuccess());
ASSERT_TRUE(service);
EXPECT_EQ("vpn_10_8_0_1_vpn_name", service->GetStorageIdentifier());
EXPECT_EQ(kName, service->friendly_name());
}
TEST_F(VPNProviderTest, OnDeviceInfoAvailable) {
const string kInterfaceName("tun0");
const int kInterfaceIndex = 1;
scoped_ptr<MockVPNDriver> bad_driver(new MockVPNDriver());
EXPECT_CALL(*bad_driver.get(), ClaimInterface(_, _))
.Times(2)
.WillRepeatedly(Return(false));
provider_.services_.push_back(
new VPNService(&control_, NULL, &metrics_, NULL, bad_driver.release()));
EXPECT_FALSE(provider_.OnDeviceInfoAvailable(kInterfaceName,
kInterfaceIndex));
scoped_ptr<MockVPNDriver> good_driver(new MockVPNDriver());
EXPECT_CALL(*good_driver.get(), ClaimInterface(_, _))
.WillOnce(Return(true));
provider_.services_.push_back(
new VPNService(&control_, NULL, &metrics_, NULL, good_driver.release()));
scoped_ptr<MockVPNDriver> dup_driver(new MockVPNDriver());
EXPECT_CALL(*dup_driver.get(), ClaimInterface(_, _))
.Times(0);
provider_.services_.push_back(
new VPNService(&control_, NULL, &metrics_, NULL, dup_driver.release()));
EXPECT_TRUE(provider_.OnDeviceInfoAvailable(kInterfaceName, kInterfaceIndex));
provider_.services_.clear();
}
} // namespace shill