1 /* 2 * Copyright (C) 2019 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 17 package com.android.internal.telephony; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.junit.Assert.fail; 22 import static org.mockito.ArgumentMatchers.anyInt; 23 import static org.mockito.Mockito.doReturn; 24 25 import android.content.Context; 26 import android.os.PersistableBundle; 27 import android.telephony.CarrierConfigManager; 28 import android.telephony.ServiceState; 29 30 import com.android.internal.telephony.cdnr.CarrierDisplayNameData; 31 import com.android.internal.telephony.cdnr.CarrierDisplayNameResolver; 32 import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 33 import com.android.internal.telephony.uicc.RuimRecords; 34 import com.android.internal.telephony.uicc.SIMRecords; 35 import com.android.internal.telephony.uicc.UiccCardApplication; 36 37 import org.junit.After; 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.mockito.Mockito; 41 42 public class CarrierDisplayNameResolverTest extends TelephonyTest { 43 44 private static final String PLMN_1 = "310260"; 45 private static final String PLMN_2 = "480123"; 46 private static final String PLMN_3 = "586111"; 47 private static final String HOME_PLMN_NUMERIC = PLMN_1; 48 private static final String NON_HOME_PLMN_NUMERIC = "123456"; 49 50 private static final String SPN_FROM_CC = "spn from carrier config"; 51 52 /** No PLMN in home, not SPN in roaming. */ 53 private static final int SPN_DISPLAY_CONDITION_FROM_USIM = 0; 54 private static final String SPN_FROM_USIM = "spn from usim"; 55 private static final String PNN_HOME_NAME_FROM_USIM = "pnnHomeName"; 56 private static final String[] SPDI_FROM_USIM = new String[] { PLMN_1, PLMN_2 }; 57 private static final String[] EHPLMNS_FROM_USIM = new String[] { 58 PLMN_1, PLMN_2, PLMN_3 59 }; 60 61 private static final boolean ROAMING = true; 62 private static final boolean NON_ROAMING = false; 63 64 private PersistableBundle mConfig; 65 66 private CarrierDisplayNameResolver mCdnr; 67 68 private ServiceState mSS = new ServiceState(); 69 70 @Before setUp()71 public void setUp() throws Exception { 72 super.setUp(this.getClass().getSimpleName()); 73 74 mCdnr = new CarrierDisplayNameResolver(mPhone); 75 76 UiccCardApplication uiccApp = Mockito.mock(UiccCardApplication.class); 77 doReturn(uiccApp).when(mPhone).getUiccCardApplication(); 78 doReturn(AppState.APPSTATE_READY).when(uiccApp).getState(); 79 doReturn(mSS).when(mSST).getServiceState(); 80 81 doReturn(false).when(mPhone).isWifiCallingEnabled(); 82 doReturn(true).when(mPhone).isPhoneTypeGsm(); 83 84 mConfig = mContextFixture.getCarrierConfigBundle(); 85 CarrierConfigManager mockConfigManager = Mockito.mock(CarrierConfigManager.class); 86 doReturn(mockConfigManager).when(mContext).getSystemService(Context.CARRIER_CONFIG_SERVICE); 87 doReturn(mConfig).when(mockConfigManager).getConfigForSubId(anyInt()); 88 89 mSS.setEmergencyOnly(false /* emergencyCallOnly" */); 90 mSS.setOperatorName("long name", "short name", HOME_PLMN_NUMERIC); 91 mSS.setVoiceRegState(ServiceState.STATE_IN_SERVICE); 92 mSS.setDataRegState(ServiceState.STATE_IN_SERVICE); 93 94 SIMRecords usim = Mockito.mock(SIMRecords.class); 95 doReturn(SPN_FROM_USIM).when(usim).getServiceProviderName(); 96 doReturn(PNN_HOME_NAME_FROM_USIM).when(usim).getPnnHomeName(); 97 doReturn(EHPLMNS_FROM_USIM).when(usim).getEhplmns(); 98 doReturn(SPDI_FROM_USIM).when(usim).getServiceProviderDisplayInformation(); 99 doReturn(SPN_DISPLAY_CONDITION_FROM_USIM).when(usim).getCarrierNameDisplayCondition(); 100 101 mCdnr.updateEfFromUsim(usim); 102 } 103 104 @After tearDown()105 public void tearDown() throws Exception { 106 mCdnr = null; 107 mConfig = null; 108 mSS = null; 109 super.tearDown(); 110 } 111 112 @Test testUpdateSPNFromHigherPrioritySource_shouldOverrideRecord()113 public void testUpdateSPNFromHigherPrioritySource_shouldOverrideRecord() { 114 // Carrier config source > sim record source 115 mConfig.putString(CarrierConfigManager.KEY_CARRIER_NAME_STRING, SPN_FROM_CC); 116 117 // Update ef records from carrier config 118 mCdnr.updateEfFromCarrierConfig(mConfig); 119 120 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 121 assertThat(data.getSpn()).isEqualTo(SPN_FROM_CC); 122 assertThat(data.shouldShowSpn()).isTrue(); 123 } 124 125 @Test testUpdateSPNFromLowerPrioritySource_shouldNotOverrideRecord()126 public void testUpdateSPNFromLowerPrioritySource_shouldNotOverrideRecord() { 127 // Ruim's priority < Usim's priority 128 RuimRecords ruim = Mockito.mock(RuimRecords.class); 129 doReturn("spn from ruim").when(ruim).getServiceProviderName(); 130 131 // Update ef records from Ruim 132 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 133 assertThat(data.getSpn()).isEqualTo(SPN_FROM_USIM); 134 } 135 136 @Test testShouldShowSPN_nonRoaming_showSPN()137 public void testShouldShowSPN_nonRoaming_showSPN() { 138 mSS.setRoaming(NON_ROAMING); 139 140 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 141 assertThat(data.shouldShowSpn()).isTrue(); 142 } 143 144 @Test testShouldShowSPN_plmnNotInProvidedList_notShowSPN()145 public void testShouldShowSPN_plmnNotInProvidedList_notShowSPN() { 146 mSS.setOperatorName("long", "short", NON_HOME_PLMN_NUMERIC); 147 mSS.setRoaming(ROAMING); 148 149 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 150 assertThat(data.shouldShowSpn()).isFalse(); 151 } 152 153 @Test testShouldShowSPN_plmnInProvidedList_showSPN()154 public void testShouldShowSPN_plmnInProvidedList_showSPN() { 155 mSS.setOperatorName("long", "short", SPDI_FROM_USIM[0]); 156 mSS.setRoaming(ROAMING); 157 158 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 159 assertThat(data.shouldShowSpn()).isTrue(); 160 } 161 162 @Test testShouldShowPLMNNetworkName_plmnNotInProvidedList_showPLMNNetworkName()163 public void testShouldShowPLMNNetworkName_plmnNotInProvidedList_showPLMNNetworkName() { 164 mSS.setOperatorName("long", "short", NON_HOME_PLMN_NUMERIC); 165 mSS.setRoaming(ROAMING); 166 167 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 168 assertThat(data.shouldShowPlmn()).isTrue(); 169 } 170 171 @Test testGetPLMNNetworkName_oplNotPresent_returnTheFirstEntryOfPNNList()172 public void testGetPLMNNetworkName_oplNotPresent_returnTheFirstEntryOfPNNList() { 173 // Set the roaming state to on roaming, we should show the plmn network name based on the 174 // default settings. 175 mSS.setRoaming(ROAMING); 176 177 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 178 assertThat(data.getPlmn()).isEqualTo(PNN_HOME_NAME_FROM_USIM); 179 } 180 181 @Test testShouldShowPLMNFromSourceBandOverride_notShowPLMN()182 public void testShouldShowPLMNFromSourceBandOverride_notShowPLMN() { 183 // Update ef records from brand override 184 mCdnr.updateEfForBrandOverride("spn from brand override"); 185 186 mSS.setRoaming(ROAMING); 187 188 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 189 assertThat(data.shouldShowPlmn()).isFalse(); 190 } 191 192 @Test testShouldShowSPNFromSourceCC_conditionOverrideShowPLMN_notShowSPN()193 public void testShouldShowSPNFromSourceCC_conditionOverrideShowPLMN_notShowSPN() { 194 // Carrier config source > sim record source 195 mConfig.putInt(CarrierConfigManager.KEY_SPN_DISPLAY_CONDITION_OVERRIDE_INT, 1); 196 197 // Update ef records from carrier config 198 mCdnr.updateEfFromCarrierConfig(mConfig); 199 200 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 201 assertThat(data.shouldShowSpn()).isFalse(); 202 } 203 204 @Test testShouldShowPLMNFromSourceCC_conditionOverrideShowPLMN_shouldShowPLMN()205 public void testShouldShowPLMNFromSourceCC_conditionOverrideShowPLMN_shouldShowPLMN() { 206 // Carrier config source > sim record source 207 mConfig.putInt(CarrierConfigManager.KEY_SPN_DISPLAY_CONDITION_OVERRIDE_INT, 1); 208 209 // Update ef records from carrier config 210 mCdnr.updateEfFromCarrierConfig(mConfig); 211 212 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 213 assertThat(data.shouldShowPlmn()).isTrue(); 214 } 215 216 @Test testShouldShowPLMNLongName_plmnNotInProvidedList_showPLMNLongName()217 public void testShouldShowPLMNLongName_plmnNotInProvidedList_showPLMNLongName() { 218 // Carrier config source > sim record source 219 mConfig.putInt(CarrierConfigManager.KEY_SPN_DISPLAY_CONDITION_OVERRIDE_INT, 1); 220 221 // Update ef records from carrier config 222 mCdnr.updateEfFromCarrierConfig(mConfig); 223 224 SIMRecords usim = Mockito.mock(SIMRecords.class); 225 doReturn(SPN_FROM_USIM).when(usim).getServiceProviderName(); 226 mCdnr.updateEfFromUsim(usim); 227 228 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 229 230 assertThat(data.shouldShowPlmn()).isTrue(); 231 assertThat(data.getPlmn()).isEqualTo("long name"); 232 } 233 234 @Test testShouldShowPLMNShortName_plmnNotInProvidedList_showPLMNShortName()235 public void testShouldShowPLMNShortName_plmnNotInProvidedList_showPLMNShortName() { 236 // Carrier config source > sim record source 237 mConfig.putInt(CarrierConfigManager.KEY_SPN_DISPLAY_CONDITION_OVERRIDE_INT, 1); 238 239 // Update ef records from carrier config 240 mCdnr.updateEfFromCarrierConfig(mConfig); 241 242 SIMRecords usim = Mockito.mock(SIMRecords.class); 243 doReturn(SPN_FROM_USIM).when(usim).getServiceProviderName(); 244 mCdnr.updateEfFromUsim(usim); 245 246 // long name empty 247 mSS.setOperatorName("", "short name", HOME_PLMN_NUMERIC); 248 249 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 250 251 assertThat(data.shouldShowPlmn()).isTrue(); 252 assertThat(data.getPlmn()).isEqualTo("short name"); 253 } 254 255 @Test testShouldShowPLMNNumeric_plmnNotInProvidedList_showPLMNNumeric()256 public void testShouldShowPLMNNumeric_plmnNotInProvidedList_showPLMNNumeric() { 257 // Carrier config source > sim record source 258 mConfig.putInt(CarrierConfigManager.KEY_SPN_DISPLAY_CONDITION_OVERRIDE_INT, 1); 259 260 // Update ef records from carrier config 261 mCdnr.updateEfFromCarrierConfig(mConfig); 262 263 SIMRecords usim = Mockito.mock(SIMRecords.class); 264 doReturn(SPN_FROM_USIM).when(usim).getServiceProviderName(); 265 mCdnr.updateEfFromUsim(usim); 266 267 // long name and short name empty 268 mSS.setOperatorName("", "", HOME_PLMN_NUMERIC); 269 270 CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData(); 271 272 assertThat(data.shouldShowPlmn()).isTrue(); 273 assertThat(data.getPlmn()).isEqualTo(HOME_PLMN_NUMERIC); 274 } 275 276 @Test testCarrierDisplayNameData_enforceNonNullDataSpn()277 public void testCarrierDisplayNameData_enforceNonNullDataSpn() { 278 try { 279 CarrierDisplayNameData cdnd = new CarrierDisplayNameData.Builder() 280 .setSpn("testSpn").build(); 281 fail("Expected IAE"); 282 } catch (IllegalArgumentException expected) { 283 } 284 } 285 } 286