Loading src/java/com/android/internal/telephony/PhoneInternalInterface.java +1 −0 Original line number Diff line number Diff line Loading @@ -208,6 +208,7 @@ public interface PhoneInternalInterface { static final String REASON_IWLAN_DATA_SERVICE_DIED = "iwlanDataServiceDied"; static final String REASON_VCN_REQUESTED_TEARDOWN = "vcnRequestedTeardown"; static final String REASON_DATA_UNTHROTTLED = "dataUnthrottled"; static final String REASON_TRAFFIC_DESCRIPTORS_UPDATED = "trafficDescriptorsUpdated"; // Reasons for Radio being powered off int RADIO_POWER_REASON_USER = 0; Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +10 −8 Original line number Diff line number Diff line Loading @@ -680,6 +680,8 @@ public class DataConnection extends StateMachine { */ public void updateTrafficDescriptors(DataCallResponse response) { mTrafficDescriptors = response.getTrafficDescriptors(); mDcController.updateTrafficDescriptorsForCid(response.getId(), response.getTrafficDescriptors()); } @VisibleForTesting Loading Loading @@ -1404,6 +1406,12 @@ public class DataConnection extends StateMachine { } } else if (cp.mApnContext.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE && mDcController.getActiveDcByCid(response.getId()) != null) { if (!mDcController.getTrafficDescriptorsForCid(response.getId()) .equals(response.getTrafficDescriptors())) { if (DBG) log("Updating traffic descriptors: " + response.getTrafficDescriptors()); mDcController.getActiveDcByCid(response.getId()).updateTrafficDescriptors(response); mDct.obtainMessage(DctConstants.EVENT_TRAFFIC_DESCRIPTORS_UPDATED).sendToTarget(); } if (DBG) log("DataConnection already exists for cid: " + response.getId()); result = SetupResult.ERROR_DUPLICATE_CID; result.mFailCause = DataFailCause.DUPLICATE_CID; Loading Loading @@ -1809,14 +1817,8 @@ public class DataConnection extends StateMachine { * @return True if this data connection supports enterprise use. */ private boolean isEnterpriseUse() { boolean enterpriseTrafficDescriptor = mTrafficDescriptors .stream() .anyMatch(td -> td.getOsAppId() != null && Arrays.equals(td.getOsAppId(), getEnterpriseOsAppId())); boolean enterpriseApnContext = mApnContexts.keySet() .stream() .anyMatch(ac -> ac.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE); return enterpriseTrafficDescriptor || enterpriseApnContext; return mApnContexts.keySet().stream().anyMatch( ac -> ac.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE); } /** Loading src/java/com/android/internal/telephony/dataconnection/DcController.java +49 −7 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.telephony.AccessNetworkConstants; import android.telephony.DataFailCause; import android.telephony.data.ApnSetting; import android.telephony.data.DataCallResponse; import android.telephony.data.TrafficDescriptor; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.DctConstants; Loading Loading @@ -86,6 +87,9 @@ public class DcController extends Handler { final ArrayList<DataConnection> mDcListAll = new ArrayList<>(); // @GuardedBy("mDcListAll") private final HashMap<Integer, DataConnection> mDcListActiveByCid = new HashMap<>(); // @GuardedBy("mTrafficDescriptorsByCid") private final HashMap<Integer, List<TrafficDescriptor>> mTrafficDescriptorsByCid = new HashMap<>(); /** * Aggregated physical link state from all data connections. This reflects the device's RRC Loading Loading @@ -138,6 +142,9 @@ public class DcController extends Handler { mDcListActiveByCid.remove(dc.mCid); mDcListAll.remove(dc); } synchronized (mTrafficDescriptorsByCid) { mTrafficDescriptorsByCid.remove(dc.mCid); } } public void addActiveDcByCid(DataConnection dc) { Loading @@ -147,6 +154,7 @@ public class DcController extends Handler { synchronized (mDcListAll) { mDcListActiveByCid.put(dc.mCid, dc); } updateTrafficDescriptorsForCid(dc.mCid, dc.getTrafficDescriptors()); } DataConnection getActiveDcByCid(int cid) { Loading @@ -162,6 +170,9 @@ public class DcController extends Handler { log("removeActiveDcByCid removedDc=null dc=" + dc); } } synchronized (mTrafficDescriptorsByCid) { mTrafficDescriptorsByCid.remove(dc.mCid); } } boolean isDefaultDataActive() { Loading @@ -172,6 +183,18 @@ public class DcController extends Handler { } } List<TrafficDescriptor> getTrafficDescriptorsForCid(int cid) { synchronized (mTrafficDescriptorsByCid) { return mTrafficDescriptorsByCid.get(cid); } } void updateTrafficDescriptorsForCid(int cid, List<TrafficDescriptor> tds) { synchronized (mTrafficDescriptorsByCid) { mTrafficDescriptorsByCid.put(cid, tds); } } @Override public void handleMessage(Message msg) { AsyncResult ar; Loading Loading @@ -207,19 +230,29 @@ public class DcController extends Handler { } // Create hashmap of cid to DataCallResponse HashMap<Integer, DataCallResponse> dataCallResponseListByCid = new HashMap<Integer, DataCallResponse>(); HashMap<Integer, DataCallResponse> dataCallResponseListByCid = new HashMap<>(); for (DataCallResponse dcs : dcsList) { dataCallResponseListByCid.put(dcs.getId(), dcs); } // Add a DC that is active but not in the // dcsList to the list of DC's to retry ArrayList<DataConnection> dcsToRetry = new ArrayList<DataConnection>(); // Add a DC that is active but not in the dcsList to the list of DC's to retry ArrayList<DataConnection> dcsToRetry = new ArrayList<>(); for (DataConnection dc : dcListActiveByCid.values()) { if (dataCallResponseListByCid.get(dc.mCid) == null) { DataCallResponse response = dataCallResponseListByCid.get(dc.mCid); if (response == null) { if (DBG) log("onDataStateChanged: add to retry dc=" + dc); dcsToRetry.add(dc); } else { List<TrafficDescriptor> oldTds = getTrafficDescriptorsForCid(dc.mCid); List<TrafficDescriptor> newTds = response.getTrafficDescriptors(); if (!oldTds.equals(newTds)) { if (DBG) { log("onDataStateChanged: add to retry due to TD changed dc=" + dc + ", oldTds=" + oldTds + ", newTds=" + newTds); } updateTrafficDescriptorsForCid(dc.mCid, newTds); dcsToRetry.add(dc); } } } if (DBG) log("onDataStateChanged: dcsToRetry=" + dcsToRetry); Loading Loading @@ -448,9 +481,15 @@ public class DcController extends Handler { @Override public String toString() { StringBuilder sb = new StringBuilder(); synchronized (mDcListAll) { return "mDcListAll=" + mDcListAll + " mDcListActiveByCid=" + mDcListActiveByCid; sb.append("mDcListAll=").append(mDcListAll) .append(" mDcListActiveByCid=").append(mDcListActiveByCid); } synchronized (mTrafficDescriptorsByCid) { sb.append("mTrafficDescriptorsByCid=").append(mTrafficDescriptorsByCid); } return sb.toString(); } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { Loading @@ -459,5 +498,8 @@ public class DcController extends Handler { pw.println(" mDcListAll=" + mDcListAll); pw.println(" mDcListActiveByCid=" + mDcListActiveByCid); } synchronized (mTrafficDescriptorsByCid) { pw.println(" mTrafficDescriptorsByCid=" + mTrafficDescriptorsByCid); } } } src/java/com/android/internal/telephony/dataconnection/DcTracker.java +13 −0 Original line number Diff line number Diff line Loading @@ -2591,6 +2591,16 @@ public class DcTracker extends Handler { } } private void onTrafficDescriptorsUpdated() { for (ApnContext apnContext : mPrioritySortedApnContexts) { if (apnContext.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE && apnContext.getApnSetting().getPermanentFailed()) { setupDataOnConnectableApn( apnContext, Phone.REASON_TRAFFIC_DESCRIPTORS_UPDATED, RetryFailures.ALWAYS); } } } private DataConnection checkForCompatibleDataConnection(ApnContext apnContext, ApnSetting nextApn) { int apnType = apnContext.getApnTypeBitmask(); Loading Loading @@ -4233,6 +4243,9 @@ public class DcTracker extends Handler { String apn = (String) ar.result; onApnUnthrottled(apn); break; case DctConstants.EVENT_TRAFFIC_DESCRIPTORS_UPDATED: onTrafficDescriptorsUpdated(); break; default: Rlog.e("DcTracker", "Unhandled event=" + msg); break; Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +26 −4 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ import java.util.function.Consumer; public class DataConnectionTest extends TelephonyTest { private static final int DEFAULT_DC_CID = 10; private static final ArrayList<TrafficDescriptor> DEFAULT_TD_LIST = new ArrayList<>(); @Mock DcTesterFailBringUpAll mDcTesterFailBringUpAll; Loading Loading @@ -209,7 +210,7 @@ public class DataConnectionTest extends TelephonyTest { } } private void setSuccessfulSetupDataResponse(int cid) { private void setSuccessfulSetupDataResponse(int cid, ArrayList<TrafficDescriptor> tds) { doAnswer(invocation -> { final Message msg = (Message) invocation.getArguments()[10]; Loading Loading @@ -237,7 +238,7 @@ public class DataConnectionTest extends TelephonyTest { .setMtuV6(1500) .setPduSessionId(1) .setQosBearerSessions(new ArrayList<>()) .setTrafficDescriptors(new ArrayList<>()) .setTrafficDescriptors(tds) .build(); msg.getData().putParcelable("data_call_response", response); msg.arg1 = DataServiceCallback.RESULT_SUCCESS; Loading Loading @@ -292,7 +293,7 @@ public class DataConnectionTest extends TelephonyTest { mDcp.mApnContext = mApnContext; setSuccessfulSetupDataResponse(DEFAULT_DC_CID); setSuccessfulSetupDataResponse(DEFAULT_DC_CID, DEFAULT_TD_LIST); doAnswer(invocation -> { final Message msg = (Message) invocation.getArguments()[2]; Loading Loading @@ -485,7 +486,7 @@ public class DataConnectionTest extends TelephonyTest { assertTrue(mDc.isInactive()); // Change the CID setSuccessfulSetupDataResponse(DEFAULT_DC_CID + 1); setSuccessfulSetupDataResponse(DEFAULT_DC_CID + 1, DEFAULT_TD_LIST); // Verify that ENTERPRISE was set up connectEvent(true); Loading @@ -493,6 +494,27 @@ public class DataConnectionTest extends TelephonyTest { NetworkCapabilities.NET_CAPABILITY_ENTERPRISE)); } @Test public void testConnectEventDuplicateContextIdsDifferentTDs() throws Exception { setUpDefaultData(DEFAULT_DC_CID); // Try to connect ENTERPRISE with the same CID as default but different TrafficDescriptors replaceInstance(ConnectionParams.class, "mApnContext", mCp, mEnterpriseApnContext); doReturn(mApn1).when(mEnterpriseApnContext).getApnSetting(); doReturn(ApnSetting.TYPE_ENTERPRISE_STRING).when(mEnterpriseApnContext).getApnType(); doReturn(ApnSetting.TYPE_ENTERPRISE).when(mEnterpriseApnContext).getApnTypeBitmask(); ArrayList<TrafficDescriptor> tdList = new ArrayList<>(); tdList.add(new TrafficDescriptor("dnn", DataConnection.getEnterpriseOsAppId())); setSuccessfulSetupDataResponse(DEFAULT_DC_CID, tdList); // Verify that ENTERPRISE wasn't set up but the TD list was updated connectEvent(false); assertTrue(mDc.isInactive()); ArgumentCaptor<DataCallResponse> captor = ArgumentCaptor.forClass(DataCallResponse.class); verify(mDefaultDc).updateTrafficDescriptors(captor.capture()); assertEquals(tdList, captor.getValue().getTrafficDescriptors()); } @Test public void testConnectEventNoDefaultData() throws Exception { assertFalse(mDefaultDc.isActive()); Loading Loading
src/java/com/android/internal/telephony/PhoneInternalInterface.java +1 −0 Original line number Diff line number Diff line Loading @@ -208,6 +208,7 @@ public interface PhoneInternalInterface { static final String REASON_IWLAN_DATA_SERVICE_DIED = "iwlanDataServiceDied"; static final String REASON_VCN_REQUESTED_TEARDOWN = "vcnRequestedTeardown"; static final String REASON_DATA_UNTHROTTLED = "dataUnthrottled"; static final String REASON_TRAFFIC_DESCRIPTORS_UPDATED = "trafficDescriptorsUpdated"; // Reasons for Radio being powered off int RADIO_POWER_REASON_USER = 0; Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +10 −8 Original line number Diff line number Diff line Loading @@ -680,6 +680,8 @@ public class DataConnection extends StateMachine { */ public void updateTrafficDescriptors(DataCallResponse response) { mTrafficDescriptors = response.getTrafficDescriptors(); mDcController.updateTrafficDescriptorsForCid(response.getId(), response.getTrafficDescriptors()); } @VisibleForTesting Loading Loading @@ -1404,6 +1406,12 @@ public class DataConnection extends StateMachine { } } else if (cp.mApnContext.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE && mDcController.getActiveDcByCid(response.getId()) != null) { if (!mDcController.getTrafficDescriptorsForCid(response.getId()) .equals(response.getTrafficDescriptors())) { if (DBG) log("Updating traffic descriptors: " + response.getTrafficDescriptors()); mDcController.getActiveDcByCid(response.getId()).updateTrafficDescriptors(response); mDct.obtainMessage(DctConstants.EVENT_TRAFFIC_DESCRIPTORS_UPDATED).sendToTarget(); } if (DBG) log("DataConnection already exists for cid: " + response.getId()); result = SetupResult.ERROR_DUPLICATE_CID; result.mFailCause = DataFailCause.DUPLICATE_CID; Loading Loading @@ -1809,14 +1817,8 @@ public class DataConnection extends StateMachine { * @return True if this data connection supports enterprise use. */ private boolean isEnterpriseUse() { boolean enterpriseTrafficDescriptor = mTrafficDescriptors .stream() .anyMatch(td -> td.getOsAppId() != null && Arrays.equals(td.getOsAppId(), getEnterpriseOsAppId())); boolean enterpriseApnContext = mApnContexts.keySet() .stream() .anyMatch(ac -> ac.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE); return enterpriseTrafficDescriptor || enterpriseApnContext; return mApnContexts.keySet().stream().anyMatch( ac -> ac.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE); } /** Loading
src/java/com/android/internal/telephony/dataconnection/DcController.java +49 −7 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.telephony.AccessNetworkConstants; import android.telephony.DataFailCause; import android.telephony.data.ApnSetting; import android.telephony.data.DataCallResponse; import android.telephony.data.TrafficDescriptor; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.DctConstants; Loading Loading @@ -86,6 +87,9 @@ public class DcController extends Handler { final ArrayList<DataConnection> mDcListAll = new ArrayList<>(); // @GuardedBy("mDcListAll") private final HashMap<Integer, DataConnection> mDcListActiveByCid = new HashMap<>(); // @GuardedBy("mTrafficDescriptorsByCid") private final HashMap<Integer, List<TrafficDescriptor>> mTrafficDescriptorsByCid = new HashMap<>(); /** * Aggregated physical link state from all data connections. This reflects the device's RRC Loading Loading @@ -138,6 +142,9 @@ public class DcController extends Handler { mDcListActiveByCid.remove(dc.mCid); mDcListAll.remove(dc); } synchronized (mTrafficDescriptorsByCid) { mTrafficDescriptorsByCid.remove(dc.mCid); } } public void addActiveDcByCid(DataConnection dc) { Loading @@ -147,6 +154,7 @@ public class DcController extends Handler { synchronized (mDcListAll) { mDcListActiveByCid.put(dc.mCid, dc); } updateTrafficDescriptorsForCid(dc.mCid, dc.getTrafficDescriptors()); } DataConnection getActiveDcByCid(int cid) { Loading @@ -162,6 +170,9 @@ public class DcController extends Handler { log("removeActiveDcByCid removedDc=null dc=" + dc); } } synchronized (mTrafficDescriptorsByCid) { mTrafficDescriptorsByCid.remove(dc.mCid); } } boolean isDefaultDataActive() { Loading @@ -172,6 +183,18 @@ public class DcController extends Handler { } } List<TrafficDescriptor> getTrafficDescriptorsForCid(int cid) { synchronized (mTrafficDescriptorsByCid) { return mTrafficDescriptorsByCid.get(cid); } } void updateTrafficDescriptorsForCid(int cid, List<TrafficDescriptor> tds) { synchronized (mTrafficDescriptorsByCid) { mTrafficDescriptorsByCid.put(cid, tds); } } @Override public void handleMessage(Message msg) { AsyncResult ar; Loading Loading @@ -207,19 +230,29 @@ public class DcController extends Handler { } // Create hashmap of cid to DataCallResponse HashMap<Integer, DataCallResponse> dataCallResponseListByCid = new HashMap<Integer, DataCallResponse>(); HashMap<Integer, DataCallResponse> dataCallResponseListByCid = new HashMap<>(); for (DataCallResponse dcs : dcsList) { dataCallResponseListByCid.put(dcs.getId(), dcs); } // Add a DC that is active but not in the // dcsList to the list of DC's to retry ArrayList<DataConnection> dcsToRetry = new ArrayList<DataConnection>(); // Add a DC that is active but not in the dcsList to the list of DC's to retry ArrayList<DataConnection> dcsToRetry = new ArrayList<>(); for (DataConnection dc : dcListActiveByCid.values()) { if (dataCallResponseListByCid.get(dc.mCid) == null) { DataCallResponse response = dataCallResponseListByCid.get(dc.mCid); if (response == null) { if (DBG) log("onDataStateChanged: add to retry dc=" + dc); dcsToRetry.add(dc); } else { List<TrafficDescriptor> oldTds = getTrafficDescriptorsForCid(dc.mCid); List<TrafficDescriptor> newTds = response.getTrafficDescriptors(); if (!oldTds.equals(newTds)) { if (DBG) { log("onDataStateChanged: add to retry due to TD changed dc=" + dc + ", oldTds=" + oldTds + ", newTds=" + newTds); } updateTrafficDescriptorsForCid(dc.mCid, newTds); dcsToRetry.add(dc); } } } if (DBG) log("onDataStateChanged: dcsToRetry=" + dcsToRetry); Loading Loading @@ -448,9 +481,15 @@ public class DcController extends Handler { @Override public String toString() { StringBuilder sb = new StringBuilder(); synchronized (mDcListAll) { return "mDcListAll=" + mDcListAll + " mDcListActiveByCid=" + mDcListActiveByCid; sb.append("mDcListAll=").append(mDcListAll) .append(" mDcListActiveByCid=").append(mDcListActiveByCid); } synchronized (mTrafficDescriptorsByCid) { sb.append("mTrafficDescriptorsByCid=").append(mTrafficDescriptorsByCid); } return sb.toString(); } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { Loading @@ -459,5 +498,8 @@ public class DcController extends Handler { pw.println(" mDcListAll=" + mDcListAll); pw.println(" mDcListActiveByCid=" + mDcListActiveByCid); } synchronized (mTrafficDescriptorsByCid) { pw.println(" mTrafficDescriptorsByCid=" + mTrafficDescriptorsByCid); } } }
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +13 −0 Original line number Diff line number Diff line Loading @@ -2591,6 +2591,16 @@ public class DcTracker extends Handler { } } private void onTrafficDescriptorsUpdated() { for (ApnContext apnContext : mPrioritySortedApnContexts) { if (apnContext.getApnTypeBitmask() == ApnSetting.TYPE_ENTERPRISE && apnContext.getApnSetting().getPermanentFailed()) { setupDataOnConnectableApn( apnContext, Phone.REASON_TRAFFIC_DESCRIPTORS_UPDATED, RetryFailures.ALWAYS); } } } private DataConnection checkForCompatibleDataConnection(ApnContext apnContext, ApnSetting nextApn) { int apnType = apnContext.getApnTypeBitmask(); Loading Loading @@ -4233,6 +4243,9 @@ public class DcTracker extends Handler { String apn = (String) ar.result; onApnUnthrottled(apn); break; case DctConstants.EVENT_TRAFFIC_DESCRIPTORS_UPDATED: onTrafficDescriptorsUpdated(); break; default: Rlog.e("DcTracker", "Unhandled event=" + msg); break; Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +26 −4 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ import java.util.function.Consumer; public class DataConnectionTest extends TelephonyTest { private static final int DEFAULT_DC_CID = 10; private static final ArrayList<TrafficDescriptor> DEFAULT_TD_LIST = new ArrayList<>(); @Mock DcTesterFailBringUpAll mDcTesterFailBringUpAll; Loading Loading @@ -209,7 +210,7 @@ public class DataConnectionTest extends TelephonyTest { } } private void setSuccessfulSetupDataResponse(int cid) { private void setSuccessfulSetupDataResponse(int cid, ArrayList<TrafficDescriptor> tds) { doAnswer(invocation -> { final Message msg = (Message) invocation.getArguments()[10]; Loading Loading @@ -237,7 +238,7 @@ public class DataConnectionTest extends TelephonyTest { .setMtuV6(1500) .setPduSessionId(1) .setQosBearerSessions(new ArrayList<>()) .setTrafficDescriptors(new ArrayList<>()) .setTrafficDescriptors(tds) .build(); msg.getData().putParcelable("data_call_response", response); msg.arg1 = DataServiceCallback.RESULT_SUCCESS; Loading Loading @@ -292,7 +293,7 @@ public class DataConnectionTest extends TelephonyTest { mDcp.mApnContext = mApnContext; setSuccessfulSetupDataResponse(DEFAULT_DC_CID); setSuccessfulSetupDataResponse(DEFAULT_DC_CID, DEFAULT_TD_LIST); doAnswer(invocation -> { final Message msg = (Message) invocation.getArguments()[2]; Loading Loading @@ -485,7 +486,7 @@ public class DataConnectionTest extends TelephonyTest { assertTrue(mDc.isInactive()); // Change the CID setSuccessfulSetupDataResponse(DEFAULT_DC_CID + 1); setSuccessfulSetupDataResponse(DEFAULT_DC_CID + 1, DEFAULT_TD_LIST); // Verify that ENTERPRISE was set up connectEvent(true); Loading @@ -493,6 +494,27 @@ public class DataConnectionTest extends TelephonyTest { NetworkCapabilities.NET_CAPABILITY_ENTERPRISE)); } @Test public void testConnectEventDuplicateContextIdsDifferentTDs() throws Exception { setUpDefaultData(DEFAULT_DC_CID); // Try to connect ENTERPRISE with the same CID as default but different TrafficDescriptors replaceInstance(ConnectionParams.class, "mApnContext", mCp, mEnterpriseApnContext); doReturn(mApn1).when(mEnterpriseApnContext).getApnSetting(); doReturn(ApnSetting.TYPE_ENTERPRISE_STRING).when(mEnterpriseApnContext).getApnType(); doReturn(ApnSetting.TYPE_ENTERPRISE).when(mEnterpriseApnContext).getApnTypeBitmask(); ArrayList<TrafficDescriptor> tdList = new ArrayList<>(); tdList.add(new TrafficDescriptor("dnn", DataConnection.getEnterpriseOsAppId())); setSuccessfulSetupDataResponse(DEFAULT_DC_CID, tdList); // Verify that ENTERPRISE wasn't set up but the TD list was updated connectEvent(false); assertTrue(mDc.isInactive()); ArgumentCaptor<DataCallResponse> captor = ArgumentCaptor.forClass(DataCallResponse.class); verify(mDefaultDc).updateTrafficDescriptors(captor.capture()); assertEquals(tdList, captor.getValue().getTrafficDescriptors()); } @Test public void testConnectEventNoDefaultData() throws Exception { assertFalse(mDefaultDc.isActive()); Loading