blob: 585e9f2b719043be2d957bf5262051a73b80d1bd [file] [log] [blame]
Peter Qiu326b6cf2015-09-02 11:11:42 -07001//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Peter Qiufb39ba42014-11-21 09:09:59 -080016
17#include "apmanager/device.h"
18
19#include <string>
20#include <vector>
21
Peter Qiu8e785b92014-11-24 10:01:08 -080022#include <base/strings/stringprintf.h>
Peter Qiufb39ba42014-11-21 09:09:59 -080023#include <gmock/gmock.h>
24#include <gtest/gtest.h>
Peter Qiu8e785b92014-11-24 10:01:08 -080025#include <shill/net/ieee80211.h>
26#include <shill/net/nl80211_attribute.h>
27#include <shill/net/nl80211_message.h>
Peter Qiufb39ba42014-11-21 09:09:59 -080028
Peter Qiuf9335402015-11-16 12:09:16 -080029#include "apmanager/fake_device_adaptor.h"
30#include "apmanager/mock_control.h"
Peter Qiu7e0ffcf2014-12-02 12:53:27 -080031#include "apmanager/mock_manager.h"
32
33using ::testing::_;
34using ::testing::Mock;
Peter Qiuf9335402015-11-16 12:09:16 -080035using ::testing::ReturnNew;
Peter Qiufb39ba42014-11-21 09:09:59 -080036using std::vector;
37
38namespace apmanager {
39
40namespace {
41
42const char kDeviceName[] = "phy0";
43const Device::WiFiInterface kApModeInterface0 = {
44 "uap0", kDeviceName, 1, NL80211_IFTYPE_AP
45};
46const Device::WiFiInterface kApModeInterface1 = {
47 "uap1", kDeviceName, 2, NL80211_IFTYPE_AP
48};
49const Device::WiFiInterface kManagedModeInterface0 = {
50 "wlan0", kDeviceName, 3, NL80211_IFTYPE_STATION
51};
52const Device::WiFiInterface kManagedModeInterface1 = {
53 "wlan1", kDeviceName, 4, NL80211_IFTYPE_STATION
54};
55const Device::WiFiInterface kMonitorModeInterface = {
56 "monitor0", kDeviceName, 5, NL80211_IFTYPE_MONITOR
57};
58
59} // namespace
60
61class DeviceTest : public testing::Test {
62 public:
Peter Qiuf9335402015-11-16 12:09:16 -080063 DeviceTest() : manager_(&control_interface_) {
64 ON_CALL(control_interface_, CreateDeviceAdaptorRaw())
65 .WillByDefault(ReturnNew<FakeDeviceAdaptor>());
66 device_ = new Device(&manager_, kDeviceName, 0);
67 }
Peter Qiufb39ba42014-11-21 09:09:59 -080068
69 void VerifyInterfaceList(
70 const vector<Device::WiFiInterface>& interface_list) {
71 EXPECT_EQ(interface_list.size(), device_->interface_list_.size());
72 for (size_t i = 0; i < interface_list.size(); i++) {
73 EXPECT_TRUE(interface_list[i].Equals(device_->interface_list_[i]));
74 }
75 }
76
77 void VerifyPreferredApInterface(const std::string& interface_name) {
78 EXPECT_EQ(interface_name, device_->GetPreferredApInterface());
79 }
80
Peter Qiu8e785b92014-11-24 10:01:08 -080081 void AddWiphyBandAttribute(shill::AttributeListRefPtr wiphy_bands,
82 const std::string& band_name,
83 int band_id,
84 std::vector<uint32_t> frequency_list,
85 uint16_t ht_cap_mask) {
86 // Band attribute.
87 shill::AttributeListRefPtr wiphy_band;
88 wiphy_bands->CreateNestedAttribute(band_id, band_name.c_str());
89 wiphy_bands->GetNestedAttributeList(band_id, &wiphy_band);
90 // Frequencies attribute.
91 shill::AttributeListRefPtr frequencies;
92 wiphy_band->CreateNestedAttribute(NL80211_BAND_ATTR_FREQS,
93 "NL80211_BAND_ATTR_FREQS");
94 wiphy_band->GetNestedAttributeList(NL80211_BAND_ATTR_FREQS,
95 &frequencies);
96 // Frequency attribute.
97 for (size_t i = 0; i < frequency_list.size(); i++) {
98 shill::AttributeListRefPtr frequency;
99 frequencies->CreateNestedAttribute(
100 i, base::StringPrintf("Frequency %d", frequency_list[i]).c_str());
101 frequencies->GetNestedAttributeList(i, &frequency);
102 frequency->CreateU32Attribute(NL80211_FREQUENCY_ATTR_FREQ,
103 "NL80211_FREQUENCY_ATTR_FREQ");
104 frequency->SetU32AttributeValue(NL80211_FREQUENCY_ATTR_FREQ,
105 frequency_list[i]);
106 frequencies->SetNestedAttributeHasAValue(i);
107 }
108 wiphy_band->SetNestedAttributeHasAValue(NL80211_BAND_ATTR_FREQS);
109
110 // HT Capability attribute.
111 wiphy_band->CreateU16Attribute(NL80211_BAND_ATTR_HT_CAPA,
112 "NL80211_BAND_ATTR_HT_CAPA");
113 wiphy_band->SetU16AttributeValue(NL80211_BAND_ATTR_HT_CAPA, ht_cap_mask);
114
115 wiphy_bands->SetNestedAttributeHasAValue(band_id);
116 }
117
Peter Qiu3d95ac72014-12-06 18:26:18 -0800118 void EnableApModeSupport() {
119 device_->supports_ap_mode_ = true;
120 }
121
122 void VerifyApModeSupport(bool supports_ap_mode) {
123 EXPECT_EQ(supports_ap_mode, device_->supports_ap_mode_);
124 }
125
Peter Qiu8e785b92014-11-24 10:01:08 -0800126 void VerifyFrequencyList(int band_id, std::vector<uint32_t> frequency_list) {
127 EXPECT_EQ(frequency_list, device_->band_capability_[band_id].frequencies);
128 }
129
Peter Qiufb39ba42014-11-21 09:09:59 -0800130 protected:
Peter Qiuf9335402015-11-16 12:09:16 -0800131 MockControl control_interface_;
Peter Qiu7e0ffcf2014-12-02 12:53:27 -0800132 MockManager manager_;
Peter Qiufb39ba42014-11-21 09:09:59 -0800133 scoped_refptr<Device> device_;
134};
135
136TEST_F(DeviceTest, RegisterInterface) {
137 vector<Device::WiFiInterface> interface_list;
138 interface_list.push_back(kApModeInterface0);
139 interface_list.push_back(kManagedModeInterface0);
140 interface_list.push_back(kMonitorModeInterface);
141
142 device_->RegisterInterface(kApModeInterface0);
143 device_->RegisterInterface(kManagedModeInterface0);
144 device_->RegisterInterface(kMonitorModeInterface);
145
146 // Verify result interface list.
147 VerifyInterfaceList(interface_list);
148}
149
150TEST_F(DeviceTest, DeregisterInterface) {
151 vector<Device::WiFiInterface> interface_list;
152 interface_list.push_back(kApModeInterface0);
153 interface_list.push_back(kManagedModeInterface0);
154
155 // Register all interfaces, then deregister monitor0 and wlan1 interfaces.
156 device_->RegisterInterface(kApModeInterface0);
157 device_->RegisterInterface(kMonitorModeInterface);
158 device_->RegisterInterface(kManagedModeInterface0);
159 device_->RegisterInterface(kManagedModeInterface1);
160 device_->DeregisterInterface(kMonitorModeInterface);
161 device_->DeregisterInterface(kManagedModeInterface1);
162
163 // Verify result interface list.
164 VerifyInterfaceList(interface_list);
165}
166
167TEST_F(DeviceTest, PreferredAPInterface) {
Peter Qiu3d95ac72014-12-06 18:26:18 -0800168 EnableApModeSupport();
169
Peter Qiufb39ba42014-11-21 09:09:59 -0800170 // Register a monitor mode interface, no preferred AP mode interface.
171 device_->RegisterInterface(kMonitorModeInterface);
172 VerifyPreferredApInterface("");
173
174 // Register a managed mode interface, should be set to preferred AP interface.
175 device_->RegisterInterface(kManagedModeInterface0);
176 VerifyPreferredApInterface(kManagedModeInterface0.iface_name);
177
178 // Register a ap mode interface, should be set to preferred AP interface.
179 device_->RegisterInterface(kApModeInterface0);
180 VerifyPreferredApInterface(kApModeInterface0.iface_name);
181
182 // Register another ap mode interface "uap1" and managed mode interface
183 // "wlan1", preferred AP interface should still be set to the first detected
184 // ap mode interface "uap0".
185 device_->RegisterInterface(kApModeInterface1);
186 device_->RegisterInterface(kManagedModeInterface1);
187 VerifyPreferredApInterface(kApModeInterface0.iface_name);
188
189 // Deregister the first ap mode interface, preferred AP interface should be
190 // set to the second ap mode interface.
191 device_->DeregisterInterface(kApModeInterface0);
192 VerifyPreferredApInterface(kApModeInterface1.iface_name);
193
194 // Deregister the second ap mode interface, preferred AP interface should be
195 // set the first managed mode interface.
196 device_->DeregisterInterface(kApModeInterface1);
197 VerifyPreferredApInterface(kManagedModeInterface0.iface_name);
198
199 // Deregister the first managed mode interface, preferred AP interface
200 // should be set to the second managed mode interface.
201 device_->DeregisterInterface(kManagedModeInterface0);
202 VerifyPreferredApInterface(kManagedModeInterface1.iface_name);
203
204 // Deregister the second managed mode interface, preferred AP interface
205 // should be set to empty string.
206 device_->DeregisterInterface(kManagedModeInterface1);
207 VerifyPreferredApInterface("");
208}
209
Peter Qiu3d95ac72014-12-06 18:26:18 -0800210TEST_F(DeviceTest, DeviceWithoutAPModeSupport) {
211 // AP mode support is not enabled for the device, so no preferred AP
212 // mode interface.
213 device_->RegisterInterface(kApModeInterface0);
214 VerifyPreferredApInterface("");
215}
216
217TEST_F(DeviceTest, ParseWiphyCapability) {
Peter Qiu8e785b92014-11-24 10:01:08 -0800218 shill::NewWiphyMessage message;
Peter Qiu3d95ac72014-12-06 18:26:18 -0800219
220 // Supported interface types attribute.
221 message.attributes()->CreateNestedAttribute(
222 NL80211_ATTR_SUPPORTED_IFTYPES, "NL80211_ATTR_SUPPORTED_IFTYPES");
223 shill::AttributeListRefPtr supported_iftypes;
224 message.attributes()->GetNestedAttributeList(
225 NL80211_ATTR_SUPPORTED_IFTYPES, &supported_iftypes);
226 // Add support for AP mode interface.
227 supported_iftypes->CreateFlagAttribute(
228 NL80211_IFTYPE_AP, "NL80211_IFTYPE_AP");
229 supported_iftypes->SetFlagAttributeValue(NL80211_IFTYPE_AP, true);
230 message.attributes()->SetNestedAttributeHasAValue(
231 NL80211_ATTR_SUPPORTED_IFTYPES);
232
233 // Wiphy bands attribute.
Peter Qiu8e785b92014-11-24 10:01:08 -0800234 message.attributes()->CreateNestedAttribute(
235 NL80211_ATTR_WIPHY_BANDS, "NL80211_ATTR_WIPHY_BANDS");
236 shill::AttributeListRefPtr wiphy_bands;
237 message.attributes()->GetNestedAttributeList(
238 NL80211_ATTR_WIPHY_BANDS, &wiphy_bands);
239
240 // 2.4GHz band capability.
241 const uint32_t kBand24GHzFrequencies[] = {
242 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467};
243 const uint16_t kBand24GHzHTCapMask = shill::IEEE_80211::kHTCapMaskLdpcCoding |
244 shill::IEEE_80211::kHTCapMaskGrnFld |
245 shill::IEEE_80211::kHTCapMaskSgi20;
246 std::vector<uint32_t> band_24ghz_freq_list(
247 kBand24GHzFrequencies,
248 kBand24GHzFrequencies + sizeof(kBand24GHzFrequencies) /
249 sizeof(kBand24GHzFrequencies[0]));
250 AddWiphyBandAttribute(
251 wiphy_bands, "2.4GHz band", 0, band_24ghz_freq_list,
252 kBand24GHzHTCapMask);
253
254 // 5GHz band capability.
255 const uint32_t kBand5GHzFrequencies[] = {
256 5180, 5190, 5200, 5210, 5220, 5230, 5240, 5260, 5280, 5300, 5320};
257 const uint16_t kBand5GHzHTCapMask =
258 shill::IEEE_80211::kHTCapMaskLdpcCoding |
259 shill::IEEE_80211::kHTCapMaskSupWidth2040 |
260 shill::IEEE_80211::kHTCapMaskGrnFld |
261 shill::IEEE_80211::kHTCapMaskSgi20 |
262 shill::IEEE_80211::kHTCapMaskSgi40;
263 std::vector<uint32_t> band_5ghz_freq_list(
264 kBand5GHzFrequencies,
265 kBand5GHzFrequencies + sizeof(kBand5GHzFrequencies) /
266 sizeof(kBand5GHzFrequencies[0]));
267 AddWiphyBandAttribute(
268 wiphy_bands, "5GHz band", 1, band_5ghz_freq_list, kBand5GHzHTCapMask);
269
270 message.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_WIPHY_BANDS);
271
272 device_->ParseWiphyCapability(message);
273
Peter Qiu3d95ac72014-12-06 18:26:18 -0800274 // Verify AP mode support.
275 VerifyApModeSupport(true);
276
Peter Qiu8e785b92014-11-24 10:01:08 -0800277 // Verify frequency list for both bands.
278 VerifyFrequencyList(0, band_24ghz_freq_list);
279 VerifyFrequencyList(1, band_5ghz_freq_list);
280
281 // Verify HT Capablity for 2.4GHz band.
282 const char kBand24GHzHTCapability[] = "[LDPC SMPS-STATIC GF SHORT-GI-20]";
283 std::string band_24ghz_cap;
284 EXPECT_TRUE(device_->GetHTCapability(6, &band_24ghz_cap));
285 EXPECT_EQ(kBand24GHzHTCapability, band_24ghz_cap);
286
287 // Verify HT Capablity for 5GHz band.
288 const char kBand5GHzHTCapability[] =
289 "[LDPC HT40+ SMPS-STATIC GF SHORT-GI-20 SHORT-GI-40]";
290 std::string band_5ghz_cap;
291 EXPECT_TRUE(device_->GetHTCapability(36, &band_5ghz_cap));
292 EXPECT_EQ(kBand5GHzHTCapability, band_5ghz_cap);
293}
294
Peter Qiu0ca183b2015-03-09 13:41:06 -0700295TEST_F(DeviceTest, ClaimAndReleaseDeviceWithFullControl) {
Peter Qiu3d95ac72014-12-06 18:26:18 -0800296 EnableApModeSupport();
297
Peter Qiu7e0ffcf2014-12-02 12:53:27 -0800298 // Register multiple interfaces.
299 device_->RegisterInterface(kApModeInterface1);
300 device_->RegisterInterface(kManagedModeInterface1);
301
Peter Qiu0ca183b2015-03-09 13:41:06 -0700302 // Claim the device should claim all interfaces registered on this device..
Peter Qiu7e0ffcf2014-12-02 12:53:27 -0800303 EXPECT_CALL(manager_, ClaimInterface(kApModeInterface1.iface_name)).Times(1);
304 EXPECT_CALL(manager_,
305 ClaimInterface(kManagedModeInterface1.iface_name)).Times(1);
Peter Qiu0ca183b2015-03-09 13:41:06 -0700306 EXPECT_TRUE(device_->ClaimDevice(true));
Peter Qiu7e0ffcf2014-12-02 12:53:27 -0800307 Mock::VerifyAndClearExpectations(&manager_);
308
309 // Claim the device when it is already claimed.
310 EXPECT_CALL(manager_, ClaimInterface(_)).Times(0);
Peter Qiu0ca183b2015-03-09 13:41:06 -0700311 EXPECT_FALSE(device_->ClaimDevice(true));
Peter Qiu7e0ffcf2014-12-02 12:53:27 -0800312 Mock::VerifyAndClearExpectations(&manager_);
313
314 // Release the device should release all interfaces registered on this device.
315 EXPECT_CALL(manager_,
316 ReleaseInterface(kApModeInterface1.iface_name)).Times(1);
317 EXPECT_CALL(manager_,
318 ReleaseInterface(kManagedModeInterface1.iface_name)).Times(1);
319 EXPECT_TRUE(device_->ReleaseDevice());
320 Mock::VerifyAndClearExpectations(&manager_);
321
322 // Release the device when it is not claimed.
323 EXPECT_CALL(manager_, ReleaseInterface(_)).Times(0);
324 EXPECT_FALSE(device_->ReleaseDevice());
325 Mock::VerifyAndClearExpectations(&manager_);
326}
327
Peter Qiu0ca183b2015-03-09 13:41:06 -0700328TEST_F(DeviceTest, ClaimAndReleaseDeviceWithoutFullControl) {
329 EnableApModeSupport();
330
331 // Register multiple interfaces.
332 device_->RegisterInterface(kApModeInterface1);
333 device_->RegisterInterface(kManagedModeInterface1);
334
335 // Claim the device should only claim the preferred AP interface registered
336 // on this device.
337 EXPECT_CALL(manager_, ClaimInterface(kApModeInterface1.iface_name)).Times(1);
338 EXPECT_CALL(manager_,
339 ClaimInterface(kManagedModeInterface1.iface_name)).Times(0);
340 EXPECT_TRUE(device_->ClaimDevice(false));
341 Mock::VerifyAndClearExpectations(&manager_);
342
343 // Claim the device when it is already claimed.
344 EXPECT_CALL(manager_, ClaimInterface(_)).Times(0);
345 EXPECT_FALSE(device_->ClaimDevice(false));
346 Mock::VerifyAndClearExpectations(&manager_);
347
348 // Release the device should release the preferred AP interface registered
349 // on this device.
350 EXPECT_CALL(manager_,
351 ReleaseInterface(kApModeInterface1.iface_name)).Times(1);
352 EXPECT_CALL(manager_,
353 ReleaseInterface(kManagedModeInterface1.iface_name)).Times(0);
354 EXPECT_TRUE(device_->ReleaseDevice());
355 Mock::VerifyAndClearExpectations(&manager_);
356
357 // Release the device when it is not claimed.
358 EXPECT_CALL(manager_, ReleaseInterface(_)).Times(0);
359 EXPECT_FALSE(device_->ReleaseDevice());
360 Mock::VerifyAndClearExpectations(&manager_);
361}
362
Peter Qiufb39ba42014-11-21 09:09:59 -0800363} // namespace apmanager