BackgroundScanSchedulerTest.java revision 1a16020f8d611c94797884b212ee6a26817fad82
1297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills/*
2297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * Copyright (C) 2015 The Android Open Source Project
3297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills *
4297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * Licensed under the Apache License, Version 2.0 (the "License");
5297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * you may not use this file except in compliance with the License.
6297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * You may obtain a copy of the License at
7297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills *
8297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills *      http://www.apache.org/licenses/LICENSE-2.0
9297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills *
10297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * Unless required by applicable law or agreed to in writing, software
11297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * distributed under the License is distributed on an "AS IS" BASIS,
12297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * See the License for the specific language governing permissions and
14297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * limitations under the License
15297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills */
16297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
17297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willspackage com.android.server.wifi;
18297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
19297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport static com.android.server.wifi.ScanTestUtil.channelsToSpec;
20297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport static com.android.server.wifi.ScanTestUtil.createRequest;
21297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport static com.android.server.wifi.ScanTestUtil.getAllChannels;
22297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport static com.android.server.wifi.ScanTestUtil.installWlanWifiNative;
23297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport static com.android.server.wifi.ScanTestUtil.setupMockChannels;
24297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
2572c639e8b97067e948eca8be50dfea3173121090Mitchell Willsimport static org.junit.Assert.assertEquals;
2672c639e8b97067e948eca8be50dfea3173121090Mitchell Willsimport static org.junit.Assert.assertNotNull;
2772c639e8b97067e948eca8be50dfea3173121090Mitchell Willsimport static org.junit.Assert.assertTrue;
28297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport static org.mockito.Mockito.mock;
29297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
30297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiScanner;
31297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiScanner.ChannelSpec;
32297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.net.wifi.WifiScanner.ScanSettings;
33297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport android.test.suitebuilder.annotation.SmallTest;
34297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
35297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport com.android.server.wifi.WifiNative.BucketSettings;
36297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
37297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport org.junit.Before;
38297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport org.junit.Test;
39297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
40297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport java.lang.reflect.Field;
41297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport java.util.ArrayList;
42297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport java.util.Collection;
43297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport java.util.Collections;
44297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport java.util.HashSet;
45297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsimport java.util.Set;
46297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
47297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills/**
48297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills * Unit tests for {@link com.android.server.wifi.MultiClientScheduler}.
49297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills */
50297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills@SmallTest
51297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willspublic class MultiClientSchedulerTest {
52297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
531a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    private static final int DEFAULT_MAX_BUCKETS = 9;
541a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    private static final int DEFAULT_MAX_CHANNELS = 23;
551a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    private static final int DEFAULT_MAX_BATCH = 11;
561a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    private static final int DEFAULT_MAX_AP_PER_SCAN = 33;
57297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
58297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    private WifiNative mWifiNative;
59297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    private MultiClientScheduler mScheduler;
60297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
61297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Before
62297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void setUp() throws Exception {
63297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mWifiNative = mock(WifiNative.class);
64297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        setupMockChannels(mWifiNative,
65297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                new int[]{2400, 2450},
66297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                new int[]{5150, 5175},
67297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                new int[]{5600, 5650, 5660});
68297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        installWlanWifiNative(mWifiNative);
69297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
70297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler = new MultiClientScheduler();
71297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxBuckets(DEFAULT_MAX_BUCKETS);
72297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxChannels(DEFAULT_MAX_CHANNELS);
73297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxBatch(DEFAULT_MAX_BATCH);
74297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxApPerScan(DEFAULT_MAX_AP_PER_SCAN);
75297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
76297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
77297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
78297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void noRequest() {
79297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        Collection<ScanSettings> requests = Collections.emptyList();
80297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
81297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
82297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
83297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
84297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals(60000, schedule.base_period_ms);
85297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 0);
86297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
87297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
88297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
89297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void singleRequest() {
90297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        Collection<ScanSettings> requests = Collections.singleton(createRequest(
91297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.WIFI_BAND_BOTH, 30000, 0, 20,
92297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
93297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ));
94297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
95297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
96297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
97297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
98297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals(30000, schedule.base_period_ms);
99297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 1);
100297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
101297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, false, true);
102297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
103297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
104297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
105297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
106297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void singleRequestWithoutPredefinedBucket() {
107297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        Collection<ScanSettings> requests = Collections.singleton(createRequest(
108297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.WIFI_BAND_BOTH, 7500, 0, 20,
109297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
110297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ));
111297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
112297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
113297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
114297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
115297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 10000, schedule.base_period_ms);
116297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 1);
117297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
118297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, false, true);
119297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
120297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
121297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
122297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
123297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void fewRequests() {
124297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        Collection<ScanSettings> requests = new ArrayList<>();
125297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(WifiScanner.WIFI_BAND_BOTH, 30000, 0, 20,
126297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT));
127297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY, 14000, 0, 20,
128297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT));
129297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
130297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
131297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
132297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
133297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 10000, schedule.base_period_ms);
134297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 2);
135297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
136297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, false, true);
137297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
138297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
139297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
140297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
141297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void manyRequests() {
142297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        Collection<ScanSettings> requests = new ArrayList<>();
143297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(WifiScanner.WIFI_BAND_BOTH, 30000, 0, 20,
144297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT));
145297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY, 20000, 0, 20,
146297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT));
147297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY, 10000, 0, 20,
148297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT));
149297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
150297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
151297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
152297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
153297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 10000, schedule.base_period_ms);
154297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 2);
155297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
156297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, false, false);
157297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
158297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
159297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
160297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
161297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void requestsWithNoPeriodCommonDenominator() {
162297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ArrayList<ScanSettings> requests = new ArrayList<>();
163297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(WifiScanner.WIFI_BAND_BOTH, 299999, 0, 20,
164297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT));
165297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY, 10500, 0, 20,
166297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT));
167297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
168297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
169297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
170297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
171297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 10000, schedule.base_period_ms);
172297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 2);
173297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
174297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, false, true);
175297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
176297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
177297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
178297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
179297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void manyRequestsDifferentReportScans() {
180297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        Collection<ScanSettings> requests = new ArrayList<>();
181297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5175), 30000, 0, 20,
182297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_BUFFER_FULL));
183297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2400), 30000, 0, 20,
184297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
185297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2450), 30000, 0, 20,
186297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT));
187297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5150), 30000, 0, 20,
188297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_NO_BATCH));
189297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
190297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
191297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
192297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
193297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 30000, schedule.base_period_ms);
194297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 1);
195297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
196297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, false, true);
197297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
198297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
199297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
200297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
201297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void exceedMaxBatch() {
202297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        Collection<ScanSettings> requests = new ArrayList<>();
203297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5175), 30000, 10, 20,
204297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_BUFFER_FULL));
205297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
206297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxBatch(5);
207297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
208297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
209297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
210297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 30000, schedule.base_period_ms);
211297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 1);
212297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
213297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, false, true);
214297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
215297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("maxScansToCache", 5, schedule.report_threshold_num_scans);
216297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
217297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
218297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
2191a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    public void defaultMaxBatch() {
2201a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        Collection<ScanSettings> requests = new ArrayList<>();
2211a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        requests.add(createRequest(channelsToSpec(5175), 30000, 0, 20,
2221a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_BUFFER_FULL));
2231a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
2241a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        mScheduler.setMaxBatch(6);
2251a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        mScheduler.updateSchedule(requests);
2261a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
2271a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
2281a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        assertEquals("base_period_ms", 30000, schedule.base_period_ms);
2291a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        assertBuckets(schedule, 1);
2301a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        for (ScanSettings request : requests) {
2311a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            assertSettingsSatisfied(schedule, request, false, true);
2321a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        }
2331a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        assertEquals("maxScansToCache", 6, schedule.report_threshold_num_scans);
2341a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    }
2351a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
2361a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    @Test
2371a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    public void exceedMaxAps() {
2381a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        Collection<ScanSettings> requests = new ArrayList<>();
2391a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        requests.add(createRequest(channelsToSpec(5175), 30000, 10, 20,
2401a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
2411a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
2421a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        mScheduler.setMaxApPerScan(5);
2431a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        mScheduler.updateSchedule(requests);
2441a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
2451a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
2461a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        assertEquals("maxScansToCache", 5, schedule.max_ap_per_scan);
2471a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    }
2481a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
2491a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    @Test
2501a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    public void defaultMaxAps() {
2511a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        Collection<ScanSettings> requests = new ArrayList<>();
2521a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        requests.add(createRequest(channelsToSpec(5175), 30000, 10, 0,
2531a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
2541a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
2551a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        mScheduler.setMaxApPerScan(8);
2561a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        mScheduler.updateSchedule(requests);
2571a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
2581a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
2591a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        assertEquals("maxApsPerScan", 8, schedule.max_ap_per_scan);
2601a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    }
2611a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
2621a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    @Test
263297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void optimalScheduleExceedsNumberOfAvailableBuckets() {
264297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ArrayList<ScanSettings> requests = new ArrayList<>();
265297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2400), 30000, 0, 20,
266297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
267297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2450), 10000, 0, 20,
268297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
269297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5150), 60000, 0, 20,
270297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
271297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
272297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxBuckets(2);
273297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
274297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
275297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
276297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 30000, schedule.base_period_ms);
277297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 2);
278297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
279297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, true, true);
280297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
281297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
282297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
283297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
284297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void optimalScheduleExceedsNumberOfAvailableBuckets2() {
285297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ArrayList<ScanSettings> requests = new ArrayList<>();
286297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2400), 30000, 0, 20,
287297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
288297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2450), 60000, 0, 20,
289297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
290297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5150), 3600000, 0, 20,
291297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
292297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
293297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxBuckets(2);
294297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
295297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
296297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
297297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 30000, schedule.base_period_ms);
298297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 2);
299297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
300297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, true, true);
301297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
302297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
303297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
304297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    /**
305297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills     * Ensure that a channel request is placed in the bucket closest to the original
306297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills     * period and not the bucket it is initially placed in. Here the 21 min period is
307297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills     * initially placed in the 15 min bucket, but that bucket is eliminated because it
308297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills     * would be a 7th bucket. This test ensures that the request is placed in the 30 min
309297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills     * bucket and not the 10 min bucket.
310297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills     */
311297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
312297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void optimalScheduleExceedsNumberOfAvailableBucketsClosestToOriginal() {
313297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ArrayList<ScanSettings> requests = new ArrayList<>();
314297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2400), 60 * 1000, 0, 20,
315297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
316297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2450), 30 * 1000, 0, 20,
317297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
318297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5150), 300 * 1000, 0, 20,
319297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
320297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5175), 600 * 1000, 0, 20,
321297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
322297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5600), 10 * 1000, 0, 20,
323297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
324297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5650), 1800 * 1000, 0, 20,
325297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
326297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
327297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(5660), 1260 * 1000, 0, 20, // 21 min
328297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
329297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
330297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxBuckets(6);
331297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
332297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
333297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
334297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 10000, schedule.base_period_ms);
335297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 6);
336297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
337297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, true, true);
338297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
339297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
340297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
341297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
3421a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    public void optimalScheduleExceedsMaxChannelsOnSingleBand() {
343297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ArrayList<ScanSettings> requests = new ArrayList<>();
344297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2400, 2450), 30000, 0, 20,
345297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
346297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
347297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxBuckets(2);
348297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxChannels(1);
349297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
350297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
351297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
352297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 30000, schedule.base_period_ms);
353297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 1);
354297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
355297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, true, true);
356297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
357297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
358297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
359297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
3601a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    public void optimalScheduleExceedsMaxChannelsOnMultipleBands() {
361297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ArrayList<ScanSettings> requests = new ArrayList<>();
362297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(createRequest(channelsToSpec(2400, 2450, 5150), 30000, 0, 20,
363297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
364297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
365297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxBuckets(2);
366297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.setMaxChannels(2);
367297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
368297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
369297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
370297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", 30000, schedule.base_period_ms);
371297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 1);
372297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ScanSettings request : requests) {
373297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertSettingsSatisfied(schedule, request, true, true);
374297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
375297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
376297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
377297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    @Test
3781a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    public void optimalScheduleExceedsMaxChannelsOnMultipleBandsFromMultipleRequests() {
3791a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        ArrayList<ScanSettings> requests = new ArrayList<>();
3801a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        requests.add(createRequest(channelsToSpec(2400, 2450), 30000, 0, 20,
3811a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
3821a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        requests.add(createRequest(WifiScanner.WIFI_BAND_5_GHZ, 30000, 0, 20,
3831a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills                WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
3841a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
3851a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        mScheduler.setMaxBuckets(2);
3861a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        mScheduler.setMaxChannels(2);
3871a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        mScheduler.updateSchedule(requests);
3881a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
3891a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
3901a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        assertEquals("base_period_ms", 30000, schedule.base_period_ms);
3911a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        assertBuckets(schedule, 1);
3921a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        for (ScanSettings request : requests) {
3931a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            assertSettingsSatisfied(schedule, request, true, true);
3941a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        }
3951a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    }
3961a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills
3971a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills    @Test
398297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void exactRequests() {
399297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        scheduleAndTestExactRequest(createRequest(WifiScanner.WIFI_BAND_BOTH, 30000, 0,
400297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                20, WifiScanner.REPORT_EVENT_AFTER_BUFFER_FULL));
401297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        scheduleAndTestExactRequest(createRequest(WifiScanner.WIFI_BAND_5_GHZ, 60000, 3,
402297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                13, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN));
403297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        scheduleAndTestExactRequest(createRequest(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY, 10000, 2,
404297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                10, WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT));
405297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        scheduleAndTestExactRequest(createRequest(WifiScanner.WIFI_BAND_BOTH, 25000, 0,
406297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                10, WifiScanner.REPORT_EVENT_NO_BATCH));
407297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        scheduleAndTestExactRequest(createRequest(WifiScanner.WIFI_BAND_BOTH, 25000, 3,
408297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                0, WifiScanner.REPORT_EVENT_NO_BATCH));
4091a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        scheduleAndTestExactRequest(createRequest(channelsToSpec(2400, 5175, 5650) , 25000, 3,
4101a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills                0, WifiScanner.REPORT_EVENT_NO_BATCH));
411297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
412297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
413297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    public void scheduleAndTestExactRequest(ScanSettings settings) {
414297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        Collection<ScanSettings> requests = new ArrayList<>();
415297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        requests.add(settings);
416297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
417297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        mScheduler.updateSchedule(requests);
418297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        WifiNative.ScanSettings schedule = mScheduler.getSchedule();
419297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
420297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("base_period_ms", computeExpectedPeriod(settings.periodInMs),
421297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                schedule.base_period_ms);
422297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertBuckets(schedule, 1);
423297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
424297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        if (settings.numBssidsPerScan == 0) {
425297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertEquals("bssids per scan", DEFAULT_MAX_AP_PER_SCAN, schedule.max_ap_per_scan);
426297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        } else {
427297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertEquals("bssids per scan", settings.numBssidsPerScan, schedule.max_ap_per_scan);
428297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
429297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        if (settings.maxScansToCache == 0) {
430297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertEquals("scans to cache", DEFAULT_MAX_BATCH,
431297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    schedule.report_threshold_num_scans);
432297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        } else {
433297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertEquals("scans to cache", settings.maxScansToCache,
434297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    schedule.report_threshold_num_scans);
435297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
436297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("reportEvents", settings.reportEvents, schedule.buckets[0].report_events);
437297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("period", computeExpectedPeriod(settings.periodInMs),
438297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                schedule.buckets[0].period_ms);
4391a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        if (settings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
4401a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            assertEquals("band", settings.band, schedule.buckets[0].band);
4411a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            Set<Integer> expectedChannels = new HashSet<>();
4421a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            for (ChannelSpec channel : getAllChannels(settings)) {
4431a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills                expectedChannels.add(channel.frequency);
4441a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            }
4451a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            Set<Integer> actualChannels = new HashSet<>();
4461a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            for (ChannelSpec channel : getAllChannels(schedule.buckets[0])) {
4471a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills                actualChannels.add(channel.frequency);
4481a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            }
4491a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            assertEquals("channels", expectedChannels, actualChannels);
450297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
4511a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills        else {
4521a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            assertEquals("band", settings.band, schedule.buckets[0].band);
4531a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            assertEquals("num_channels", 0, schedule.buckets[0].num_channels);
4541a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills            assertTrue("channels", schedule.buckets[0].channels == null
4551a16020f8d611c94797884b212ee6a26817fad82Mitchell Wills                    || schedule.buckets[0].channels.length == 0);
456297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
457297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
458297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
459297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    private void assertBuckets(WifiNative.ScanSettings schedule, int numBuckets) {
460297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("num_buckets", numBuckets, schedule.num_buckets);
461297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertNotNull("buckets was null", schedule.buckets);
462297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        assertEquals("num_buckets and actual buckets", schedule.num_buckets,
463297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                schedule.buckets.length);
464297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (int i = 0; i < numBuckets; i++) {
465297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            assertNotNull("bucket[" + i + "] was null", schedule.buckets[i]);
466297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            if (schedule.buckets[i].band == WifiScanner.WIFI_BAND_UNSPECIFIED) {
467297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                assertTrue("num channels <= 0", schedule.buckets[i].num_channels > 0);
468297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                assertTrue("bucket channels > max channels",
469297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        schedule.buckets[i].num_channels <= mScheduler.getMaxChannels());
470297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                assertNotNull("Channels was null", schedule.buckets[i].channels);
471297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                for (int c = 0; c < schedule.buckets[i].num_channels; c++) {
472297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    assertNotNull("Channel was null", schedule.buckets[i].channels[c]);
473297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                }
474297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            } else {
475297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                assertTrue("Invalid band: " + schedule.buckets[i].band,
47672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                        schedule.buckets[i].band > WifiScanner.WIFI_BAND_UNSPECIFIED
47772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                        && schedule.buckets[i].band <= WifiScanner.WIFI_BAND_BOTH_WITH_DFS);
478297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
479297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
480297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
481297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
482297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    private static void assertSettingsSatisfied(WifiNative.ScanSettings schedule,
483297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            ScanSettings settings, boolean bucketsLimited, boolean exactPeriod) {
48472c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        assertTrue("bssids per scan: " + schedule.max_ap_per_scan + " /<= "
48572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                + settings.numBssidsPerScan,
48672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                schedule.max_ap_per_scan <= settings.numBssidsPerScan);
487297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
488297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        if (settings.maxScansToCache > 0) {
48972c639e8b97067e948eca8be50dfea3173121090Mitchell Wills            assertTrue("scans to cache: " + schedule.report_threshold_num_scans + " /<= "
49072c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    + settings.maxScansToCache,
49172c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                    schedule.report_threshold_num_scans <= settings.maxScansToCache);
492297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
493297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
494297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        HashSet<Integer> channelSet = new HashSet<>();
495297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (ChannelSpec channel : getAllChannels(settings)) {
496297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            channelSet.add(channel.frequency);
497297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
498297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
499297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        StringBuilder ignoreString = new StringBuilder();
500297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
501297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        HashSet<Integer> scheduleChannelSet = new HashSet<>();
502297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (int b = 0; b < schedule.num_buckets; b++) {
503297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            BucketSettings bucket = schedule.buckets[b];
504297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            if ((settings.reportEvents & WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN) != 0) {
505297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                if ((bucket.report_events & WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN) == 0) {
506297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    ignoreString
507297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(" ")
508297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(WifiChannelHelper.toString(getAllChannels(bucket)))
509297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append("=after_each_scan:")
510297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(bucket.report_events & WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN)
511297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append("!=")
512297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(settings.reportEvents & WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN);
513297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    continue;
514297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                }
515297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
516297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            if ((settings.reportEvents & WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT) != 0) {
517297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                if ((bucket.report_events & WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT) == 0) {
518297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    ignoreString
519297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(" ")
520297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(WifiChannelHelper.toString(getAllChannels(bucket)))
521297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append("=full_result:")
522297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(bucket.report_events & WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT)
523297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append("!=")
524297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(settings.reportEvents & WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT);
525297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    continue;
526297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                }
527297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
528297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            if ((settings.reportEvents & WifiScanner.REPORT_EVENT_NO_BATCH) == 0) {
529297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                if ((bucket.report_events & WifiScanner.REPORT_EVENT_NO_BATCH) != 0) {
530297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    ignoreString
531297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(" ")
532297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(WifiChannelHelper.toString(getAllChannels(bucket)))
533297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append("=no_batch:")
534297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(bucket.report_events & WifiScanner.REPORT_EVENT_NO_BATCH)
535297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append("!=")
536297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                        .append(settings.reportEvents & WifiScanner.REPORT_EVENT_NO_BATCH);
537297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    continue;
538297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                }
539297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
540297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            int expectedPeriod;
541297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            if (bucketsLimited) {
542297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                expectedPeriod = computeExpectedPeriod(settings.periodInMs, schedule);
543297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            } else {
544297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                expectedPeriod = computeExpectedPeriod(settings.periodInMs);
545297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
546297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
547297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            if (exactPeriod) {
548297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                if (bucket.period_ms != expectedPeriod) {
549297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    ignoreString
550297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append(" ")
551297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append(WifiChannelHelper.toString(getAllChannels(bucket)))
552297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append("=period:")
553297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append(bucket.period_ms)
554297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append("!=")
555297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append(settings.periodInMs);
556297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    continue;
557297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                }
558297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            } else {
559297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                if (bucket.period_ms > expectedPeriod) {
560297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    ignoreString
561297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append(" ")
562297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append(WifiChannelHelper.toString(getAllChannels(bucket)))
563297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append("=period:")
564297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append(bucket.period_ms)
565297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append(">")
566297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                            .append(settings.periodInMs);
567297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    continue;
568297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                }
569297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
570297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            for (ChannelSpec channel : getAllChannels(bucket)) {
571297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                scheduleChannelSet.add(channel.frequency);
572297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
573297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
574297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
57572c639e8b97067e948eca8be50dfea3173121090Mitchell Wills        assertTrue("expected that " + scheduleChannelSet + " contained " + channelSet
57672c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                + ", Channel ignore reasons:" + ignoreString.toString(),
57772c639e8b97067e948eca8be50dfea3173121090Mitchell Wills                scheduleChannelSet.containsAll(channelSet));
578297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
579297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
580297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    private static int[] getPredefinedBuckets() {
581297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        try {
582297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            Field f = MultiClientScheduler.class.getDeclaredField("PREDEFINED_BUCKET_PERIODS");
583297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            f.setAccessible(true);
584297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            return (int[]) f.get(null);
585297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        } catch (Exception e) {
586297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            throw new RuntimeException("Could not get predefined buckets", e);
587297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
588297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
589297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    private static final int[] PREDEFINED_BUCKET_PERIODS = getPredefinedBuckets();
590297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
591297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    // find closest bucket period to the requested period
592297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    private static int computeExpectedPeriod(int requestedPeriod) {
593297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        int period = 0;
594297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        int minDiff = Integer.MAX_VALUE;
595297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (int bucketPeriod : PREDEFINED_BUCKET_PERIODS) {
596297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            int diff = Math.abs(bucketPeriod - requestedPeriod);
597297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            if (diff < minDiff) {
598297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                minDiff = diff;
599297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                period = bucketPeriod;
600297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
601297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
602297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        return period;
603297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
604297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
605297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    // find closest bucket period to the requested period that exists in the schedule
606297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    private static int computeExpectedPeriod(int requestedPeriod,
607297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            WifiNative.ScanSettings schedule) {
608297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        int period = 0;
609297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        int minDiff = Integer.MAX_VALUE;
610297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        for (int i = 0; i < schedule.num_buckets; ++i) {
611297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            int bucketPeriod = schedule.buckets[i].period_ms;
612297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            int diff = Math.abs(bucketPeriod - requestedPeriod);
613297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            if (diff < minDiff) {
614297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                minDiff = diff;
615297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                period = bucketPeriod;
616297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
617297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
618297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        return period;
619297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
620297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills}
621