1/*
2 * Copyright (C) 2015 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 */
16
17package com.android.server.wifi.scanner;
18
19import static com.android.server.wifi.ScanTestUtil.channelsToSpec;
20import static com.android.server.wifi.ScanTestUtil.createRequest;
21import static com.android.server.wifi.ScanTestUtil.createScanDatas;
22import static com.android.server.wifi.ScanTestUtil.createScanResult;
23
24import static org.junit.Assert.assertEquals;
25import static org.junit.Assert.assertFalse;
26import static org.junit.Assert.assertNotNull;
27import static org.junit.Assert.assertNull;
28import static org.junit.Assert.assertTrue;
29
30import android.net.wifi.WifiScanner;
31import android.net.wifi.WifiScanner.ScanData;
32import android.net.wifi.WifiScanner.ScanSettings;
33import android.test.suitebuilder.annotation.SmallTest;
34
35import org.junit.Before;
36import org.junit.Test;
37
38/**
39 * Unit tests for filtering of scan results in
40 * {@link com.android.server.wifi.scanner.ScanScheduleUtil}.
41 */
42@SmallTest
43public class ScanScheduleUtilFilterTest {
44
45    private ChannelHelper mChannelHelper;
46
47    @Before
48    public void setUp() throws Exception {
49        mChannelHelper = new PresetKnownBandsChannelHelper(
50                new int[]{2400, 2450},
51                new int[]{5150, 5175},
52                new int[]{5600, 5650});
53    }
54
55    @Test
56    public void reportFullResultTrueForBandsWithNoBucketInfo() {
57        ScanSettings settings = createRequest(
58                WifiScanner.WIFI_BAND_24_GHZ, 30000, 0, 20,
59                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
60        );
61
62        assertTrue(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
63                        createScanResult(2400), 0, settings, -1));
64    }
65
66    @Test
67    public void reportFullResultFalseForBandsWithNoBucketInfo() {
68        ScanSettings settings = createRequest(
69                WifiScanner.WIFI_BAND_24_GHZ, 30000, 0, 20,
70                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
71        );
72
73        assertFalse(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
74                        createScanResult(5150), 0, settings, 0));
75    }
76
77    @Test
78    public void reportFullResultTrueForChannelsWithNoBucketInfo() {
79        ScanSettings settings = createRequest(
80                channelsToSpec(2400, 5150), 30000, 0, 20,
81                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
82        );
83
84        assertTrue(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
85                        createScanResult(2400), 0, settings, 0));
86    }
87
88    @Test
89    public void reportFullResultFalseForChannelsWithNoBucketInfo() {
90        ScanSettings settings = createRequest(
91                channelsToSpec(2400, 5150), 30000, 0, 20,
92                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
93        );
94
95        assertFalse(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
96                        createScanResult(5175), 0, settings, 0));
97    }
98
99    @Test
100    public void reportFullResultTrueForChannelsWithBucketDefinitlyScanned() {
101        ScanSettings settings = createRequest(
102                channelsToSpec(2400, 5150), 30000, 0, 20,
103                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
104        );
105
106        assertTrue(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
107                        createScanResult(2400), 5, settings, 2));
108    }
109
110    @Test
111    public void reportFullResultFalseForChannelsWithBucketDefinitlyNotScanned() {
112        ScanSettings settings = createRequest(
113                channelsToSpec(2400, 5150), 30000, 0, 20,
114                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
115        );
116
117        assertFalse(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
118                        createScanResult(2400), 1, settings, 1));
119    }
120
121    @Test
122    public void filterScanDataEmptyWithNoBucketInfo() {
123        ScanSettings settings = createRequest(
124                channelsToSpec(2400, 5150), 30000, 0, 20,
125                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
126        );
127
128        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
129                new ScanData[0], settings, -1);
130        assertScanDataFreqsEquals(null, results);
131    }
132
133    @Test
134    public void filterScanDataSingleNotMatchingWithNoBucketInfo() {
135        ScanSettings settings = createRequest(
136                channelsToSpec(2400, 5150), 30000, 0, 20,
137                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
138        );
139
140        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
141                createScanDatas(new int[][]{ { 2450 } }), settings, 0);
142        assertScanDataFreqsEquals(null, results);
143    }
144
145    @Test
146    public void filterScanDataSingleNotMatchingWithDefinitlyScannedBucketIndex() {
147        ScanSettings settings = createRequest(
148                channelsToSpec(2400, 5150), 30000, 0, 20,
149                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
150        );
151
152        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
153                createScanDatas(new int[][]{ { 2450 } }), settings, -1);
154        assertScanDataFreqsEquals(new int[][]{ { } }, results);
155    }
156
157    @Test
158    public void filterScanDataSingleNotMatchingWithBucketDefinitlyScanned() {
159        ScanSettings settings = createRequest(
160                channelsToSpec(2400, 5150), 30000, 0, 20,
161                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
162        );
163
164        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
165                createScanDatas(new int[][]{ { 2450 } }, new int[]{ 2 }), settings, 1);
166        assertScanDataFreqsEquals(new int[][]{ { } }, results);
167    }
168
169    @Test
170    public void filterScanDataSingleMatchingWithNoBucketInfo() {
171        ScanSettings settings = createRequest(
172                channelsToSpec(2400, 5150), 30000, 0, 20,
173                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
174        );
175
176        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
177                createScanDatas(new int[][]{ { 2400 } }), settings, 0);
178
179        assertScanDataFreqsEquals(new int[][]{ { 2400 } }, results);
180    }
181
182    @Test
183    public void filterScanDataSingleMatchingWithBucketDefinitlyNotScanned() {
184        ScanSettings settings = createRequest(
185                channelsToSpec(2400, 5150), 30000, 0, 20,
186                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
187        );
188
189        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
190                createScanDatas(new int[][]{ { 2400 } }, new int[] { 5 }), settings, 1);
191
192        assertScanDataFreqsEquals(null, results);
193    }
194
195    @Test
196    public void filterScanDataSinglePartialMatchingWithNoBucketInfo() {
197        ScanSettings settings = createRequest(
198                channelsToSpec(2400, 5150), 30000, 0, 20,
199                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
200        );
201
202        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
203                createScanDatas(new int[][]{ { 2400, 2450, 5150, 5175 } }), settings, 0);
204
205        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150 } }, results);
206    }
207
208    @Test
209    public void filterScanDataMultipleNotMatchingWithNoBucketInfo() {
210        ScanSettings settings = createRequest(
211                channelsToSpec(2400, 5150), 30000, 0, 20,
212                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
213        );
214
215        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
216                createScanDatas(new int[][]{ { 2450 }, { 2450, 5175 } }), settings, 0);
217        assertScanDataFreqsEquals(null, results);
218    }
219
220    @Test
221    public void filterScanDataMultipleNotMatchingWithOneDefinitlyScanned() {
222        ScanSettings settings = createRequest(
223                channelsToSpec(2400, 5150), 30000, 0, 20,
224                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
225        );
226
227        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
228                createScanDatas(new int[][]{ { 2450 }, { 2450, 5175 } }, new int[]{ 1, 8 }),
229                settings, 3);
230        assertScanDataFreqsEquals(new int[][]{ {} }, results);
231    }
232
233    @Test
234    public void filterScanDataMultipleMatchingWithNoBucketInfo() {
235        ScanSettings settings = createRequest(
236                channelsToSpec(2400, 5150), 30000, 0, 20,
237                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
238        );
239
240        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
241                createScanDatas(new int[][]{ { 2400 }, {2400, 5150} }), settings, 0);
242
243        assertScanDataFreqsEquals(new int[][]{ { 2400 }, {2400, 5150} }, results);
244    }
245
246    @Test
247    public void filterScanDataMultiplePartialMatchingWithNoBucketInfo() {
248        ScanSettings settings = createRequest(
249                channelsToSpec(2400, 5150), 30000, 0, 20,
250                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
251        );
252
253        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
254                createScanDatas(new int[][]{ { 2400, 2450, 5150, 5175 }, { 2400, 2450, 5175 } }),
255                settings, -1);
256
257        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150 }, { 2400 } }, results);
258    }
259
260    @Test
261    public void filterScanDataMultipleDuplicateFrequenciesWithNoBucketInfo() {
262        ScanSettings settings = createRequest(
263                channelsToSpec(2400, 5150), 30000, 0, 20,
264                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
265        );
266
267        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
268                createScanDatas(new int[][]{
269                        { 2400, 2450, 5150, 5175, 2400 },
270                        { 2400, 2450, 5175 },
271                        { 5175, 5175, 5150 } }), settings, 0);
272
273        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150, 2400 }, { 2400 }, { 5150 } }, results);
274    }
275
276    @Test
277    public void filterScanDataMultipleSomeNotMatchingWithNoBucketInfo() {
278        ScanSettings settings = createRequest(
279                channelsToSpec(2400, 5150), 30000, 0, 20,
280                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
281        );
282
283        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
284                createScanDatas(new int[][]{
285                        { 2400, 2450, 5150, 5175, 2400 },
286                        { 5175 },
287                        { 5175, 5175, 5150 } }), settings, 0);
288
289        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150, 2400 }, { 5150 } }, results);
290    }
291
292    @Test
293    public void filterScanDataExceedMaxBssidsPerScanWithNoBucketInfo() {
294        ScanSettings settings = createRequest(
295                channelsToSpec(2400, 5150), 30000, 0, 3,
296                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
297        );
298
299        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
300                createScanDatas(new int[][]{
301                        { 2400, 2450, 5150, 5175, 2400, 2400},
302                        { 5175 },
303                        { 5175, 5175, 5150, 2400, 2400, 5150 } }), settings, 0);
304
305        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150, 2400 }, { 5150, 2400, 2400 } },
306                results);
307    }
308
309
310    private static void assertScanDataFreqsEquals(int[][] expected, ScanData[] results) {
311        if (expected == null) {
312            assertNull("Expected no results", results);
313        } else {
314            assertNotNull("Expected some results", results);
315            assertEquals("num scans", expected.length, results.length);
316            for (int i = 0; i < expected.length; ++i) {
317                assertNotNull("scan[" + i + "] was null", results[i]);
318                assertEquals("num aps in scan[" + i + "]", expected[i].length,
319                        results[i].getResults().length);
320                for (int j = 0; j < expected[i].length; ++j) {
321                    assertNotNull("ap result[" + i + "][" + j + "] was null",
322                            results[i].getResults()[j]);
323                    assertEquals("ap freq in result[" + i + "][" + j + "]", expected[i][j],
324                            results[i].getResults()[j].frequency);
325                }
326            }
327        }
328    }
329}
330