Unit test code for onCallStates change crash issue
Bug: 379126049
Flag: com.android.internal.telephony.flags.pass_copied_call_state_list
Test: atest FrameworksTelephonyTests
Change-Id: I9b393ff97ba1bf7a7fb716fa9006323c7db48019
diff --git a/flags/calling.aconfig b/flags/calling.aconfig
index 906abfc..3bd994f 100644
--- a/flags/calling.aconfig
+++ b/flags/calling.aconfig
@@ -70,3 +70,14 @@
description: "Used to notify the emergency callback mode for call/SMS to other applications."
bug:"359064059"
}
+
+# OWNER=sewookseo TARGET=25Q2
+flag {
+ name: "pass_copied_call_state_list"
+ namespace: "telephony"
+ description: "To prevent passing the TelephonyRegistry's original instance to listeners in the same process"
+ bug:"379126049"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
\ No newline at end of file
diff --git a/tests/telephonytests/src/com/android/internal/telephony/TelephonyRegistryTest.java b/tests/telephonytests/src/com/android/internal/telephony/TelephonyRegistryTest.java
index 5dc4719..5a8cdd8 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/TelephonyRegistryTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/TelephonyRegistryTest.java
@@ -56,6 +56,7 @@
import android.telephony.AccessNetworkConstants;
import android.telephony.Annotation;
import android.telephony.BarringInfo;
+import android.telephony.CallState;
import android.telephony.CellIdentity;
import android.telephony.CellIdentityGsm;
import android.telephony.CellIdentityLte;
@@ -141,6 +142,7 @@
private List<Integer> mCarrierRoamingNtnAvailableServices;
private NtnSignalStrength mCarrierRoamingNtnSignalStrength;
private boolean mIsSatelliteEnabled;
+ private final List<List<CallState>> mCallStateList = new ArrayList<>();
// All events contribute to TelephonyRegistry#isPhoneStatePermissionRequired
private static final Set<Integer> READ_PHONE_STATE_EVENTS;
@@ -224,7 +226,8 @@
TelephonyCallback.EmergencyCallbackModeListener,
TelephonyCallback.CarrierRoamingNtnModeListener,
TelephonyCallback.SecurityAlgorithmsListener,
- TelephonyCallback.CellularIdentifierDisclosedListener {
+ TelephonyCallback.CellularIdentifierDisclosedListener,
+ TelephonyCallback.CallAttributesListener {
// This class isn't mockable to get invocation counts because the IBinder is null and
// crashes the TelephonyRegistry. Make a cheesy verify(times()) alternative.
public AtomicInteger invocationCount = new AtomicInteger(0);
@@ -374,6 +377,12 @@
public void onCellularIdentifierDisclosedChanged(CellularIdentifierDisclosure disclosure) {
invocationCount.incrementAndGet();
}
+
+ @Override
+ public void onCallStatesChanged(List<CallState> callStateList) {
+ invocationCount.incrementAndGet();
+ mCallStateList.add(callStateList);
+ }
}
public class MySatelliteStateChangeListener implements ISatelliteStateChangeListener {
@@ -448,6 +457,7 @@
mPhysicalChannelConfigs = null;
}
mCellLocation = null;
+ mCallStateList.clear();
super.tearDown();
}
@@ -1774,6 +1784,37 @@
}
@Test
+ @EnableFlags(Flags.FLAG_PASS_COPIED_CALL_STATE_LIST)
+ public void testNotifyPreciseCallStateChangedInProcess() {
+ doReturn(mMockSubInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(anyInt());
+ doReturn(0/*slotIndex*/).when(mMockSubInfo).getSimSlotIndex();
+
+ final int subId = 1;
+ int[] events = {TelephonyCallback.EVENT_CALL_ATTRIBUTES_CHANGED};
+
+ mTelephonyRegistry.listenWithEventList(false, false, subId, mContext.getOpPackageName(),
+ mContext.getAttributionTag(), mTelephonyCallback.callback, events, false);
+ processAllMessages();
+
+ int[] callState = {0, 5, 0};
+ String[] imsCallId = {"0", "1", "0"};
+ int[] imsServiceType = {0, 1, 0};
+ int[] imsCallType = {0, 1, 0};
+ int[] callState2 = {0, 1, 0};
+ mTelephonyRegistry.notifyPreciseCallState(
+ /*phoneId*/ 0, subId, callState, imsCallId, imsServiceType, imsCallType);
+ mTelephonyRegistry.notifyPreciseCallState(
+ /*phoneId*/ 0, subId, callState2, imsCallId, imsServiceType, imsCallType);
+ processAllMessages();
+
+ assertEquals(2, mCallStateList.size());
+ //make sure the call state is from the first report(callState).
+ assertEquals(5, mCallStateList.get(0).getFirst().getCallState());
+ //make sure the call state is from the second report(callState2).
+ assertEquals(1, mCallStateList.get(1).getFirst().getCallState());
+ }
+
+ @Test
@EnableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN)
public void testNotifyCarrierRoamingNtnSignalStrengthChanged() {
int subId = INVALID_SUBSCRIPTION_ID;