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