AccessPointTest.java revision d911da3adcdc009c6fcbd956f7059838bf55fe69
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 */ 16package com.android.settingslib.wifi; 17 18import static com.google.common.truth.Truth.assertThat; 19import static com.google.common.truth.Truth.assertWithMessage; 20 21import static org.mockito.Mockito.any; 22import static org.mockito.Mockito.anyInt; 23import static org.mockito.Mockito.mock; 24import static org.mockito.Mockito.verify; 25import static org.mockito.Mockito.when; 26 27import android.content.Context; 28import android.net.ConnectivityManager; 29import android.net.NetworkInfo; 30import android.net.NetworkKey; 31import android.net.RssiCurve; 32import android.net.ScoredNetwork; 33import android.net.WifiKey; 34import android.net.wifi.ScanResult; 35import android.net.wifi.WifiConfiguration; 36import android.net.wifi.WifiInfo; 37import android.net.wifi.WifiNetworkScoreCache; 38import android.net.wifi.WifiSsid; 39import android.net.wifi.hotspot2.PasspointConfiguration; 40import android.net.wifi.hotspot2.pps.HomeSp; 41import android.os.Bundle; 42import android.os.SystemClock; 43import android.support.test.InstrumentationRegistry; 44import android.support.test.filters.SmallTest; 45import android.support.test.runner.AndroidJUnit4; 46import android.text.SpannableString; 47import android.text.style.TtsSpan; 48 49import com.android.settingslib.R; 50 51import org.junit.Before; 52import org.junit.Test; 53import org.junit.runner.RunWith; 54import org.mockito.Mock; 55import org.mockito.MockitoAnnotations; 56 57import java.util.ArrayList; 58import java.util.Collections; 59 60@SmallTest 61@RunWith(AndroidJUnit4.class) 62public class AccessPointTest { 63 64 private static final String TEST_SSID = "test_ssid"; 65 private Context mContext; 66 @Mock private RssiCurve mockBadgeCurve; 67 @Mock private WifiNetworkScoreCache mockWifiNetworkScoreCache; 68 69 @Before 70 public void setUp() { 71 MockitoAnnotations.initMocks(this); 72 mContext = InstrumentationRegistry.getTargetContext(); 73 } 74 75 @Test 76 public void testSsidIsTelephoneSpan() { 77 final Bundle bundle = new Bundle(); 78 bundle.putString("key_ssid", TEST_SSID); 79 final AccessPoint ap = new AccessPoint(InstrumentationRegistry.getTargetContext(), bundle); 80 final CharSequence ssid = ap.getSsid(); 81 82 assertThat(ssid instanceof SpannableString).isTrue(); 83 84 TtsSpan[] spans = ((SpannableString) ssid).getSpans(0, TEST_SSID.length(), TtsSpan.class); 85 86 assertThat(spans.length).isEqualTo(1); 87 assertThat(spans[0].getType()).isEqualTo(TtsSpan.TYPE_TELEPHONE); 88 } 89 90 @Test 91 public void testCopyAccessPoint_dataShouldMatch() { 92 WifiConfiguration configuration = createWifiConfiguration(); 93 configuration.meteredHint = true; 94 95 NetworkInfo networkInfo = 96 new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE"); 97 AccessPoint originalAccessPoint = new AccessPoint(mContext, configuration); 98 WifiInfo wifiInfo = new WifiInfo(); 99 wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID)); 100 wifiInfo.setBSSID(configuration.BSSID); 101 originalAccessPoint.update(configuration, wifiInfo, networkInfo); 102 AccessPoint copy = new AccessPoint(mContext, originalAccessPoint); 103 104 assertThat(originalAccessPoint.getSsid().toString()).isEqualTo(copy.getSsid().toString()); 105 assertThat(originalAccessPoint.getBssid()).isEqualTo(copy.getBssid()); 106 assertThat(originalAccessPoint.getConfig()).isEqualTo(copy.getConfig()); 107 assertThat(originalAccessPoint.getSecurity()).isEqualTo(copy.getSecurity()); 108 assertThat(originalAccessPoint.isMetered()).isEqualTo(copy.isMetered()); 109 assertThat(originalAccessPoint.compareTo(copy) == 0).isTrue(); 110 } 111 112 @Test 113 public void testThatCopyAccessPoint_scanCacheShouldMatch() { 114 AccessPoint original = createAccessPointWithScanResultCache(); 115 assertThat(original.getRssi()).isEqualTo(4); 116 AccessPoint copy = new AccessPoint(mContext, createWifiConfiguration()); 117 assertThat(copy.getRssi()).isEqualTo(AccessPoint.UNREACHABLE_RSSI); 118 copy.copyFrom(original); 119 assertThat(original.getRssi()).isEqualTo(copy.getRssi()); 120 } 121 122 @Test 123 public void testCompareTo_GivesActiveBeforeInactive() { 124 AccessPoint activeAp = new TestAccessPointBuilder(mContext).setActive(true).build(); 125 AccessPoint inactiveAp = new TestAccessPointBuilder(mContext).setActive(false).build(); 126 127 assertSortingWorks(activeAp, inactiveAp); 128 } 129 130 @Test 131 public void testCompareTo_GivesReachableBeforeUnreachable() { 132 AccessPoint nearAp = new TestAccessPointBuilder(mContext).setReachable(true).build(); 133 AccessPoint farAp = new TestAccessPointBuilder(mContext).setReachable(false).build(); 134 135 assertSortingWorks(nearAp, farAp); 136 } 137 138 @Test 139 public void testCompareTo_GivesSavedBeforeUnsaved() { 140 AccessPoint savedAp = new TestAccessPointBuilder(mContext).setSaved(true).build(); 141 AccessPoint notSavedAp = new TestAccessPointBuilder(mContext).setSaved(false).build(); 142 143 assertSortingWorks(savedAp, notSavedAp); 144 } 145 146 //TODO: add tests for mRankingScore sort order if ranking is exposed 147 148 @Test 149 public void testCompareTo_GivesHighLevelBeforeLowLevel() { 150 final int highLevel = AccessPoint.SIGNAL_LEVELS - 1; 151 final int lowLevel = 1; 152 assertThat(highLevel).isGreaterThan(lowLevel); 153 154 AccessPoint strongAp = new TestAccessPointBuilder(mContext).setLevel(highLevel).build(); 155 AccessPoint weakAp = new TestAccessPointBuilder(mContext).setLevel(lowLevel).build(); 156 157 assertSortingWorks(strongAp, weakAp); 158 } 159 160 @Test 161 public void testCompareTo_GivesSsidAlphabetically() { 162 163 final String firstName = "AAAAAA"; 164 final String secondName = "zzzzzz"; 165 166 AccessPoint firstAp = new TestAccessPointBuilder(mContext).setSsid(firstName).build(); 167 AccessPoint secondAp = new TestAccessPointBuilder(mContext).setSsid(secondName).build(); 168 169 assertThat(firstAp.getSsidStr().compareToIgnoreCase(secondAp.getSsidStr()) < 0).isTrue(); 170 assertSortingWorks(firstAp, secondAp); 171 } 172 173 @Test 174 public void testCompareTo_GivesSsidCasePrecendenceAfterAlphabetical() { 175 176 final String firstName = "aaAaaa"; 177 final String secondName = "aaaaaa"; 178 final String thirdName = "BBBBBB"; 179 180 AccessPoint firstAp = new TestAccessPointBuilder(mContext).setSsid(firstName).build(); 181 AccessPoint secondAp = new TestAccessPointBuilder(mContext).setSsid(secondName).build(); 182 AccessPoint thirdAp = new TestAccessPointBuilder(mContext).setSsid(thirdName).build(); 183 184 assertSortingWorks(firstAp, secondAp); 185 assertSortingWorks(secondAp, thirdAp); 186 } 187 188 @Test 189 public void testCompareTo_AllSortingRulesCombined() { 190 191 AccessPoint active = new TestAccessPointBuilder(mContext).setActive(true).build(); 192 AccessPoint reachableAndMinLevel = new TestAccessPointBuilder(mContext) 193 .setReachable(true).build(); 194 AccessPoint saved = new TestAccessPointBuilder(mContext).setSaved(true).build(); 195 AccessPoint highLevelAndReachable = new TestAccessPointBuilder(mContext) 196 .setLevel(AccessPoint.SIGNAL_LEVELS - 1).build(); 197 AccessPoint firstName = new TestAccessPointBuilder(mContext).setSsid("a").build(); 198 AccessPoint lastname = new TestAccessPointBuilder(mContext).setSsid("z").build(); 199 200 ArrayList<AccessPoint> points = new ArrayList<AccessPoint>(); 201 points.add(lastname); 202 points.add(firstName); 203 points.add(highLevelAndReachable); 204 points.add(saved); 205 points.add(reachableAndMinLevel); 206 points.add(active); 207 208 Collections.sort(points); 209 assertThat(points.indexOf(active)).isLessThan(points.indexOf(reachableAndMinLevel)); 210 assertThat(points.indexOf(reachableAndMinLevel)).isLessThan(points.indexOf(saved)); 211 // note: the saved AP will not appear before highLevelAndReachable, 212 // because all APs with a signal level are reachable, 213 // and isReachable() takes higher sorting precedence than isSaved(). 214 assertThat(points.indexOf(saved)).isLessThan(points.indexOf(firstName)); 215 assertThat(points.indexOf(highLevelAndReachable)).isLessThan(points.indexOf(firstName)); 216 assertThat(points.indexOf(firstName)).isLessThan(points.indexOf(lastname)); 217 } 218 219 @Test 220 public void testRssiIsSetFromScanResults() { 221 AccessPoint ap = createAccessPointWithScanResultCache(); 222 int originalRssi = ap.getRssi(); 223 assertThat(originalRssi).isNotEqualTo(AccessPoint.UNREACHABLE_RSSI); 224 } 225 226 @Test 227 public void testGetRssiShouldReturnSetRssiValue() { 228 AccessPoint ap = createAccessPointWithScanResultCache(); 229 int originalRssi = ap.getRssi(); 230 int newRssi = originalRssi - 10; 231 ap.setRssi(newRssi); 232 assertThat(ap.getRssi()).isEqualTo(newRssi); 233 } 234 235 @Test 236 public void testUpdateWithScanResultShouldAverageRssi() { 237 String ssid = "ssid"; 238 int originalRssi = -65; 239 int newRssi = -80; 240 int expectedRssi = (originalRssi + newRssi) / 2; 241 AccessPoint ap = 242 new TestAccessPointBuilder(mContext).setSsid(ssid).setRssi(originalRssi).build(); 243 244 ScanResult scanResult = new ScanResult(); 245 scanResult.SSID = ssid; 246 scanResult.level = newRssi; 247 scanResult.BSSID = "bssid"; 248 scanResult.timestamp = SystemClock.elapsedRealtime() * 1000; 249 scanResult.capabilities = ""; 250 assertThat(ap.update(scanResult)).isTrue(); 251 252 assertThat(ap.getRssi()).isEqualTo(expectedRssi); 253 } 254 255 @Test 256 public void testCreateFromPasspointConfig() { 257 PasspointConfiguration config = new PasspointConfiguration(); 258 HomeSp homeSp = new HomeSp(); 259 homeSp.setFqdn("test.com"); 260 homeSp.setFriendlyName("Test Provider"); 261 config.setHomeSp(homeSp); 262 AccessPoint ap = new AccessPoint(mContext, config); 263 assertThat(ap.isPasspointConfig()).isTrue(); 264 } 265 266 @Test 267 public void testIsMetered_returnTrueWhenWifiConfigurationIsMetered() { 268 WifiConfiguration configuration = createWifiConfiguration(); 269 configuration.meteredHint = true; 270 271 NetworkInfo networkInfo = 272 new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE"); 273 AccessPoint accessPoint = new AccessPoint(mContext, configuration); 274 WifiInfo wifiInfo = new WifiInfo(); 275 wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID)); 276 wifiInfo.setBSSID(configuration.BSSID); 277 wifiInfo.setNetworkId(configuration.networkId); 278 accessPoint.update(configuration, wifiInfo, networkInfo); 279 280 assertThat(accessPoint.isMetered()).isTrue(); 281 } 282 283 @Test 284 public void testIsMetered_returnTrueWhenWifiInfoIsMetered() { 285 WifiConfiguration configuration = createWifiConfiguration(); 286 287 NetworkInfo networkInfo = 288 new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE"); 289 AccessPoint accessPoint = new AccessPoint(mContext, configuration); 290 WifiInfo wifiInfo = new WifiInfo(); 291 wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID)); 292 wifiInfo.setBSSID(configuration.BSSID); 293 wifiInfo.setNetworkId(configuration.networkId); 294 wifiInfo.setMeteredHint(true); 295 accessPoint.update(configuration, wifiInfo, networkInfo); 296 297 assertThat(accessPoint.isMetered()).isTrue(); 298 } 299 300 @Test 301 public void testIsMetered_returnTrueWhenNetworkInfoIsMetered() { 302 WifiConfiguration configuration = createWifiConfiguration(); 303 304 NetworkInfo networkInfo = 305 new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE"); 306 networkInfo.setMetered(true); 307 AccessPoint accessPoint = new AccessPoint(mContext, configuration); 308 WifiInfo wifiInfo = new WifiInfo(); 309 wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID)); 310 wifiInfo.setBSSID(configuration.BSSID); 311 wifiInfo.setNetworkId(configuration.networkId); 312 accessPoint.update(configuration, wifiInfo, networkInfo); 313 314 assertThat(accessPoint.isMetered()).isTrue(); 315 } 316 317 @Test 318 public void testIsMetered_returnTrueWhenScoredNetworkIsMetered() { 319 AccessPoint ap = createAccessPointWithScanResultCache(); 320 321 when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) 322 .thenReturn( 323 new ScoredNetwork( 324 null /* NetworkKey */, 325 null /* rssiCurve */, 326 true /* metered */)); 327 ap.update(mockWifiNetworkScoreCache, false /* scoringUiEnabled */); 328 329 assertThat(ap.isMetered()).isTrue(); 330 } 331 332 @Test 333 public void testIsMetered_returnFalseByDefault() { 334 WifiConfiguration configuration = createWifiConfiguration(); 335 336 NetworkInfo networkInfo = 337 new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE"); 338 AccessPoint accessPoint = new AccessPoint(mContext, configuration); 339 WifiInfo wifiInfo = new WifiInfo(); 340 wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID)); 341 wifiInfo.setBSSID(configuration.BSSID); 342 wifiInfo.setNetworkId(configuration.networkId); 343 accessPoint.update(configuration, wifiInfo, networkInfo); 344 345 assertThat(accessPoint.isMetered()).isFalse(); 346 } 347 348 @Test 349 public void testSpeedLabel_returnsVeryFast() { 350 AccessPoint ap = createAccessPointWithScanResultCache(); 351 352 when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) 353 .thenReturn(buildScoredNetworkWithMockBadgeCurve()); 354 when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST); 355 356 ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); 357 358 assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.VERY_FAST); 359 assertThat(ap.getSpeedLabel()) 360 .isEqualTo(mContext.getString(R.string.speed_label_very_fast)); 361 } 362 363 @Test 364 public void testSpeedLabel_returnsFast() { 365 AccessPoint ap = createAccessPointWithScanResultCache(); 366 367 when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) 368 .thenReturn(buildScoredNetworkWithMockBadgeCurve()); 369 when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.FAST); 370 371 ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); 372 373 assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.FAST); 374 assertThat(ap.getSpeedLabel()) 375 .isEqualTo(mContext.getString(R.string.speed_label_fast)); 376 } 377 378 @Test 379 public void testSpeedLabel_returnsOkay() { 380 AccessPoint ap = createAccessPointWithScanResultCache(); 381 382 when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) 383 .thenReturn(buildScoredNetworkWithMockBadgeCurve()); 384 when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.MODERATE); 385 386 ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); 387 388 assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.MODERATE); 389 assertThat(ap.getSpeedLabel()) 390 .isEqualTo(mContext.getString(R.string.speed_label_okay)); 391 } 392 393 @Test 394 public void testSpeedLabel_returnsSlow() { 395 AccessPoint ap = createAccessPointWithScanResultCache(); 396 397 when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) 398 .thenReturn(buildScoredNetworkWithMockBadgeCurve()); 399 when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.SLOW); 400 401 ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); 402 403 assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.SLOW); 404 assertThat(ap.getSpeedLabel()) 405 .isEqualTo(mContext.getString(R.string.speed_label_slow)); 406 } 407 408 @Test 409 public void testSummaryString_showsSpeedLabel() { 410 AccessPoint ap = createAccessPointWithScanResultCache(); 411 412 when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) 413 .thenReturn(buildScoredNetworkWithMockBadgeCurve()); 414 when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST); 415 416 ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); 417 418 assertThat(ap.getSummary()).isEqualTo(mContext.getString(R.string.speed_label_very_fast)); 419 } 420 421 @Test 422 public void testSummaryString_concatenatesSpeedLabel() { 423 AccessPoint ap = createAccessPointWithScanResultCache(); 424 ap.update(new WifiConfiguration()); 425 426 when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) 427 .thenReturn(buildScoredNetworkWithMockBadgeCurve()); 428 when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST); 429 430 ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); 431 432 String expectedString = mContext.getString(R.string.speed_label_very_fast) + " / " 433 + mContext.getString(R.string.wifi_remembered); 434 assertThat(ap.getSummary()).isEqualTo(expectedString); 435 } 436 437 @Test 438 public void testSummaryString_showsWrongPasswordLabel() { 439 WifiConfiguration configuration = createWifiConfiguration(); 440 configuration.getNetworkSelectionStatus().setNetworkSelectionStatus( 441 WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED); 442 configuration.getNetworkSelectionStatus().setNetworkSelectionDisableReason( 443 WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD); 444 AccessPoint ap = new AccessPoint(mContext, configuration); 445 446 assertThat(ap.getSummary()).isEqualTo(mContext.getString( 447 R.string.wifi_check_password_try_again)); 448 } 449 450 private ScoredNetwork buildScoredNetworkWithMockBadgeCurve() { 451 Bundle attr1 = new Bundle(); 452 attr1.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, mockBadgeCurve); 453 return new ScoredNetwork( 454 new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00")), 455 mockBadgeCurve, 456 false /* meteredHint */, 457 attr1); 458 459 } 460 461 private AccessPoint createAccessPointWithScanResultCache() { 462 Bundle bundle = new Bundle(); 463 ArrayList<ScanResult> scanResults = new ArrayList<>(); 464 for (int i = 0; i < 5; i++) { 465 ScanResult scanResult = new ScanResult(); 466 scanResult.level = i; 467 scanResult.BSSID = "bssid-" + i; 468 scanResult.timestamp = SystemClock.elapsedRealtime() * 1000; 469 scanResult.capabilities = ""; 470 scanResults.add(scanResult); 471 } 472 473 bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, scanResults); 474 return new AccessPoint(mContext, bundle); 475 } 476 477 private WifiConfiguration createWifiConfiguration() { 478 WifiConfiguration configuration = new WifiConfiguration(); 479 configuration.BSSID = "bssid"; 480 configuration.SSID = "ssid"; 481 configuration.networkId = 123; 482 return configuration; 483 } 484 485 /** 486 * Assert that the first AccessPoint appears after the second AccessPoint 487 * once sorting has been completed. 488 */ 489 private void assertSortingWorks(AccessPoint first, AccessPoint second) { 490 491 ArrayList<AccessPoint> points = new ArrayList<AccessPoint>(); 492 493 // add in reverse order so we can tell that sorting actually changed something 494 points.add(second); 495 points.add(first); 496 Collections.sort(points); 497 assertWithMessage( 498 String.format("After sorting: second AccessPoint should have higher array index " 499 + "than the first, but found indicies second '%s' and first '%s'.", 500 points.indexOf(second), points.indexOf(first))) 501 .that(points.indexOf(second)).isGreaterThan(points.indexOf(first)); 502 } 503 504 @Test 505 public void testBuilder_setActive() { 506 AccessPoint activeAp = new TestAccessPointBuilder(mContext).setActive(true).build(); 507 assertThat(activeAp.isActive()).isTrue(); 508 509 AccessPoint inactiveAp = new TestAccessPointBuilder(mContext).setActive(false).build(); 510 assertThat(inactiveAp.isActive()).isFalse(); 511 } 512 513 @Test 514 public void testBuilder_setReachable() { 515 AccessPoint nearAp = new TestAccessPointBuilder(mContext).setReachable(true).build(); 516 assertThat(nearAp.isReachable()).isTrue(); 517 518 AccessPoint farAp = new TestAccessPointBuilder(mContext).setReachable(false).build(); 519 assertThat(farAp.isReachable()).isFalse(); 520 } 521 522 @Test 523 public void testBuilder_setSaved() { 524 AccessPoint savedAp = new TestAccessPointBuilder(mContext).setSaved(true).build(); 525 assertThat(savedAp.isSaved()).isTrue(); 526 527 AccessPoint newAp = new TestAccessPointBuilder(mContext).setSaved(false).build(); 528 assertThat(newAp.isSaved()).isFalse(); 529 } 530 531 @Test 532 public void testBuilder_setLevel() { 533 AccessPoint testAp; 534 535 for (int i = 0; i < AccessPoint.SIGNAL_LEVELS; i++) { 536 testAp = new TestAccessPointBuilder(mContext).setLevel(i).build(); 537 assertThat(testAp.getLevel()).isEqualTo(i); 538 } 539 540 // numbers larger than the max level should be set to max 541 testAp = new TestAccessPointBuilder(mContext).setLevel(AccessPoint.SIGNAL_LEVELS).build(); 542 assertThat(testAp.getLevel()).isEqualTo(AccessPoint.SIGNAL_LEVELS - 1); 543 544 // numbers less than 0 should give level 0 545 testAp = new TestAccessPointBuilder(mContext).setLevel(-100).build(); 546 assertThat(testAp.getLevel()).isEqualTo(0); 547 } 548 549 @Test 550 public void testBuilder_settingReachableAfterLevelDoesNotAffectLevel() { 551 int level = 1; 552 assertThat(level).isLessThan(AccessPoint.SIGNAL_LEVELS - 1); 553 554 AccessPoint testAp = 555 new TestAccessPointBuilder(mContext).setLevel(level).setReachable(true).build(); 556 assertThat(testAp.getLevel()).isEqualTo(level); 557 } 558 559 @Test 560 public void testBuilder_setSsid() { 561 String name = "AmazingSsid!"; 562 AccessPoint namedAp = new TestAccessPointBuilder(mContext).setSsid(name).build(); 563 assertThat(namedAp.getSsidStr()).isEqualTo(name); 564 } 565 566 @Test 567 public void testBuilder_passpointConfig() { 568 String fqdn = "Test.com"; 569 String providerFriendlyName = "Test Provider"; 570 AccessPoint ap = new TestAccessPointBuilder(mContext).setFqdn(fqdn) 571 .setProviderFriendlyName(providerFriendlyName).build(); 572 assertThat(ap.isPasspointConfig()).isTrue(); 573 assertThat(ap.getPasspointFqdn()).isEqualTo(fqdn); 574 assertThat(ap.getConfigName()).isEqualTo(providerFriendlyName); 575 } 576 577 @Test 578 public void testUpdateNetworkInfo_returnsTrue() { 579 int networkId = 123; 580 int rssi = -55; 581 WifiConfiguration config = new WifiConfiguration(); 582 config.networkId = networkId; 583 WifiInfo wifiInfo = new WifiInfo(); 584 wifiInfo.setNetworkId(networkId); 585 wifiInfo.setRssi(rssi); 586 587 NetworkInfo networkInfo = 588 new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", ""); 589 networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTING, "", ""); 590 591 AccessPoint ap = new TestAccessPointBuilder(mContext) 592 .setNetworkInfo(networkInfo) 593 .setNetworkId(networkId) 594 .setRssi(rssi) 595 .setWifiInfo(wifiInfo) 596 .build(); 597 598 NetworkInfo newInfo = new NetworkInfo(networkInfo); 599 newInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", ""); 600 assertThat(ap.update(config, wifiInfo, newInfo)).isTrue(); 601 } 602 603 @Test 604 public void testUpdateNetworkInfoWithSameInfo_returnsFalse() { 605 int networkId = 123; 606 int rssi = -55; 607 WifiConfiguration config = new WifiConfiguration(); 608 config.networkId = networkId; 609 WifiInfo wifiInfo = new WifiInfo(); 610 wifiInfo.setNetworkId(networkId); 611 wifiInfo.setRssi(rssi); 612 613 NetworkInfo networkInfo = 614 new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", ""); 615 networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTING, "", ""); 616 617 AccessPoint ap = new TestAccessPointBuilder(mContext) 618 .setNetworkInfo(networkInfo) 619 .setNetworkId(networkId) 620 .setRssi(rssi) 621 .setWifiInfo(wifiInfo) 622 .build(); 623 624 NetworkInfo newInfo = new NetworkInfo(networkInfo); // same values 625 assertThat(ap.update(config, wifiInfo, newInfo)).isFalse(); 626 } 627 628 @Test 629 public void testUpdateWithConfigChangeOnly_returnsFalseButInvokesListener() { 630 int networkId = 123; 631 int rssi = -55; 632 WifiConfiguration config = new WifiConfiguration(); 633 config.networkId = networkId; 634 config.numNoInternetAccessReports = 1; 635 636 WifiInfo wifiInfo = new WifiInfo(); 637 wifiInfo.setNetworkId(networkId); 638 wifiInfo.setRssi(rssi); 639 640 NetworkInfo networkInfo = 641 new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", ""); 642 networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", ""); 643 644 AccessPoint ap = new TestAccessPointBuilder(mContext) 645 .setNetworkInfo(networkInfo) 646 .setNetworkId(networkId) 647 .setRssi(rssi) 648 .setWifiInfo(wifiInfo) 649 .build(); 650 651 AccessPoint.AccessPointListener mockListener = mock(AccessPoint.AccessPointListener.class); 652 ap.setListener(mockListener); 653 WifiConfiguration newConfig = new WifiConfiguration(config); 654 config.validatedInternetAccess = true; 655 656 assertThat(ap.update(newConfig, wifiInfo, networkInfo)).isFalse(); 657 verify(mockListener).onAccessPointChanged(ap); 658 } 659 660 @Test 661 public void testUpdateWithNullWifiConfiguration_doesNotThrowNPE() { 662 int networkId = 123; 663 int rssi = -55; 664 WifiConfiguration config = new WifiConfiguration(); 665 config.networkId = networkId; 666 WifiInfo wifiInfo = new WifiInfo(); 667 wifiInfo.setNetworkId(networkId); 668 wifiInfo.setRssi(rssi); 669 670 NetworkInfo networkInfo = 671 new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", ""); 672 networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTING, "", ""); 673 674 AccessPoint ap = new TestAccessPointBuilder(mContext) 675 .setNetworkInfo(networkInfo) 676 .setNetworkId(networkId) 677 .setRssi(rssi) 678 .setWifiInfo(wifiInfo) 679 .build(); 680 681 ap.update(null, wifiInfo, networkInfo); 682 } 683} 684