• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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