blob: d113dece4b37833af2aee27a7e47877ab4a9e67a [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony;
import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_ADDRESS;
import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_DNS;
import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_GATEWAY;
import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_IFNAME;
import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_PCSCF_ADDRESS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import android.annotation.NonNull;
import android.content.Intent;
import android.net.InetAddresses;
import android.net.LinkAddress;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.Looper;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PcoData;
import android.telephony.PhysicalChannelConfig;
import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import com.android.internal.telephony.dataconnection.DataConnection;
import com.android.internal.telephony.dataconnection.DcController;
import com.android.internal.util.IState;
import com.android.internal.util.StateMachine;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class NetworkTypeControllerTest extends TelephonyTest {
// private constants copied over from NetworkTypeController
private static final int EVENT_DATA_RAT_CHANGED = 2;
private static final int EVENT_NR_STATE_CHANGED = 3;
private static final int EVENT_NR_FREQUENCY_CHANGED = 4;
private static final int EVENT_PHYSICAL_LINK_STATE_CHANGED = 5;
private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED = 6;
private static final int EVENT_CARRIER_CONFIG_CHANGED = 7;
private static final int EVENT_PRIMARY_TIMER_EXPIRED = 8;
private static final int EVENT_SECONDARY_TIMER_EXPIRED = 9;
private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 10;
private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11;
private static final int EVENT_INITIALIZE = 12;
private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13;
private static final int EVENT_PCO_DATA_CHANGED = 14;
private static final int EVENT_BANDWIDTH_CHANGED = 15;
private static final int EVENT_DATA_CALL_LIST_CHANGED = 16;
private NetworkTypeController mNetworkTypeController;
private PersistableBundle mBundle;
@Mock
DataConnection mDataConnection;
@Mock
ApnSetting mApnSetting;
private IState getCurrentState() throws Exception {
Method method = StateMachine.class.getDeclaredMethod("getCurrentState");
method.setAccessible(true);
return (IState) method.invoke(mNetworkTypeController);
}
private void updateOverrideNetworkType() throws Exception {
Method method = NetworkTypeController.class.getDeclaredMethod("updateOverrideNetworkType");
method.setAccessible(true);
method.invoke(mNetworkTypeController);
}
private void broadcastCarrierConfigs() {
Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
intent.putExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, mPhone.getSubId());
intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, mPhone.getPhoneId());
mContext.sendBroadcast(intent);
processAllMessages();
}
private @NonNull DataCallResponse getDataCallResponse(int cid) {
return new DataCallResponse.Builder()
.setCause(0)
.setRetryDurationMillis(-1)
.setId(cid)
.setLinkStatus(DataCallResponse.LINK_STATUS_ACTIVE)
.setProtocolType(ApnSetting.PROTOCOL_IP)
.setInterfaceName(FAKE_IFNAME)
.setAddresses(Arrays.asList(
new LinkAddress(InetAddresses.parseNumericAddress(FAKE_ADDRESS), 0)))
.setDnsAddresses(Arrays.asList(InetAddresses.parseNumericAddress(FAKE_DNS)))
.setGatewayAddresses(Arrays.asList(InetAddresses.parseNumericAddress(FAKE_GATEWAY)))
.setPcscfAddresses(
Arrays.asList(InetAddresses.parseNumericAddress(FAKE_PCSCF_ADDRESS)))
.setMtuV4(1440)
.setMtuV6(1440)
.build();
}
@Before
public void setUp() throws Exception {
super.setUp(getClass().getSimpleName());
mBundle = mContextFixture.getCarrierConfigBundle();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING,
"connected_mmwave:5G_Plus,connected:5G,not_restricted_rrc_idle:5G,"
+ "not_restricted_rrc_con:5G");
broadcastCarrierConfigs();
replaceInstance(Handler.class, "mLooper", mDisplayInfoController, Looper.myLooper());
doReturn(RadioAccessFamily.getRafFromNetworkType(
TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA)).when(
mPhone).getCachedAllowedNetworkTypesBitmask();
doReturn(false).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
doReturn(new int[] {0}).when(mServiceState).getCellBandwidths();
mNetworkTypeController = new NetworkTypeController(mPhone, mDisplayInfoController);
processAllMessages();
}
@After
public void tearDown() throws Exception {
mNetworkTypeController.getHandler().removeCallbacksAndMessages(null);
mNetworkTypeController = null;
super.tearDown();
}
@Test
public void testUpdateOverrideNetworkTypeNrNsa() throws Exception {
// not NR
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
// NR NSA, restricted
doReturn(NetworkRegistrationInfo.NR_STATE_RESTRICTED).when(mServiceState).getNrState();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
// NR NSA, not restricted
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
// NR NSA, sub 6 frequency
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_LOW).when(mServiceState).getNrFrequencyRange();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
// NR NSA, millimeter wave frequency
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testUpdateOverrideNetworkTypeNrSa() throws Exception {
// not NR
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
// NR SA connected
mNetworkRegistrationInfo = new NetworkRegistrationInfo.Builder()
.setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_NR)
.setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
.build();
doReturn(mNetworkRegistrationInfo).when(mServiceState).getNetworkRegistrationInfo(
anyInt(), anyInt());
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testUpdateOverrideNetworkTypeNrSaMmwave() throws Exception {
// not NR
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
// NR SA connected and millimeter wave frequency
mNetworkRegistrationInfo = new NetworkRegistrationInfo.Builder()
.setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_NR)
.setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
.build();
doReturn(mNetworkRegistrationInfo).when(mServiceState).getNetworkRegistrationInfo(
anyInt(), anyInt());
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testUpdateOverrideNetworkTypeLte() throws Exception {
// normal LTE
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
// LTE CA at bandwidth threshold
doReturn(true).when(mServiceState).isUsingCarrierAggregation();
doReturn(new int[] {20000}).when(mServiceState).getCellBandwidths();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
// LTE CA above bandwidth threshold
doReturn(new int[] {20000, 1400}).when(mServiceState).getCellBandwidths();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA,
mNetworkTypeController.getOverrideNetworkType());
// LTE ADVANCED PRO
doReturn("test_patternShowAdvanced").when(mServiceState).getOperatorAlphaLongRaw();
mBundle.putString(CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING,
".*_patternShowAdvanced");
broadcastCarrierConfigs();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testUpdateOverrideNetworkType() throws Exception {
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_LOW).when(mServiceState).getNrFrequencyRange();
NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
.setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_HSPAP)
.setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
.build();
doReturn(nri).when(mServiceState).getNetworkRegistrationInfo(anyInt(), anyInt());
updateOverrideNetworkType();
// override shouldn't be NR if not on LTE despite NR_STATE_CONNECTED
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testTransitionToCurrentStateLegacy() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_HSPAP).when(mServiceState).getDataNetworkType();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("legacy", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateRestricted() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("restricted", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateIdle() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_NOT_ACTIVE, null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("not_restricted_rrc_idle", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateIdleSupportPhysicalChannelConfig1_6() throws Exception {
doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
mNetworkTypeController = new NetworkTypeController(mPhone, mDisplayInfoController);
processAllMessages();
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
setPhysicalLinkState(false);
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED);
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("not_restricted_rrc_idle", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateIdle_usingUserDataForRrcDetection() throws Exception {
mBundle.putBoolean(
CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL, true);
doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
mNetworkTypeController = new NetworkTypeController(mPhone, mDisplayInfoController);
broadcastCarrierConfigs();
processAllMessages();
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_NOT_ACTIVE, null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("not_restricted_rrc_idle", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateLteConnected() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_ACTIVE, null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("not_restricted_rrc_con", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateLteConnectedSupportPhysicalChannelConfig1_6()
throws Exception {
doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
mNetworkTypeController = new NetworkTypeController(mPhone, mDisplayInfoController);
broadcastCarrierConfigs();
processAllMessages();
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
setPhysicalLinkState(true);
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED);
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("not_restricted_rrc_con", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateLteConnected_usingUserDataForRrcDetection()
throws Exception {
mBundle.putBoolean(
CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL, true);
doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
mNetworkTypeController = new NetworkTypeController(mPhone, mDisplayInfoController);
broadcastCarrierConfigs();
processAllMessages();
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_ACTIVE, null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("not_restricted_rrc_con", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnected() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedMmwave() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected_mmwave", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedMmwaveWithAdditionalBandAndNoMmwave()
throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_HIGH).when(mServiceState).getNrFrequencyRange();
mBundle.putIntArray(CarrierConfigManager.KEY_ADDITIONAL_NR_ADVANCED_BANDS_INT_ARRAY,
new int[]{41});
PhysicalChannelConfig physicalChannelConfig = new PhysicalChannelConfig.Builder()
.setNetworkType(TelephonyManager.NETWORK_TYPE_NR)
.setBand(41)
.build();
List<PhysicalChannelConfig> lastPhysicalChannelConfigList = new ArrayList<>();
lastPhysicalChannelConfigList.add(physicalChannelConfig);
doReturn(lastPhysicalChannelConfigList).when(mSST).getPhysicalChannelConfigList();
broadcastCarrierConfigs();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected_mmwave", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedWithNoAdditionalBandAndNoMmwave()
throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_HIGH).when(mServiceState).getNrFrequencyRange();
mBundle.putIntArray(CarrierConfigManager.KEY_ADDITIONAL_NR_ADVANCED_BANDS_INT_ARRAY,
new int[]{41});
PhysicalChannelConfig physicalChannelConfig = new PhysicalChannelConfig.Builder()
.setNetworkType(TelephonyManager.NETWORK_TYPE_NR)
.setBand(2)
.build();
List<PhysicalChannelConfig> lastPhysicalChannelConfigList = new ArrayList<>();
lastPhysicalChannelConfigList.add(physicalChannelConfig);
doReturn(lastPhysicalChannelConfigList).when(mSST).getPhysicalChannelConfigList();
broadcastCarrierConfigs();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapable() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0);
broadcastCarrierConfigs();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected_mmwave", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedWithPcoAndNoNrAdvancedCapable()
throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
broadcastCarrierConfigs();
int cid = 1;
byte[] contents = new byte[]{0};
mNetworkTypeController.sendMessage(EVENT_DATA_CALL_LIST_CHANGED,
new AsyncResult(null, List.of(getDataCallResponse(cid)), null));
processAllMessages();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
broadcastCarrierConfigs();
processAllMessages();
mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED,
new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedWithPcoLength4AndNoNrAdvancedCapable()
throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
broadcastCarrierConfigs();
int cid = 1;
byte[] contents = new byte[]{31, 1, 84, 0};
mNetworkTypeController.sendMessage(EVENT_DATA_CALL_LIST_CHANGED,
new AsyncResult(null, List.of(getDataCallResponse(cid)), null));
processAllMessages();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
broadcastCarrierConfigs();
processAllMessages();
mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED,
new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedWithWrongPcoAndNoNrAdvancedCapable()
throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
broadcastCarrierConfigs();
int cid = 1;
byte[] contents = new byte[]{1};
mNetworkTypeController.sendMessage(EVENT_DATA_CALL_LIST_CHANGED,
new AsyncResult(null, List.of(getDataCallResponse(cid)), null));
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF00);
broadcastCarrierConfigs();
mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED,
new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapableAndPco()
throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
broadcastCarrierConfigs();
processAllMessages();
int cid = 1;
byte[] contents = new byte[]{1};
mNetworkTypeController.sendMessage(EVENT_DATA_CALL_LIST_CHANGED,
new AsyncResult(null, List.of(getDataCallResponse(cid)), null));
mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED,
new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected_mmwave", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapableAndPcoLength4()
throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
broadcastCarrierConfigs();
processAllMessages();
int cid = 1;
byte[] contents = new byte[]{31, 1, 84, 1};
mNetworkTypeController.sendMessage(EVENT_DATA_CALL_LIST_CHANGED,
new AsyncResult(null, List.of(getDataCallResponse(cid)), null));
mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED,
new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected_mmwave", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapableButCidNotMatched()
throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
int cid = 1;
byte[] contents = new byte[]{31, 1, 84, 1};
mNetworkTypeController.sendMessage(EVENT_DATA_CALL_LIST_CHANGED,
new AsyncResult(null, List.of(getDataCallResponse(2)), null));
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03);
broadcastCarrierConfigs();
mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED,
new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
@Test
public void testEventDataRatChanged() throws Exception {
testTransitionToCurrentStateLegacy();
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_DATA_RAT_CHANGED);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
@Test
public void testEventNrStateChanged() throws Exception {
testTransitionToCurrentStateNrConnected();
doReturn(NetworkRegistrationInfo.NR_STATE_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
processAllMessages();
assertEquals("restricted", getCurrentState().getName());
}
@Test
public void testEventNrFrequencyRangeChangedFromNrConnectedMmwaveToNrConnected()
throws Exception {
testTransitionToCurrentStateNrConnectedMmwave();
doReturn(ServiceState.FREQUENCY_RANGE_LOW).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
@Test
public void testEventNrFrequencyRangeChangedFromNrConnectedToNrConnectedMmwave()
throws Exception {
testTransitionToCurrentStateNrConnected();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
processAllMessages();
assertEquals("connected_mmwave", getCurrentState().getName());
}
@Test
public void testNrPhysicalChannelChangeFromNrConnectedMmwaveToLteConnected() throws Exception {
testTransitionToCurrentStateNrConnectedMmwave();
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_ACTIVE, null));
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
processAllMessages();
assertEquals("not_restricted_rrc_con", getCurrentState().getName());
}
@Test
public void testNrPhysicalChannelChange1_6FromNrConnectedMmwaveToLteConnected()
throws Exception {
doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
mNetworkTypeController = new NetworkTypeController(mPhone, mDisplayInfoController);
processAllMessages();
testTransitionToCurrentStateNrConnectedMmwave();
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
setPhysicalLinkState(true);
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED);
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
processAllMessages();
assertEquals("not_restricted_rrc_con", getCurrentState().getName());
}
@Test
public void testUsingUserDataForRrcDetection_FromNrConnectedMmwaveToLteConnected()
throws Exception {
mBundle.putBoolean(
CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL, true);
doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
mNetworkTypeController = new NetworkTypeController(mPhone, mDisplayInfoController);
broadcastCarrierConfigs();
processAllMessages();
testTransitionToCurrentStateNrConnectedMmwave();
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_ACTIVE, null));
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
processAllMessages();
assertEquals("not_restricted_rrc_con", getCurrentState().getName());
}
@Test
public void testEventPhysicalChannelChangeFromLteToLteCaInLegacyState() throws Exception {
testTransitionToCurrentStateLegacy();
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
updateOverrideNetworkType();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
doReturn(true).when(mServiceState).isUsingCarrierAggregation();
doReturn(new int[] {30000}).when(mServiceState).getCellBandwidths();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED);
processAllMessages();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testEventPhysicalChannelChangeFromLteToLteCaInLteConnectedState() throws Exception {
// Remove RRC idle/RRC connected from 5G override
mBundle = mContextFixture.getCarrierConfigBundle();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING,
"connected_mmwave:5G_Plus,connected:5G");
broadcastCarrierConfigs();
// Transition to LTE connected state
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_ACTIVE, null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("not_restricted_rrc_con", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
// LTE -> LTE+
doReturn(true).when(mServiceState).isUsingCarrierAggregation();
doReturn(new int[] {30000}).when(mServiceState).getCellBandwidths();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED);
processAllMessages();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testEventPhysicalChannelChangeFromLteToLteCaInIdleState() throws Exception {
// Remove RRC idle/RRC connected from 5G override
mBundle = mContextFixture.getCarrierConfigBundle();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING,
"connected_mmwave:5G_Plus,connected:5G");
broadcastCarrierConfigs();
// Transition to idle state
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_NOT_ACTIVE, null));
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("not_restricted_rrc_idle", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
// LTE -> LTE+
doReturn(true).when(mServiceState).isUsingCarrierAggregation();
doReturn(new int[] {30000}).when(mServiceState).getCellBandwidths();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED);
processAllMessages();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testEventPhysicalLinkStateChanged() throws Exception {
testTransitionToCurrentStateLteConnected();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_NOT_ACTIVE, null));
processAllMessages();
assertEquals("not_restricted_rrc_idle", getCurrentState().getName());
}
@Test
public void testEventPhysicalLinkStateChangedSupportPhysicalChannelConfig1_6()
throws Exception {
doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
mNetworkTypeController = new NetworkTypeController(mPhone, mDisplayInfoController);
processAllMessages();
testTransitionToCurrentStateLteConnectedSupportPhysicalChannelConfig1_6();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
setPhysicalLinkState(false);
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED);
processAllMessages();
assertEquals("not_restricted_rrc_idle", getCurrentState().getName());
}
@Test
public void testEventPhysicalLinkStateChanged_UsingUserDataForRrcDetection()
throws Exception {
mBundle.putBoolean(
CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL, true);
doReturn(true).when(mTelephonyManager).isRadioInterfaceCapabilitySupported(
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
mNetworkTypeController = new NetworkTypeController(mPhone, mDisplayInfoController);
broadcastCarrierConfigs();
processAllMessages();
testTransitionToCurrentStateLteConnected_usingUserDataForRrcDetection();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_LINK_STATE_CHANGED,
new AsyncResult(null, DcController.PHYSICAL_LINK_NOT_ACTIVE, null));
processAllMessages();
assertEquals("not_restricted_rrc_idle", getCurrentState().getName());
}
@Test
public void testEventPhysicalChannelConfigNotifChanged() throws Exception {
testTransitionToCurrentStateNrConnected();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
mNetworkTypeController.sendMessage(EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED,
new AsyncResult(null, false, null));
processAllMessages();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testEventRadioOffOrUnavailable() throws Exception {
testTransitionToCurrentStateNrConnected();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
doReturn(TelephonyManager.NETWORK_TYPE_UNKNOWN).when(mServiceState).getDataNetworkType();
mNetworkTypeController.sendMessage(EVENT_RADIO_OFF_OR_UNAVAILABLE);
processAllMessages();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testEventPreferredNetworkModeChanged() throws Exception {
testTransitionToCurrentStateNrConnected();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
// remove NR from preferred network types
doReturn(RadioAccessFamily.getRafFromNetworkType(
TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA)).when(
mPhone).getCachedAllowedNetworkTypesBitmask();
mNetworkTypeController.sendMessage(EVENT_PREFERRED_NETWORK_MODE_CHANGED);
processAllMessages();
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
}
@Test
public void testPrimaryTimerExpire() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
broadcastCarrierConfigs();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
// should trigger 10 second timer
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
processAllMessages();
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// timer expires
moveTimeForward(10 * 1000);
processAllMessages();
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
@Test
public void testPrimaryTimerReset() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
broadcastCarrierConfigs();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
// trigger 10 second timer after disconnecting from NR
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
processAllMessages();
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// reconnect to NR in the middle of the timer
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
// timer expires
moveTimeForward(10 * 1000);
processAllMessages();
// timer should not have gone off
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
@Test
public void testPrimaryTimerReset_theNetworkModeWithoutNr() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
broadcastCarrierConfigs();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
// remove NR from preferred network types
doReturn(RadioAccessFamily.getRafFromNetworkType(
TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA)).when(
mPhone).getCachedAllowedNetworkTypesBitmask();
// trigger 10 second timer after disconnecting from NR, and then it does the timer reset
// since the network mode without the NR capability.
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
processAllMessages();
// timer should be reset.
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
@Test
public void testPrimaryTimerExpireMmwave() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
broadcastCarrierConfigs();
assertEquals("connected_mmwave", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
// should trigger 10 second timer
doReturn(ServiceState.FREQUENCY_RANGE_LOW).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// timer expires
moveTimeForward(10 * 1000);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
@Test
public void testPrimaryTimerResetMmwave() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
broadcastCarrierConfigs();
assertEquals("connected_mmwave", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
// trigger 10 second timer after disconnecting from NR
doReturn(ServiceState.FREQUENCY_RANGE_LOW).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// reconnect to NR in the middle of the timer
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
// timer expires
moveTimeForward(10 * 1000);
processAllMessages();
// timer should not have gone off
assertEquals("connected_mmwave", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
@Test
public void testSecondaryTimerExpire() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_SECONDARY_GRACE_PERIOD_STRING,
"connected,any,30");
broadcastCarrierConfigs();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
// should trigger 10 second primary timer
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
processAllMessages();
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// primary timer expires
moveTimeForward(10 * 1000);
processAllMessages();
// should trigger 30 second secondary timer
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// secondary timer expires
moveTimeForward(30 * 1000);
processAllMessages();
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
@Test
public void testSecondaryTimerReset() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_SECONDARY_GRACE_PERIOD_STRING,
"connected,any,30");
broadcastCarrierConfigs();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
// should trigger 10 second primary timer
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
processAllMessages();
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// primary timer expires
moveTimeForward(10 * 1000);
processAllMessages();
// should trigger 30 second secondary timer
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// reconnect to NR in the middle of the timer
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
// secondary timer expires
moveTimeForward(30 * 1000);
processAllMessages();
// timer should not have gone off
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
@Test
public void testSecondaryTimerExpireMmwave() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_SECONDARY_GRACE_PERIOD_STRING,
"connected_mmwave,any,30");
broadcastCarrierConfigs();
assertEquals("connected_mmwave", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
// should trigger 10 second primary timer
doReturn(ServiceState.FREQUENCY_RANGE_LOW).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// primary timer expires
moveTimeForward(10 * 1000);
processAllMessages();
// should trigger 30 second secondary timer
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// secondary timer expires
moveTimeForward(30 * 1000);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
@Test
public void testSecondaryTimerResetMmwave() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_SECONDARY_GRACE_PERIOD_STRING,
"connected_mmwave,any,30");
broadcastCarrierConfigs();
assertEquals("connected_mmwave", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
// should trigger 10 second primary timer
doReturn(ServiceState.FREQUENCY_RANGE_LOW).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// primary timer expires
moveTimeForward(10 * 1000);
processAllMessages();
// should trigger 30 second secondary timer
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// reconnect to NR in the middle of the timer
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
// secondary timer expires
moveTimeForward(30 * 1000);
processAllMessages();
// timer should not have gone off
assertEquals("connected_mmwave", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
@Test
public void testNrTimerResetIn3g() throws Exception {
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
"connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_SECONDARY_GRACE_PERIOD_STRING,
"connected_mmwave,any,30");
broadcastCarrierConfigs();
assertEquals("connected_mmwave", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
// should trigger 10 second primary timer
doReturn(ServiceState.FREQUENCY_RANGE_LOW).when(mServiceState).getNrFrequencyRange();
mNetworkTypeController.sendMessage(EVENT_NR_FREQUENCY_CHANGED);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
mNetworkTypeController.getOverrideNetworkType());
assertTrue(mNetworkTypeController.is5GHysteresisActive());
// rat is UMTS, should stop timer
NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
.setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UMTS)
.setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
.build();
doReturn(nri).when(mServiceState).getNetworkRegistrationInfo(anyInt(), anyInt());
doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
mNetworkTypeController.sendMessage(EVENT_DATA_RAT_CHANGED);
processAllMessages();
assertEquals("legacy", getCurrentState().getName());
assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
mNetworkTypeController.getOverrideNetworkType());
assertFalse(mNetworkTypeController.is5GHysteresisActive());
}
private void setPhysicalLinkState(Boolean state) {
List<PhysicalChannelConfig> lastPhysicalChannelConfigList = new ArrayList<>();
// If PhysicalChannelConfigList is empty, PhysicalLinkState is DcController
// .PHYSICAL_LINK_NOT_ACTIVE
// If PhysicalChannelConfigList is not empty, PhysicalLinkState is DcController
// .PHYSICAL_LINK_ACTIVE
if (state) {
PhysicalChannelConfig physicalChannelConfig = new PhysicalChannelConfig.Builder()
.setNetworkType(TelephonyManager.NETWORK_TYPE_NR)
.setBand(41)
.build();
lastPhysicalChannelConfigList.add(physicalChannelConfig);
}
doReturn(lastPhysicalChannelConfigList).when(mSST).getPhysicalChannelConfigList();
}
@Test
public void testTransitionToCurrentStateNrConnectedWithLowBandwidth() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
doReturn(new int[] {19999}).when(mServiceState).getCellBandwidths();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_THRESHOLD_BANDWIDTH_KHZ_INT, 20000);
broadcastCarrierConfigs();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
@Test
public void testTransitionToCurrentStateNrConnectedWithHighBandwidth() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
doReturn(new int[] {20001}).when(mServiceState).getCellBandwidths();
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_THRESHOLD_BANDWIDTH_KHZ_INT, 20000);
broadcastCarrierConfigs();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected_mmwave", getCurrentState().getName());
}
@Test
public void testNrAdvancedDisabledWhileRoaming() throws Exception {
assertEquals("DefaultState", getCurrentState().getName());
doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
doReturn(true).when(mServiceState).getDataRoaming();
doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
mBundle.putBoolean(CarrierConfigManager.KEY_ENABLE_NR_ADVANCED_WHILE_ROAMING_BOOL, false);
broadcastCarrierConfigs();
mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected", getCurrentState().getName());
}
}