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

Commit eb1feb14 authored by Calvin Pan's avatar Calvin Pan Committed by Automerger Merge Worker
Browse files

Merge "Remove UNIQUE constraint in Eab common table" into sc-dev am: e93db406 am: 08b68a57

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/opt/net/ims/+/15284571

Change-Id: Ia7cc2c6d617dc3fee72ac40fc6729ba17a3a209f
parents 1ce60911 08b68a57
Loading
Loading
Loading
Loading
+42 −5
Original line number Diff line number Diff line
@@ -81,7 +81,7 @@ public class EabProvider extends ContentProvider {
    public static final String AUTHORITY = "eab";

    private static final String TAG = "EabProvider";
    private static final int DATABASE_VERSION = 2;
    private static final int DATABASE_VERSION = 3;

    public static final String EAB_CONTACT_TABLE_NAME = "eab_contact";
    public static final String EAB_COMMON_TABLE_NAME = "eab_common";
@@ -332,8 +332,6 @@ public class EabProvider extends ContentProvider {

        static {
            CONTACT_UNIQUE_FIELDS.add(ContactColumns.PHONE_NUMBER);

            COMMON_UNIQUE_FIELDS.add(EabCommonColumns.EAB_CONTACT_ID);
        }

        @VisibleForTesting
@@ -356,8 +354,7 @@ public class EabProvider extends ContentProvider {
                + EabCommonColumns.EAB_CONTACT_ID + " INTEGER DEFAULT -1, "
                + EabCommonColumns.MECHANISM + " INTEGER DEFAULT NULL, "
                + EabCommonColumns.REQUEST_RESULT + " INTEGER DEFAULT -1, "
                + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1, "
                + "UNIQUE (" + TextUtils.join(", ", COMMON_UNIQUE_FIELDS) + ")"
                + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1 "
                + ");";

        @VisibleForTesting
@@ -410,6 +407,46 @@ public class EabProvider extends ContentProvider {
                        + ContactColumns.CONTACT_ID + " INTEGER DEFAULT -1;");
                oldVersion = 2;
            }

            if (oldVersion < 3) {
                // Drop UNIQUE constraint in EAB_COMMON_TABLE, SQLite didn't support DROP
                // constraint, so drop the old one and migrate data to new one

                // Create temp table
                final String createTempTableCommand = "CREATE TABLE temp"
                        + " ("
                        + EabCommonColumns._ID + " INTEGER PRIMARY KEY, "
                        + EabCommonColumns.EAB_CONTACT_ID + " INTEGER DEFAULT -1, "
                        + EabCommonColumns.MECHANISM + " INTEGER DEFAULT NULL, "
                        + EabCommonColumns.REQUEST_RESULT + " INTEGER DEFAULT -1, "
                        + EabCommonColumns.SUBSCRIPTION_ID + " INTEGER DEFAULT -1 "
                        + ");";
                sqLiteDatabase.execSQL(createTempTableCommand);

                // Migrate data to temp table
                sqLiteDatabase.execSQL("INSERT INTO temp ("
                        + EabCommonColumns._ID + ", "
                        + EabCommonColumns.EAB_CONTACT_ID + ", "
                        + EabCommonColumns.MECHANISM + ", "
                        + EabCommonColumns.REQUEST_RESULT + ", "
                        + EabCommonColumns.SUBSCRIPTION_ID + ") "
                        + " SELECT "
                        + EabCommonColumns._ID + ", "
                        + EabCommonColumns.EAB_CONTACT_ID + ", "
                        + EabCommonColumns.MECHANISM + ", "
                        + EabCommonColumns.REQUEST_RESULT + ", "
                        + EabCommonColumns.SUBSCRIPTION_ID + " "
                        + " FROM "
                        + EAB_COMMON_TABLE_NAME
                        +";");

                // Drop old one
                sqLiteDatabase.execSQL("DROP TABLE " + EAB_COMMON_TABLE_NAME + ";");

                // Rename temp to eab_common
                sqLiteDatabase.execSQL("ALTER TABLE temp RENAME TO " + EAB_COMMON_TABLE_NAME + ";");
                oldVersion = 3;
            }
        }
    }

+44 −20
Original line number Diff line number Diff line
@@ -66,7 +66,8 @@ import java.util.concurrent.TimeUnit;
@RunWith(AndroidJUnit4.class)
public class EabControllerTest extends ImsTestBase {
    EabProviderTestable mEabProviderTestable = new EabProviderTestable();
    EabControllerImpl mEabController;
    EabControllerImpl mEabControllerSub1;
    EabControllerImpl mEabControllerSub2;
    PersistableBundle mBundle;
    ExecutorService mExecutor = Executors.newSingleThreadExecutor();

@@ -74,6 +75,7 @@ public class EabControllerTest extends ImsTestBase {
    EabControllerImpl.ExpirationTimeFactory mExpirationTimeFactory;

    private static final int TEST_SUB_ID = 1;
    private static final int TEST_SECOND_SUB_ID = 2;
    private static final String TEST_PHONE_NUMBER = "16661234567";
    private static final String TEST_SERVICE_STATUS = "status";
    private static final String TEST_SERVICE_SERVICE_ID = "serviceId";
@@ -94,9 +96,14 @@ public class EabControllerTest extends ImsTestBase {
        mockContentResolver.addProvider(EabProvider.AUTHORITY, mEabProviderTestable);

        insertContactInfoToDB();
        mEabController = new EabControllerImpl(
        mEabControllerSub1 = new EabControllerImpl(
                mContext, TEST_SUB_ID, null, Looper.getMainLooper());
        mEabController.setExpirationTimeFactory(mExpirationTimeFactory);
        mEabControllerSub1.setExpirationTimeFactory(mExpirationTimeFactory);

        mEabControllerSub2 = new EabControllerImpl(
                mContext, TEST_SECOND_SUB_ID, null, Looper.getMainLooper());
        mEabControllerSub2.setExpirationTimeFactory(mExpirationTimeFactory);

        doReturn(Instant.now().getEpochSecond()).when(mExpirationTimeFactory).getExpirationTime();

        mBundle = mContextFixture.getTestCarrierConfigBundle();
@@ -113,9 +120,9 @@ public class EabControllerTest extends ImsTestBase {
        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceCapability());

        mEabController.saveCapabilities(contactList);
        mEabControllerSub1.saveCapabilities(contactList);

        EabCapabilityResult result = mEabController.getAvailability(TEST_CONTACT_URI);
        EabCapabilityResult result = mEabControllerSub1.getAvailability(TEST_CONTACT_URI);
        Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL, result.getStatus());
        Assert.assertEquals(TEST_CONTACT_URI,
                result.getContactCapabilities().getContactUri());
@@ -127,14 +134,14 @@ public class EabControllerTest extends ImsTestBase {
        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceCapability());

        mEabController.saveCapabilities(contactList);
        mEabControllerSub1.saveCapabilities(contactList);

        List<Uri> contactUriList = new ArrayList<>();
        contactUriList.add(TEST_CONTACT_URI);
        Assert.assertEquals(1,
                mEabController.getCapabilities(contactUriList).size());
                mEabControllerSub1.getCapabilities(contactUriList).size());
        Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
                mEabController.getCapabilities(contactUriList).get(0).getStatus());
                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
    }

    @Test
@@ -145,14 +152,14 @@ public class EabControllerTest extends ImsTestBase {

        contactList.add(createPresenceCapability());

        mEabController.saveCapabilities(contactList);
        mEabControllerSub1.saveCapabilities(contactList);

        List<Uri> contactUriList = new ArrayList<>();
        contactUriList.add(TEST_CONTACT_URI);
        Assert.assertEquals(1,
                mEabController.getCapabilities(contactUriList).size());
                mEabControllerSub1.getCapabilities(contactUriList).size());
        Assert.assertEquals(EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
                mEabController.getCapabilities(contactUriList).get(0).getStatus());
                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
    }

    @Test
@@ -164,16 +171,16 @@ public class EabControllerTest extends ImsTestBase {
        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceNonRcsCapability());

        mEabController.saveCapabilities(contactList);
        mEabControllerSub1.saveCapabilities(contactList);

        List<Uri> contactUriList = new ArrayList<>();
        contactUriList.add(TEST_CONTACT_URI);

        // Verify result is not expired
        Assert.assertEquals(1,
                mEabController.getCapabilities(contactUriList).size());
                mEabControllerSub1.getCapabilities(contactUriList).size());
        Assert.assertEquals(EabCapabilityResult.EAB_QUERY_SUCCESSFUL,
                mEabController.getCapabilities(contactUriList).get(0).getStatus());
                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
    }

    @Test
@@ -187,15 +194,15 @@ public class EabControllerTest extends ImsTestBase {

        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceNonRcsCapability());
        mEabController.saveCapabilities(contactList);
        mEabControllerSub1.saveCapabilities(contactList);

        // Verify result is expired
        List<Uri> contactUriList = new ArrayList<>();
        contactUriList.add(TEST_CONTACT_URI);
        Assert.assertEquals(1,
                mEabController.getCapabilities(contactUriList).size());
                mEabControllerSub1.getCapabilities(contactUriList).size());
        Assert.assertEquals(EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
                mEabController.getCapabilities(contactUriList).get(0).getStatus());
                mEabControllerSub1.getCapabilities(contactUriList).get(0).getStatus());
    }

    @Test
@@ -209,7 +216,7 @@ public class EabControllerTest extends ImsTestBase {
        data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, -1);
        mContext.getContentResolver().insert(COMMON_URI, data);

        mExecutor.execute(mEabController.mCapabilityCleanupRunnable);
        mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
        mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);

        // Verify the entry that cannot map to presence/option table has been removed
@@ -242,7 +249,7 @@ public class EabControllerTest extends ImsTestBase {
                expiredDate.getTime().getTime() / 1000);
        mContext.getContentResolver().insert(PRESENCE_URI, data);

        mExecutor.execute(mEabController.mCapabilityCleanupRunnable);
        mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
        mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);

        // Verify the invalid data has been removed after save capabilities
@@ -275,7 +282,7 @@ public class EabControllerTest extends ImsTestBase {
                expiredDate.getTime().getTime() / 1000);
        mContext.getContentResolver().insert(OPTIONS_URI, data);

        mExecutor.execute(mEabController.mCapabilityCleanupRunnable);
        mExecutor.execute(mEabControllerSub1.mCapabilityCleanupRunnable);
        mExecutor.awaitTermination(TIME_OUT_IN_SEC, TimeUnit.SECONDS);

        // Verify the invalid data has been removed after save capabilities
@@ -289,6 +296,23 @@ public class EabControllerTest extends ImsTestBase {
        }
    }

    @Test
    @SmallTest
    public void testSaveCapabilityForDifferentSubId() {
        List<RcsContactUceCapability> contactList = new ArrayList<>();
        contactList.add(createPresenceCapability());

        mEabControllerSub1.saveCapabilities(contactList);
        mEabControllerSub2.saveCapabilities(contactList);

        List<Uri> contactUriList = new ArrayList<>();
        contactUriList.add(TEST_CONTACT_URI);
        Assert.assertEquals(1,
                mEabControllerSub1.getCapabilities(contactUriList).size());
        Assert.assertEquals(1,
                mEabControllerSub2.getCapabilities(contactUriList).size());
    }

    private RcsContactUceCapability createPresenceCapability() {
        RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder =
                new RcsContactPresenceTuple.ServiceCapabilities.Builder(TEST_AUDIO_CAPABLE,
+4 −2
Original line number Diff line number Diff line
@@ -117,17 +117,19 @@ public class EabProviderTest extends ImsTestBase {

    @Test
    @SmallTest
    public void testCommonIsUnique() {
    public void testCommonIsNotUnique() {
        ContentValues data = new ContentValues();
        data.put(EabProvider.EabCommonColumns.EAB_CONTACT_ID, 1);
        data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE);
        data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND);
        data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, 1);
        mContext.getContentResolver().insert(COMMON_URI, data);

        data = new ContentValues();
        data.put(EabProvider.EabCommonColumns.EAB_CONTACT_ID, 1);
        data.put(EabProvider.EabCommonColumns.MECHANISM, CAPABILITY_MECHANISM_PRESENCE);
        data.put(EabProvider.EabCommonColumns.REQUEST_RESULT, REQUEST_RESULT_FOUND);
        data.put(EabProvider.EabCommonColumns.SUBSCRIPTION_ID, 2);
        mContext.getContentResolver().insert(COMMON_URI, data);

        Cursor cursor = mContext.getContentResolver().query(COMMON_URI,
@@ -136,7 +138,7 @@ public class EabProviderTest extends ImsTestBase {
                null,
                null);

        assertEquals(1, cursor.getCount());
        assertEquals(2, cursor.getCount());
    }

    @Test