diff options
Diffstat (limited to 'tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java')
-rw-r--r-- | tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java | 704 |
1 files changed, 527 insertions, 177 deletions
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java index d96bac49b8..a2c972488f 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java @@ -115,6 +115,7 @@ import com.android.internal.telephony.data.DataEvaluation.DataDisallowedReason; import com.android.internal.telephony.data.DataNetworkController.HandoverRule; import com.android.internal.telephony.data.DataRetryManager.DataRetryManagerCallback; import com.android.internal.telephony.data.LinkBandwidthEstimator.LinkBandwidthEstimatorCallback; +import com.android.internal.telephony.flags.FeatureFlags; import com.android.internal.telephony.ims.ImsResolver; import com.android.internal.telephony.subscription.SubscriptionInfoInternal; @@ -149,6 +150,7 @@ public class DataNetworkControllerTest extends TelephonyTest { // Events private static final int EVENT_SIM_STATE_CHANGED = 9; private static final int EVENT_REEVALUATE_EXISTING_DATA_NETWORKS = 16; + private static final int EVENT_SERVICE_STATE_CHANGED = 17; private static final int EVENT_VOICE_CALL_ENDED = 18; private static final int EVENT_SUBSCRIPTION_OVERRIDE = 23; @@ -158,7 +160,7 @@ public class DataNetworkControllerTest extends TelephonyTest { private DataNetworkControllerCallback mMockedDataNetworkControllerCallback; private DataRetryManagerCallback mMockedDataRetryManagerCallback; private ImsResolver mMockedImsResolver; - + private DataStallRecoveryManager mMockedDataStallRecoveryManager; private ImsManager mMockedImsManager; private ImsMmTelManager mMockedImsMmTelManager; private ImsRcsManager mMockedImsRcsManager; @@ -179,6 +181,10 @@ public class DataNetworkControllerTest extends TelephonyTest { private AccessNetworksManagerCallback mAccessNetworksManagerCallback; private LinkBandwidthEstimatorCallback mLinkBandwidthEstimatorCallback; + private boolean mIsNonTerrestrialNetwork = false; + private ArrayList<Integer> mCarrierSupportedSatelliteServices = new ArrayList<>(); + private FeatureFlags mFeatureFlags; + private final DataProfile mGeneralPurposeDataProfile = new DataProfile.Builder() .setApnSetting(new ApnSetting.Builder() .setId(2163) @@ -204,6 +210,8 @@ public class DataNetworkControllerTest extends TelephonyTest { .setMaxConns(321) .setWaitTime(456) .setMaxConnsTime(789) + .setInfrastructureBitmask(ApnSetting.INFRASTRUCTURE_SATELLITE + | ApnSetting.INFRASTRUCTURE_CELLULAR) .build()) .setPreferred(false) .build(); @@ -385,6 +393,69 @@ public class DataNetworkControllerTest extends TelephonyTest { "PRIORITIZE_LATENCY", 1).getBytes())) .build(); + private final DataProfile mMmsOnWlanDataProfile = new DataProfile.Builder() + .setApnSetting(new ApnSetting.Builder() + .setEntryName("mms_wlan") + .setApnName("mms_wlan") + .setApnTypeBitmask(ApnSetting.TYPE_MMS) + .setCarrierEnabled(true) + .setNetworkTypeBitmask((int) TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN) + .build()) + .setPreferred(false) + .build(); + + private final DataProfile mNtnDataProfile = new DataProfile.Builder() + .setApnSetting(new ApnSetting.Builder() + .setEntryName("ntn") + .setApnName("ntn") + .setApnTypeBitmask(ApnSetting.TYPE_RCS) + .setCarrierEnabled(true) + .setInfrastructureBitmask(ApnSetting.INFRASTRUCTURE_SATELLITE) + .build()) + .setPreferred(false) + .build(); + + private final DataProfile mEsimBootstrapDataProfile = new DataProfile.Builder() + .setApnSetting(new ApnSetting.Builder() + .setEntryName("ESIM BOOTSTRAP") + .setApnName("ESIM BOOTSTRAP") + .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT) + .setNetworkTypeBitmask((int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE + | (int) TelephonyManager.NETWORK_TYPE_BITMASK_NR) + .setCarrierEnabled(true) + .setEsimBootstrapProvisioning(true) + .build()) + .setPreferred(false) + .build(); + + private final DataProfile mEsimBootstrapImsProfile = new DataProfile.Builder() + .setApnSetting(new ApnSetting.Builder() + .setEntryName("IMS BOOTSTRAP") + .setApnName("IMS BOOTSTRAP") + .setApnTypeBitmask(ApnSetting.TYPE_IMS) + .setNetworkTypeBitmask((int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE + | (int) TelephonyManager.NETWORK_TYPE_BITMASK_NR) + .setCarrierEnabled(true) + .setEsimBootstrapProvisioning(true) + .build()) + .setPreferred(false) + .build(); + + private final DataProfile mEsimBootstrapRcsInfraStructureProfile = + new DataProfile.Builder() + .setApnSetting(new ApnSetting.Builder() + .setEntryName("INFRASTRUCTURE BOOTSTRAP") + .setApnName("INFRASTRUCTURE BOOTSTRAP") + .setApnTypeBitmask(ApnSetting.TYPE_RCS) + .setNetworkTypeBitmask((int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE + | (int) TelephonyManager.NETWORK_TYPE_BITMASK_NR) + .setCarrierEnabled(true) + .setInfrastructureBitmask(2) + .setEsimBootstrapProvisioning(true) + .build()) + .setPreferred(false) + .build(); + /** Data call response map. The first key is the transport type, the second key is the cid. */ private final Map<Integer, Map<Integer, DataCallResponse>> mDataCallResponses = new HashMap<>(); @@ -583,7 +654,7 @@ public class DataNetworkControllerTest extends TelephonyTest { doReturn(ss).when(mSST).getServiceState(); doReturn(ss).when(mPhone).getServiceState(); - mDataNetworkControllerUT.obtainMessage(17/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget(); + mDataNetworkControllerUT.obtainMessage(EVENT_SERVICE_STATE_CHANGED).sendToTarget(); processAllMessages(); } @@ -609,6 +680,8 @@ public class DataNetworkControllerTest extends TelephonyTest { .setRegistrationState(dataRegState) .setDomain(NetworkRegistrationInfo.DOMAIN_PS) .setDataSpecificInfo(dsri) + .setIsNonTerrestrialNetwork(mIsNonTerrestrialNetwork) + .setAvailableServices(mCarrierSupportedSatelliteServices) .build()); ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() @@ -616,6 +689,8 @@ public class DataNetworkControllerTest extends TelephonyTest { .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) .setRegistrationState(iwlanRegState) .setDomain(NetworkRegistrationInfo.DOMAIN_PS) + .setIsNonTerrestrialNetwork(mIsNonTerrestrialNetwork) + .setAvailableServices(mCarrierSupportedSatelliteServices) .build()); ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() @@ -726,6 +801,12 @@ public class DataNetworkControllerTest extends TelephonyTest { .KEY_CAPABILITIES_EXEMPT_FROM_SINGLE_DC_CHECK_INT_ARRAY, new int[]{NetworkCapabilities.NET_CAPABILITY_IMS}); + mCarrierConfig.putLongArray(CarrierConfigManager.KEY_DATA_STALL_RECOVERY_TIMERS_LONG_ARRAY, + new long[] {100, 100, 100, 100}); + mCarrierConfig.putBooleanArray( + CarrierConfigManager.KEY_DATA_STALL_RECOVERY_SHOULD_SKIP_BOOL_ARRAY, + new boolean[] {false, false, true, false, false}); + mContextFixture.putResource(com.android.internal.R.string.config_bandwidthEstimateSource, "bandwidth_estimator"); @@ -747,9 +828,11 @@ public class DataNetworkControllerTest extends TelephonyTest { mMockedImsMmTelManager = Mockito.mock(ImsMmTelManager.class); mMockedImsRcsManager = Mockito.mock(ImsRcsManager.class); mMockedImsResolver = Mockito.mock(ImsResolver.class); + mMockedDataStallRecoveryManager = Mockito.mock(DataStallRecoveryManager.class); mMockedDataNetworkControllerCallback = Mockito.mock(DataNetworkControllerCallback.class); mMockedDataRetryManagerCallback = Mockito.mock(DataRetryManagerCallback.class); mMockSubInfo = Mockito.mock(SubscriptionInfo.class); + mFeatureFlags = Mockito.mock(FeatureFlags.class); when(mTelephonyComponentFactory.makeDataSettingsManager(any(Phone.class), any(DataNetworkController.class), any(Looper.class), any(DataSettingsManager.DataSettingsManagerCallback.class))).thenCallRealMethod(); @@ -831,7 +914,8 @@ public class DataNetworkControllerTest extends TelephonyTest { // to test, in this case, DataNetworkController. But since there are too many interactions // between DataNetworkController and its sub-modules, we intend to make those modules "real" // as well, except some modules below we replaced with mocks. - mDataNetworkControllerUT = new DataNetworkController(mPhone, Looper.myLooper()); + mDataNetworkControllerUT = new DataNetworkController(mPhone, Looper.myLooper(), + mFeatureFlags); // First two come from DataServiceManager and the third comes from DataConfigManager which // is what we want to capture and assign to mCarrierConfigChangeListener verify(mCarrierConfigManager, times(3)).registerCarrierConfigChangeListener(any(), @@ -858,6 +942,8 @@ public class DataNetworkControllerTest extends TelephonyTest { replaceInstance(DataNetworkController.class, "mAccessNetworksManager", mDataNetworkControllerUT, mAccessNetworksManager); replaceInstance(ImsResolver.class, "sInstance", null, mMockedImsResolver); + replaceInstance(DataNetworkController.class, "mDataStallRecoveryManager", + mDataNetworkControllerUT, mMockedDataStallRecoveryManager); ArgumentCaptor<AccessNetworksManagerCallback> callbackCaptor = ArgumentCaptor.forClass(AccessNetworksManagerCallback.class); @@ -873,7 +959,9 @@ public class DataNetworkControllerTest extends TelephonyTest { List<DataProfile> profiles = List.of(mGeneralPurposeDataProfile, mGeneralPurposeDataProfileAlternative, mImsCellularDataProfile, mImsIwlanDataProfile, mEmergencyDataProfile, mFotaDataProfile, - mTetheringDataProfile); + mTetheringDataProfile, mMmsOnWlanDataProfile, mLowLatencyDataProfile, + mNtnDataProfile, mEsimBootstrapDataProfile, + mEsimBootstrapImsProfile, mEsimBootstrapRcsInfraStructureProfile); doAnswer(invocation -> { DataProfile dp = (DataProfile) invocation.getArguments()[0]; @@ -904,23 +992,35 @@ public class DataNetworkControllerTest extends TelephonyTest { TelephonyNetworkRequest networkRequest = (TelephonyNetworkRequest) invocation.getArguments()[0]; int networkType = (int) invocation.getArguments()[1]; - boolean ignorePermanentFailure = (boolean) invocation.getArguments()[2]; + boolean isNtn = (boolean) invocation.getArguments()[2]; + boolean isEsimBootstrapProvisioning = (boolean) invocation.getArguments()[3]; + boolean ignorePermanentFailure = (boolean) invocation.getArguments()[4]; for (DataProfile dataProfile : profiles) { - if (dataProfile.canSatisfy(networkRequest.getCapabilities()) - && (dataProfile.getApnSetting().getNetworkTypeBitmask() == 0 - || (dataProfile.getApnSetting().getNetworkTypeBitmask() + ApnSetting apnSetting = dataProfile.getApnSetting(); + if (apnSetting != null + && dataProfile.canSatisfy(networkRequest.getCapabilities()) + && (apnSetting.getNetworkTypeBitmask() == 0 + || (apnSetting.getNetworkTypeBitmask() & ServiceState.getBitmaskForTech(networkType)) != 0) - && (ignorePermanentFailure || (dataProfile.getApnSetting() != null - && !dataProfile.getApnSetting().getPermanentFailed()))) { + && (isEsimBootstrapProvisioning + == apnSetting.isEsimBootstrapProvisioning()) + && ((isNtn && apnSetting.isForInfrastructure( + ApnSetting.INFRASTRUCTURE_SATELLITE)) + || (!isNtn && apnSetting.isForInfrastructure( + ApnSetting.INFRASTRUCTURE_CELLULAR))) + && (ignorePermanentFailure || !apnSetting.getPermanentFailed())) { return dataProfile; } } logd("Cannot find data profile to satisfy " + networkRequest + ", network type=" - + TelephonyManager.getNetworkTypeName(networkType)); + + TelephonyManager.getNetworkTypeName(networkType) + ", ignorePermanentFailure=" + + ignorePermanentFailure + ", isNtn=" + isNtn + "," + + "isEsimBootstrapProvisioning=" + isEsimBootstrapProvisioning); return null; }).when(mDataProfileManager).getDataProfileForNetworkRequest( - any(TelephonyNetworkRequest.class), anyInt(), anyBoolean()); + any(TelephonyNetworkRequest.class), anyInt(), anyBoolean(), anyBoolean(), + anyBoolean()); doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WWAN).when(mAccessNetworksManager) .getPreferredTransportByNetworkCapability(anyInt()); @@ -1090,7 +1190,7 @@ public class DataNetworkControllerTest extends TelephonyTest { } private void verifyInternetConnected() throws Exception { - verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkConnected(any()); + verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged(any()); verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_INTERNET); } @@ -1128,6 +1228,18 @@ public class DataNetworkControllerTest extends TelephonyTest { + dataNetworkList); } + private void verifyConnectedNetworkHasNoDataProfile(@NonNull DataProfile dataProfile) + throws Exception { + List<DataNetwork> dataNetworkList = getDataNetworks(); + for (DataNetwork dataNetwork : getDataNetworks()) { + if (dataNetwork.isConnected() && dataNetwork.getDataProfile().equals(dataProfile)) { + fail("network with " + dataProfile + " is connected. dataNetworkList=" + + dataNetworkList); + } + } + return; + } + private void verifyAllDataDisconnected() throws Exception { List<DataNetwork> dataNetworkList = getDataNetworks(); assertWithMessage("All data should be disconnected but it's not. " + dataNetworkList) @@ -1150,7 +1262,7 @@ public class DataNetworkControllerTest extends TelephonyTest { InetAddresses.parseNumericAddress(IPV4_ADDRESS), InetAddresses.parseNumericAddress(IPV6_ADDRESS)); - verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkConnected(any()); + verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged(any()); } @Test @@ -1168,7 +1280,7 @@ public class DataNetworkControllerTest extends TelephonyTest { InetAddresses.parseNumericAddress(IPV4_ADDRESS), InetAddresses.parseNumericAddress(IPV6_ADDRESS)); - verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkConnected(any()); + verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged(any()); // database updated/reloaded, causing data profile id change List<DataProfile> profiles = List.of(mDuplicatedGeneralPurposeDataProfile); @@ -1202,10 +1314,11 @@ public class DataNetworkControllerTest extends TelephonyTest { + TelephonyManager.getNetworkTypeName(networkType)); return null; }).when(mDataProfileManager).getDataProfileForNetworkRequest( - any(TelephonyNetworkRequest.class), anyInt(), anyBoolean()); + any(TelephonyNetworkRequest.class), anyInt(), anyBoolean(), anyBoolean(), + anyBoolean()); // verify the network still connects - verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkConnected(any()); + verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged(any()); // A NOT_VCN_MANAGED request cannot be satisfied by the existing network, but will adopt the // same data profile @@ -1216,7 +1329,7 @@ public class DataNetworkControllerTest extends TelephonyTest { processAllMessages(); // verify the network still connects - verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkConnected(any()); + verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged(any()); // verify we don't try to setup a separate network for the not_vcn_managed request dataNetworkList = getDataNetworks(); assertThat(dataNetworkList).hasSize(1); @@ -1247,7 +1360,7 @@ public class DataNetworkControllerTest extends TelephonyTest { createDataCallResponse(1, DataCallResponse.LINK_STATUS_ACTIVE, tdList)); doReturn(mEnterpriseDataProfile).when(mDataProfileManager) .getDataProfileForNetworkRequest(any(TelephonyNetworkRequest.class), anyInt(), - anyBoolean()); + anyBoolean(), anyBoolean(), anyBoolean()); NetworkCapabilities netCaps = new NetworkCapabilities(); netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_ENTERPRISE); @@ -1279,7 +1392,7 @@ public class DataNetworkControllerTest extends TelephonyTest { mDataNetworkControllerUT.addNetworkRequest(request); processAllMessages(); verify(mMockedDataNetworkControllerCallback).onAnyDataNetworkExistingChanged(eq(true)); - verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkConnected(any()); + verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged(any()); int countOfCallbacks = dataNetworkControllerCallbacks.size(); @@ -1302,7 +1415,8 @@ public class DataNetworkControllerTest extends TelephonyTest { processAllMessages(); verifyAllDataDisconnected(); verify(mMockedDataNetworkControllerCallback).onAnyDataNetworkExistingChanged(eq(false)); - verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkDisconnected(); + verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged( + eq(Collections.emptySet())); verify(mMockedDataNetworkControllerCallback).onPhysicalLinkStatusChanged( eq(DataCallResponse.LINK_STATUS_INACTIVE)); } @@ -1461,12 +1575,13 @@ public class DataNetworkControllerTest extends TelephonyTest { // Now RAT changes from UMTS to GSM doReturn(null).when(mDataProfileManager).getDataProfileForNetworkRequest( any(TelephonyNetworkRequest.class), eq(TelephonyManager.NETWORK_TYPE_GSM), - anyBoolean()); + anyBoolean(), anyBoolean(), anyBoolean()); serviceStateChanged(TelephonyManager.NETWORK_TYPE_GSM, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); verifyAllDataDisconnected(); verify(mMockedDataNetworkControllerCallback).onAnyDataNetworkExistingChanged(eq(false)); - verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkDisconnected(); + verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged( + eq(Collections.emptySet())); verify(mMockedDataNetworkControllerCallback).onPhysicalLinkStatusChanged( eq(DataCallResponse.LINK_STATUS_INACTIVE)); @@ -1474,14 +1589,14 @@ public class DataNetworkControllerTest extends TelephonyTest { // Now RAT changes from GSM to UMTS doReturn(null).when(mDataProfileManager).getDataProfileForNetworkRequest( any(TelephonyNetworkRequest.class), eq(TelephonyManager.NETWORK_TYPE_UMTS), - anyBoolean()); + anyBoolean(), anyBoolean(), anyBoolean()); serviceStateChanged(TelephonyManager.NETWORK_TYPE_UMTS, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); doReturn(mGeneralPurposeDataProfile).when(mDataProfileManager) .getDataProfileForNetworkRequest(any(TelephonyNetworkRequest.class), anyInt(), - anyBoolean()); + anyBoolean(), anyBoolean(), anyBoolean()); // Now RAT changes from UMTS to LTE serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, NetworkRegistrationInfo.REGISTRATION_STATE_HOME); @@ -1555,6 +1670,74 @@ public class DataNetworkControllerTest extends TelephonyTest { } @Test + public void testNonTerrestrialNetworkChangedWithoutDataSupport() throws Exception { + when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(true); + mIsNonTerrestrialNetwork = true; + // Data is not supported while using satellite + mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); + processAllMessages(); + + // Data with internet capability should not be allowed + // when the device is using non-terrestrial network + verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + + mIsNonTerrestrialNetwork = false; + mCarrierSupportedSatelliteServices.clear(); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + + // Verify data is restored. + verifyInternetConnected(); + } + + @Test + public void testNonTerrestrialNetworkWithDataSupport() throws Exception { + when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(true); + mIsNonTerrestrialNetwork = true; + // Data is supported while using satellite + mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_DATA); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); + processAllMessages(); + + // Verify data is connected. + verifyInternetConnected(); + + mIsNonTerrestrialNetwork = false; + mCarrierSupportedSatelliteServices.clear(); + } + + @Test + public void testNonTerrestrialNetworkWithFlagDisabled() throws Exception { + when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(false); + + mIsNonTerrestrialNetwork = true; + // Data is not supported while using satellite + mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); + processAllMessages(); + + // As feature is disabled, data is connected. + verifyInternetConnected(); + + mIsNonTerrestrialNetwork = false; + mCarrierSupportedSatelliteServices.clear(); + } + + + @Test public void testRoamingDataChanged() throws Exception { doReturn(true).when(mServiceState).getDataRoaming(); @@ -1578,7 +1761,6 @@ public class DataNetworkControllerTest extends TelephonyTest { // Verify data is restored. verifyInternetConnected(); - Mockito.clearInvocations(mMockedDataNetworkControllerCallback); // Roaming data disabled mDataNetworkControllerUT.getDataSettingsManager().setDataRoamingEnabled(false); @@ -1586,6 +1768,7 @@ public class DataNetworkControllerTest extends TelephonyTest { // Verify data is torn down. verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + Mockito.clearInvocations(mMockedDataNetworkControllerCallback); // Registration is back to HOME. serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, @@ -1744,9 +1927,13 @@ public class DataNetworkControllerTest extends TelephonyTest { @Test public void testIsDataEnabledOverriddenForApnDataDuringCall() throws Exception { - doReturn(1).when(mPhone).getSubId(); + // Assume phone2 is the default data phone + Phone phone2 = Mockito.mock(Phone.class); + replaceInstance(PhoneFactory.class, "sPhones", null, new Phone[]{mPhone, phone2}); doReturn(2).when(mSubscriptionManagerService).getDefaultDataSubId(); - // Data disabled + doReturn(1).when(mPhone).getSubId(); + + // Data disabled on nonDDS mDataNetworkControllerUT.getDataSettingsManager().setDataEnabled( TelephonyManager.DATA_ENABLED_REASON_USER, false, mContext.getOpPackageName()); @@ -1766,6 +1953,8 @@ public class DataNetworkControllerTest extends TelephonyTest { // Phone ringing doReturn(PhoneConstants.State.RINGING).when(mPhone).getState(); + // Data is user enabled on DDS + doReturn(true).when(phone2).isUserDataEnabled(); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); processAllMessages(); @@ -2352,8 +2541,7 @@ public class DataNetworkControllerTest extends TelephonyTest { new String[]{"source=EUTRAN, target=IWLAN, type=disallowed, capabilities=MMS|IMS", "source=IWLAN, target=EUTRAN, type=disallowed, capabilities=MMS"}); // Force data config manager to reload the carrier config. - mDataNetworkControllerUT.getDataConfigManager().obtainMessage( - 1/*EVENT_CARRIER_CONFIG_CHANGED*/).sendToTarget(); + carrierConfigChanged(); processAllMessages(); testSetupImsDataNetwork(); @@ -2394,6 +2582,36 @@ public class DataNetworkControllerTest extends TelephonyTest { } @Test + public void testHandoverDataNetworkNotAllowedByPolicyDelayDueToVoiceCall() throws Exception { + doReturn(true).when(mFeatureFlags).relaxHoTeardown(); + // Config delay IMS tear down enabled + mCarrierConfig.putBoolean(CarrierConfigManager.KEY_DELAY_IMS_TEAR_DOWN_UNTIL_CALL_END_BOOL, + true); + mCarrierConfig.putStringArray(CarrierConfigManager.KEY_IWLAN_HANDOVER_POLICY_STRING_ARRAY, + new String[]{"source=EUTRAN, target=IWLAN, type=disallowed, capabilities=MMS|IMS"}); + carrierConfigChanged(); + + testSetupImsDataNetwork(); + + // Ringing an active call, should delay handover tear down + doReturn(PhoneConstants.State.RINGING).when(mCT).getState(); + updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS, + AccessNetworkConstants.TRANSPORT_TYPE_WLAN); + + // Verify network is still connected due to active voice call + verify(mMockedWwanDataServiceManager, never()).deactivateDataCall(anyInt(), + eq(DataService.REQUEST_REASON_NORMAL), any(Message.class)); + + // Verify tear down after call ends + doReturn(PhoneConstants.State.IDLE).when(mCT).getState(); + mDataNetworkControllerUT.obtainMessage(EVENT_VOICE_CALL_ENDED).sendToTarget(); + processAllFutureMessages(); + + verify(mMockedWwanDataServiceManager).deactivateDataCall(anyInt(), + eq(DataService.REQUEST_REASON_NORMAL), any(Message.class)); + } + + @Test public void testHandoverDataNetworkNotAllowedByRoamingPolicy() throws Exception { mCarrierConfig.putStringArray(CarrierConfigManager.KEY_IWLAN_HANDOVER_POLICY_STRING_ARRAY, new String[]{"source=EUTRAN|NGRAN|IWLAN, target=EUTRAN|NGRAN|IWLAN, roaming=true, " @@ -3139,7 +3357,7 @@ public class DataNetworkControllerTest extends TelephonyTest { processAllMessages(); verify(mMockedDataNetworkControllerCallback) - .onInternetDataNetworkConnected(any()); + .onConnectedInternetDataNetworksChanged(any()); List<DataNetwork> dataNetworks = getDataNetworks(); assertThat(dataNetworks).hasSize(1); assertThat(dataNetworks.get(0).getNetworkCapabilities().hasCapability( @@ -3373,7 +3591,7 @@ public class DataNetworkControllerTest extends TelephonyTest { createDataCallResponse(1, DataCallResponse.LINK_STATUS_ACTIVE, tdList)); doReturn(mEnterpriseDataProfile).when(mDataProfileManager) .getDataProfileForNetworkRequest(any(TelephonyNetworkRequest.class), anyInt(), - anyBoolean()); + anyBoolean(), anyBoolean(), anyBoolean()); NetworkCapabilities netCaps = new NetworkCapabilities(); netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_ENTERPRISE); @@ -3417,8 +3635,12 @@ public class DataNetworkControllerTest extends TelephonyTest { @Test public void testNonVoPStoVoPSImsSetup() throws Exception { - // Even allow lingering when NoVops, should have no effect on NoVops -> Vops - mCarrierConfig.putBoolean(CarrierConfigManager.Ims.KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL, true); + doReturn(true).when(mFeatureFlags).allowMmtelInNonVops(); + mDataNetworkControllerUT.getDataSettingsManager().setDataRoamingEnabled(true); + // Config that allows non-vops bring up when Roaming + mCarrierConfig.putIntArray(CarrierConfigManager.Ims + .KEY_IMS_PDN_ENABLED_IN_NO_VOPS_SUPPORT_INT_ARRAY, new int[] + {CarrierConfigManager.Ims.NETWORK_TYPE_ROAMING}); carrierConfigChanged(); // VOPS not supported @@ -3438,6 +3660,30 @@ public class DataNetworkControllerTest extends TelephonyTest { processAllMessages(); verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS); + // Verify bring up in Home is not allowed. + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, dsri); + processAllMessages(); + verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS); + + // Verify bring up in Roaming is allowed. + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING, dsri); + processAllMessages(); + verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS, + NetworkCapabilities.NET_CAPABILITY_MMTEL); + + // Verify the roaming network survives network re-evaluation. + mDataNetworkControllerUT.obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS) + .sendToTarget(); + processAllMessages(); + + // Service state changed to Home, non-vops area is no longer allowed + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, dsri); + processAllMessages(); + verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS); + // VoPS supported dsri = new DataSpecificRegistrationInfo.Builder(8) .setNrAvailable(true) @@ -4013,8 +4259,6 @@ public class DataNetworkControllerTest extends TelephonyTest { @Test public void testHandoverDataNetworkNonVops() throws Exception { - ServiceState ss = new ServiceState(); - DataSpecificRegistrationInfo dsri = new DataSpecificRegistrationInfo.Builder(8) .setNrAvailable(true) .setEnDcAvailable(true) @@ -4022,36 +4266,13 @@ public class DataNetworkControllerTest extends TelephonyTest { LteVopsSupportInfo.LTE_STATUS_NOT_SUPPORTED, LteVopsSupportInfo.LTE_STATUS_NOT_SUPPORTED)) .build(); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .setDataSpecificInfo(dsri) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_CS) - .build()); - processServiceStateRegStateForTest(ss); - doReturn(ss).when(mSST).getServiceState(); - doReturn(ss).when(mPhone).getServiceState(); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, dsri); doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager) .getPreferredTransportByNetworkCapability(NetworkCapabilities.NET_CAPABILITY_IMS); - mDataNetworkControllerUT.obtainMessage(17/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget(); + mDataNetworkControllerUT.obtainMessage(EVENT_SERVICE_STATE_CHANGED).sendToTarget(); processAllMessages(); mDataNetworkControllerUT.addNetworkRequest( @@ -4080,8 +4301,6 @@ public class DataNetworkControllerTest extends TelephonyTest { mCarrierConfig.putBoolean(CarrierConfigManager.Ims.KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL, true); carrierConfigChanged(); - ServiceState ss = new ServiceState(); - DataSpecificRegistrationInfo dsri = new DataSpecificRegistrationInfo.Builder(8) .setNrAvailable(true) .setEnDcAvailable(true) @@ -4089,36 +4308,13 @@ public class DataNetworkControllerTest extends TelephonyTest { LteVopsSupportInfo.LTE_STATUS_NOT_SUPPORTED, LteVopsSupportInfo.LTE_STATUS_NOT_SUPPORTED)) .build(); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .setDataSpecificInfo(dsri) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_CS) - .build()); - processServiceStateRegStateForTest(ss); - doReturn(ss).when(mSST).getServiceState(); - doReturn(ss).when(mPhone).getServiceState(); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, dsri); doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager) .getPreferredTransportByNetworkCapability(NetworkCapabilities.NET_CAPABILITY_IMS); - mDataNetworkControllerUT.obtainMessage(17/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget(); + mDataNetworkControllerUT.obtainMessage(EVENT_SERVICE_STATE_CHANGED).sendToTarget(); processAllMessages(); mDataNetworkControllerUT.addNetworkRequest( @@ -4144,8 +4340,6 @@ public class DataNetworkControllerTest extends TelephonyTest { @Test public void testNonMmtelImsHandoverDataNetworkNonVops() throws Exception { - ServiceState ss = new ServiceState(); - DataSpecificRegistrationInfo dsri = new DataSpecificRegistrationInfo.Builder(8) .setNrAvailable(true) .setEnDcAvailable(true) @@ -4154,35 +4348,13 @@ public class DataNetworkControllerTest extends TelephonyTest { LteVopsSupportInfo.LTE_STATUS_NOT_SUPPORTED)) .build(); - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .setDataSpecificInfo(dsri) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_CS) - .build()); - processServiceStateRegStateForTest(ss); - doReturn(ss).when(mSST).getServiceState(); - doReturn(ss).when(mPhone).getServiceState(); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, dsri); doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager) .getPreferredTransportByNetworkCapability(NetworkCapabilities.NET_CAPABILITY_IMS); - mDataNetworkControllerUT.obtainMessage(17/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget(); + mDataNetworkControllerUT.obtainMessage(EVENT_SERVICE_STATE_CHANGED).sendToTarget(); processAllMessages(); // Bring up the IMS network that does not require MMTEL @@ -4190,7 +4362,7 @@ public class DataNetworkControllerTest extends TelephonyTest { createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS)); processAllMessages(); - // Even though the network request does not have MMTEL, but the network support it, so + // Even though the network request does not have MMTEL, the WLAN network support it, so // the network capabilities should still have MMTEL. verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS, NetworkCapabilities.NET_CAPABILITY_MMTEL); @@ -4204,9 +4376,9 @@ public class DataNetworkControllerTest extends TelephonyTest { any(DataProfile.class), anyBoolean(), anyBoolean(), anyInt(), any(), anyInt(), any(), any(), anyBoolean(), any(Message.class)); - // The IMS network should still have IMS and MMTEL. + // The IMS network should still have IMS, but MMTEL is removed. verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS); - verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_MMTEL); + verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL); } @Test @@ -4215,8 +4387,6 @@ public class DataNetworkControllerTest extends TelephonyTest { mCarrierConfig.putBoolean(CarrierConfigManager.Ims.KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL, true); carrierConfigChanged(); - ServiceState ss = new ServiceState(); - // VoPS network DataSpecificRegistrationInfo dsri = new DataSpecificRegistrationInfo.Builder(8) .setNrAvailable(true) @@ -4226,35 +4396,13 @@ public class DataNetworkControllerTest extends TelephonyTest { LteVopsSupportInfo.LTE_STATUS_SUPPORTED)) .build(); - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .setDataSpecificInfo(dsri) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_CS) - .build()); - processServiceStateRegStateForTest(ss); - doReturn(ss).when(mSST).getServiceState(); - doReturn(ss).when(mPhone).getServiceState(); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, dsri); doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WWAN).when(mAccessNetworksManager) .getPreferredTransportByNetworkCapability(NetworkCapabilities.NET_CAPABILITY_IMS); - mDataNetworkControllerUT.obtainMessage(17/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget(); + mDataNetworkControllerUT.obtainMessage(EVENT_SERVICE_STATE_CHANGED).sendToTarget(); processAllMessages(); // Bring up the IMS network that does require MMTEL @@ -4267,7 +4415,6 @@ public class DataNetworkControllerTest extends TelephonyTest { verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS, NetworkCapabilities.NET_CAPABILITY_MMTEL); - ss = new ServiceState(); // Non VoPS network dsri = new DataSpecificRegistrationInfo.Builder(8) .setNrAvailable(true) @@ -4277,32 +4424,10 @@ public class DataNetworkControllerTest extends TelephonyTest { LteVopsSupportInfo.LTE_STATUS_NOT_SUPPORTED)) .build(); - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .setDataSpecificInfo(dsri) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_PS) - .build()); - - ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder() - .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) - .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) - .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME) - .setDomain(NetworkRegistrationInfo.DOMAIN_CS) - .build()); - processServiceStateRegStateForTest(ss); - doReturn(ss).when(mSST).getServiceState(); - doReturn(ss).when(mPhone).getServiceState(); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME, dsri); - mDataNetworkControllerUT.obtainMessage(17/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget(); + mDataNetworkControllerUT.obtainMessage(EVENT_SERVICE_STATE_CHANGED).sendToTarget(); processAllMessages(); // The IMS network is alive due to KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL = true @@ -4386,7 +4511,8 @@ public class DataNetworkControllerTest extends TelephonyTest { processAllMessages(); verifyAllDataDisconnected(); verify(mMockedDataNetworkControllerCallback).onAnyDataNetworkExistingChanged(eq(false)); - verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkDisconnected(); + verify(mMockedDataNetworkControllerCallback).onConnectedInternetDataNetworksChanged( + eq(Collections.emptySet())); verify(mMockedDataNetworkControllerCallback).onPhysicalLinkStatusChanged( eq(DataCallResponse.LINK_STATUS_INACTIVE)); } @@ -4505,7 +4631,7 @@ public class DataNetworkControllerTest extends TelephonyTest { NetworkRegistrationInfo.REGISTRATION_STATE_HOME, NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING, null); doReturn(ss).when(mSST).getServiceState(); - mDataNetworkControllerUT.obtainMessage(17/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget(); + mDataNetworkControllerUT.obtainMessage(EVENT_SERVICE_STATE_CHANGED).sendToTarget(); mDataNetworkControllerUT.removeNetworkRequest(request); mDataNetworkControllerUT.addNetworkRequest(request); processAllMessages(); @@ -4527,7 +4653,7 @@ public class DataNetworkControllerTest extends TelephonyTest { createDataCallResponse(1, DataCallResponse.LINK_STATUS_ACTIVE, tdList)); doReturn(mEnterpriseDataProfile).when(mDataProfileManager) .getDataProfileForNetworkRequest(any(TelephonyNetworkRequest.class), anyInt(), - anyBoolean()); + anyBoolean(), anyBoolean(), anyBoolean()); mDataNetworkControllerUT.addNetworkRequest(new TelephonyNetworkRequest( new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_ENTERPRISE) @@ -4565,7 +4691,7 @@ public class DataNetworkControllerTest extends TelephonyTest { createDataCallResponse(2, DataCallResponse.LINK_STATUS_ACTIVE, tdList)); doReturn(mLowLatencyDataProfile).when(mDataProfileManager) .getDataProfileForNetworkRequest(any(TelephonyNetworkRequest.class), anyInt(), - anyBoolean()); + anyBoolean(), anyBoolean(), anyBoolean()); processAllFutureMessages(); dataNetworkList = getDataNetworks(); @@ -4580,4 +4706,228 @@ public class DataNetworkControllerTest extends TelephonyTest { assertThat(dataNetworkList.get(1).getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY)).isTrue(); } + + @Test + public void testAllowBringUpWithDifferentDataProfileForWlan() throws Exception { + // Mock MMS preferred on WLAN + doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager) + .getPreferredTransportByNetworkCapability(NetworkCapabilities.NET_CAPABILITY_MMS); + + // Setup a default cellular network that's capable of MMS + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS)); + processAllMessages(); + verifyConnectedNetworkHasDataProfile(mGeneralPurposeDataProfile); + + // Mock the designated MMS profile when WLAN is preferred + doReturn(mMmsOnWlanDataProfile).when(mDataProfileManager).getDataProfileForNetworkRequest( + any(TelephonyNetworkRequest.class), eq(TelephonyManager.NETWORK_TYPE_IWLAN), + anyBoolean(), anyBoolean(), anyBoolean()); + setSuccessfulSetupDataResponse(mMockedWlanDataServiceManager, + createDataCallResponse(2, DataCallResponse.LINK_STATUS_ACTIVE)); + + // Verify the designated MMS profile is used to satisfy MMS request + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_MMS)); + processAllMessages(); + verifyConnectedNetworkHasDataProfile(mMmsOnWlanDataProfile); + } + + @Test + public void testNonTerrestrialNetwork() throws Exception { + when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(true); + mIsNonTerrestrialNetwork = true; + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_RCS)); + processAllMessages(); + verifyConnectedNetworkHasDataProfile(mNtnDataProfile); + } + + @Test + public void testIsEsimBootStrapProvisioningActivatedWithFlagEnabledAndProvisioningClass() { + when(mFeatureFlags.esimBootstrapProvisioningFlag()).thenReturn(true); + doReturn(new SubscriptionInfoInternal.Builder().setId(1) + .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING).build()) + .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); + + assertThat(mDataNetworkControllerUT.isEsimBootStrapProvisioningActivated()).isTrue(); + } + + @Test + public void testIsEsimBootStrapProvisioningActivatedWithFlagEnabledAndNoProvisioningClass() { + when(mFeatureFlags.esimBootstrapProvisioningFlag()).thenReturn(true); + doReturn(new SubscriptionInfoInternal.Builder().setId(1) + .setProfileClass(SubscriptionManager.PROFILE_CLASS_UNSET).build()) + .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); + + assertThat(mDataNetworkControllerUT.isEsimBootStrapProvisioningActivated()).isFalse(); + } + + @Test + public void testIsEsimBootStrapProvisioningActivatedWithFlagDisabledAndNoProvisioningClass() { + when(mFeatureFlags.esimBootstrapProvisioningFlag()).thenReturn(false); + doReturn(new SubscriptionInfoInternal.Builder().setId(1) + .setProfileClass(SubscriptionManager.PROFILE_CLASS_UNSET).build()) + .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); + + assertThat(mDataNetworkControllerUT.isEsimBootStrapProvisioningActivated()).isFalse(); + } + + @Test + public void testIsEsimBootStrapProvisioningActivatedWithFlagDisabledAndProvisioningClass() { + when(mFeatureFlags.esimBootstrapProvisioningFlag()).thenReturn(false); + doReturn(new SubscriptionInfoInternal.Builder().setId(1) + .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING).build()) + .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); + + assertThat(mDataNetworkControllerUT.isEsimBootStrapProvisioningActivated()).isFalse(); + } + + @Test + public void testNetworkOnProvisioningProfileClass_WithFlagEnabled() throws Exception { + when(mFeatureFlags.esimBootstrapProvisioningFlag()).thenReturn(true); + doReturn(new SubscriptionInfoInternal.Builder().setId(1) + .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING).build()) + .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); + processAllMessages(); + verifyConnectedNetworkHasDataProfile(mEsimBootstrapDataProfile); + + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS, + NetworkCapabilities.NET_CAPABILITY_MMTEL)); + setSuccessfulSetupDataResponse(mMockedDataServiceManagers + .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), 2); + processAllMessages(); + verifyConnectedNetworkHasDataProfile(mEsimBootstrapImsProfile); + + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_RCS)); + processAllMessages(); + verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_RCS); + } + + @Test + public void testNetworkOnNonProvisioningProfileClass_WithFlagEnabled() throws Exception { + when(mFeatureFlags.esimBootstrapProvisioningFlag()).thenReturn(true); + doReturn(new SubscriptionInfoInternal.Builder().setId(1) + .setProfileClass(SubscriptionManager.PROFILE_CLASS_UNSET).build()) + .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET)); + processAllMessages(); + verifyConnectedNetworkHasNoDataProfile(mEsimBootstrapDataProfile); + + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS, + NetworkCapabilities.NET_CAPABILITY_MMTEL)); + setSuccessfulSetupDataResponse(mMockedDataServiceManagers + .get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN), 2); + processAllMessages(); + verifyConnectedNetworkHasNoDataProfile(mEsimBootstrapImsProfile); + } + + @Test + public void testNtnNetworkOnProvisioningProfileClass_WithFlagEnabled() throws Exception { + when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(true); + when(mFeatureFlags.esimBootstrapProvisioningFlag()).thenReturn(true); + doReturn(new SubscriptionInfoInternal.Builder().setId(1) + .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING).build()) + .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); + mIsNonTerrestrialNetwork = true; + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_RCS)); + processAllMessages(); + + assertThat(mDataNetworkControllerUT.isEsimBootStrapProvisioningActivated()).isTrue(); + verifyConnectedNetworkHasNoDataProfile(mNtnDataProfile); + verifyConnectedNetworkHasDataProfile(mEsimBootstrapRcsInfraStructureProfile); + } + + @Test + public void testNonNtnNetworkOnProvisioningProfileClass_WithFlagEnabled() throws Exception { + when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(true); + when(mFeatureFlags.esimBootstrapProvisioningFlag()).thenReturn(true); + doReturn(new SubscriptionInfoInternal.Builder().setId(1) + .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING).build()) + .when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt()); + serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE, + NetworkRegistrationInfo.REGISTRATION_STATE_HOME); + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_RCS)); + processAllMessages(); + + assertThat(mDataNetworkControllerUT.isEsimBootStrapProvisioningActivated()).isTrue(); + verifyConnectedNetworkHasNoDataProfile(mNtnDataProfile); + verifyConnectedNetworkHasNoDataProfile(mEsimBootstrapRcsInfraStructureProfile); + } + + @Test + public void testRequestNetworkValidationWithConnectedNetwork() throws Exception { + // IMS preferred on IWLAN. + doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager) + .getPreferredTransportByNetworkCapability( + eq(NetworkCapabilities.NET_CAPABILITY_IMS)); + + // Request IMS + mDataNetworkControllerUT.addNetworkRequest( + createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_IMS, + NetworkCapabilities.NET_CAPABILITY_MMTEL)); + setSuccessfulSetupDataResponse(mMockedDataServiceManagers + .get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN), 3); + processAllMessages(); + + // Make sure IMS on IWLAN. + verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_IMS); + DataNetwork dataNetwork = getDataNetworks().get(0); + assertThat(dataNetwork.getTransport()).isEqualTo( + AccessNetworkConstants.TRANSPORT_TYPE_WLAN); + + mDataNetworkControllerUT.requestNetworkValidation(NetworkCapabilities.NET_CAPABILITY_IMS, + mIntegerConsumer); + processAllMessages(); + assertThat(waitForIntegerConsumerResponse(1 /*numOfEvents*/)).isFalse(); + } + + @Test + public void testRequestNetworkValidationWithNoConnectedNetwork() + throws Exception { + // IMS preferred on IWLAN. + doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager) + .getPreferredTransportByNetworkCapability( + eq(NetworkCapabilities.NET_CAPABILITY_IMS)); + + // IMS On Wlan not connected + verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS); + + //Connected List is Empty + mDataNetworkControllerUT.requestNetworkValidation(NetworkCapabilities.NET_CAPABILITY_IMS, + mIntegerConsumer); + processAllMessages(); + assertThat(waitForIntegerConsumerResponse(1 /*numOfEvents*/)).isTrue(); + assertThat(mIntegerConsumerResult).isEqualTo(DataServiceCallback.RESULT_ERROR_INVALID_ARG); + } + + @Test + public void testRequestNetworkValidationWithInvalidArg() { + mDataNetworkControllerUT.requestNetworkValidation( + NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY, + mIntegerConsumer); + processAllMessages(); + assertThat(waitForIntegerConsumerResponse(1 /*numOfEvents*/)).isTrue(); + assertThat(mIntegerConsumerResult).isEqualTo(DataServiceCallback.RESULT_ERROR_INVALID_ARG); + } } |