ScanScheduleUtilFilterTest.java revision 1a16020f8d611c94797884b212ee6a26817fad82
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;
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;
23import static com.android.server.wifi.ScanTestUtil.installWlanWifiNative;
24import static com.android.server.wifi.ScanTestUtil.setupMockChannels;
25
26import static org.junit.Assert.assertEquals;
27import static org.junit.Assert.assertFalse;
28import static org.junit.Assert.assertNotNull;
29import static org.junit.Assert.assertNull;
30import static org.junit.Assert.assertTrue;
31import static org.mockito.Mockito.mock;
32
33import android.net.wifi.WifiScanner;
34import android.net.wifi.WifiScanner.ScanData;
35import android.net.wifi.WifiScanner.ScanSettings;
36import android.test.suitebuilder.annotation.SmallTest;
37
38import org.junit.Before;
39import org.junit.Test;
40
41import java.util.Collection;
42import java.util.Collections;
43
44/**
45 * Unit tests for filtering of scan results in {@link com.android.server.wifi.MultiClientScheduler}.
46 */
47@SmallTest
48public class MultiClientSchedulerFilterTest {
49
50    private static final int DEFAULT_MAX_BUCKETS = 8;
51    private static final int DEFAULT_MAX_CHANNELS = 8;
52    private static final int DEFAULT_MAX_BATCH = 10;
53
54    private WifiNative mWifiNative;
55    private MultiClientScheduler mScheduler;
56
57    @Before
58    public void setUp() throws Exception {
59        mWifiNative = mock(WifiNative.class);
60        setupMockChannels(mWifiNative,
61                new int[]{2400, 2450},
62                new int[]{5150, 5175},
63                new int[]{5600, 5650});
64        installWlanWifiNative(mWifiNative);
65
66        mScheduler = new MultiClientScheduler();
67        mScheduler.setMaxBuckets(DEFAULT_MAX_BUCKETS);
68        mScheduler.setMaxChannels(DEFAULT_MAX_CHANNELS);
69        mScheduler.setMaxBatch(DEFAULT_MAX_BATCH);
70    }
71
72    @Test
73    public void reportFullResultTrueForBands() {
74        ScanSettings settings = createRequest(
75                WifiScanner.WIFI_BAND_24_GHZ, 30000, 0, 20,
76                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
77        );
78        Collection<ScanSettings> requests = Collections.singleton(settings);
79        mScheduler.updateSchedule(requests);
80
81        assertTrue(mScheduler.shouldReportFullScanResultForSettings(
82                createScanResult(2400), settings));
83    }
84
85    @Test
86    public void reportFullResultFalseForBands() {
87        ScanSettings settings = createRequest(
88                WifiScanner.WIFI_BAND_24_GHZ, 30000, 0, 20,
89                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
90        );
91        Collection<ScanSettings> requests = Collections.singleton(settings);
92        mScheduler.updateSchedule(requests);
93
94        assertFalse(mScheduler.shouldReportFullScanResultForSettings(
95                createScanResult(5150), settings));
96    }
97
98    @Test
99    public void reportFullResultTrueForChannels() {
100        ScanSettings settings = createRequest(
101                channelsToSpec(2400, 5150), 30000, 0, 20,
102                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
103        );
104        Collection<ScanSettings> requests = Collections.singleton(settings);
105        mScheduler.updateSchedule(requests);
106
107        assertTrue(mScheduler.shouldReportFullScanResultForSettings(
108                createScanResult(2400), settings));
109    }
110
111    @Test
112    public void reportFullResultFalseForChannels() {
113        ScanSettings settings = createRequest(
114                channelsToSpec(2400, 5150), 30000, 0, 20,
115                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
116        );
117        Collection<ScanSettings> requests = Collections.singleton(settings);
118        mScheduler.updateSchedule(requests);
119
120        assertFalse(mScheduler.shouldReportFullScanResultForSettings(
121                createScanResult(5175), settings));
122    }
123
124    @Test
125    public void filterScanDataEmpty() {
126        ScanSettings settings = createRequest(
127                channelsToSpec(2400, 5150), 30000, 0, 20,
128                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
129        );
130        Collection<ScanSettings> requests = Collections.singleton(settings);
131        mScheduler.updateSchedule(requests);
132
133        ScanData[] results = mScheduler.filterResultsForSettings(new ScanData[0], settings);
134        assertScanDataFreqsEquals(null, results);
135    }
136
137    @Test
138    public void filterScanDataSingleNotMatching() {
139        ScanSettings settings = createRequest(
140                channelsToSpec(2400, 5150), 30000, 0, 20,
141                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
142        );
143        Collection<ScanSettings> requests = Collections.singleton(settings);
144        mScheduler.updateSchedule(requests);
145
146        ScanData[] results = mScheduler.filterResultsForSettings(
147                createScanDatas(new int[][]{ { 2450 } }), settings);
148        assertScanDataFreqsEquals(null, results);
149    }
150
151    @Test
152    public void filterScanDataSingleMatching() {
153        ScanSettings settings = createRequest(
154                channelsToSpec(2400, 5150), 30000, 0, 20,
155                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
156        );
157        Collection<ScanSettings> requests = Collections.singleton(settings);
158        mScheduler.updateSchedule(requests);
159
160        ScanData[] results = mScheduler.filterResultsForSettings(
161                createScanDatas(new int[][]{ { 2400 } }), settings);
162
163        assertScanDataFreqsEquals(new int[][]{ { 2400 } }, results);
164    }
165
166    @Test
167    public void filterScanDataSinglePartialMatching() {
168        ScanSettings settings = createRequest(
169                channelsToSpec(2400, 5150), 30000, 0, 20,
170                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
171        );
172        Collection<ScanSettings> requests = Collections.singleton(settings);
173        mScheduler.updateSchedule(requests);
174
175        ScanData[] results = mScheduler.filterResultsForSettings(
176                createScanDatas(new int[][]{ { 2400, 2450, 5150, 5175 } }), settings);
177
178        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150 } }, results);
179    }
180
181    @Test
182    public void filterScanDataMultipleNotMatching() {
183        ScanSettings settings = createRequest(
184                channelsToSpec(2400, 5150), 30000, 0, 20,
185                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
186        );
187        Collection<ScanSettings> requests = Collections.singleton(settings);
188        mScheduler.updateSchedule(requests);
189
190        ScanData[] results = mScheduler.filterResultsForSettings(
191                createScanDatas(new int[][]{ { 2450 }, { 2450, 5175 } }), settings);
192        assertScanDataFreqsEquals(null, results);
193    }
194
195    @Test
196    public void filterScanDataMultipleMatching() {
197        ScanSettings settings = createRequest(
198                channelsToSpec(2400, 5150), 30000, 0, 20,
199                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
200        );
201        Collection<ScanSettings> requests = Collections.singleton(settings);
202        mScheduler.updateSchedule(requests);
203
204        ScanData[] results = mScheduler.filterResultsForSettings(
205                createScanDatas(new int[][]{ { 2400 }, {2400, 5150} }), settings);
206
207        assertScanDataFreqsEquals(new int[][]{ { 2400 }, {2400, 5150} }, results);
208    }
209
210    @Test
211    public void filterScanDataMultiplePartialMatching() {
212        ScanSettings settings = createRequest(
213                channelsToSpec(2400, 5150), 30000, 0, 20,
214                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
215        );
216        Collection<ScanSettings> requests = Collections.singleton(settings);
217        mScheduler.updateSchedule(requests);
218
219        ScanData[] results = mScheduler.filterResultsForSettings(createScanDatas(
220                new int[][]{ { 2400, 2450, 5150, 5175 }, { 2400, 2450, 5175 } }), settings);
221
222        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150 }, { 2400 } }, results);
223    }
224
225    @Test
226    public void filterScanDataMultipleDuplicateFrequencies() {
227        ScanSettings settings = createRequest(
228                channelsToSpec(2400, 5150), 30000, 0, 20,
229                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
230        );
231        Collection<ScanSettings> requests = Collections.singleton(settings);
232        mScheduler.updateSchedule(requests);
233
234        ScanData[] results = mScheduler.filterResultsForSettings(createScanDatas(
235                new int[][]{ { 2400, 2450, 5150, 5175, 2400 },
236                             { 2400, 2450, 5175 },
237                             { 5175, 5175, 5150 } }), settings);
238
239        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150, 2400 }, { 2400 }, { 5150 } }, results);
240    }
241
242    @Test
243    public void filterScanDataMultipleSomeNotMatching() {
244        ScanSettings settings = createRequest(
245                channelsToSpec(2400, 5150), 30000, 0, 20,
246                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
247        );
248        Collection<ScanSettings> requests = Collections.singleton(settings);
249        mScheduler.updateSchedule(requests);
250
251        ScanData[] results = mScheduler.filterResultsForSettings(createScanDatas(
252                new int[][]{ { 2400, 2450, 5150, 5175, 2400 },
253                             { 5175 },
254                             { 5175, 5175, 5150 } }), settings);
255
256        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150, 2400 }, { 5150 } }, results);
257    }
258
259    @Test
260    public void filterScanDataExceedMaxBssidsPerScan() {
261        ScanSettings settings = createRequest(
262                channelsToSpec(2400, 5150), 30000, 0, 3,
263                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
264        );
265        Collection<ScanSettings> requests = Collections.singleton(settings);
266        mScheduler.updateSchedule(requests);
267
268        ScanData[] results = mScheduler.filterResultsForSettings(createScanDatas(
269                        new int[][]{ { 2400, 2450, 5150, 5175, 2400, 2400},
270                                     { 5175 },
271                                     { 5175, 5175, 5150, 2400, 2400, 5150 } }), settings);
272
273        assertScanDataFreqsEquals(new int[][]{ { 2400, 5150, 2400 }, { 5150, 2400, 2400 } },
274                results);
275    }
276
277
278    public static void assertScanDataFreqsEquals(int[][] expected, ScanData[] results) {
279        if (expected == null) {
280            assertNull(results);
281        } else {
282            assertNotNull(results);
283            assertEquals("num scans", expected.length, results.length);
284            for (int i = 0; i < expected.length; ++i) {
285                assertNotNull("scan[" + i + "] was null", results[i]);
286                assertEquals("num aps in scan[" + i + "]", expected[i].length,
287                        results[i].getResults().length);
288                for (int j = 0; j < expected[i].length; ++j) {
289                    assertNotNull("ap result[" + i + "][" + j + "] was null",
290                            results[i].getResults()[j]);
291                    assertEquals("ap freq in result[" + i + "][" + j + "]", expected[i][j],
292                            results[i].getResults()[j].frequency);
293                }
294            }
295        }
296    }
297}
298