PasspointNetworkScoreTest.java revision 7f2a1e30dd5d14320ffc7b185ac25fdb79fe52b0
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.hotspot2;
18
19import static org.junit.Assert.assertEquals;
20import static org.mockito.Mockito.mock;
21import static org.mockito.Mockito.when;
22
23import android.net.wifi.ScanResult;
24import android.support.test.filters.SmallTest;
25
26import com.android.server.wifi.ScanDetail;
27import com.android.server.wifi.hotspot2.anqp.ANQPElement;
28import com.android.server.wifi.hotspot2.anqp.Constants;
29import com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType;
30import com.android.server.wifi.hotspot2.anqp.HSWanMetricsElement;
31import com.android.server.wifi.hotspot2.anqp.IPAddressTypeAvailabilityElement;
32
33import org.junit.Test;
34
35import java.util.ArrayList;
36import java.util.HashMap;
37import java.util.List;
38import java.util.Map;
39
40/**
41 * Unit tests for {@link com.android.server.wifi.hotspot2.PasspointNetworkScore}.
42 */
43@SmallTest
44public class PasspointNetworkScoreTest {
45    private static class TestData {
46        public final boolean isHomeProvider;
47        public final boolean isActiveNetwork;
48        public final int rssiLevel;
49        public final boolean internetAccess;
50        public final NetworkDetail.Ant networkType;
51        public final Map<ANQPElementType, ANQPElement> anqpElements;
52        public int expectedScore;
53
54        TestData(boolean homeProvider, boolean activeNetwork, int rssi, boolean internet,
55                NetworkDetail.Ant type, Map<ANQPElementType, ANQPElement> elements,
56                int score) {
57            isHomeProvider = homeProvider;
58            isActiveNetwork = activeNetwork;
59            rssiLevel = rssi;
60            internetAccess = internet;
61            networkType = type;
62            anqpElements = elements;
63            expectedScore = score;
64        }
65    }
66
67    private static final HSWanMetricsElement WAN_PORT_DOWN_ELEMENT = new HSWanMetricsElement(
68            HSWanMetricsElement.LINK_STATUS_DOWN /* status */, true /* symmetric */,
69            false /* capped */, 1233 /* downlinkSpeed */, 1233 /* uplinkSpeed */,
70            10 /* downlinkLoad */, 10 /* uplinkLoad */, 12 /* lmd */);
71
72    private static final HSWanMetricsElement WAN_PORT_UP_ELEMENT = new HSWanMetricsElement(
73            HSWanMetricsElement.LINK_STATUS_UP /* status */, true /* symmetric */,
74            false /* capped */, 1233 /* downlinkSpeed */, 1233 /* uplinkSpeed */,
75            10 /* downlinkLoad */, 10 /* uplinkLoad */, 12 /* lmd */);
76
77    private static final HSWanMetricsElement WAN_PORT_CAPPED_ELEMENT = new HSWanMetricsElement(
78            HSWanMetricsElement.LINK_STATUS_UP /* status */, true /* symmetric */,
79            true /* capped */, 1233 /* downlinkSpeed */, 1233 /* uplinkSpeed */,
80            10 /* downlinkLoad */, 10 /* uplinkLoad */, 12 /* lmd */);
81
82    private static final IPAddressTypeAvailabilityElement UNRESTRICTED_IP_ADDRESS_ELEMENT =
83            new IPAddressTypeAvailabilityElement(IPAddressTypeAvailabilityElement.IPV4_PUBLIC,
84                    IPAddressTypeAvailabilityElement.IPV6_AVAILABLE);
85
86    private static final IPAddressTypeAvailabilityElement UNAVAILABLE_IP_ADDRESS_ELEMENT =
87            new IPAddressTypeAvailabilityElement(
88                    IPAddressTypeAvailabilityElement.IPV4_NOT_AVAILABLE,
89                    IPAddressTypeAvailabilityElement.IPV6_NOT_AVAILABLE);
90
91    private static final IPAddressTypeAvailabilityElement UNKNOWN_IP_ADDRESS_ELEMENT =
92            new IPAddressTypeAvailabilityElement(
93                    IPAddressTypeAvailabilityElement.IPV4_UNKNOWN,
94                    IPAddressTypeAvailabilityElement.IPV6_UNKNOWN);
95
96    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_WAN_PORT_DOWN =
97            new HashMap<>();
98
99    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_WAN_PORT_UP =
100            new HashMap<>();
101
102    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_WAN_PORT_CAPPED =
103            new HashMap<>();
104
105    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_UNRESTRICTED_IP =
106            new HashMap<>();
107
108    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_UNAVAILABLE_IP =
109            new HashMap<>();
110
111    private static final Map<ANQPElementType, ANQPElement> TEST_ANQP_WITH_UNKNOWN_IP =
112            new HashMap<>();
113
114    // List of test data.
115    private static final List<TestData> TEST_DATA_LIST = new ArrayList<>();
116    static {
117        // Setup ANQP elements map for testing.
118        TEST_ANQP_WITH_WAN_PORT_DOWN.put(Constants.ANQPElementType.HSWANMetrics,
119                WAN_PORT_DOWN_ELEMENT);
120        TEST_ANQP_WITH_WAN_PORT_UP.put(Constants.ANQPElementType.HSWANMetrics,
121                WAN_PORT_UP_ELEMENT);
122        TEST_ANQP_WITH_WAN_PORT_CAPPED.put(Constants.ANQPElementType.HSWANMetrics,
123                WAN_PORT_CAPPED_ELEMENT);
124        TEST_ANQP_WITH_UNRESTRICTED_IP.put(Constants.ANQPElementType.ANQPIPAddrAvailability,
125                UNRESTRICTED_IP_ADDRESS_ELEMENT);
126        TEST_ANQP_WITH_UNAVAILABLE_IP.put(Constants.ANQPElementType.ANQPIPAddrAvailability,
127                UNAVAILABLE_IP_ADDRESS_ELEMENT);
128        TEST_ANQP_WITH_UNKNOWN_IP.put(Constants.ANQPElementType.ANQPIPAddrAvailability,
129                UNKNOWN_IP_ADDRESS_ELEMENT);
130
131        // Home provider public network with Internet access that's not the current
132        // active network.
133        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
134                -60 /* rssiLevel */, true /* internetAccess */,
135                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
136                /* expectedScore */
137                PasspointNetworkScore.HOME_PROVIDER_AWARD
138                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
139                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
140                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
141
142        // Home provider public network with Internet access that's the current active network.
143        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, true /* isActiveNetwork */,
144                -60 /* rssiLevel */, true /* internetAccess */,
145                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
146                /* expectedScore */
147                PasspointNetworkScore.HOME_PROVIDER_AWARD
148                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
149                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
150                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, true)));
151
152        // Home provider public network without Internet access that's not the current
153        // active network.
154        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
155                -60 /* rssiLevel */, false /* internetAccess */,
156                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
157                /* expectedScore */
158                PasspointNetworkScore.HOME_PROVIDER_AWARD
159                - PasspointNetworkScore.INTERNET_ACCESS_AWARD
160                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
161                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
162
163        // Home provider personal network with Internet access that's not the current active
164        // network.
165        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
166                -60 /* rssiLevel */, true /* internetAccess */,
167                NetworkDetail.Ant.Personal /* networkType */, null /* anqpElements */,
168                /* expectedScore */
169                PasspointNetworkScore.HOME_PROVIDER_AWARD
170                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
171                + PasspointNetworkScore.PERSONAL_OR_EMERGENCY_NETWORK_AWARDS
172                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
173
174        // Home provider public network with Internet access that's not the current
175        // active network, and ANPQ element indicating WAN port is up.
176        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
177                -60 /* rssiLevel */, true /* internetAccess */,
178                NetworkDetail.Ant.FreePublic /* networkType */,
179                TEST_ANQP_WITH_WAN_PORT_UP /* anqpElements */,
180                /* expectedScore */
181                PasspointNetworkScore.HOME_PROVIDER_AWARD
182                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
183                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
184                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
185
186        // Home provider public network with Internet access that's not the current
187        // active network, and ANPQ element indicating WAN port is down.
188        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
189                -60 /* rssiLevel */, true /* internetAccess */,
190                NetworkDetail.Ant.FreePublic /* networkType */,
191                TEST_ANQP_WITH_WAN_PORT_DOWN /* anqpElements */,
192                /* expectedScore */
193                PasspointNetworkScore.HOME_PROVIDER_AWARD
194                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
195                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
196                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
197                - PasspointNetworkScore.WAN_PORT_DOWN_OR_CAPPED_PENALTY));
198
199        // Home provider public network with Internet access that's not the current
200        // active network, and ANPQ element indicating WAN port is capped (max load reached).
201        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
202                -60 /* rssiLevel */, true /* internetAccess */,
203                NetworkDetail.Ant.FreePublic /* networkType */,
204                TEST_ANQP_WITH_WAN_PORT_CAPPED /* anqpElements */,
205                /* expectedScore */
206                PasspointNetworkScore.HOME_PROVIDER_AWARD
207                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
208                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
209                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
210                - PasspointNetworkScore.WAN_PORT_DOWN_OR_CAPPED_PENALTY));
211
212        // Home provider public network with Internet access that's not the current
213        // active network, and ANPQ element indicating both IPv4 and IPv6 addresses are available.
214        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
215                -60 /* rssiLevel */, true /* internetAccess */,
216                NetworkDetail.Ant.FreePublic /* networkType */,
217                TEST_ANQP_WITH_UNRESTRICTED_IP /* anqpElements */,
218                /* expectedScore */
219                PasspointNetworkScore.HOME_PROVIDER_AWARD
220                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
221                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
222                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
223                + PasspointNetworkScore.UNRESTRICTED_IP_AWARDS * 2 /* one for IPv4 and IPv6 */));
224
225        // Home provider public network with Internet access that's not the current
226        // active network, and ANPQ element indicating both IPv4 and IPv6 addresses are available.
227        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
228                -60 /* rssiLevel */, true /* internetAccess */,
229                NetworkDetail.Ant.FreePublic /* networkType */,
230                TEST_ANQP_WITH_UNRESTRICTED_IP /* anqpElements */,
231                /* expectedScore */
232                PasspointNetworkScore.HOME_PROVIDER_AWARD
233                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
234                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
235                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
236                /* one each for IPv4 and IPv6. */
237                + PasspointNetworkScore.UNRESTRICTED_IP_AWARDS * 2));
238
239        // Home provider public network with Internet access that's not the current
240        // active network, and ANPQ element indicating both IPv4 and IPv6 addresses are
241        // unavailable.
242        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
243                -60 /* rssiLevel */, true /* internetAccess */,
244                NetworkDetail.Ant.FreePublic /* networkType */,
245                TEST_ANQP_WITH_UNAVAILABLE_IP /* anqpElements */,
246                /* expectedScore */
247                PasspointNetworkScore.HOME_PROVIDER_AWARD
248                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
249                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
250                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
251
252        // Home provider public network with Internet access that's not the current
253        // active network, and ANPQ element indicating both IPv4 and IPv6 addresses are unknown.
254        TEST_DATA_LIST.add(new TestData(true /* isHomeProvider */, false /* isActiveNetwork */,
255                -60 /* rssiLevel */, true /* internetAccess */,
256                NetworkDetail.Ant.FreePublic /* networkType */,
257                TEST_ANQP_WITH_UNKNOWN_IP /* anqpElements */,
258                /* expectedScore */
259                PasspointNetworkScore.HOME_PROVIDER_AWARD
260                + PasspointNetworkScore.INTERNET_ACCESS_AWARD
261                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
262                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)
263                /* one each for IPv4 and IPv6. */
264                + PasspointNetworkScore.RESTRICTED_OR_UNKNOWN_IP_AWARDS * 2));
265
266        // Roaming provider public network with Internet access that's not the current active
267        // network.
268        TEST_DATA_LIST.add(new TestData(false /* isHomeProvider */, false /* isActiveNetwork */,
269                -60 /* rssiLevel */, true /* internetAccess */,
270                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
271                /* expectedScore */
272                PasspointNetworkScore.INTERNET_ACCESS_AWARD
273                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
274                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
275
276        // Roaming provider public network with Internet access that's the current active network.
277        TEST_DATA_LIST.add(new TestData(false /* isHomeProvider */, true /* isActiveNetwork */,
278                -60 /* rssiLevel */, true /* internetAccess */,
279                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
280                /* expectedScore */
281                PasspointNetworkScore.INTERNET_ACCESS_AWARD
282                + PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
283                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, true)));
284
285        // Roaming provider public network without Internet access that's not the current active
286        // network.
287        TEST_DATA_LIST.add(new TestData(false /* isHomeProvider */, false /* isActiveNetwork */,
288                -60 /* rssiLevel */, false /* internetAccess */,
289                NetworkDetail.Ant.FreePublic /* networkType */, null /* anqpElements */,
290                /* expectedScore */
291                PasspointNetworkScore.PUBLIC_OR_PRIVATE_NETWORK_AWARDS
292                - PasspointNetworkScore.INTERNET_ACCESS_AWARD
293                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
294
295        // Roaming provider personal network with Internet access that's not the current active
296        // network.
297        TEST_DATA_LIST.add(new TestData(false /* isHomeProvider */, false /* isActiveNetwork */,
298                -60 /* rssiLevel */, true /* internetAccess */,
299                NetworkDetail.Ant.Personal /* networkType */, null /* anqpElements */,
300                /* expectedScore */
301                PasspointNetworkScore.INTERNET_ACCESS_AWARD
302                + PasspointNetworkScore.PERSONAL_OR_EMERGENCY_NETWORK_AWARDS
303                + PasspointNetworkScore.RSSI_SCORE.lookupScore(-60, false)));
304    }
305
306    /**
307     * Helper function for generating a {@link ScanDetail} for testing.
308     *
309     * @param rssiLevel RSSI level of the network
310     * @param internetAccess Flag indicating if the network provides Internet access
311     * @param networkType The type of the network
312     * @return {@link ScanDetail}
313     */
314    private static ScanDetail generateScanDetail(int rssiLevel, boolean internetAccess,
315            NetworkDetail.Ant networkType) {
316        // Setup ScanResult.
317        ScanResult scanResult = new ScanResult();
318        scanResult.level = -60;
319
320        // Setup NetworkDetail.
321        NetworkDetail networkDetail = mock(NetworkDetail.class);
322        when(networkDetail.isInternet()).thenReturn(internetAccess);
323        when(networkDetail.getAnt()).thenReturn(networkType);
324
325        // Setup ScanDetail.
326        ScanDetail scanDetail = mock(ScanDetail.class);
327        when(scanDetail.getScanResult()).thenReturn(scanResult);
328        when(scanDetail.getNetworkDetail()).thenReturn(networkDetail);
329
330        return scanDetail;
331    }
332
333    /**
334     * Go through the list of the test data {@link #TEST_DATA_LIST} and verify the score for each.
335     *
336     * @throws Exception
337     */
338    @Test
339    public void calculateScore() throws Exception {
340        for (TestData data : TEST_DATA_LIST) {
341            ScanDetail scanDetail = generateScanDetail(data.rssiLevel, data.internetAccess,
342                    data.networkType);
343            assertEquals(data.expectedScore, PasspointNetworkScore.calculateScore(
344                    data.isHomeProvider, scanDetail, data.anqpElements, data.isActiveNetwork));
345        }
346    }
347
348}
349