1/* 2 * Copyright (C) 2016 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.bandIs; 20import static com.android.server.wifi.ScanTestUtil.channelsAre; 21import static com.android.server.wifi.ScanTestUtil.channelsToSpec; 22import static com.android.server.wifi.ScanTestUtil.createRequest; 23 24import static org.hamcrest.MatcherAssert.assertThat; 25import static org.junit.Assert.assertEquals; 26import static org.junit.Assert.assertFalse; 27import static org.junit.Assert.assertNull; 28import static org.junit.Assert.assertTrue; 29 30import android.net.wifi.WifiScanner; 31import android.test.suitebuilder.annotation.SmallTest; 32 33import com.android.server.wifi.WifiNative; 34 35import org.junit.Before; 36import org.junit.Test; 37import org.junit.experimental.runners.Enclosed; 38import org.junit.runner.RunWith; 39 40import java.util.Arrays; 41import java.util.Collections; 42import java.util.HashSet; 43 44/** 45 * Unit tests for {@link com.android.server.wifi.scanner.KnownBandsChannelHelper}. 46 */ 47@RunWith(Enclosed.class) // WARNING: tests cannot be declared in the outer class 48public class KnownBandsChannelHelperTest { 49 50 private static final int[] CHANNELS_24_GHZ = new int[]{2400, 2450}; 51 private static final int[] CHANNELS_5_GHZ = new int[]{5150, 5175}; 52 private static final int[] CHANNELS_DFS = new int[]{5600, 5650, 5660}; 53 54 /** 55 * Unit tests for 56 * {@link com.android.server.wifi.scanner.KnownBandsChannelHelper.estimateScanDuration}. 57 */ 58 @SmallTest 59 public static class EstimateScanDurationTest { 60 KnownBandsChannelHelper mChannelHelper; 61 62 /** 63 * Called before each test 64 * Create a channel helper 65 */ 66 @Before 67 public void setUp() throws Exception { 68 mChannelHelper = new PresetKnownBandsChannelHelper( 69 CHANNELS_24_GHZ, 70 CHANNELS_5_GHZ, 71 CHANNELS_DFS); 72 } 73 74 /** 75 * check a settings object with a few channels 76 */ 77 @Test 78 public void fewChannels() { 79 WifiScanner.ScanSettings testSettings = createRequest(channelsToSpec(2400, 2450, 5100), 80 10000, 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); 81 82 assertEquals(ChannelHelper.SCAN_PERIOD_PER_CHANNEL_MS * 3, 83 mChannelHelper.estimateScanDuration(testSettings)); 84 } 85 86 /** 87 * check a settings object with a band 88 */ 89 @Test 90 public void band() { 91 WifiScanner.ScanSettings testSettings = createRequest(WifiScanner.WIFI_BAND_24_GHZ, 92 10000, 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); 93 94 assertEquals(ChannelHelper.SCAN_PERIOD_PER_CHANNEL_MS * CHANNELS_24_GHZ.length, 95 mChannelHelper.estimateScanDuration(testSettings)); 96 } 97 } 98 99 /** 100 * Unit tests for 101 * {@link com.android.server.wifi.scanner.KnownBandsChannelHelper.getAvailableScanChannels}. 102 */ 103 @SmallTest 104 public static class GetAvailableScanChannelsTest { 105 KnownBandsChannelHelper mChannelHelper; 106 107 /** 108 * Called before each test 109 * Create a channel helper 110 */ 111 @Before 112 public void setUp() throws Exception { 113 mChannelHelper = new PresetKnownBandsChannelHelper( 114 CHANNELS_24_GHZ, 115 CHANNELS_5_GHZ, 116 CHANNELS_DFS); 117 } 118 119 private void testBand(int[] expectedChannels, int band) { 120 WifiScanner.ChannelSpec[] channels = 121 mChannelHelper.getAvailableScanChannels(band); 122 assertEquals("nun channels", expectedChannels.length, channels.length); 123 for (int i = 0; i < channels.length; ++i) { 124 assertEquals("channels[" + i + "].frequency", 125 expectedChannels[i], channels[i].frequency); 126 } 127 } 128 129 /** 130 * test the 2.4GHz band 131 */ 132 @Test 133 public void channels24Ghz() { 134 testBand(CHANNELS_24_GHZ, WifiScanner.WIFI_BAND_24_GHZ); 135 } 136 137 /** 138 * test the 5GHz band 139 */ 140 @Test 141 public void channels5Ghz() { 142 testBand(CHANNELS_5_GHZ, WifiScanner.WIFI_BAND_5_GHZ); 143 } 144 145 /** 146 * test the 5GHz DFS band 147 */ 148 @Test 149 public void channelsDfs() { 150 testBand(CHANNELS_DFS, WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY); 151 } 152 153 /** 154 * test the 2.4GHz and 5GHz band 155 */ 156 @Test 157 public void channels24GhzAnd5Ghz() { 158 int[] expectedChannels = new int[CHANNELS_24_GHZ.length + CHANNELS_5_GHZ.length]; 159 System.arraycopy(CHANNELS_24_GHZ, 0, expectedChannels, 0, CHANNELS_24_GHZ.length); 160 System.arraycopy(CHANNELS_5_GHZ, 0, expectedChannels, CHANNELS_24_GHZ.length, 161 CHANNELS_5_GHZ.length); 162 testBand(expectedChannels, WifiScanner.WIFI_BAND_BOTH); 163 } 164 165 /** 166 * test all bands 167 */ 168 @Test 169 public void channelsAll() { 170 int[] expectedChannels = 171 new int[CHANNELS_24_GHZ.length + CHANNELS_5_GHZ.length + CHANNELS_DFS.length]; 172 System.arraycopy(CHANNELS_24_GHZ, 0, expectedChannels, 0, CHANNELS_24_GHZ.length); 173 System.arraycopy(CHANNELS_5_GHZ, 0, expectedChannels, CHANNELS_24_GHZ.length, 174 CHANNELS_5_GHZ.length); 175 System.arraycopy(CHANNELS_DFS, 0, expectedChannels, 176 CHANNELS_24_GHZ.length + CHANNELS_5_GHZ.length, 177 CHANNELS_DFS.length); 178 testBand(expectedChannels, WifiScanner.WIFI_BAND_BOTH_WITH_DFS); 179 } 180 } 181 182 /** 183 * Unit tests for 184 * {@link com.android.server.wifi.scanner.KnownBandsChannelHelper.settingsContainChannel}. 185 */ 186 @SmallTest 187 public static class SettingsContainChannelTest { 188 KnownBandsChannelHelper mChannelHelper; 189 190 /** 191 * Called before each test 192 * Create a channel helper 193 */ 194 @Before 195 public void setUp() throws Exception { 196 mChannelHelper = new PresetKnownBandsChannelHelper( 197 CHANNELS_24_GHZ, 198 CHANNELS_5_GHZ, 199 CHANNELS_DFS); 200 } 201 202 /** 203 * check a settings object with no channels 204 */ 205 @Test 206 public void emptySettings() { 207 WifiScanner.ScanSettings testSettings = createRequest(channelsToSpec(), 208 10000, 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); 209 210 assertFalse(mChannelHelper.settingsContainChannel(testSettings, 2400)); 211 assertFalse(mChannelHelper.settingsContainChannel(testSettings, 5150)); 212 assertFalse(mChannelHelper.settingsContainChannel(testSettings, 5650)); 213 } 214 215 /** 216 * check a settings object with some channels 217 */ 218 @Test 219 public void settingsWithChannels() { 220 WifiScanner.ScanSettings testSettings = createRequest(channelsToSpec(2400, 5650), 221 10000, 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); 222 223 assertTrue(mChannelHelper.settingsContainChannel(testSettings, 2400)); 224 assertFalse(mChannelHelper.settingsContainChannel(testSettings, 5150)); 225 assertTrue(mChannelHelper.settingsContainChannel(testSettings, 5650)); 226 } 227 228 /** 229 * check a settings object with a band specified 230 */ 231 @Test 232 public void settingsWithBand() { 233 WifiScanner.ScanSettings testSettings = createRequest(WifiScanner.WIFI_BAND_24_GHZ, 234 10000, 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); 235 236 assertTrue(mChannelHelper.settingsContainChannel(testSettings, 2400)); 237 assertTrue(mChannelHelper.settingsContainChannel(testSettings, 2450)); 238 assertFalse(mChannelHelper.settingsContainChannel(testSettings, 5150)); 239 assertFalse(mChannelHelper.settingsContainChannel(testSettings, 5650)); 240 } 241 242 /** 243 * check a settings object with multiple bands specified 244 */ 245 @Test 246 public void settingsWithMultiBand() { 247 WifiScanner.ScanSettings testSettings = createRequest(WifiScanner.WIFI_BAND_BOTH, 248 10000, 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN); 249 250 assertTrue(mChannelHelper.settingsContainChannel(testSettings, 2400)); 251 assertTrue(mChannelHelper.settingsContainChannel(testSettings, 2450)); 252 assertTrue(mChannelHelper.settingsContainChannel(testSettings, 5150)); 253 assertFalse(mChannelHelper.settingsContainChannel(testSettings, 5650)); 254 } 255 } 256 257 /** 258 * Unit tests for 259 * {@link com.android.server.wifi.scanner.KnownBandsChannelHelper.KnownBandsChannelCollection}. 260 */ 261 @SmallTest 262 public static class KnownBandsChannelCollectionTest { 263 ChannelHelper.ChannelCollection mChannelCollection; 264 265 /** 266 * Called before each test 267 * Create a collection to use for each test 268 */ 269 @Before 270 public void setUp() throws Exception { 271 KnownBandsChannelHelper channelHelper = new PresetKnownBandsChannelHelper( 272 CHANNELS_24_GHZ, 273 CHANNELS_5_GHZ, 274 CHANNELS_DFS); 275 mChannelCollection = channelHelper.createChannelCollection(); 276 } 277 278 /** 279 * Create an empty collection 280 */ 281 @Test 282 public void empty() { 283 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 284 mChannelCollection.fillBucketSettings(bucketSettings, Integer.MAX_VALUE); 285 assertThat(bucketSettings, channelsAre()); 286 287 assertEquals(Collections.<Integer>emptySet(), 288 mChannelCollection.getSupplicantScanFreqs()); 289 290 assertTrue(mChannelCollection.isEmpty()); 291 assertFalse(mChannelCollection.containsChannel(2400)); 292 assertFalse(mChannelCollection.containsChannel(5150)); 293 assertFalse(mChannelCollection.isAllChannels()); 294 } 295 296 /** 297 * Add something to a collection and then clear it and make sure nothing is in it 298 */ 299 @Test 300 public void clear() { 301 mChannelCollection.addBand(WifiScanner.WIFI_BAND_24_GHZ); 302 mChannelCollection.clear(); 303 304 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 305 mChannelCollection.fillBucketSettings(bucketSettings, Integer.MAX_VALUE); 306 assertThat(bucketSettings, channelsAre()); 307 308 assertEquals(Collections.<Integer>emptySet(), 309 mChannelCollection.getSupplicantScanFreqs()); 310 311 assertTrue(mChannelCollection.isEmpty()); 312 assertFalse(mChannelCollection.containsChannel(2400)); 313 assertFalse(mChannelCollection.containsChannel(5150)); 314 assertFalse(mChannelCollection.isAllChannels()); 315 } 316 317 /** 318 * Add a single band to the collection 319 */ 320 @Test 321 public void addBand() { 322 mChannelCollection.addBand(WifiScanner.WIFI_BAND_24_GHZ); 323 324 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 325 mChannelCollection.fillBucketSettings(bucketSettings, Integer.MAX_VALUE); 326 assertThat(bucketSettings, bandIs(WifiScanner.WIFI_BAND_24_GHZ)); 327 328 assertEquals(new HashSet<Integer>(Arrays.asList(2400, 2450)), 329 mChannelCollection.getSupplicantScanFreqs()); 330 331 assertFalse(mChannelCollection.isEmpty()); 332 assertTrue(mChannelCollection.containsChannel(2400)); 333 assertFalse(mChannelCollection.containsChannel(5150)); 334 assertFalse(mChannelCollection.isAllChannels()); 335 } 336 337 /** 338 * Add a single channel to the collection 339 */ 340 @Test 341 public void addChannel_single() { 342 mChannelCollection.addChannel(2400); 343 344 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 345 mChannelCollection.fillBucketSettings(bucketSettings, Integer.MAX_VALUE); 346 assertThat(bucketSettings, channelsAre(2400)); 347 348 assertEquals(new HashSet<Integer>(Arrays.asList(2400)), 349 mChannelCollection.getSupplicantScanFreqs()); 350 351 assertFalse(mChannelCollection.isEmpty()); 352 assertTrue(mChannelCollection.containsChannel(2400)); 353 assertFalse(mChannelCollection.containsChannel(5150)); 354 assertFalse(mChannelCollection.isAllChannels()); 355 } 356 357 /** 358 * Add a multiple channels to the collection 359 */ 360 @Test 361 public void addChannel_multiple() { 362 mChannelCollection.addChannel(2400); 363 mChannelCollection.addChannel(2450); 364 365 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 366 mChannelCollection.fillBucketSettings(bucketSettings, Integer.MAX_VALUE); 367 assertThat(bucketSettings, channelsAre(2400, 2450)); 368 369 assertEquals(new HashSet<Integer>(Arrays.asList(2400, 2450)), 370 mChannelCollection.getSupplicantScanFreqs()); 371 372 assertFalse(mChannelCollection.isEmpty()); 373 assertTrue(mChannelCollection.containsChannel(2400)); 374 assertFalse(mChannelCollection.containsChannel(5150)); 375 assertFalse(mChannelCollection.isAllChannels()); 376 } 377 378 /** 379 * Add a band and channel that is on that band 380 */ 381 @Test 382 public void addChannel_and_addBand_sameBand() { 383 mChannelCollection.addBand(WifiScanner.WIFI_BAND_24_GHZ); 384 mChannelCollection.addChannel(2400); 385 386 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 387 mChannelCollection.fillBucketSettings(bucketSettings, Integer.MAX_VALUE); 388 assertThat(bucketSettings, bandIs(WifiScanner.WIFI_BAND_24_GHZ)); 389 390 assertEquals(new HashSet<Integer>(Arrays.asList(2400, 2450)), 391 mChannelCollection.getSupplicantScanFreqs()); 392 393 assertFalse(mChannelCollection.isEmpty()); 394 assertTrue(mChannelCollection.containsChannel(2400)); 395 assertFalse(mChannelCollection.containsChannel(5150)); 396 assertFalse(mChannelCollection.isAllChannels()); 397 } 398 399 /** 400 * Add a band and channel that is not that band 401 */ 402 @Test 403 public void addChannel_and_addBand_withDifferentBandChannel() { 404 mChannelCollection.addBand(WifiScanner.WIFI_BAND_24_GHZ); 405 mChannelCollection.addChannel(5150); 406 407 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 408 mChannelCollection.fillBucketSettings(bucketSettings, Integer.MAX_VALUE); 409 assertThat(bucketSettings, channelsAre(2400, 2450, 5150)); 410 411 assertEquals(new HashSet<Integer>(Arrays.asList(2400, 2450, 5150)), 412 mChannelCollection.getSupplicantScanFreqs()); 413 414 assertFalse(mChannelCollection.isEmpty()); 415 assertTrue(mChannelCollection.containsChannel(2400)); 416 assertTrue(mChannelCollection.containsChannel(5150)); 417 assertFalse(mChannelCollection.isAllChannels()); 418 } 419 420 /** 421 * Add a band that should contain all channels 422 */ 423 @Test 424 public void addChannel_and_addBand_all() { 425 mChannelCollection.addBand(WifiScanner.WIFI_BAND_BOTH_WITH_DFS); 426 mChannelCollection.addChannel(5150); 427 428 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 429 mChannelCollection.fillBucketSettings(bucketSettings, Integer.MAX_VALUE); 430 assertThat(bucketSettings, bandIs(WifiScanner.WIFI_BAND_BOTH_WITH_DFS)); 431 432 assertNull(mChannelCollection.getSupplicantScanFreqs()); 433 434 assertFalse(mChannelCollection.isEmpty()); 435 assertTrue(mChannelCollection.containsChannel(2400)); 436 assertTrue(mChannelCollection.containsChannel(5150)); 437 assertTrue(mChannelCollection.containsChannel(5600)); 438 assertTrue(mChannelCollection.isAllChannels()); 439 } 440 441 /** 442 * Add enough channels on a single band that the max channels is exceeded 443 */ 444 @Test 445 public void addChannel_exceedMaxChannels() { 446 mChannelCollection.addChannel(5600); 447 mChannelCollection.addChannel(5650); 448 mChannelCollection.addChannel(5660); 449 450 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 451 mChannelCollection.fillBucketSettings(bucketSettings, 2); 452 assertThat(bucketSettings, bandIs(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY)); 453 assertFalse(mChannelCollection.isAllChannels()); 454 } 455 456 /** 457 * Add enough channels across multiple bands that the max channels is exceeded 458 */ 459 @Test 460 public void addChannel_exceedMaxChannelsOnMultipleBands() { 461 mChannelCollection.addChannel(2400); 462 mChannelCollection.addChannel(2450); 463 mChannelCollection.addChannel(5150); 464 465 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 466 mChannelCollection.fillBucketSettings(bucketSettings, 2); 467 assertThat(bucketSettings, bandIs(WifiScanner.WIFI_BAND_BOTH)); 468 assertFalse(mChannelCollection.isAllChannels()); 469 } 470 471 472 /** 473 * Add enough channels across all bands that the max channels is exceeded 474 */ 475 @Test 476 public void addChannel_addAllAvailableChannels() { 477 mChannelCollection.addChannel(2400); 478 mChannelCollection.addChannel(2450); 479 mChannelCollection.addChannel(5150); 480 mChannelCollection.addChannel(5175); 481 mChannelCollection.addChannel(5600); 482 mChannelCollection.addChannel(5650); 483 mChannelCollection.addChannel(5660); 484 485 WifiNative.BucketSettings bucketSettings = new WifiNative.BucketSettings(); 486 mChannelCollection.fillBucketSettings(bucketSettings, Integer.MAX_VALUE); 487 assertThat(bucketSettings, channelsAre(2400, 2450, 5150, 5175, 5600, 5650, 5660)); 488 assertTrue(mChannelCollection.isAllChannels()); 489 } 490 } 491} 492