blob: 32bd01f66eccdadaecc62d5b56ed7e4a9f827ef4 [file] [log] [blame]
Ben Chanc07362b2012-05-12 10:54:11 -07001// 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.h"
6
Darin Petkov9893d9c2012-05-17 15:27:31 -07007#include <base/stringprintf.h>
Ben Chanc07362b2012-05-12 10:54:11 -07008#include <gtest/gtest.h>
9
10#include "shill/event_dispatcher.h"
11#include "shill/mock_glib.h"
12#include "shill/mock_manager.h"
13#include "shill/mock_metrics.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020014#include "shill/mock_wimax_device_proxy.h"
Darin Petkov9893d9c2012-05-17 15:27:31 -070015#include "shill/mock_wimax_network_proxy.h"
16#include "shill/mock_wimax_service.h"
Ben Chanc07362b2012-05-12 10:54:11 -070017#include "shill/nice_mock_control.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020018#include "shill/proxy_factory.h"
19
20using std::string;
Darin Petkov912f0de2012-05-16 14:12:14 +020021using testing::_;
Darin Petkov9893d9c2012-05-17 15:27:31 -070022using testing::Return;
Ben Chanc07362b2012-05-12 10:54:11 -070023
24namespace shill {
25
26namespace {
27
28const char kTestLinkName[] = "wm0";
Ben Chan4e64d2d2012-05-16 00:02:25 -070029const char kTestAddress[] = "01:23:45:67:89:ab";
Ben Chanc07362b2012-05-12 10:54:11 -070030const int kTestInterfaceIndex = 5;
Darin Petkovb72b62e2012-05-15 16:55:36 +020031const char kTestPath[] = "/org/chromium/WiMaxManager/Device/6";
Ben Chanc07362b2012-05-12 10:54:11 -070032
Darin Petkov9893d9c2012-05-17 15:27:31 -070033string GetTestNetworkPath(uint32 identifier) {
34 return base::StringPrintf("%s%08x",
35 wimax_manager::kNetworkObjectPathPrefix,
36 identifier);
37}
38
Ben Chanc07362b2012-05-12 10:54:11 -070039} // namespace
40
41class WiMaxTest : public testing::Test {
42 public:
43 WiMaxTest()
Darin Petkovb72b62e2012-05-15 16:55:36 +020044 : proxy_(new MockWiMaxDeviceProxy()),
Darin Petkov9893d9c2012-05-17 15:27:31 -070045 network_proxy_(new MockWiMaxNetworkProxy()),
Darin Petkovb72b62e2012-05-15 16:55:36 +020046 proxy_factory_(this),
47 manager_(&control_, &dispatcher_, &metrics_, &glib_),
Ben Chanc07362b2012-05-12 10:54:11 -070048 wimax_(new WiMax(&control_, &dispatcher_, &metrics_, &manager_,
Ben Chan4e64d2d2012-05-16 00:02:25 -070049 kTestLinkName, kTestAddress, kTestInterfaceIndex,
50 kTestPath)) {}
Ben Chanc07362b2012-05-12 10:54:11 -070051
52 virtual ~WiMaxTest() {}
53
54 protected:
Darin Petkovb72b62e2012-05-15 16:55:36 +020055 class TestProxyFactory : public ProxyFactory {
56 public:
57 explicit TestProxyFactory(WiMaxTest *test) : test_(test) {}
58
59 virtual WiMaxDeviceProxyInterface *CreateWiMaxDeviceProxy(
60 const string &/*path*/) {
61 return test_->proxy_.release();
62 }
63
Darin Petkov9893d9c2012-05-17 15:27:31 -070064 virtual WiMaxNetworkProxyInterface *CreateWiMaxNetworkProxy(
65 const string &/*path*/) {
66 return test_->network_proxy_.release();
67 }
68
Darin Petkovb72b62e2012-05-15 16:55:36 +020069 private:
70 WiMaxTest *test_;
71
72 DISALLOW_COPY_AND_ASSIGN(TestProxyFactory);
73 };
74
75 virtual void SetUp() {
76 wimax_->proxy_factory_ = &proxy_factory_;
77 }
78
79 virtual void TearDown() {
Darin Petkov9893d9c2012-05-17 15:27:31 -070080 wimax_->services_.clear();
Darin Petkovb72b62e2012-05-15 16:55:36 +020081 wimax_->proxy_factory_ = NULL;
82 }
83
84 scoped_ptr<MockWiMaxDeviceProxy> proxy_;
Darin Petkov9893d9c2012-05-17 15:27:31 -070085 scoped_ptr<MockWiMaxNetworkProxy> network_proxy_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020086 TestProxyFactory proxy_factory_;
Ben Chanc07362b2012-05-12 10:54:11 -070087 NiceMockControl control_;
88 EventDispatcher dispatcher_;
89 MockMetrics metrics_;
90 MockGLib glib_;
91 MockManager manager_;
Ben Chanc07362b2012-05-12 10:54:11 -070092 WiMaxRefPtr wimax_;
93};
94
Darin Petkovb72b62e2012-05-15 16:55:36 +020095TEST_F(WiMaxTest, Constructor) {
96 EXPECT_EQ(kTestPath, wimax_->path());
Darin Petkov9893d9c2012-05-17 15:27:31 -070097 EXPECT_FALSE(wimax_->scanning());
Darin Petkovb72b62e2012-05-15 16:55:36 +020098}
99
Ben Chanc07362b2012-05-12 10:54:11 -0700100TEST_F(WiMaxTest, TechnologyIs) {
101 EXPECT_TRUE(wimax_->TechnologyIs(Technology::kWiMax));
102 EXPECT_FALSE(wimax_->TechnologyIs(Technology::kEthernet));
103}
104
Darin Petkovb72b62e2012-05-15 16:55:36 +0200105TEST_F(WiMaxTest, StartStop) {
106 EXPECT_FALSE(wimax_->proxy_.get());
Darin Petkov912f0de2012-05-16 14:12:14 +0200107 EXPECT_CALL(*proxy_, Enable(_, _, _));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700108 EXPECT_CALL(*proxy_, set_networks_changed_callback(_));
Darin Petkov912f0de2012-05-16 14:12:14 +0200109 EXPECT_CALL(*proxy_, Disable(_, _, _));
Darin Petkovb72b62e2012-05-15 16:55:36 +0200110 wimax_->Start(NULL, EnabledStateChangedCallback());
111 EXPECT_TRUE(wimax_->proxy_.get());
112 wimax_->Stop(NULL, EnabledStateChangedCallback());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200113}
114
Darin Petkov9893d9c2012-05-17 15:27:31 -0700115TEST_F(WiMaxTest, OnNetworksChanged) {
116 wimax_->services_[GetTestNetworkPath(2)] =
117 new MockWiMaxService(&control_, NULL, &metrics_, &manager_, NULL);
118 RpcIdentifiers live_devices;
119 live_devices.push_back(GetTestNetworkPath(3));
120 EXPECT_CALL(manager_, DeregisterService(_));
121 EXPECT_CALL(*network_proxy_, Name(_));
122 EXPECT_CALL(*network_proxy_, Identifier(_));
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200123 EXPECT_CALL(*network_proxy_, SignalStrength(_));
124 EXPECT_CALL(*network_proxy_, set_signal_strength_changed_callback(_));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700125 EXPECT_CALL(manager_, RegisterService(_));
126 wimax_->OnNetworksChanged(live_devices);
127 ASSERT_EQ(1, wimax_->services_.size());
128 EXPECT_TRUE(ContainsKey(wimax_->services_, GetTestNetworkPath(3)));
129}
130
131TEST_F(WiMaxTest, CreateService) {
132 EXPECT_TRUE(wimax_->services_.empty());
133
134 static const char kTestNetworkName[] = "TestWiMaxNetwork";
135
136 EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kTestNetworkName));
137 EXPECT_CALL(*network_proxy_, Identifier(_));
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200138 EXPECT_CALL(*network_proxy_, SignalStrength(_));
139 EXPECT_CALL(*network_proxy_, set_signal_strength_changed_callback(_));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700140 EXPECT_CALL(manager_, RegisterService(_));
141 wimax_->CreateService(GetTestNetworkPath(1));
142 ASSERT_EQ(1, wimax_->services_.size());
143 EXPECT_TRUE(ContainsKey(wimax_->services_, GetTestNetworkPath(1)));
144 EXPECT_EQ(kTestNetworkName,
145 wimax_->services_[GetTestNetworkPath(1)]->friendly_name());
146
147 WiMaxService *service = wimax_->services_[GetTestNetworkPath(1)];
148 wimax_->CreateService(GetTestNetworkPath(1));
149 EXPECT_EQ(service, wimax_->services_[GetTestNetworkPath(1)]);
150}
151
152TEST_F(WiMaxTest, DestroyDeadServices) {
153 for (int i = 100; i < 104; i++) {
154 wimax_->services_[GetTestNetworkPath(i)] =
155 new MockWiMaxService(&control_, NULL, &metrics_, &manager_, NULL);
156 }
157 wimax_->SelectService(wimax_->services_[GetTestNetworkPath(100)]);
158 wimax_->pending_service_ = wimax_->services_[GetTestNetworkPath(103)];
159
160 RpcIdentifiers live_networks;
161 live_networks.push_back(GetTestNetworkPath(777));
162 live_networks.push_back(GetTestNetworkPath(100));
163 live_networks.push_back(GetTestNetworkPath(103));
164 EXPECT_CALL(manager_, DeregisterService(_)).Times(2);
165 wimax_->DestroyDeadServices(live_networks);
166 ASSERT_EQ(2, wimax_->services_.size());
167 EXPECT_TRUE(ContainsKey(wimax_->services_, GetTestNetworkPath(100)));
168 EXPECT_TRUE(ContainsKey(wimax_->services_, GetTestNetworkPath(103)));
169 EXPECT_TRUE(wimax_->selected_service());
170 EXPECT_TRUE(wimax_->pending_service_);
171
172 live_networks.pop_back();
173 EXPECT_CALL(manager_, DeregisterService(_)).Times(1);
174 wimax_->DestroyDeadServices(live_networks);
175 ASSERT_EQ(1, wimax_->services_.size());
176 EXPECT_TRUE(ContainsKey(wimax_->services_, GetTestNetworkPath(100)));
177 EXPECT_TRUE(wimax_->selected_service());
178 EXPECT_FALSE(wimax_->pending_service_);
179
180 live_networks.pop_back();
181 EXPECT_CALL(manager_, DeregisterService(_)).Times(1);
182 wimax_->DestroyDeadServices(live_networks);
183 EXPECT_TRUE(wimax_->services_.empty());
184 EXPECT_FALSE(wimax_->selected_service());
185}
186
Ben Chanc07362b2012-05-12 10:54:11 -0700187} // namespace shill