AccessPointTest.java revision 43d2a1700b6eb1d804924c6a1e5e0161a13a5348
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_returnTrueWhenScoredNetworkIsMetered() {
302        AccessPoint ap = createAccessPointWithScanResultCache();
303
304        when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
305                .thenReturn(
306                        new ScoredNetwork(
307                                null /* NetworkKey */,
308                                null /* rssiCurve */,
309                                true /* metered */));
310        ap.update(mockWifiNetworkScoreCache, false /* scoringUiEnabled */);
311
312        assertThat(ap.isMetered()).isTrue();
313    }
314
315    @Test
316    public void testIsMetered_returnFalseByDefault() {
317        WifiConfiguration configuration = createWifiConfiguration();
318
319        NetworkInfo networkInfo =
320                new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE");
321        AccessPoint accessPoint = new AccessPoint(mContext, configuration);
322        WifiInfo wifiInfo = new WifiInfo();
323        wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID));
324        wifiInfo.setBSSID(configuration.BSSID);
325        wifiInfo.setNetworkId(configuration.networkId);
326        accessPoint.update(configuration, wifiInfo, networkInfo);
327
328        assertThat(accessPoint.isMetered()).isFalse();
329    }
330
331    @Test
332    public void testSpeedLabel_returnsVeryFast() {
333        AccessPoint ap = createAccessPointWithScanResultCache();
334
335        when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
336                .thenReturn(buildScoredNetworkWithMockBadgeCurve());
337        when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
338
339        ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
340
341        assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.VERY_FAST);
342        assertThat(ap.getSpeedLabel())
343                .isEqualTo(mContext.getString(R.string.speed_label_very_fast));
344    }
345
346    @Test
347    public void testSpeedLabel_returnsFast() {
348        AccessPoint ap = createAccessPointWithScanResultCache();
349
350        when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
351                .thenReturn(buildScoredNetworkWithMockBadgeCurve());
352        when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.FAST);
353
354        ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
355
356        assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.FAST);
357        assertThat(ap.getSpeedLabel())
358                .isEqualTo(mContext.getString(R.string.speed_label_fast));
359    }
360
361    @Test
362    public void testSpeedLabel_returnsOkay() {
363        AccessPoint ap = createAccessPointWithScanResultCache();
364
365        when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
366                .thenReturn(buildScoredNetworkWithMockBadgeCurve());
367        when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.MODERATE);
368
369        ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
370
371        assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.MODERATE);
372        assertThat(ap.getSpeedLabel())
373                .isEqualTo(mContext.getString(R.string.speed_label_okay));
374    }
375
376    @Test
377    public void testSpeedLabel_returnsSlow() {
378        AccessPoint ap = createAccessPointWithScanResultCache();
379
380        when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
381                .thenReturn(buildScoredNetworkWithMockBadgeCurve());
382        when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.SLOW);
383
384        ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
385
386        assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.SLOW);
387        assertThat(ap.getSpeedLabel())
388                .isEqualTo(mContext.getString(R.string.speed_label_slow));
389    }
390
391    @Test
392    public void testSummaryString_showsSpeedLabel() {
393        AccessPoint ap = createAccessPointWithScanResultCache();
394
395        when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
396                .thenReturn(buildScoredNetworkWithMockBadgeCurve());
397        when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
398
399        ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
400
401        assertThat(ap.getSummary()).isEqualTo(mContext.getString(R.string.speed_label_very_fast));
402    }
403
404    @Test
405    public void testSummaryString_concatenatesSpeedLabel() {
406        AccessPoint ap = createAccessPointWithScanResultCache();
407        ap.update(new WifiConfiguration());
408
409        when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
410                .thenReturn(buildScoredNetworkWithMockBadgeCurve());
411        when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.VERY_FAST);
412
413        ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
414
415        String expectedString = mContext.getString(R.string.speed_label_very_fast) + " / "
416                + mContext.getString(R.string.wifi_remembered);
417        assertThat(ap.getSummary()).isEqualTo(expectedString);
418    }
419
420    @Test
421    public void testSummaryString_showsWrongPasswordLabel() {
422        WifiConfiguration configuration = createWifiConfiguration();
423        configuration.getNetworkSelectionStatus().setNetworkSelectionStatus(
424                WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED);
425        configuration.getNetworkSelectionStatus().setNetworkSelectionDisableReason(
426                WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD);
427        AccessPoint ap = new AccessPoint(mContext, configuration);
428
429        assertThat(ap.getSummary()).isEqualTo(mContext.getString(
430                R.string.wifi_check_password_try_again));
431    }
432
433    private ScoredNetwork buildScoredNetworkWithMockBadgeCurve() {
434        Bundle attr1 = new Bundle();
435        attr1.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, mockBadgeCurve);
436        return new ScoredNetwork(
437                new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00")),
438                mockBadgeCurve,
439                false /* meteredHint */,
440                attr1);
441
442    }
443
444    private AccessPoint createAccessPointWithScanResultCache() {
445        Bundle bundle = new Bundle();
446        ArrayList<ScanResult> scanResults = new ArrayList<>();
447        for (int i = 0; i < 5; i++) {
448            ScanResult scanResult = new ScanResult();
449            scanResult.level = i;
450            scanResult.BSSID = "bssid-" + i;
451            scanResult.timestamp = SystemClock.elapsedRealtime() * 1000;
452            scanResult.capabilities = "";
453            scanResults.add(scanResult);
454        }
455
456        bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, scanResults);
457        return new AccessPoint(mContext, bundle);
458    }
459
460    private WifiConfiguration createWifiConfiguration() {
461        WifiConfiguration configuration = new WifiConfiguration();
462        configuration.BSSID = "bssid";
463        configuration.SSID = "ssid";
464        configuration.networkId = 123;
465        return configuration;
466    }
467
468    /**
469    * Assert that the first AccessPoint appears after the second AccessPoint
470    * once sorting has been completed.
471    */
472    private void assertSortingWorks(AccessPoint first, AccessPoint second) {
473
474        ArrayList<AccessPoint> points = new ArrayList<AccessPoint>();
475
476        // add in reverse order so we can tell that sorting actually changed something
477        points.add(second);
478        points.add(first);
479        Collections.sort(points);
480        assertWithMessage(
481                String.format("After sorting: second AccessPoint should have higher array index "
482                    + "than the first, but found indicies second '%s' and first '%s'.",
483                    points.indexOf(second), points.indexOf(first)))
484            .that(points.indexOf(second)).isGreaterThan(points.indexOf(first));
485    }
486
487    @Test
488    public void testBuilder_setActive() {
489        AccessPoint activeAp = new TestAccessPointBuilder(mContext).setActive(true).build();
490        assertThat(activeAp.isActive()).isTrue();
491
492        AccessPoint inactiveAp = new TestAccessPointBuilder(mContext).setActive(false).build();
493        assertThat(inactiveAp.isActive()).isFalse();
494    }
495
496    @Test
497    public void testBuilder_setReachable() {
498        AccessPoint nearAp = new TestAccessPointBuilder(mContext).setReachable(true).build();
499        assertThat(nearAp.isReachable()).isTrue();
500
501        AccessPoint farAp = new TestAccessPointBuilder(mContext).setReachable(false).build();
502        assertThat(farAp.isReachable()).isFalse();
503    }
504
505    @Test
506    public void testBuilder_setSaved() {
507        AccessPoint savedAp = new TestAccessPointBuilder(mContext).setSaved(true).build();
508        assertThat(savedAp.isSaved()).isTrue();
509
510        AccessPoint newAp = new TestAccessPointBuilder(mContext).setSaved(false).build();
511        assertThat(newAp.isSaved()).isFalse();
512    }
513
514    @Test
515    public void testBuilder_setLevel() {
516        AccessPoint testAp;
517
518        for (int i = 0; i < AccessPoint.SIGNAL_LEVELS; i++) {
519            testAp = new TestAccessPointBuilder(mContext).setLevel(i).build();
520            assertThat(testAp.getLevel()).isEqualTo(i);
521        }
522
523        // numbers larger than the max level should be set to max
524        testAp = new TestAccessPointBuilder(mContext).setLevel(AccessPoint.SIGNAL_LEVELS).build();
525        assertThat(testAp.getLevel()).isEqualTo(AccessPoint.SIGNAL_LEVELS - 1);
526
527        // numbers less than 0 should give level 0
528        testAp = new TestAccessPointBuilder(mContext).setLevel(-100).build();
529        assertThat(testAp.getLevel()).isEqualTo(0);
530    }
531
532    @Test
533    public void testBuilder_settingReachableAfterLevelDoesNotAffectLevel() {
534        int level = 1;
535        assertThat(level).isLessThan(AccessPoint.SIGNAL_LEVELS - 1);
536
537        AccessPoint testAp =
538                new TestAccessPointBuilder(mContext).setLevel(level).setReachable(true).build();
539        assertThat(testAp.getLevel()).isEqualTo(level);
540    }
541
542    @Test
543    public void testBuilder_setSsid() {
544        String name = "AmazingSsid!";
545        AccessPoint namedAp = new TestAccessPointBuilder(mContext).setSsid(name).build();
546        assertThat(namedAp.getSsidStr()).isEqualTo(name);
547    }
548
549    @Test
550    public void testBuilder_passpointConfig() {
551        String fqdn = "Test.com";
552        String providerFriendlyName = "Test Provider";
553        AccessPoint ap = new TestAccessPointBuilder(mContext).setFqdn(fqdn)
554                .setProviderFriendlyName(providerFriendlyName).build();
555        assertThat(ap.isPasspointConfig()).isTrue();
556        assertThat(ap.getPasspointFqdn()).isEqualTo(fqdn);
557        assertThat(ap.getConfigName()).isEqualTo(providerFriendlyName);
558    }
559
560    @Test
561    public void testUpdateNetworkInfo_returnsTrue() {
562        int networkId = 123;
563        int rssi = -55;
564        WifiConfiguration config = new WifiConfiguration();
565        config.networkId = networkId;
566        WifiInfo wifiInfo = new WifiInfo();
567        wifiInfo.setNetworkId(networkId);
568        wifiInfo.setRssi(rssi);
569
570        NetworkInfo networkInfo =
571                new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", "");
572        networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTING, "", "");
573
574        AccessPoint ap = new TestAccessPointBuilder(mContext)
575                .setNetworkInfo(networkInfo)
576                .setNetworkId(networkId)
577                .setRssi(rssi)
578                .setWifiInfo(wifiInfo)
579                .build();
580
581        NetworkInfo newInfo = new NetworkInfo(networkInfo);
582        newInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", "");
583        assertThat(ap.update(config, wifiInfo, newInfo)).isTrue();
584    }
585
586    @Test
587    public void testUpdateNetworkInfoWithSameInfo_returnsFalse() {
588        int networkId = 123;
589        int rssi = -55;
590        WifiConfiguration config = new WifiConfiguration();
591        config.networkId = networkId;
592        WifiInfo wifiInfo = new WifiInfo();
593        wifiInfo.setNetworkId(networkId);
594        wifiInfo.setRssi(rssi);
595
596        NetworkInfo networkInfo =
597                new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", "");
598        networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTING, "", "");
599
600        AccessPoint ap = new TestAccessPointBuilder(mContext)
601                .setNetworkInfo(networkInfo)
602                .setNetworkId(networkId)
603                .setRssi(rssi)
604                .setWifiInfo(wifiInfo)
605                .build();
606
607        NetworkInfo newInfo = new NetworkInfo(networkInfo); // same values
608        assertThat(ap.update(config, wifiInfo, newInfo)).isFalse();
609    }
610
611    @Test
612    public void testUpdateWithConfigChangeOnly_returnsFalseButInvokesListener() {
613        int networkId = 123;
614        int rssi = -55;
615        WifiConfiguration config = new WifiConfiguration();
616        config.networkId = networkId;
617        config.numNoInternetAccessReports = 1;
618
619        WifiInfo wifiInfo = new WifiInfo();
620        wifiInfo.setNetworkId(networkId);
621        wifiInfo.setRssi(rssi);
622
623        NetworkInfo networkInfo =
624                new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", "");
625        networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", "");
626
627        AccessPoint ap = new TestAccessPointBuilder(mContext)
628                .setNetworkInfo(networkInfo)
629                .setNetworkId(networkId)
630                .setRssi(rssi)
631                .setWifiInfo(wifiInfo)
632                .build();
633
634        AccessPoint.AccessPointListener mockListener = mock(AccessPoint.AccessPointListener.class);
635        ap.setListener(mockListener);
636        WifiConfiguration newConfig = new WifiConfiguration(config);
637        config.validatedInternetAccess = true;
638
639        assertThat(ap.update(newConfig, wifiInfo, networkInfo)).isFalse();
640        verify(mockListener).onAccessPointChanged(ap);
641    }
642
643    @Test
644    public void testUpdateWithNullWifiConfiguration_doesNotThrowNPE() {
645        int networkId = 123;
646        int rssi = -55;
647        WifiConfiguration config = new WifiConfiguration();
648        config.networkId = networkId;
649        WifiInfo wifiInfo = new WifiInfo();
650        wifiInfo.setNetworkId(networkId);
651        wifiInfo.setRssi(rssi);
652
653        NetworkInfo networkInfo =
654                new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", "");
655        networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTING, "", "");
656
657        AccessPoint ap = new TestAccessPointBuilder(mContext)
658                .setNetworkInfo(networkInfo)
659                .setNetworkId(networkId)
660                .setRssi(rssi)
661                .setWifiInfo(wifiInfo)
662                .build();
663
664        ap.update(null, wifiInfo, networkInfo);
665    }
666}
667