blob: 15a18819180d821bfbb76b744708a577ce90ab4e [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 Guthrieb86860c2013-09-18 15:42:56 -070066 WiFiProvider::FrequencyCountList default_connected_frequencies(
Wade Guthriea60a11c2013-04-12 17:47:34 -070067 kConnectedFrequencies,
68 kConnectedFrequencies + arraysize(kConnectedFrequencies));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070069
Wade Guthrieb86860c2013-09-18 15:42:56 -070070 set<uint16_t> default_unconnected_frequencies(
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070071 kUnconnectedFrequencies,
72 kUnconnectedFrequencies + arraysize(kUnconnectedFrequencies));
Wade Guthrieb86860c2013-09-18 15:42:56 -070073
74 BuildScanSession(default_connected_frequencies,
75 default_unconnected_frequencies);
76 }
77
78 void BuildScanSession(const WiFiProvider::FrequencyCountList
79 &connected_frequencies,
80 const std::set<uint16_t> &unconnected_frequencies) {
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070081 const int kArbitraryMinimum = 1;
82 const int kArbitraryMaximum = std::numeric_limits<int>::max();
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070083 scan_session_.reset(new ScanSession(&netlink_manager_,
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070084 &dispatcher_,
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070085 connected_frequencies,
86 unconnected_frequencies,
87 0,
88 ScanSession::FractionList(),
89 kArbitraryMinimum,
90 kArbitraryMaximum,
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -070091 Bind(&ScanSessionTest::OnScanError,
Wade Guthrief22681f2013-05-31 11:46:31 -070092 weak_ptr_factory_.GetWeakPtr()),
93 NULL));
Wade Guthriea60a11c2013-04-12 17:47:34 -070094 }
95
Wade Guthrieb9c3feb2013-04-25 16:31:19 -070096 virtual std::vector<uint16_t> GetScanFrequencies(float scan_fraction,
97 size_t min_frequencies,
98 size_t max_frequencies) {
99 return scan_session_->GetScanFrequencies(scan_fraction, min_frequencies,
100 max_frequencies);
101 }
102 ScanSession *scan_session() { return scan_session_.get(); }
103
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700104 void SetScanSize(size_t min_frequencies, size_t max_frequencies) {
105 scan_session_->min_frequencies_ = min_frequencies;
106 scan_session_->max_frequencies_ = max_frequencies;
107 }
108
109 size_t GetScanFrequencyCount() {
110 return arraysize(kConnectedFrequencies) +
111 arraysize(kUnconnectedFrequencies);
112 }
113
114 protected:
115 MOCK_METHOD0(OnScanError, void());
116 MockNetlinkManager *netlink_manager() { return &netlink_manager_; }
117 MockEventDispatcher *dispatcher() { return &dispatcher_; }
118
119 MockEventDispatcher dispatcher_;
Wade Guthriea60a11c2013-04-12 17:47:34 -0700120 MockNetlinkManager netlink_manager_;
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700121 scoped_ptr<ScanSession> scan_session_;
122 base::WeakPtrFactory<ScanSessionTest> weak_ptr_factory_;
Wade Guthriea60a11c2013-04-12 17:47:34 -0700123};
124
125// Test that we can get a bunch of frequencies up to a specified fraction.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700126TEST_F(ScanSessionTest, Fraction) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700127 vector<uint16_t> result;
128
129 // Get the first 83% of the connected values.
130 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700131 vector<uint16_t> expected{kExpectedFreq5640, kExpectedFreq5600,
132 kExpectedFreq5580};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700133 result = GetScanFrequencies(.83, 1, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700134 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700135 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700136 }
137
138 // Get the next 4 values.
139 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700140 vector<uint16_t> expected{kExpectedFreq5560, kExpectedFreq5620,
141 kExpectedFreq2412, kExpectedFreq2417};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700142 result = GetScanFrequencies(ScanSession::kAllFrequencies, 1, 4);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700143 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700144 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700145 }
146
147 // And, get the remaining list.
148 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700149 vector<uint16_t> expected{kExpectedFreq2422, kExpectedFreq2427,
150 kExpectedFreq2432};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700151 result = GetScanFrequencies(ScanSession::kAllFrequencies, 20,
152 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700153 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700154 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700155 }
156}
157
158// Test that we can get a bunch of frequencies up to a specified fraction,
159// followed by another group up to a specified fraction.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700160TEST_F(ScanSessionTest, TwoFractions) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700161 vector<uint16_t> result;
162
163 // Get the first 60% of the connected values.
164 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700165 vector<uint16_t> expected{kExpectedFreq5640, 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 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700173 vector<uint16_t> expected{kExpectedFreq5580, kExpectedFreq5560};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700174 result = GetScanFrequencies(.32, 0, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700175 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700176 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700177 }
178
179 // And, get the remaining list.
180 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700181 vector<uint16_t> expected{kExpectedFreq5620, kExpectedFreq2412,
182 kExpectedFreq2417, kExpectedFreq2422, kExpectedFreq2427,
183 kExpectedFreq2432};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700184 result = GetScanFrequencies(ScanSession::kAllFrequencies,
185 std::numeric_limits<size_t>::max(),
186 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700187 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700188 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700189 }
190}
191
192// Test that we can get a bunch of frequencies up to a minimum count, even
193// when the requested fraction has already been reached.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700194TEST_F(ScanSessionTest, Min) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700195 vector<uint16_t> result;
196
197 // Get the first 3 previously seen values.
198 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700199 vector<uint16_t> expected{kExpectedFreq5640, kExpectedFreq5600,
200 kExpectedFreq5580};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700201 result = GetScanFrequencies(.30, 3, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700202 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700203 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700204 }
205
Wade Guthrieb86860c2013-09-18 15:42:56 -0700206 // Get the next value by requesting a minimum of 1.
Wade Guthriea60a11c2013-04-12 17:47:34 -0700207 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700208 vector<uint16_t> expected{kExpectedFreq5560};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700209 result = GetScanFrequencies(0.0, 1, 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 // And, get the remaining list.
215 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700216 vector<uint16_t> expected{kExpectedFreq5620, kExpectedFreq2412,
217 kExpectedFreq2417, kExpectedFreq2422, kExpectedFreq2427,
218 kExpectedFreq2432};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700219 result = GetScanFrequencies(ScanSession::kAllFrequencies,
220 std::numeric_limits<size_t>::max(),
221 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700222 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700223 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700224 }
225}
226
227// Test that we can get up to a specified maximum number of frequencies.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700228TEST_F(ScanSessionTest, Max) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700229 vector<uint16_t> result;
230
231 // Get the first 7 values (crosses seen/unseen boundary).
232 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700233 vector<uint16_t> expected{kExpectedFreq5640, kExpectedFreq5600,
234 kExpectedFreq5580, kExpectedFreq5560, kExpectedFreq5620,
235 kExpectedFreq2412, kExpectedFreq2417};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700236 result = GetScanFrequencies(ScanSession::kAllFrequencies, 1, 7);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700237 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700238 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700239 }
240
241 // And, get the remaining list.
242 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700243 vector<uint16_t> expected{kExpectedFreq2422, kExpectedFreq2427,
244 kExpectedFreq2432};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700245 result = GetScanFrequencies(ScanSession::kAllFrequencies, 20,
246 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700247 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700248 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700249 }
250}
251
252// Test that we can get exactly the seen frequencies and exactly the unseen
253// ones.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700254TEST_F(ScanSessionTest, Exact) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700255 vector<uint16_t> result;
256
Wade Guthrieb86860c2013-09-18 15:42:56 -0700257 // Get the first 5 values -- exactly on the seen/unseen border.
Wade Guthriea60a11c2013-04-12 17:47:34 -0700258 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700259 vector<uint16_t> expected{kExpectedFreq5640, kExpectedFreq5600,
260 kExpectedFreq5580, kExpectedFreq5560, kExpectedFreq5620};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700261 result = GetScanFrequencies(ScanSession::kAllFrequencies, 5, 5);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700262 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700263 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700264 }
265
266 // And, get the last 5.
267 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700268 vector<uint16_t> expected{kExpectedFreq2412, kExpectedFreq2417,
269 kExpectedFreq2422, kExpectedFreq2427, kExpectedFreq2432};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700270 result = GetScanFrequencies(ScanSession::kAllFrequencies, 5, 5);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700271 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700272 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700273 }
274}
275
276// Test that we can get everything in one read.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700277TEST_F(ScanSessionTest, AllOneRead) {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700278 vector<uint16_t> expected{kExpectedFreq5640, kExpectedFreq5600,
279 kExpectedFreq5580, kExpectedFreq5560, kExpectedFreq5620,
280 kExpectedFreq2412, kExpectedFreq2417, kExpectedFreq2422,
281 kExpectedFreq2427, kExpectedFreq2432};
Wade Guthriea60a11c2013-04-12 17:47:34 -0700282 vector<uint16_t> result;
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700283 result = GetScanFrequencies(ScanSession::kAllFrequencies,
284 std::numeric_limits<size_t>::max(),
285 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700286 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700287 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700288}
289
290// Test that we can get all the previously seen frequencies (and only the
291// previously seen frequencies) via the requested fraction.
Wade Guthrieb86860c2013-09-18 15:42:56 -0700292TEST_F(ScanSessionTest, EverythingConnected) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700293 vector<uint16_t> result;
294
295 // Get the first 100% of the connected values.
296 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700297 vector<uint16_t> expected{kExpectedFreq5640, kExpectedFreq5600,
298 kExpectedFreq5580, kExpectedFreq5560, kExpectedFreq5620};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700299 result = GetScanFrequencies(1.0, 0, std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700300 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700301 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700302 }
303
304 // And, get the remaining list.
305 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700306 vector<uint16_t> expected{kExpectedFreq2412, kExpectedFreq2417,
307 kExpectedFreq2422, kExpectedFreq2427, kExpectedFreq2432};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700308 result = GetScanFrequencies(ScanSession::kAllFrequencies,
309 std::numeric_limits<size_t>::max(),
310 std::numeric_limits<size_t>::max());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700311 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700312 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700313 }
314}
315
Wade Guthrieb86860c2013-09-18 15:42:56 -0700316TEST_F(ScanSessionTest, OnlyPreviouslySeen) {
317 // Build a scan session with only previously connected frequencies.
318 WiFiProvider::FrequencyCountList default_connected_frequencies(
319 kConnectedFrequencies,
320 kConnectedFrequencies + arraysize(kConnectedFrequencies));
321 BuildScanSession(default_connected_frequencies, std::set<uint16_t>());
322
323 // Get the first 100% of the connected values.
324 vector<uint16_t> expected{kExpectedFreq5640, kExpectedFreq5600,
325 kExpectedFreq5580, kExpectedFreq5560, kExpectedFreq5620};
326
327 vector<uint16_t> result;
328 result = GetScanFrequencies(ScanSession::kAllFrequencies, 1,
329 std::numeric_limits<size_t>::max());
330 EXPECT_THAT(result, ContainerEq(expected));
331 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
332 result = GetScanFrequencies(ScanSession::kAllFrequencies,
333 std::numeric_limits<size_t>::max(),
334 std::numeric_limits<size_t>::max());
335 EXPECT_TRUE(result.empty());
336}
337
338// Verify that max works inside the list of connected frequencies.
339TEST_F(ScanSessionTest, MaxAppliesToConnected) {
340 vector<uint16_t> result;
341
342 {
343 vector<uint16_t> expected{kExpectedFreq5640, kExpectedFreq5600,
344 kExpectedFreq5580};
345
346 result = GetScanFrequencies(ScanSession::kAllFrequencies, 1, 3);
347 EXPECT_THAT(result, ContainerEq(expected));
348 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
349 }
350
351 {
352 vector<uint16_t> expected{kExpectedFreq5560, kExpectedFreq5620,
353 kExpectedFreq2412};
354
355 result = GetScanFrequencies(ScanSession::kAllFrequencies, 1, 3);
356 EXPECT_THAT(result, ContainerEq(expected));
357 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
358 }
359
360 {
361 vector<uint16_t> expected{kExpectedFreq2417, kExpectedFreq2422,
362 kExpectedFreq2427};
363
364 result = GetScanFrequencies(ScanSession::kAllFrequencies, 1, 3);
365 EXPECT_THAT(result, ContainerEq(expected));
366 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
367 }
368
369 {
370 vector<uint16_t> expected{kExpectedFreq2432};
371
372 result = GetScanFrequencies(ScanSession::kAllFrequencies, 1, 3);
373 EXPECT_THAT(result, ContainerEq(expected));
374 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
375 }
376}
377
Wade Guthriea60a11c2013-04-12 17:47:34 -0700378// Test that we can get each value individually.
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700379TEST_F(ScanSessionTest, IndividualReads) {
Wade Guthriea60a11c2013-04-12 17:47:34 -0700380 vector<uint16_t> result;
381 static const float kArbitraryFraction = 0.83;
382
383 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700384 vector<uint16_t> expected{kExpectedFreq5640};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700385 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700386 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700387 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700388 }
389 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700390 vector<uint16_t> expected{kExpectedFreq5600};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700391 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700392 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700393 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700394 }
395 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700396 vector<uint16_t> expected{kExpectedFreq5580};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700397 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700398 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700399 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700400 }
401 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700402 vector<uint16_t> expected{kExpectedFreq5560};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700403 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700404 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700405 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700406 }
407 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700408 vector<uint16_t> expected{kExpectedFreq5620};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700409 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700410 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700411 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700412 }
413 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700414 vector<uint16_t> expected{kExpectedFreq2412};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700415 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
Wade Guthriea60a11c2013-04-12 17:47:34 -0700416 EXPECT_THAT(result, ContainerEq(expected));
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700417 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
418 }
419 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700420 vector<uint16_t> expected{kExpectedFreq2417};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700421 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
422 EXPECT_THAT(result, ContainerEq(expected));
423 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
424 }
425 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700426 vector<uint16_t> expected{kExpectedFreq2422};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700427 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
428 EXPECT_THAT(result, ContainerEq(expected));
429 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
430 }
431 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700432 vector<uint16_t> expected{kExpectedFreq2427};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700433 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
434 EXPECT_THAT(result, ContainerEq(expected));
435 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
436 }
437 {
Wade Guthrieb86860c2013-09-18 15:42:56 -0700438 vector<uint16_t> expected{kExpectedFreq2432};
Wade Guthrieb9c3feb2013-04-25 16:31:19 -0700439 result = GetScanFrequencies(kArbitraryFraction, 1, 1);
440 EXPECT_THAT(result, ContainerEq(expected));
441 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthriea60a11c2013-04-12 17:47:34 -0700442 }
443}
444
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700445TEST_F(ScanSessionTest, OnTriggerScanResponse) {
446 Nl80211Message::SetMessageType(kNl80211FamilyId);
447
Wade Guthrie7347bf22013-04-30 11:21:51 -0700448 EXPECT_CALL(*netlink_manager(), SendNl80211Message(
449 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _));
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700450 scan_session()->InitiateScan();
451
452 EXPECT_CALL(*this, OnScanError());
453 NewScanResultsMessage not_supposed_to_get_this_message;
454 scan_session()->OnTriggerScanResponse(not_supposed_to_get_this_message);
455}
456
457TEST_F(ScanSessionTest, ExhaustFrequencies) {
458 // Set min & max scan frequency count to 1 so each scan will be of a single
459 // frequency.
460 SetScanSize(1, 1);
461
462 // Perform all the progressive scans until the frequencies are exhausted.
463 for (size_t i = 0; i < GetScanFrequencyCount(); ++i) {
464 EXPECT_TRUE(scan_session()->HasMoreFrequencies());
Wade Guthrie7347bf22013-04-30 11:21:51 -0700465 EXPECT_CALL(*netlink_manager(), SendNl80211Message(
466 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _));
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700467 scan_session()->InitiateScan();
468 }
469
470 EXPECT_FALSE(scan_session()->HasMoreFrequencies());
Wade Guthrie7347bf22013-04-30 11:21:51 -0700471 EXPECT_CALL(*netlink_manager(), SendNl80211Message(
472 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _))
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700473 .Times(0);
474 scan_session()->InitiateScan();
475}
476
477TEST_F(ScanSessionTest, OnError) {
478 Nl80211Message::SetMessageType(kNl80211FamilyId);
479
Wade Guthrie7347bf22013-04-30 11:21:51 -0700480 EXPECT_CALL(*netlink_manager(), SendNl80211Message(
481 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _));
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700482 scan_session()->InitiateScan();
483
484 EXPECT_CALL(*this, OnScanError());
485 ErrorAckMessage error_message(-EINTR);
Wade Guthrie84db7ce2013-06-12 11:40:49 -0700486 scan_session()->OnTriggerScanErrorResponse(NetlinkManager::kErrorFromKernel,
487 &error_message);
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700488}
489
490TEST_F(ScanSessionTest, EBusy) {
491 const size_t kSmallRetryNumber = 3;
492 Nl80211Message::SetMessageType(kNl80211FamilyId);
493 scan_session()->scan_tries_left_ = kSmallRetryNumber;
494
Wade Guthrie7347bf22013-04-30 11:21:51 -0700495 EXPECT_CALL(*netlink_manager(), SendNl80211Message(
496 IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _));
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700497 scan_session()->InitiateScan();
498
499 ErrorAckMessage error_message(-EBUSY);
500 for (size_t i = 0; i < kSmallRetryNumber; ++i) {
501 EXPECT_CALL(*this, OnScanError()).Times(0);
502 EXPECT_CALL(*dispatcher(), PostDelayedTask(_, _));
Wade Guthrie84db7ce2013-06-12 11:40:49 -0700503 scan_session()->OnTriggerScanErrorResponse(NetlinkManager::kErrorFromKernel,
504 &error_message);
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700505 }
506
507 EXPECT_CALL(*this, OnScanError());
Wade Guthrie84db7ce2013-06-12 11:40:49 -0700508 scan_session()->OnTriggerScanErrorResponse(NetlinkManager::kErrorFromKernel,
509 &error_message);
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700510}
511
512TEST_F(ScanSessionTest, ScanHidden) {
513 scan_session_->AddSsid(ByteString("a", 1));
514 EXPECT_CALL(netlink_manager_,
Wade Guthrie7347bf22013-04-30 11:21:51 -0700515 SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _));
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700516 scan_session()->InitiateScan();
517}
518
519TEST_F(ScanSessionTest, ScanNoHidden) {
520 EXPECT_CALL(netlink_manager_,
Wade Guthrie7347bf22013-04-30 11:21:51 -0700521 SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _));
Wade Guthrie5a4e2ef2013-04-30 12:51:39 -0700522 scan_session()->InitiateScan();
523}
524
Wade Guthriea60a11c2013-04-12 17:47:34 -0700525} // namespace shill