1 /* 2 * Copyright (C) 2018 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 package android.telephony.cts; 17 18 import static android.telephony.ServiceState.DUPLEX_MODE_FDD; 19 import static android.telephony.ServiceState.DUPLEX_MODE_TDD; 20 import static android.telephony.ServiceState.DUPLEX_MODE_UNKNOWN; 21 import static android.telephony.ServiceState.ROAMING_TYPE_DOMESTIC; 22 import static android.telephony.ServiceState.ROAMING_TYPE_NOT_ROAMING; 23 import static android.telephony.ServiceState.STATE_OUT_OF_SERVICE; 24 import static android.telephony.ServiceState.STATE_POWER_OFF; 25 26 import static org.junit.Assert.assertEquals; 27 import static org.junit.Assert.assertFalse; 28 import static org.junit.Assert.assertNotEquals; 29 import static org.junit.Assert.assertNotNull; 30 import static org.junit.Assert.assertNull; 31 import static org.junit.Assert.assertTrue; 32 import static org.junit.Assert.fail; 33 34 import android.content.Context; 35 import android.os.Build; 36 import android.os.Parcel; 37 import android.telephony.AccessNetworkConstants; 38 import android.telephony.DataSpecificRegistrationInfo; 39 import android.telephony.LteVopsSupportInfo; 40 import android.telephony.NetworkRegistrationInfo; 41 import android.telephony.NrVopsSupportInfo; 42 import android.telephony.ServiceState; 43 import android.telephony.TelephonyManager; 44 import android.telephony.VopsSupportInfo; 45 46 import androidx.test.InstrumentationRegistry; 47 48 import org.junit.Before; 49 import org.junit.Test; 50 51 import java.util.List; 52 import java.util.regex.Matcher; 53 import java.util.regex.Pattern; 54 55 public class ServiceStateTest { 56 private static final String OPERATOR_ALPHA_LONG = "CtsOperatorLong"; 57 private static final String OPERATOR_ALPHA_SHORT = "CtsOp"; 58 private static final String OPERATOR_NUMERIC = "02871"; 59 private static final int SYSTEM_ID = 123; 60 private static final int NETWORK_ID = 456; 61 private static final int CHANNEL_NUMBER_BAND_66 = 66436; 62 private static final int CHANNEL_NUMBER_BAND_33 = 36000; 63 private static final int[] CELL_BANDWIDTH = {1, 2, 3}; 64 65 private ServiceState serviceState; 66 67 @Before setUp()68 public void setUp() { 69 serviceState = new ServiceState(); 70 } 71 72 @Test testDescribeContents()73 public void testDescribeContents() { 74 assertEquals(0, serviceState.describeContents()); 75 } 76 77 @Test testSetStateOff()78 public void testSetStateOff() { 79 serviceState.setStateOff(); 80 assertEquals(STATE_POWER_OFF, serviceState.getState()); 81 checkOffStatus(serviceState); 82 } 83 84 @Test testSetStateOutOfService()85 public void testSetStateOutOfService() { 86 serviceState.setStateOutOfService(); 87 assertEquals(STATE_OUT_OF_SERVICE, serviceState.getState()); 88 checkOffStatus(serviceState); 89 } 90 91 @Test testSetState()92 public void testSetState() { 93 serviceState.setState(ServiceState.STATE_IN_SERVICE); 94 assertEquals(ServiceState.STATE_IN_SERVICE, serviceState.getState()); 95 } 96 97 @Test testGetRoaming()98 public void testGetRoaming() { 99 serviceState.setRoaming(false); 100 assertFalse(serviceState.getRoaming()); 101 serviceState.setRoaming(true); 102 assertTrue(serviceState.getRoaming()); 103 } 104 105 @Test testGetIsManualSelection()106 public void testGetIsManualSelection() { 107 serviceState.setIsManualSelection(false); 108 assertFalse(serviceState.getIsManualSelection()); 109 serviceState.setIsManualSelection(true); 110 assertTrue(serviceState.getIsManualSelection()); 111 } 112 113 @Test testGetOperator()114 public void testGetOperator() { 115 serviceState.setOperatorName(OPERATOR_ALPHA_LONG, OPERATOR_ALPHA_SHORT, OPERATOR_NUMERIC); 116 assertEquals(OPERATOR_ALPHA_LONG, serviceState.getOperatorAlphaLong()); 117 assertEquals(OPERATOR_ALPHA_SHORT, serviceState.getOperatorAlphaShort()); 118 assertEquals(OPERATOR_NUMERIC, serviceState.getOperatorNumeric()); 119 } 120 121 @Test testGetChannelNumber()122 public void testGetChannelNumber() { 123 serviceState.setChannelNumber(CHANNEL_NUMBER_BAND_66); 124 assertEquals(CHANNEL_NUMBER_BAND_66, serviceState.getChannelNumber()); 125 } 126 127 @Test testGetCellBandwidths()128 public void testGetCellBandwidths() { 129 serviceState.setCellBandwidths(CELL_BANDWIDTH); 130 assertEquals(CELL_BANDWIDTH, serviceState.getCellBandwidths()); 131 } 132 133 @Test testGetDuplexMode()134 public void testGetDuplexMode() { 135 NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder() 136 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 137 .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_GSM) 138 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 139 .build(); 140 serviceState.addNetworkRegistrationInfo(nri); 141 assertEquals(DUPLEX_MODE_UNKNOWN, serviceState.getDuplexMode()); 142 143 nri = new NetworkRegistrationInfo.Builder() 144 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 145 .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) 146 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 147 .build(); 148 serviceState.addNetworkRegistrationInfo(nri); 149 150 assertEquals(DUPLEX_MODE_FDD, serviceState.getDuplexMode()); 151 152 serviceState.setChannelNumber(CHANNEL_NUMBER_BAND_33); 153 assertEquals(DUPLEX_MODE_TDD, serviceState.getDuplexMode()); 154 } 155 getContext()156 private static Context getContext() { 157 return InstrumentationRegistry.getContext(); 158 } 159 160 @Test testToString()161 public void testToString() { 162 assertNotNull(serviceState.toString()); 163 } 164 165 @Test testNrStateRedacted()166 public void testNrStateRedacted() { 167 // Verify that NR State is not leaked in user builds. 168 if (Build.IS_DEBUGGABLE) return; 169 final TelephonyManager tm = getContext().getSystemService(TelephonyManager.class); 170 171 final NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder() 172 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 173 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 174 .build(); 175 nri.setNrState(NetworkRegistrationInfo.NR_STATE_RESTRICTED); 176 177 final ServiceState ss = new ServiceState(); 178 ss.addNetworkRegistrationInfo(nri); 179 String sss = ss.toString(); 180 181 // The string leaked in previous releases is "nrState=<val>"; test that there is 182 // no matching or highly similar string leak, such as: 183 // nrState=NONE 184 // nrState=0 185 // mNrState=RESTRICTED 186 // NRSTATE=NOT_RESTRICTED 187 // nrState = CONNECTED 188 // etc. 189 Pattern p = Pattern.compile("nrState\\s*=\\s*[a-zA-Z0-9_]+", Pattern.CASE_INSENSITIVE); 190 Matcher m = p.matcher(sss); 191 // Need to use if (find) fail to ensure that the start and end are populated 192 if (m.find()) fail("Found nrState reported as: " + sss.substring(m.start(), m.end())); 193 } 194 195 @Test testCopyConstructor()196 public void testCopyConstructor() { 197 ServiceState serviceState = getServiceStateWithOperatorName("name", "numeric"); 198 assertEquals(serviceState, new ServiceState(serviceState)); 199 } 200 201 @Test testParcelConstructor()202 public void testParcelConstructor() { 203 ServiceState serviceState = getServiceStateWithOperatorName("name", "numeric"); 204 Parcel stateParcel = Parcel.obtain(); 205 serviceState.writeToParcel(stateParcel, 0); 206 stateParcel.setDataPosition(0); 207 assertEquals(serviceState, new ServiceState(stateParcel)); 208 } 209 210 @Test testHashCode()211 public void testHashCode() { 212 ServiceState serviceStateA = getServiceStateWithOperatorName("a", "b"); 213 ServiceState serviceStateB = getServiceStateWithOperatorName("a", "b"); 214 ServiceState serviceStateC = getServiceStateWithOperatorName("c", "d"); 215 216 // well-written hashCode functions shouldn't produce "0" 217 assertNotEquals(serviceStateA.hashCode(), 0); 218 assertNotEquals(serviceStateB.hashCode(), 0); 219 220 // If serviceStateA.equals(serviceStateB), then serviceStateA.hashCode() 221 // should equal serviceStateB.hashCode(). 222 assertEquals(serviceStateA.hashCode(), serviceStateB.hashCode()); 223 assertEquals(serviceStateA, serviceStateB); 224 225 // If serviceStateA.hashCode() != serviceStateC.hashCode(), then 226 // serviceStateA.equals(serviceStateB) should be false. 227 assertNotEquals(serviceStateA.hashCode(), serviceStateC.hashCode()); 228 assertNotEquals(serviceStateA, serviceStateC); 229 } 230 231 @Test testRoaming()232 public void testRoaming() { 233 ServiceState notRoaming = getServiceStateWithRoamingTypes(ROAMING_TYPE_NOT_ROAMING, 234 ROAMING_TYPE_NOT_ROAMING); 235 ServiceState dataRoaming = getServiceStateWithRoamingTypes(ROAMING_TYPE_DOMESTIC, 236 ROAMING_TYPE_NOT_ROAMING); 237 ServiceState voiceRoaming = getServiceStateWithRoamingTypes(ROAMING_TYPE_NOT_ROAMING, 238 ROAMING_TYPE_DOMESTIC); 239 ServiceState dataVoiceRoaming = getServiceStateWithRoamingTypes(ROAMING_TYPE_NOT_ROAMING, 240 ROAMING_TYPE_DOMESTIC); 241 242 assertFalse(notRoaming.getRoaming()); 243 assertTrue(dataRoaming.getRoaming()); 244 assertTrue(voiceRoaming.getRoaming()); 245 assertTrue(dataVoiceRoaming.getRoaming()); 246 } 247 248 @Test testGetDataNetworkType()249 public void testGetDataNetworkType() { 250 NetworkRegistrationInfo iwlanReg = new NetworkRegistrationInfo.Builder() 251 .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) 252 .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) 253 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) 254 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 255 .build(); 256 257 NetworkRegistrationInfo wwanReg = 258 new NetworkRegistrationInfo.Builder() 259 .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) 260 .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) 261 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 262 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 263 .build(); 264 265 NetworkRegistrationInfo outOfServiceWwanReg = 266 new NetworkRegistrationInfo.Builder() 267 .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) 268 .setRegistrationState( 269 NetworkRegistrationInfo 270 .REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING) 271 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 272 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 273 .build(); 274 275 serviceState = new ServiceState(); 276 serviceState.addNetworkRegistrationInfo(iwlanReg); 277 serviceState.addNetworkRegistrationInfo(wwanReg); 278 assertEquals(TelephonyManager.NETWORK_TYPE_LTE, serviceState.getDataNetworkType()); 279 280 serviceState = new ServiceState(); 281 serviceState.addNetworkRegistrationInfo(iwlanReg); 282 serviceState.addNetworkRegistrationInfo(outOfServiceWwanReg); 283 assertEquals(TelephonyManager.NETWORK_TYPE_IWLAN, serviceState.getDataNetworkType()); 284 } 285 286 @Test testIsManualSelection()287 public void testIsManualSelection() { 288 serviceState.setIsManualSelection(false); 289 assertFalse(serviceState.getIsManualSelection()); 290 serviceState.setIsManualSelection(true); 291 assertTrue(serviceState.getIsManualSelection()); 292 } 293 getServiceStateWithOperatorName(String name, String numeric)294 private ServiceState getServiceStateWithOperatorName(String name, String numeric) { 295 ServiceState serviceState = new ServiceState(); 296 serviceState.setOperatorName(name, name, numeric); 297 return serviceState; 298 } 299 getServiceStateWithRoamingTypes(int dataRoaming, int voiceRoaming)300 private ServiceState getServiceStateWithRoamingTypes(int dataRoaming, int voiceRoaming) { 301 ServiceState serviceState = new ServiceState(); 302 serviceState.setDataRoamingType(dataRoaming); 303 serviceState.setVoiceRoamingType(voiceRoaming); 304 return serviceState; 305 } 306 307 /** 308 * Check the ServiceState fields in STATE_OUT_OF_SERVICE or STATE_POWER_OFF 309 */ checkOffStatus(ServiceState s)310 private void checkOffStatus(ServiceState s) { 311 assertFalse(s.getRoaming()); 312 assertNull(s.getOperatorAlphaLong()); 313 assertNull(s.getOperatorAlphaShort()); 314 assertNull(s.getOperatorNumeric()); 315 assertFalse(s.getIsManualSelection()); 316 } 317 318 @Test testGetRegistrationInfo()319 public void testGetRegistrationInfo() { 320 NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder() 321 .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) 322 .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) 323 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 324 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 325 .build(); 326 serviceState.addNetworkRegistrationInfo(nri); 327 328 assertEquals(nri, serviceState.getNetworkRegistrationInfo( 329 NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); 330 assertNull(serviceState.getNetworkRegistrationInfo( 331 NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WLAN)); 332 assertNull(serviceState.getNetworkRegistrationInfo( 333 NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); 334 assertNull(serviceState.getNetworkRegistrationInfo( 335 NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WLAN)); 336 337 List<NetworkRegistrationInfo> nris = serviceState.getNetworkRegistrationInfoList(); 338 assertEquals(1, nris.size()); 339 assertEquals(nri, nris.get(0)); 340 341 nri = new NetworkRegistrationInfo.Builder() 342 .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) 343 .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) 344 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) 345 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 346 .build(); 347 serviceState.addNetworkRegistrationInfo(nri); 348 assertEquals(nri, serviceState.getNetworkRegistrationInfo( 349 NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WLAN)); 350 351 nris = serviceState.getNetworkRegistrationInfoListForDomain( 352 NetworkRegistrationInfo.DOMAIN_PS); 353 assertEquals(2, nris.size()); 354 assertEquals(nri, nris.get(1)); 355 356 nris = serviceState.getNetworkRegistrationInfoList(); 357 assertEquals(2, nris.size()); 358 359 nris = serviceState.getNetworkRegistrationInfoListForTransportType( 360 AccessNetworkConstants.TRANSPORT_TYPE_WLAN); 361 assertEquals(1, nris.size()); 362 assertEquals(nri, nris.get(0)); 363 } 364 365 @Test testVopsSupportInfo()366 public void testVopsSupportInfo() { 367 VopsSupportInfo vopsSupportInfo = 368 new LteVopsSupportInfo(LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE, 369 LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE); 370 371 NetworkRegistrationInfo wwanDataRegState = new NetworkRegistrationInfo.Builder() 372 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 373 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 374 .setDataSpecificInfo(new DataSpecificRegistrationInfo( 375 0, false, false, false, vopsSupportInfo)) 376 .setEmergencyOnly(true).build(); 377 378 ServiceState ss = new ServiceState(); 379 380 ss.addNetworkRegistrationInfo(wwanDataRegState); 381 382 assertEquals(ss.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, 383 AccessNetworkConstants.TRANSPORT_TYPE_WWAN), wwanDataRegState); 384 385 vopsSupportInfo = 386 new LteVopsSupportInfo(LteVopsSupportInfo.LTE_STATUS_SUPPORTED, 387 LteVopsSupportInfo.LTE_STATUS_NOT_SUPPORTED); 388 389 wwanDataRegState = new NetworkRegistrationInfo.Builder() 390 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 391 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 392 .setDataSpecificInfo(new DataSpecificRegistrationInfo( 393 0, false, false, false, vopsSupportInfo)) 394 .setEmergencyOnly(true).build(); 395 ss.addNetworkRegistrationInfo(wwanDataRegState); 396 assertEquals(ss.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, 397 AccessNetworkConstants.TRANSPORT_TYPE_WWAN), wwanDataRegState); 398 assertEquals(ss.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, 399 AccessNetworkConstants.TRANSPORT_TYPE_WWAN).getDataSpecificInfo() 400 .getLteVopsSupportInfo(), (LteVopsSupportInfo) vopsSupportInfo); 401 assertEquals(ss.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, 402 AccessNetworkConstants.TRANSPORT_TYPE_WWAN).getDataSpecificInfo() 403 .getVopsSupportInfo(), vopsSupportInfo); 404 405 vopsSupportInfo = new NrVopsSupportInfo(NrVopsSupportInfo.NR_STATUS_VOPS_NOT_SUPPORTED, 406 NrVopsSupportInfo.NR_STATUS_EMC_NOT_SUPPORTED, 407 NrVopsSupportInfo.NR_STATUS_EMF_NOT_SUPPORTED); 408 wwanDataRegState = new NetworkRegistrationInfo.Builder() 409 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 410 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 411 .setDataSpecificInfo(new DataSpecificRegistrationInfo( 412 0, false, false, false, vopsSupportInfo)) 413 .setEmergencyOnly(true).build(); 414 ss.addNetworkRegistrationInfo(wwanDataRegState); 415 assertEquals(ss.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, 416 AccessNetworkConstants.TRANSPORT_TYPE_WWAN), wwanDataRegState); 417 assertEquals(ss.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, 418 AccessNetworkConstants.TRANSPORT_TYPE_WWAN).getDataSpecificInfo() 419 .getVopsSupportInfo(), vopsSupportInfo); 420 } 421 422 @Test testIsSearchingPs()423 public void testIsSearchingPs() { 424 NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder() 425 .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) 426 .setRegistrationState( 427 NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_SEARCHING) 428 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 429 .setDomain(NetworkRegistrationInfo.DOMAIN_PS) 430 .build(); 431 serviceState.addNetworkRegistrationInfo(nri); 432 assertTrue(serviceState.isSearching()); 433 } 434 435 @Test testNotSearchingCs()436 public void testNotSearchingCs() { 437 NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder() 438 .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) 439 .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) 440 .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) 441 .setDomain(NetworkRegistrationInfo.DOMAIN_CS) 442 .build(); 443 serviceState.addNetworkRegistrationInfo(nri); 444 assertFalse(serviceState.isSearching()); 445 } 446 447 @Test testIsUsingNonTerrestrialNetwork()448 public void testIsUsingNonTerrestrialNetwork() { 449 NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder() 450 .setIsNonTerrestrialNetwork(true) 451 .build(); 452 serviceState.addNetworkRegistrationInfo(nri); 453 assertTrue(serviceState.isUsingNonTerrestrialNetwork()); 454 } 455 } 456