blob: b55cce2ed35d7a23bd0d55dbd9c64871e30a7376 [file] [log] [blame]
Wade Guthriea60a11c2013-04-12 17:47:34 -07001// Copyright (c) 2013 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/scan_session.h"
6
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -07007#include <errno.h>
8
Wade Guthriea60a11c2013-04-12 17:47:34 -07009#include <limits>
10#include <set>
11#include <vector>
12
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070013#include <base/memory/weak_ptr.h>
Wade Guthriea60a11c2013-04-12 17:47:34 -070014#include <gmock/gmock.h>
15#include <gtest/gtest.h>
16
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070017#include "shill/mock_event_dispatcher.h"
Wade Guthriea60a11c2013-04-12 17:47:34 -070018#include "shill/mock_netlink_manager.h"
19#include "shill/netlink_manager.h"
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070020#include "shill/netlink_message_matchers.h"
21#include "shill/nl80211_message.h"
Wade Guthriea60a11c2013-04-12 17:47:34 -070022
23using std::set;
24using std::vector;
25using testing::_;
26using testing::ContainerEq;
Wade Guthriea60a11c2013-04-12 17:47:34 -070027using testing::Test;
28
29namespace shill {
30
31static const uint16_t kExpectedFreq5640 = 5640;
32static const uint16_t kExpectedFreq5600 = 5600;
33static const uint16_t kExpectedFreq5580 = 5580;
34static const uint16_t kExpectedFreq5560 = 5560;
35static const uint16_t kExpectedFreq5620 = 5620;
36
37static WiFiProvider::FrequencyCount kConnectedFrequencies[] = {
38 WiFiProvider::FrequencyCount(kExpectedFreq5640, 40), // 40th percentile.
39 WiFiProvider::FrequencyCount(kExpectedFreq5600, 25), // 65th percentile.
40 WiFiProvider::FrequencyCount(kExpectedFreq5580, 20), // 85th percentile.
41 WiFiProvider::FrequencyCount(kExpectedFreq5560, 10), // 95th percentile.
42 WiFiProvider::FrequencyCount(kExpectedFreq5620, 5) // 100th percentile.
43};
44
45static const uint16_t kExpectedFreq2432 = 2432;
46static const uint16_t kExpectedFreq2427 = 2427;
47static const uint16_t kExpectedFreq2422 = 2422;
48static const uint16_t kExpectedFreq2417 = 2417;
49static const uint16_t kExpectedFreq2412 = 2412;
50
51static uint16_t kUnconnectedFrequencies[] = {
52 kExpectedFreq2432,
53 kExpectedFreq2427,
54 kExpectedFreq2422,
55 kExpectedFreq2417,
56 kExpectedFreq2412
57};
58
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070059static const uint16_t kNl80211FamilyId = 0x13;
60
Wade Guthriea60a11c2013-04-12 17:47:34 -070061class ScanSessionTest : public Test {
62 public:
63 // Test set of "all the other frequencies this device can support" in
64 // sorted order.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070065 ScanSessionTest() : weak_ptr_factory_(this) {
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070066 WiFiProvider::FrequencyCountList connected_frequencies(
Wade Guthriea60a11c2013-04-12 17:47:34 -070067 kConnectedFrequencies,
68 kConnectedFrequencies + arraysize(kConnectedFrequencies));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070069
70 set<uint16_t> unconnected_frequencies(
71 kUnconnectedFrequencies,
72 kUnconnectedFrequencies + arraysize(kUnconnectedFrequencies));
73 const int kArbitraryMinimum = 1;
74 const int kArbitraryMaximum = std::numeric_limits<int>::max();
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070075 scan_session_.reset(new ScanSession(&netlink_manager_,
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070076 &dispatcher_,
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070077 connected_frequencies,
78 unconnected_frequencies,
79 0,
80 ScanSession::FractionList(),
81 kArbitraryMinimum,
82 kArbitraryMaximum,
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070083 Bind(&ScanSessionTest::OnScanError,
84 weak_ptr_factory_.GetWeakPtr())));
Wade Guthriea60a11c2013-04-12 17:47:34 -070085 }
86
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070087 virtual std::vector<uint16_t> GetScanFrequencies(float scan_fraction,
88 size_t min_frequencies,
89 size_t max_frequencies) {
90 return scan_session_->GetScanFrequencies(scan_fraction, min_frequencies,
91 max_frequencies);
92 }
93 ScanSession *scan_session() { return scan_session_.get(); }
94
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070095 void SetScanSize(size_t min_frequencies, size_t max_frequencies) {
96 scan_session_->min_frequencies_ = min_frequencies;
97 scan_session_->max_frequencies_ = max_frequencies;
98 }
99
100 size_t GetScanFrequencyCount() {
101 return arraysize(kConnectedFrequencies) +
102 arraysize(kUnconnectedFrequencies);
103 }
104
105 protected:
106 MOCK_METHOD0(OnScanError, void());
107 MockNetlinkManager *netlink_manager() { return &netlink_manager_; }
108 MockEventDispatcher *dispatcher() { return &dispatcher_; }
109
110 MockEventDispatcher dispatcher_;
Wade Guthriea60a11c2013-04-12 17:47:34 -0700111 MockNetlinkManager netlink_manager_;
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700112 scoped_ptr<ScanSession> scan_session_;
113 base::WeakPtrFactory<ScanSessionTest> weak_ptr_factory_;
Wade Guthriea60a11c2013-04-12 17:47:34 -0700114};
115
116// Test that we can get a bunch of frequencies up to a specified fraction.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700117TEST_F(ScanSessionTest, Fraction) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700118 vector<uint16_t> result;
119
120 // Get the first 83% of the connected values.
121 {
122 vector<uint16_t> expected;
123 expected.push_back(kExpectedFreq5640);
124 expected.push_back(kExpectedFreq5600);
125 expected.push_back(kExpectedFreq5580);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700126 result = GetScanFrequencies(.83, 1, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700127 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700128 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700129 }
130
131 // Get the next 4 values.
132 {
133 vector<uint16_t> expected;
134 expected.push_back(kExpectedFreq5560);
135 expected.push_back(kExpectedFreq5620);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700136 expected.push_back(kExpectedFreq2412);
137 expected.push_back(kExpectedFreq2417);
138 result = GetScanFrequencies(ScanSession::kAllFrequencies, 1, 4);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700139 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700140 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700141 }
142
143 // And, get the remaining list.
144 {
145 vector<uint16_t> expected;
146 expected.push_back(kExpectedFreq2422);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700147 expected.push_back(kExpectedFreq2427);
148 expected.push_back(kExpectedFreq2432);
149 result = GetScanFrequencies(ScanSession::kAllFrequencies, 20,
150 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700151 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700152 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700153 }
154}
155
156// Test that we can get a bunch of frequencies up to a specified fraction,
157// followed by another group up to a specified fraction.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700158TEST_F(ScanSessionTest, TwoFractions) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700159 vector<uint16_t> result;
160
161 // Get the first 60% of the connected values.
162 {
163 vector<uint16_t> expected;
164 expected.push_back(kExpectedFreq5640);
165 expected.push_back(kExpectedFreq5600);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700166 result = GetScanFrequencies(.60, 0, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700167 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700168 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700169 }
170
171 // Get the next 32% of the connected values.
172 {
173 vector<uint16_t> expected;
174 expected.push_back(kExpectedFreq5580);
175 expected.push_back(kExpectedFreq5560);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700176 result = GetScanFrequencies(.32, 0, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700177 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700178 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700179 }
180
181 // And, get the remaining list.
182 {
183 vector<uint16_t> expected;
184 expected.push_back(kExpectedFreq5620);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700185 expected.push_back(kExpectedFreq2412);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700186 expected.push_back(kExpectedFreq2417);
187 expected.push_back(kExpectedFreq2422);
188 expected.push_back(kExpectedFreq2427);
189 expected.push_back(kExpectedFreq2432);
190 result = GetScanFrequencies(ScanSession::kAllFrequencies,
191 std::numeric_limits<size_t>::max(),
192 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700193 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700194 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700195 }
196}
197
198// Test that we can get a bunch of frequencies up to a minimum count, even
199// when the requested fraction has already been reached.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700200TEST_F(ScanSessionTest, Min) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700201 vector<uint16_t> result;
202
203 // Get the first 3 previously seen values.
204 {
205 vector<uint16_t> expected;
206 expected.push_back(kExpectedFreq5640);
207 expected.push_back(kExpectedFreq5600);
208 expected.push_back(kExpectedFreq5580);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700209 result = GetScanFrequencies(.30, 3, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700210 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700211 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700212 }
213
214 // Get the next value by requensting a minimum of 1.
215 {
216 vector<uint16_t> expected;
217 expected.push_back(kExpectedFreq5560);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700218 result = GetScanFrequencies(0.0, 1, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700219 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700220 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700221 }
222
223 // And, get the remaining list.
224 {
225 vector<uint16_t> expected;
226 expected.push_back(kExpectedFreq5620);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700227 expected.push_back(kExpectedFreq2412);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700228 expected.push_back(kExpectedFreq2417);
229 expected.push_back(kExpectedFreq2422);
230 expected.push_back(kExpectedFreq2427);
231 expected.push_back(kExpectedFreq2432);
232 result = GetScanFrequencies(ScanSession::kAllFrequencies,
233 std::numeric_limits<size_t>::max(),
234 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700235 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700236 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700237 }
238}
239
240// Test that we can get up to a specified maximum number of frequencies.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700241TEST_F(ScanSessionTest, Max) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700242 vector<uint16_t> result;
243
244 // Get the first 7 values (crosses seen/unseen boundary).
245 {
246 vector<uint16_t> expected;
247 expected.push_back(kExpectedFreq5640);
248 expected.push_back(kExpectedFreq5600);
249 expected.push_back(kExpectedFreq5580);
250 expected.push_back(kExpectedFreq5560);
251 expected.push_back(kExpectedFreq5620);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700252 expected.push_back(kExpectedFreq2412);
253 expected.push_back(kExpectedFreq2417);
254 result = GetScanFrequencies(ScanSession::kAllFrequencies, 1, 7);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700255 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700256 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700257 }
258
259 // And, get the remaining list.
260 {
261 vector<uint16_t> expected;
262 expected.push_back(kExpectedFreq2422);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700263 expected.push_back(kExpectedFreq2427);
264 expected.push_back(kExpectedFreq2432);
265 result = GetScanFrequencies(ScanSession::kAllFrequencies, 20,
266 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700267 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700268 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700269 }
270}
271
272// Test that we can get exactly the seen frequencies and exactly the unseen
273// ones.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700274TEST_F(ScanSessionTest, Exact) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700275 vector<uint16_t> result;
276
277 // Get the first 5 values -- exectly on the seen/unseen border.
278 {
279 vector<uint16_t> expected;
280 expected.push_back(kExpectedFreq5640);
281 expected.push_back(kExpectedFreq5600);
282 expected.push_back(kExpectedFreq5580);
283 expected.push_back(kExpectedFreq5560);
284 expected.push_back(kExpectedFreq5620);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700285 result = GetScanFrequencies(ScanSession::kAllFrequencies, 5, 5);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700286 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700287 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700288 }
289
290 // And, get the last 5.
291 {
292 vector<uint16_t> expected;
Wade Guthriea60a11c2013-04-12 17:47:34 -0700293 expected.push_back(kExpectedFreq2412);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700294 expected.push_back(kExpectedFreq2417);
295 expected.push_back(kExpectedFreq2422);
296 expected.push_back(kExpectedFreq2427);
297 expected.push_back(kExpectedFreq2432);
298 result = GetScanFrequencies(ScanSession::kAllFrequencies, 5, 5);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700299 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700300 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700301 }
302}
303
304// Test that we can get everything in one read.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700305TEST_F(ScanSessionTest, AllOneRead) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700306 vector<uint16_t> expected;
307 expected.push_back(kExpectedFreq5640);
308 expected.push_back(kExpectedFreq5600);
309 expected.push_back(kExpectedFreq5580);
310 expected.push_back(kExpectedFreq5560);
311 expected.push_back(kExpectedFreq5620);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700312 expected.push_back(kExpectedFreq2412);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700313 expected.push_back(kExpectedFreq2417);
314 expected.push_back(kExpectedFreq2422);
315 expected.push_back(kExpectedFreq2427);
316 expected.push_back(kExpectedFreq2432);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700317 vector<uint16_t> result;
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700318 result = GetScanFrequencies(ScanSession::kAllFrequencies,
319 std::numeric_limits<size_t>::max(),
320 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700321 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700322 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700323}
324
325// Test that we can get all the previously seen frequencies (and only the
326// previously seen frequencies) via the requested fraction.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700327TEST_F(ScanSessionTest, EverythingFraction) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700328 vector<uint16_t> result;
329
330 // Get the first 100% of the connected values.
331 {
332 vector<uint16_t> expected;
333 expected.push_back(kExpectedFreq5640);
334 expected.push_back(kExpectedFreq5600);
335 expected.push_back(kExpectedFreq5580);
336 expected.push_back(kExpectedFreq5560);
337 expected.push_back(kExpectedFreq5620);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700338 result = GetScanFrequencies(1.0, 0, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700339 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700340 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700341 }
342
343 // And, get the remaining list.
344 {
345 vector<uint16_t> expected;
Wade Guthriea60a11c2013-04-12 17:47:34 -0700346 expected.push_back(kExpectedFreq2412);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700347 expected.push_back(kExpectedFreq2417);
348 expected.push_back(kExpectedFreq2422);
349 expected.push_back(kExpectedFreq2427);
350 expected.push_back(kExpectedFreq2432);
351 result = GetScanFrequencies(ScanSession::kAllFrequencies,
352 std::numeric_limits<size_t>::max(),
353 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700354 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700355 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700356 }
357}
358
359// Test that we can get each value individually.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700360TEST_F(ScanSessionTest, IndividualReads) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700361 vector<uint16_t> result;
362 static const float kArbitraryFraction = 0.83;
363
364 {
365 vector<uint16_t> expected;
366 expected.push_back(kExpectedFreq5640);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700367 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700368 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700369 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700370 }
371 {
372 vector<uint16_t> expected;
373 expected.push_back(kExpectedFreq5600);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700374 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700375 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700376 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700377 }
378 {
379 vector<uint16_t> expected;
380 expected.push_back(kExpectedFreq5580);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700381 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700382 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700383 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700384 }
385 {
386 vector<uint16_t> expected;
387 expected.push_back(kExpectedFreq5560);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700388 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700389 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700390 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700391 }
392 {
393 vector<uint16_t> expected;
394 expected.push_back(kExpectedFreq5620);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700395 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700396 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700397 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700398 }
399 {
400 vector<uint16_t> expected;
401 expected.push_back(kExpectedFreq2412);
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700402 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700403 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700404 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
405 }
406 {
407 vector<uint16_t> expected;
408 expected.push_back(kExpectedFreq2417);
409 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
410 EXPECT_THAT(result, ContainerEq(expected));
411 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
412 }
413 {
414 vector<uint16_t> expected;
415 expected.push_back(kExpectedFreq2422);
416 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
417 EXPECT_THAT(result, ContainerEq(expected));
418 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
419 }
420 {
421 vector<uint16_t> expected;
422 expected.push_back(kExpectedFreq2427);
423 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
424 EXPECT_THAT(result, ContainerEq(expected));
425 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
426 }
427 {
428 vector<uint16_t> expected;
429 expected.push_back(kExpectedFreq2432);
430 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
431 EXPECT_THAT(result, ContainerEq(expected));
432 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700433 }
434}
435
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700436TEST_F(ScanSessionTest, OnTriggerScanResponse) {
437 Nl80211Message::SetMessageType(kNl80211FamilyId);
438
439 EXPECT_CALL(*netlink_manager(), SendMessage(
440 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _));
441 scan_session()->InitiateScan();
442
443 EXPECT_CALL(*this, OnScanError());
444 NewScanResultsMessage not_supposed_to_get_this_message;
445 scan_session()->OnTriggerScanResponse(not_supposed_to_get_this_message);
446}
447
448TEST_F(ScanSessionTest, ExhaustFrequencies) {
449 // Set min & max scan frequency count to 1 so each scan will be of a single
450 // frequency.
451 SetScanSize(1, 1);
452
453 // Perform all the progressive scans until the frequencies are exhausted.
454 for (size_t i = 0; i < GetScanFrequencyCount(); ++i) {
455 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
456 EXPECT_CALL(*netlink_manager(), SendMessage(
457 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _));
458 scan_session()->InitiateScan();
459 }
460
461 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
462 EXPECT_CALL(*netlink_manager(), SendMessage(
463 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _))
464 .Times(0);
465 scan_session()->InitiateScan();
466}
467
468TEST_F(ScanSessionTest, OnError) {
469 Nl80211Message::SetMessageType(kNl80211FamilyId);
470
471 EXPECT_CALL(*netlink_manager(), SendMessage(
472 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _));
473 scan_session()->InitiateScan();
474
475 EXPECT_CALL(*this, OnScanError());
476 ErrorAckMessage error_message(-EINTR);
477 scan_session()->OnTriggerScanResponse(error_message);
478}
479
480TEST_F(ScanSessionTest, EBusy) {
481 const size_t kSmallRetryNumber = 3;
482 Nl80211Message::SetMessageType(kNl80211FamilyId);
483 scan_session()->scan_tries_left_ = kSmallRetryNumber;
484
485 EXPECT_CALL(*netlink_manager(), SendMessage(
486 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _));
487 scan_session()->InitiateScan();
488
489 ErrorAckMessage error_message(-EBUSY);
490 for (size_t i = 0; i < kSmallRetryNumber; ++i) {
491 EXPECT_CALL(*this, OnScanError()).Times(0);
492 EXPECT_CALL(*dispatcher(), PostDelayedTask(_, _));
493 scan_session()->OnTriggerScanResponse(error_message);
494 }
495
496 EXPECT_CALL(*this, OnScanError());
497 scan_session()->OnTriggerScanResponse(error_message);
498}
499
500TEST_F(ScanSessionTest, ScanHidden) {
501 scan_session_->AddSsid(ByteString("a", 1));
502 EXPECT_CALL(netlink_manager_,
503 SendMessage(HasHiddenSSID(kNl80211FamilyId), _));
504 scan_session()->InitiateScan();
505}
506
507TEST_F(ScanSessionTest, ScanNoHidden) {
508 EXPECT_CALL(netlink_manager_,
509 SendMessage(HasNoHiddenSSID(kNl80211FamilyId), _));
510 scan_session()->InitiateScan();
511}
512
Wade Guthriea60a11c2013-04-12 17:47:34 -0700513} // namespace shill