diff options
Diffstat (limited to 'tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java')
-rw-r--r-- | tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java | 208 |
1 files changed, 193 insertions, 15 deletions
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java index f6ed2e24df..edfd6105ad 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java @@ -53,7 +53,9 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.anyVararg; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; @@ -72,7 +74,9 @@ import android.os.Handler; import android.os.ICancellationSignal; import android.os.Looper; import android.os.Message; +import android.os.PersistableBundle; import android.os.ResultReceiver; +import android.telephony.CarrierConfigManager; import android.telephony.Rlog; import android.telephony.satellite.ISatelliteDatagramCallback; import android.telephony.satellite.ISatelliteProvisionStateCallback; @@ -84,7 +88,9 @@ import android.telephony.satellite.SatelliteManager; import android.telephony.satellite.SatelliteManager.SatelliteException; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.util.Pair; +import com.android.internal.R; import com.android.internal.telephony.IIntegerConsumer; import com.android.internal.telephony.IVoidConsumer; import com.android.internal.telephony.Phone; @@ -92,6 +98,7 @@ import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats; import com.android.internal.telephony.satellite.metrics.ProvisionMetricsStats; import com.android.internal.telephony.satellite.metrics.SessionMetricsStats; +import com.android.internal.telephony.subscription.SubscriptionManagerService; import org.junit.After; import org.junit.Before; @@ -107,6 +114,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.Executor; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; @@ -114,11 +122,17 @@ import java.util.concurrent.TimeUnit; @TestableLooper.RunWithLooper public class SatelliteControllerTest extends TelephonyTest { private static final String TAG = "SatelliteControllerTest"; + + private static final int EVENT_DEVICE_CONFIG_CHANGED = 29; + private static final long TIMEOUT = 500; private static final int SUB_ID = 0; + private static final int SUB_ID1 = 1; private static final int MAX_BYTES_PER_OUT_GOING_DATAGRAM = 339; private static final String TEST_SATELLITE_TOKEN = "TEST_SATELLITE_TOKEN"; private static final String TEST_NEXT_SATELLITE_TOKEN = "TEST_NEXT_SATELLITE_TOKEN"; + private static final String[] EMPTY_SATELLITE_SERVICES_SUPPORTED_BY_PROVIDERS_STRING_ARRAY = {}; + private static final int[] ACTIVE_SUB_IDS = {SUB_ID}; private TestSatelliteController mSatelliteControllerUT; private TestSharedPreferences mSharedPreferences; @@ -130,6 +144,7 @@ public class SatelliteControllerTest extends TelephonyTest { @Mock private ControllerMetricsStats mMockControllerMetricsStats; @Mock private ProvisionMetricsStats mMockProvisionMetricsStats; @Mock private SessionMetricsStats mMockSessionMetricsStats; + @Mock private SubscriptionManagerService mMockSubscriptionManagerService; private List<Integer> mIIntegerConsumerResults = new ArrayList<>(); @Mock private ISatelliteTransmissionUpdateCallback mStartTransmissionUpdateCallback; @Mock private ISatelliteTransmissionUpdateCallback mStopTransmissionUpdateCallback; @@ -215,6 +230,7 @@ public class SatelliteControllerTest extends TelephonyTest { private ResultReceiver mIsSatelliteEnabledReceiver = new ResultReceiver(null) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { + logd("mIsSatelliteEnabledReceiver: resultCode=" + resultCode); mQueriedIsSatelliteEnabledResultCode = resultCode; if (resultCode == SATELLITE_ERROR_NONE) { if (resultData.containsKey(KEY_SATELLITE_ENABLED)) { @@ -224,7 +240,6 @@ public class SatelliteControllerTest extends TelephonyTest { mQueriedIsSatelliteEnabled = false; } } else { - logd("mIsSatelliteEnableReceiver: resultCode=" + resultCode); mQueriedIsSatelliteEnabled = false; } try { @@ -343,6 +358,9 @@ public class SatelliteControllerTest extends TelephonyTest { } }; + private List<Pair<Executor, CarrierConfigManager.CarrierConfigChangeListener>> + mCarrierConfigChangedListenerList = new ArrayList<>(); + private PersistableBundle mCarrierConfigBundle; @Before public void setUp() throws Exception { @@ -364,6 +382,25 @@ public class SatelliteControllerTest extends TelephonyTest { mMockProvisionMetricsStats); replaceInstance(SessionMetricsStats.class, "sInstance", null, mMockSessionMetricsStats); + replaceInstance(SubscriptionManagerService.class, "sInstance", null, + mMockSubscriptionManagerService); + + mContextFixture.putStringArrayResource( + R.array.config_satellite_services_supported_by_providers, + EMPTY_SATELLITE_SERVICES_SUPPORTED_BY_PROVIDERS_STRING_ARRAY); + doReturn(ACTIVE_SUB_IDS).when(mMockSubscriptionManagerService).getActiveSubIdList(true); + + mCarrierConfigBundle = mContextFixture.getCarrierConfigBundle(); + doReturn(mCarrierConfigBundle) + .when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyVararg()); + doAnswer(invocation -> { + Executor executor = invocation.getArgument(0); + CarrierConfigManager.CarrierConfigChangeListener listener = invocation.getArgument(1); + mCarrierConfigChangedListenerList.add(new Pair<>(executor, listener)); + return null; + }).when(mCarrierConfigManager).registerCarrierConfigChangeListener( + any(Executor.class), + any(CarrierConfigManager.CarrierConfigChangeListener.class)); mSharedPreferences = new TestSharedPreferences(); when(mContext.getSharedPreferences(anyString(), anyInt())).thenReturn(mSharedPreferences); @@ -586,18 +623,39 @@ public class SatelliteControllerTest extends TelephonyTest { processAllMessages(); verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE); + // Successfully enable satellite + mIIntegerConsumerResults.clear(); + mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false; + setUpResponseForRequestSatelliteEnabled(true, false, SATELLITE_ERROR_NONE); + mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, mIIntegerConsumer); + processAllMessages(); + assertTrue(waitForIIntegerConsumerResult(1)); + assertEquals(SATELLITE_ERROR_NONE, (long) mIIntegerConsumerResults.get(0)); + verifySatelliteEnabled(true, SATELLITE_ERROR_NONE); + assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled); + assertEquals( + SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue); + verify(mMockSatelliteSessionController, times(1)).onSatelliteEnabledStateChanged(eq(true)); + verify(mMockSatelliteSessionController, times(2)).setDemoMode(eq(false)); + verify(mMockDatagramController, times(2)).setDemoMode(eq(false)); + verify(mMockPointingAppController).startPointingUI(eq(false)); + verify(mMockControllerMetricsStats, times(1)).onSatelliteEnabled(); + verify(mMockControllerMetricsStats, times(1)).reportServiceEnablementSuccessCount(); + // Successfully disable satellite when radio is turned off. mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false; setUpResponseForRequestSatelliteEnabled(false, false, SATELLITE_ERROR_NONE); setRadioPower(false); processAllMessages(); + sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_OFF, null); + processAllMessages(); verifySatelliteEnabled(false, SATELLITE_ERROR_NONE); assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled); assertEquals( SATELLITE_MODE_ENABLED_FALSE, mSatelliteControllerUT.satelliteModeSettingValue); verify(mMockSatelliteSessionController, times(2)).onSatelliteEnabledStateChanged(eq(false)); - verify(mMockSatelliteSessionController, times(2)).setDemoMode(eq(false)); - verify(mMockDatagramController, times(2)).setDemoMode(eq(false)); + verify(mMockSatelliteSessionController, times(3)).setDemoMode(eq(false)); + verify(mMockDatagramController, times(3)).setDemoMode(eq(false)); verify(mMockControllerMetricsStats, times(1)).onSatelliteDisabled(); // Fail to enable satellite when radio is off. @@ -615,6 +673,7 @@ public class SatelliteControllerTest extends TelephonyTest { // Fail to enable satellite with an error response from modem when radio is on. mIIntegerConsumerResults.clear(); + clearInvocations(mMockPointingAppController); mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false; setUpResponseForRequestSatelliteEnabled(true, false, SATELLITE_INVALID_MODEM_STATE); mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, mIIntegerConsumer); @@ -638,14 +697,14 @@ public class SatelliteControllerTest extends TelephonyTest { assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled); assertEquals(SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue); verify(mMockPointingAppController).startPointingUI(eq(false)); - verify(mMockSatelliteSessionController, times(1)).onSatelliteEnabledStateChanged(eq(true)); - verify(mMockSatelliteSessionController, times(3)).setDemoMode(eq(false)); - verify(mMockDatagramController, times(3)).setDemoMode(eq(false)); - verify(mMockControllerMetricsStats, times(1)).onSatelliteEnabled(); - verify(mMockControllerMetricsStats, times(1)).reportServiceEnablementSuccessCount(); - verify(mMockSessionMetricsStats, times(2)).setInitializationResult(anyInt()); - verify(mMockSessionMetricsStats, times(2)).setRadioTechnology(anyInt()); - verify(mMockSessionMetricsStats, times(2)).reportSessionMetrics(); + verify(mMockSatelliteSessionController, times(2)).onSatelliteEnabledStateChanged(eq(true)); + verify(mMockSatelliteSessionController, times(4)).setDemoMode(eq(false)); + verify(mMockDatagramController, times(4)).setDemoMode(eq(false)); + verify(mMockControllerMetricsStats, times(2)).onSatelliteEnabled(); + verify(mMockControllerMetricsStats, times(2)).reportServiceEnablementSuccessCount(); + verify(mMockSessionMetricsStats, times(3)).setInitializationResult(anyInt()); + verify(mMockSessionMetricsStats, times(3)).setRadioTechnology(anyInt()); + verify(mMockSessionMetricsStats, times(3)).reportSessionMetrics(); // Successfully enable satellite when it is already enabled. mIIntegerConsumerResults.clear(); @@ -663,7 +722,7 @@ public class SatelliteControllerTest extends TelephonyTest { assertEquals(SATELLITE_INVALID_ARGUMENTS, (long) mIIntegerConsumerResults.get(0)); verifySatelliteEnabled(true, SATELLITE_ERROR_NONE); - // Disable satellite. + // Successfully disable satellite. mIIntegerConsumerResults.clear(); setUpResponseForRequestSatelliteEnabled(false, false, SATELLITE_ERROR_NONE); mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, false, false, mIIntegerConsumer); @@ -1412,13 +1471,128 @@ public class SatelliteControllerTest extends TelephonyTest { processAllMessages(); assertTrue(waitForIIntegerConsumerResult(1)); assertEquals(SATELLITE_INVALID_MODEM_STATE, (long) mIIntegerConsumerResults.get(0)); + } + @Test + public void testSupportedSatelliteServices() { + List<String> satellitePlmnList = mSatelliteControllerUT.getSatellitePlmnList(); + assertEquals(EMPTY_SATELLITE_SERVICES_SUPPORTED_BY_PROVIDERS_STRING_ARRAY.length, + satellitePlmnList.size()); + List<Integer> supportedSatelliteServices = + mSatelliteControllerUT.getSupportedSatelliteServices(SUB_ID, "00101"); + assertTrue(supportedSatelliteServices.isEmpty()); + + String[] satellitePlmnArray = {"00101", "00102"}; + String[] satelliteServicesSupportedByProviderStrArray = {"00101:1,2", "00102:2,3"}; + int[] expectedSupportedServices1 = {1, 2}; + int[] expectedSupportedServices2 = {2, 3}; + + mContextFixture.putStringArrayResource( + R.array.config_satellite_services_supported_by_providers, + satelliteServicesSupportedByProviderStrArray); + TestSatelliteController testSatelliteController = + new TestSatelliteController(mContext, Looper.myLooper()); + + satellitePlmnList = testSatelliteController.getSatellitePlmnList(); + assertTrue(Arrays.equals(satellitePlmnArray, satellitePlmnList.stream().toArray())); + + supportedSatelliteServices = + testSatelliteController.getSupportedSatelliteServices(SUB_ID, "00101"); + assertNotNull(supportedSatelliteServices); + assertTrue(Arrays.equals(expectedSupportedServices1, + supportedSatelliteServices.stream() + .mapToInt(Integer::intValue) + .toArray())); + + supportedSatelliteServices = + testSatelliteController.getSupportedSatelliteServices(SUB_ID, "00102"); + assertNotNull(supportedSatelliteServices); + assertTrue(Arrays.equals(expectedSupportedServices2, + supportedSatelliteServices.stream() + .mapToInt(Integer::intValue) + .toArray())); + + // Carrier config changed + int[] expectedSupportedServices3 = {2}; + int[] supportedServices = {1, 3}; + PersistableBundle carrierSupportedSatelliteServicesPerProvider = new PersistableBundle(); + carrierSupportedSatelliteServicesPerProvider.putIntArray( + "00102", expectedSupportedServices3); + carrierSupportedSatelliteServicesPerProvider.putIntArray("00103", supportedServices); + mCarrierConfigBundle.putPersistableBundle(CarrierConfigManager + .KEY_CARRIER_SUPPORTED_SATELLITE_SERVICES_PER_PROVIDER_BUNDLE, + carrierSupportedSatelliteServicesPerProvider); + for (Pair<Executor, CarrierConfigManager.CarrierConfigChangeListener> pair + : mCarrierConfigChangedListenerList) { + pair.first.execute(() -> pair.second.onCarrierConfigChanged( + /*slotIndex*/ 0, /*subId*/ SUB_ID, /*carrierId*/ 0, /*specificCarrierId*/ 0) + ); + } + processAllMessages(); + + supportedSatelliteServices = + testSatelliteController.getSupportedSatelliteServices(SUB_ID, "00101"); + assertNotNull(supportedSatelliteServices); + assertTrue(Arrays.equals(expectedSupportedServices1, + supportedSatelliteServices.stream() + .mapToInt(Integer::intValue) + .toArray())); + + supportedSatelliteServices = + testSatelliteController.getSupportedSatelliteServices(SUB_ID, "00102"); + assertNotNull(supportedSatelliteServices); + assertTrue(Arrays.equals(expectedSupportedServices3, + supportedSatelliteServices.stream() + .mapToInt(Integer::intValue) + .toArray())); + + supportedSatelliteServices = + mSatelliteControllerUT.getSupportedSatelliteServices(SUB_ID, "00103"); + assertTrue(supportedSatelliteServices.isEmpty()); + + // Subscriptions changed + int[] newActiveSubIds = {SUB_ID1}; + doReturn(newActiveSubIds).when(mMockSubscriptionManagerService).getActiveSubIdList(true); + for (Pair<Executor, CarrierConfigManager.CarrierConfigChangeListener> pair + : mCarrierConfigChangedListenerList) { + pair.first.execute(() -> pair.second.onCarrierConfigChanged( + /*slotIndex*/ 0, /*subId*/ SUB_ID, /*carrierId*/ 0, /*specificCarrierId*/ 0) + ); + } + processAllMessages(); + + supportedSatelliteServices = + testSatelliteController.getSupportedSatelliteServices(SUB_ID, "00101"); + assertTrue(supportedSatelliteServices.isEmpty()); + supportedSatelliteServices = + testSatelliteController.getSupportedSatelliteServices(SUB_ID, "00102"); + assertTrue(supportedSatelliteServices.isEmpty()); + + supportedSatelliteServices = + testSatelliteController.getSupportedSatelliteServices(SUB_ID1, "00101"); + assertNotNull(supportedSatelliteServices); + assertTrue(Arrays.equals(expectedSupportedServices1, + supportedSatelliteServices.stream() + .mapToInt(Integer::intValue) + .toArray())); + + supportedSatelliteServices = + testSatelliteController.getSupportedSatelliteServices(SUB_ID1, "00102"); + assertNotNull(supportedSatelliteServices); + assertTrue(Arrays.equals(expectedSupportedServices3, + supportedSatelliteServices.stream() + .mapToInt(Integer::intValue) + .toArray())); + + supportedSatelliteServices = + testSatelliteController.getSupportedSatelliteServices(SUB_ID1, "00103"); + assertTrue(supportedSatelliteServices.isEmpty()); } private void resetSatelliteControllerUTEnabledState() { logd("resetSatelliteControllerUTEnabledState"); setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RADIO_NOT_AVAILABLE); - doReturn(true).when(mMockSatelliteModemInterface) + doNothing().when(mMockSatelliteModemInterface) .setSatelliteServicePackageName(anyString()); mSatelliteControllerUT.setSatelliteServicePackageName("TestSatelliteService"); processAllMessages(); @@ -1438,7 +1612,7 @@ public class SatelliteControllerTest extends TelephonyTest { // Reset all cached states setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RADIO_NOT_AVAILABLE); - doReturn(true).when(mMockSatelliteModemInterface) + doNothing().when(mMockSatelliteModemInterface) .setSatelliteServicePackageName(anyString()); mSatelliteControllerUT.setSatelliteServicePackageName("TestSatelliteService"); processAllMessages(); @@ -1455,7 +1629,8 @@ public class SatelliteControllerTest extends TelephonyTest { private void resetSatelliteControllerUTToOffAndProvisionedState() { resetSatelliteControllerUTToSupportedAndProvisionedState(); - sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_OFF, null); + // Clean up pending resources and move satellite controller to OFF state. + sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_UNAVAILABLE, null); processAllMessages(); verifySatelliteEnabled(false, SATELLITE_ERROR_NONE); } @@ -1568,6 +1743,9 @@ public class SatelliteControllerTest extends TelephonyTest { SatelliteException exception = (error == SATELLITE_ERROR_NONE) ? null : new SatelliteException(error); doAnswer(invocation -> { + if (exception == null && !enabled) { + sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_OFF, null); + } Message message = (Message) invocation.getArguments()[2]; AsyncResult.forMessage(message, null, exception); message.sendToTarget(); |