blob: 9bc142a7fcdcacf0b097df0f0ef41bae5c33413e [file] [log] [blame]
Darin Petkovb72b62e2012-05-15 16:55:36 +02001// 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/wimax_provider.h"
6
Darin Petkove4b27022012-05-16 13:28:50 +02007#include <base/stringprintf.h>
Darin Petkovb72b62e2012-05-15 16:55:36 +02008#include <gtest/gtest.h>
9
10#include "shill/mock_dbus_properties_proxy.h"
Darin Petkove4b27022012-05-16 13:28:50 +020011#include "shill/mock_device_info.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020012#include "shill/mock_manager.h"
13#include "shill/mock_metrics.h"
Darin Petkove4b27022012-05-16 13:28:50 +020014#include "shill/mock_wimax.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020015#include "shill/mock_wimax_manager_proxy.h"
16#include "shill/nice_mock_control.h"
17#include "shill/proxy_factory.h"
18
19using std::string;
20using std::vector;
21using testing::_;
22using testing::Return;
23
24namespace shill {
25
Darin Petkove4b27022012-05-16 13:28:50 +020026namespace {
27const char kWiMaxDevicePathPrefix[] = "/org/chromium/WiMaxManager/Device/";
28
29string GetTestLinkName(int index) {
30 return StringPrintf("wm%d", index);
31}
32
33string GetTestPath(int index) {
34 return kWiMaxDevicePathPrefix + GetTestLinkName(index);
35}
36} // namespace
37
Darin Petkovb72b62e2012-05-15 16:55:36 +020038class WiMaxProviderTest : public testing::Test {
39 public:
40 WiMaxProviderTest()
41 : manager_proxy_(new MockWiMaxManagerProxy()),
42 properties_proxy_(new MockDBusPropertiesProxy()),
43 proxy_factory_(this),
44 manager_(&control_, NULL, &metrics_, NULL),
Darin Petkove4b27022012-05-16 13:28:50 +020045 device_info_(&control_, NULL, &metrics_, &manager_),
Darin Petkovb72b62e2012-05-15 16:55:36 +020046 provider_(&control_, NULL, &metrics_, &manager_) {}
47
48 virtual ~WiMaxProviderTest() {}
49
50 protected:
51 class TestProxyFactory : public ProxyFactory {
52 public:
53 explicit TestProxyFactory(WiMaxProviderTest *test) : test_(test) {}
54
55 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
56 const string &/*path*/, const string &/*service*/) {
57 return test_->properties_proxy_.release();
58 }
59
60 virtual WiMaxManagerProxyInterface *CreateWiMaxManagerProxy() {
61 return test_->manager_proxy_.release();
62 }
63
64 private:
65 WiMaxProviderTest *test_;
66
67 DISALLOW_COPY_AND_ASSIGN(TestProxyFactory);
68 };
69
70 virtual void SetUp() {
71 provider_.proxy_factory_ = &proxy_factory_;
72 }
73
74 virtual void TearDown() {
Darin Petkove4b27022012-05-16 13:28:50 +020075 provider_.devices_.clear();
Darin Petkovb72b62e2012-05-15 16:55:36 +020076 provider_.proxy_factory_ = NULL;
77 }
78
79 scoped_ptr<MockWiMaxManagerProxy> manager_proxy_;
80 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
81 TestProxyFactory proxy_factory_;
82 NiceMockControl control_;
83 MockMetrics metrics_;
84 MockManager manager_;
Darin Petkove4b27022012-05-16 13:28:50 +020085 MockDeviceInfo device_info_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020086 WiMaxProvider provider_;
87};
88
89TEST_F(WiMaxProviderTest, StartStop) {
90 EXPECT_FALSE(provider_.manager_proxy_.get());
91 EXPECT_FALSE(provider_.properties_proxy_.get());
92 vector<RpcIdentifier> devices;
93 EXPECT_CALL(*properties_proxy_, set_properties_changed_callback(_)).Times(1);
94 EXPECT_CALL(*manager_proxy_, Devices(_)).WillOnce(Return(devices));
95 provider_.Start();
96 EXPECT_TRUE(provider_.manager_proxy_.get());
97 EXPECT_TRUE(provider_.properties_proxy_.get());
98 provider_.Start();
99 EXPECT_TRUE(provider_.manager_proxy_.get());
100 EXPECT_TRUE(provider_.properties_proxy_.get());
Darin Petkove4b27022012-05-16 13:28:50 +0200101 provider_.pending_devices_[GetTestLinkName(2)] = GetTestPath(2);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200102 provider_.Stop();
103 EXPECT_FALSE(provider_.manager_proxy_.get());
104 EXPECT_FALSE(provider_.properties_proxy_.get());
Darin Petkove4b27022012-05-16 13:28:50 +0200105 EXPECT_TRUE(provider_.pending_devices_.empty());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200106 provider_.Stop();
107}
108
Darin Petkove4b27022012-05-16 13:28:50 +0200109TEST_F(WiMaxProviderTest, UpdateDevices) {
110 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
111
112 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
113 WiMaxProvider::RpcIdentifiers live_devices;
114 live_devices.push_back(GetTestPath(2));
115 live_devices.push_back(GetTestPath(3));
116 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(2))).WillOnce(Return(-1));
117 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(3))).WillOnce(Return(-1));
118 provider_.UpdateDevices(live_devices);
119 ASSERT_EQ(2, provider_.pending_devices_.size());
120 EXPECT_EQ(GetTestPath(2), provider_.pending_devices_[GetTestLinkName(2)]);
121 EXPECT_EQ(GetTestPath(3), provider_.pending_devices_[GetTestLinkName(3)]);
122}
123
124TEST_F(WiMaxProviderTest, OnDeviceInfoAvailable) {
125 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
126
127 provider_.pending_devices_[GetTestLinkName(1)] = GetTestPath(1);
128 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
129 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
130 EXPECT_CALL(device_info_, RegisterDevice(_));
131 provider_.OnDeviceInfoAvailable(GetTestLinkName(1));
132 EXPECT_TRUE(provider_.pending_devices_.empty());
133 ASSERT_EQ(1, provider_.devices_.size());
134 EXPECT_EQ(GetTestLinkName(1), provider_.devices_[0]->link_name());
135}
136
137TEST_F(WiMaxProviderTest, OnPropertiesChanged) {
138 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
139
140 vector<DBus::Path> paths;
141 paths.push_back(GetTestPath(1));
142 DBusPropertiesMap props;
143 DBus::MessageIter writer = props["Devices"].writer();
144 writer << paths;
145 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(-1));
146 provider_.OnPropertiesChanged(string(), props, vector<string>());
147 ASSERT_EQ(1, provider_.pending_devices_.size());
148 EXPECT_EQ(GetTestPath(1), provider_.pending_devices_[GetTestLinkName(1)]);
149}
150
151TEST_F(WiMaxProviderTest, CreateDevice) {
152 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
153
154 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(-1));
155 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
156 EXPECT_TRUE(provider_.devices_.empty());
157 ASSERT_EQ(1, provider_.pending_devices_.size());
158 EXPECT_EQ(GetTestPath(1), provider_.pending_devices_[GetTestLinkName(1)]);
159
160 EXPECT_CALL(device_info_, GetIndex(GetTestLinkName(1))).WillOnce(Return(1));
161 EXPECT_CALL(device_info_, GetMACAddress(1, _)).WillOnce(Return(true));
162 EXPECT_CALL(device_info_, RegisterDevice(_));
163 provider_.CreateDevice(GetTestLinkName(1), GetTestPath(1));
164 EXPECT_TRUE(provider_.pending_devices_.empty());
165 ASSERT_EQ(1, provider_.devices_.size());
166 EXPECT_EQ(GetTestLinkName(1), provider_.devices_[0]->link_name());
167}
168
169TEST_F(WiMaxProviderTest, DestroyDeadDevices) {
170 for (int i = 0; i < 4; i++) {
171 provider_.devices_.push_back(
172 new MockWiMax(&control_, NULL, &metrics_, &manager_,
173 GetTestLinkName(i), "", i, GetTestPath(i)));
174 }
175 for (int i = 4; i < 8; i++) {
176 provider_.pending_devices_[GetTestLinkName(i)] = GetTestPath(i);
177 }
178 WiMaxProvider::RpcIdentifiers live_devices;
179 live_devices.push_back(GetTestPath(0));
180 live_devices.push_back(GetTestPath(3));
181 live_devices.push_back(GetTestPath(4));
182 live_devices.push_back(GetTestPath(7));
183 live_devices.push_back(GetTestPath(123));
184 EXPECT_CALL(manager_, device_info())
185 .Times(2)
186 .WillRepeatedly(Return(&device_info_));
187 EXPECT_CALL(device_info_, DeregisterDevice(_)).Times(2);
188 provider_.DestroyDeadDevices(live_devices);
189 ASSERT_EQ(2, provider_.devices_.size());
190 EXPECT_EQ(GetTestLinkName(0), provider_.devices_[0]->link_name());
191 EXPECT_EQ(GetTestLinkName(3), provider_.devices_[1]->link_name());
192 EXPECT_EQ(2, provider_.pending_devices_.size());
193 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(4)));
194 EXPECT_TRUE(ContainsKey(provider_.pending_devices_, GetTestLinkName(7)));
195}
196
197TEST_F(WiMaxProviderTest, GetLinkName) {
198 EXPECT_EQ("", provider_.GetLinkName("/random/path"));
199 EXPECT_EQ(GetTestLinkName(1), provider_.GetLinkName(GetTestPath(1)));
200}
201
Darin Petkovb72b62e2012-05-15 16:55:36 +0200202} // namespace shill