Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b74471c authored by Jack Yu's avatar Jack Yu
Browse files

Added unit tests

Added unit tests for SubscriptionDatabaseManager and
SubscriptionManagerService

Bug: 272989110
Test: atest SubscriptionDatabaseManagerTest
            SubscriptionManagerServiceTest
Change-Id: I8752aea9d1f792a5cbbbbd5d2ca7424f731c6320
parent f004827f
Loading
Loading
Loading
Loading
+6 −11
Original line number Diff line number Diff line
@@ -266,8 +266,12 @@ public class SubscriptionManagerService extends ISub.Stub {
    /**
     * Slot index/subscription map that automatically invalidate cache in
     * {@link SubscriptionManager}.
     *
     * @param <K> The type of the key.
     * @param <V> The type of the value.
     */
    private static class SubscriptionMap<K, V> extends ConcurrentHashMap<K, V> {
    @VisibleForTesting
    public static class SubscriptionMap<K, V> extends ConcurrentHashMap<K, V> {
        @Override
        public void clear() {
            super.clear();
@@ -2989,7 +2993,7 @@ public class SubscriptionManagerService extends ISub.Stub {
                        + columnName);
            }
        } catch (IllegalArgumentException e) {
            logv("getSubscriptionProperty: Invalid subId " + subId + ", columnName=" + columnName);
            loge("getSubscriptionProperty: Invalid subId " + subId + ", columnName=" + columnName);
            return null;
        } finally {
            Binder.restoreCallingIdentity(token);
@@ -3898,15 +3902,6 @@ public class SubscriptionManagerService extends ISub.Stub {
        Rlog.e(LOG_TAG, s);
    }

    /**
     * Log verbose messages.
     *
     * @param s debug messages.
     */
    private void logv(@NonNull String s) {
        if (VDBG) Rlog.v(LOG_TAG, s);
    }

    /**
     * Log debug messages and also log into the local log.
     *
+36 −0
Original line number Diff line number Diff line
@@ -63,6 +63,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -1673,4 +1675,38 @@ public class SubscriptionDatabaseManagerTest extends TelephonyTest {
        assertThat(mDatabaseManagerUT.getSubscriptionInfoInternal(3)).isNull();
        verify(mSubscriptionDatabaseManagerCallback).onSubscriptionChanged(eq(3));
    }

    @Test
    public void testCallback() {
        CountDownLatch latch = new CountDownLatch(2);
        Executor executor = Runnable::run;
        SubscriptionDatabaseManagerCallback callback =
                new SubscriptionDatabaseManagerCallback(executor) {
                    @Override
                    public void onInitialized() {
                        latch.countDown();
                        logd("onInitialized");
                    }

                    @Override
                    public void onSubscriptionChanged(int subId) {
                        latch.countDown();
                        logd("onSubscriptionChanged");
                    }
                };
        assertThat(callback.getExecutor()).isEqualTo(executor);
        mDatabaseManagerUT = new SubscriptionDatabaseManager(mContext, Looper.myLooper(), callback);
        processAllMessages();

        assertThat(latch.getCount()).isEqualTo(1);

        mDatabaseManagerUT.insertSubscriptionInfo(
                new SubscriptionInfoInternal.Builder()
                        .setId(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
                        .setIccId(FAKE_ICCID1)
                        .setSimSlotIndex(0)
                        .build());
        processAllMessages();
        assertThat(latch.getCount()).isEqualTo(0);
    }
}
+85 −10
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.euicc.EuiccController;
import com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.SubscriptionProvider;
import com.android.internal.telephony.subscription.SubscriptionManagerService.SubscriptionManagerServiceCallback;
import com.android.internal.telephony.subscription.SubscriptionManagerService.SubscriptionMap;
import com.android.internal.telephony.uicc.UiccSlot;

import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
@@ -120,11 +121,11 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -134,6 +135,8 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {

    private static final String CALLING_FEATURE = "calling_feature";

    private static final String GROUP_UUID = "6adbc864-691c-45dc-b698-8fc9a2176fae";

    private SubscriptionManagerService mSubscriptionManagerServiceUT;

    private final SubscriptionProvider mSubscriptionProvider = new SubscriptionProvider();
@@ -254,21 +257,17 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
            // Insertion is sync, but the onSubscriptionChanged callback is handled by the handler.
            processAllMessages();

            Class<?> SubscriptionMapClass = Class.forName(
                    "com.android.internal.telephony.subscription"
                            + ".SubscriptionManagerService$SubscriptionMap");
            Field field = SubscriptionManagerService.class.getDeclaredField("mSlotIndexToSubId");
            field.setAccessible(true);
            Object map = field.get(mSubscriptionManagerServiceUT);
            SubscriptionMap<Integer, Integer> map = (SubscriptionMap<Integer, Integer>)
                    field.get(mSubscriptionManagerServiceUT);
            Class[] cArgs = new Class[2];
            cArgs[0] = Object.class;
            cArgs[1] = Object.class;

            if (subInfo.getSimSlotIndex() >= 0) {
                // Change the slot -> subId mapping
                Method method = SubscriptionMapClass.getDeclaredMethod("put", cArgs);
                method.setAccessible(true);
                method.invoke(map, subInfo.getSimSlotIndex(), subId);
                map.put(subInfo.getSimSlotIndex(), subId);
            }

            mContextFixture.removeCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
@@ -1171,7 +1170,7 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO2);

        ParcelUuid newUuid = ParcelUuid.fromString("6adbc864-691c-45dc-b698-8fc9a2176fae");
        ParcelUuid newUuid = ParcelUuid.fromString(GROUP_UUID);
        String newOwner = "new owner";
        // Should fail without MODIFY_PHONE_STATE
        assertThrows(SecurityException.class, () -> mSubscriptionManagerServiceUT
@@ -2027,14 +2026,16 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
    @Test
    public void testOnUiccApplicationsEnabled() {
        CountDownLatch latch = new CountDownLatch(1);
        Executor executor = Runnable::run;
        SubscriptionManagerServiceCallback callback =
                new SubscriptionManagerServiceCallback(Runnable::run) {
                new SubscriptionManagerServiceCallback(executor) {
                    @Override
                    public void onUiccApplicationsEnabledChanged(int subId) {
                        latch.countDown();
                        logd("testOnSubscriptionChanged: onUiccApplicationsEnabledChanged");
                    }
                };
        assertThat(callback.getExecutor()).isEqualTo(executor);
        mSubscriptionManagerServiceUT.registerCallback(callback);
        int subId = insertSubscription(FAKE_SUBSCRIPTION_INFO1);

@@ -2042,6 +2043,13 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        mSubscriptionManagerServiceUT.setUiccApplicationsEnabled(false, subId);
        processAllMessages();
        assertThat(latch.getCount()).isEqualTo(0);

        mSubscriptionManagerServiceUT.unregisterCallback(callback);
        // without override. Nothing should happen.
        callback = new SubscriptionManagerServiceCallback(Runnable::run);
        mSubscriptionManagerServiceUT.registerCallback(callback);
        mSubscriptionManagerServiceUT.setUiccApplicationsEnabled(true, subId);
        processAllMessages();
    }

    @Test
@@ -2098,4 +2106,71 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        assertThat(mSubscriptionManagerServiceUT.getActiveSubscriptionInfoList(
                CALLING_PACKAGE, CALLING_FEATURE).get(0).getIccId()).isEqualTo(FAKE_MAC_ADDRESS2);
    }

    @Test
    public void testRemoveSubscriptionsFromGroup() {
        testAddSubscriptionsIntoGroup();

        mContextFixture.removeCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
        assertThrows(SecurityException.class, ()
                -> mSubscriptionManagerServiceUT.removeSubscriptionsFromGroup(new int[]{2},
                ParcelUuid.fromString(GROUP_UUID), CALLING_PACKAGE));

        mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);

        assertThrows(IllegalArgumentException.class, ()
                -> mSubscriptionManagerServiceUT.removeSubscriptionsFromGroup(new int[]{3},
                ParcelUuid.fromString(GROUP_UUID), CALLING_PACKAGE));

        assertThrows(IllegalArgumentException.class, ()
                -> mSubscriptionManagerServiceUT.removeSubscriptionsFromGroup(new int[]{2},
                ParcelUuid.fromString("55911c5b-83ed-419d-8f9b-4e027cf09305"), CALLING_PACKAGE));

        mSubscriptionManagerServiceUT.removeSubscriptionsFromGroup(new int[]{2},
                ParcelUuid.fromString(GROUP_UUID), CALLING_PACKAGE);

        SubscriptionInfoInternal subInfo = mSubscriptionManagerServiceUT
                .getSubscriptionInfoInternal(2);
        assertThat(subInfo.getGroupUuid()).isEmpty();
        assertThat(subInfo.getGroupOwner()).isEmpty();
    }

    @Test
    public void testUpdateSimStateForInactivePort() {
        testSetUiccApplicationsEnabled();

        mContextFixture.addCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
        mSubscriptionManagerServiceUT.updateSimStateForInactivePort(0);
        processAllMessages();

        SubscriptionInfoInternal subInfo = mSubscriptionManagerServiceUT
                .getSubscriptionInfoInternal(1);
        assertThat(subInfo.areUiccApplicationsEnabled()).isTrue();
    }

    @Test
    public void testRestoreAllSimSpecificSettingsFromBackup() {
        assertThrows(SecurityException.class, ()
                -> mSubscriptionManagerServiceUT.restoreAllSimSpecificSettingsFromBackup(
                        new byte[0]));
        mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);

        // TODO: Briefly copy the logic from TelephonyProvider to
        //  SubscriptionDatabaseManagerTest.SubscriptionProvider
        mSubscriptionManagerServiceUT.restoreAllSimSpecificSettingsFromBackup(
                new byte[0]);
    }

    @Test
    public void testSubscriptionMap() {
        SubscriptionMap<Integer, Integer> map = new SubscriptionMap<>();
        map.put(1, 1);
        assertThat(map.get(1)).isEqualTo(1);
        map.put(0, 2);
        assertThat(map.get(0)).isEqualTo(2);
        map.remove(1);
        assertThat(map.get(1)).isNull();
        map.clear();
        assertThat(map).hasSize(0);
    }
}