Added carrier_id support to the carrier_key table in CarrierInformation DB
Also Updated the related test cases

Bug: 191919168
Test: aTest verification passed
Change-Id: I8ad388bbb120c32ba874312bcc5c63cc1371348a
diff --git a/src/com/android/providers/telephony/CarrierDatabaseHelper.java b/src/com/android/providers/telephony/CarrierDatabaseHelper.java
index 0b97da1..3d2de29 100644
--- a/src/com/android/providers/telephony/CarrierDatabaseHelper.java
+++ b/src/com/android/providers/telephony/CarrierDatabaseHelper.java
@@ -28,14 +28,13 @@
 
 public class CarrierDatabaseHelper extends SQLiteOpenHelper {
     private static final String TAG = "CarrierDatabaseHelper";
-    private static final boolean DBG = true;
-
     private static final String DATABASE_NAME = "CarrierInformation.db";
     public static final String CARRIER_KEY_TABLE = "carrier_key";
-    private static final int DATABASE_VERSION = 2;
+    private static final int DATABASE_VERSION = 3;
 
     /**
      * CarrierDatabaseHelper carrier database helper class.
+     *
      * @param context of the user.
      */
     public CarrierDatabaseHelper(Context context) {
@@ -46,21 +45,20 @@
     public static final String KEY_TYPE = "key_type";
     public static final String MCC = "mcc";
     public static final String MNC = "mnc";
-    public static final String MVNO_TYPE = "mvno_type";
-    public static final String MVNO_MATCH_DATA = "mvno_match_data";
+    public static final String CARRIER_ID = "carrier_id";
     public static final String PUBLIC_KEY = "public_key";
     public static final String KEY_IDENTIFIER = "key_identifier";
     public static final String EXPIRATION_TIME = "expiration_time";
     public static final String LAST_MODIFIED = "last_modified";
 
     private static final List<String> CARRIERS_UNIQUE_FIELDS = new ArrayList<String>();
+    private static final String TEMPORARY_CARRIER_KEY_TABLE = CARRIER_KEY_TABLE + "_temp";
 
     static {
         CARRIERS_UNIQUE_FIELDS.add(MCC);
         CARRIERS_UNIQUE_FIELDS.add(MNC);
+        CARRIERS_UNIQUE_FIELDS.add(CARRIER_ID);
         CARRIERS_UNIQUE_FIELDS.add(KEY_TYPE);
-        CARRIERS_UNIQUE_FIELDS.add(MVNO_TYPE);
-        CARRIERS_UNIQUE_FIELDS.add(MVNO_MATCH_DATA);
     }
 
     public static String getStringForCarrierKeyTableCreation(String tableName) {
@@ -68,8 +66,7 @@
                 "(_id INTEGER PRIMARY KEY," +
                 MCC + " TEXT DEFAULT ''," +
                 MNC + " TEXT DEFAULT ''," +
-                MVNO_TYPE + " TEXT DEFAULT ''," +
-                MVNO_MATCH_DATA + " TEXT DEFAULT ''," +
+                CARRIER_ID + " INTEGER DEFAULT -1," +
                 KEY_TYPE + " TEXT DEFAULT ''," +
                 KEY_IDENTIFIER + " TEXT DEFAULT ''," +
                 PUBLIC_KEY + " BLOB DEFAULT ''," +
@@ -93,10 +90,43 @@
 
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-        Log.d(TAG, "dbh.onUpgrade:+ db=" + db + " oldV=" + oldVersion + " newV=" + newVersion);
+        Log.d(TAG, "dbh.onUpgrade:db=" + db + " oldV=" + oldVersion + " newV=" + newVersion);
         if (oldVersion < 2) {
             dropCarrierTable(db);
             createCarrierTable(db);
+            return;
+        }
+        if (oldVersion < 3) {
+            // Create new table and copy the contents from the existing table
+            renameCarrierTable(db);
+            createCarrierTable(db);
+            copyContents(db);
+            dropTemporaryTable(db);
+            db.execSQL("COMMIT");
+            return;
         }
     }
-}
+
+    // Renames the existing table as temporary table
+    private void renameCarrierTable(SQLiteDatabase db) {
+        db.execSQL(
+                "ALTER TABLE " + CARRIER_KEY_TABLE + " RENAME TO " + TEMPORARY_CARRIER_KEY_TABLE);
+    }
+
+    // Copies the content from temporary table to new table
+    private void copyContents(SQLiteDatabase db) {
+        String copyStr = new StringBuilder().append("INSERT INTO ").append(
+                CARRIER_KEY_TABLE).append(
+                " (MCC, MNC, KEY_TYPE, KEY_IDENTIFIER, PUBLIC_KEY, "
+                        + "EXPIRATION_TIME, LAST_MODIFIED)").append(" SELECT ").append(
+                "MCC, MNC, KEY_TYPE, KEY_IDENTIFIER, PUBLIC_KEY, "
+                        + "EXPIRATION_TIME, LAST_MODIFIED").append(" FROM ").append(
+                TEMPORARY_CARRIER_KEY_TABLE).toString();
+        db.execSQL(copyStr);
+    }
+
+    // Drops the temporary table
+    private void dropTemporaryTable(SQLiteDatabase db) {
+        db.execSQL("DROP TABLE IF EXISTS " + TEMPORARY_CARRIER_KEY_TABLE + ";");
+    }
+}
\ No newline at end of file
diff --git a/tests/src/com/android/providers/telephony/CarrierProviderTest.java b/tests/src/com/android/providers/telephony/CarrierProviderTest.java
index eb95fb6..d329002 100644
--- a/tests/src/com/android/providers/telephony/CarrierProviderTest.java
+++ b/tests/src/com/android/providers/telephony/CarrierProviderTest.java
@@ -22,14 +22,13 @@
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.database.SQLException;
+import android.telephony.TelephonyManager;
 import android.test.mock.MockContentResolver;
 import android.test.mock.MockContext;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.android.providers.telephony.CarrierProvider;
-
 import junit.framework.TestCase;
 
 import org.junit.Test;
@@ -60,11 +59,10 @@
     public static final String test_mcc = "MCC005";
     public static final String test_key1 = "PUBKEY1";
     public static final String test_key2 = "PUBKEY2";
-    public static final String test_mvno_type = "100";
-    public static final String test_mvno_match_data = "101";
     public static final String  test_key_identifier_data = "key_identifier1";
     public static final long  test_key_expiration = 1496795015L;
-
+    public static final int TEST_CARRIER_ID_1 = 1;
+    public static final int TEST_CARRIER_ID_2 = 2;
 
     /**
      * This is used to give the CarrierProviderTest a mocked context which takes a
@@ -147,8 +145,7 @@
         contentValues.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
         contentValues.put(CarrierDatabaseHelper.MCC, test_mcc);
         contentValues.put(CarrierDatabaseHelper.MNC, test_mnc);
-        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, test_mvno_type);
-        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, test_mvno_match_data);
+        contentValues.put(CarrierDatabaseHelper.CARRIER_ID, TEST_CARRIER_ID_1);
         contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, test_key_identifier_data);
         contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key1.getBytes());
         contentValues.put(CarrierDatabaseHelper.EXPIRATION_TIME, test_key_expiration);
@@ -183,8 +180,7 @@
         contentValues.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
         contentValues.put(CarrierDatabaseHelper.MCC, test_mcc);
         contentValues.put(CarrierDatabaseHelper.MNC, test_mnc);
-        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, test_mvno_type);
-        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, test_mvno_match_data);
+        contentValues.put(CarrierDatabaseHelper.CARRIER_ID, TEST_CARRIER_ID_1);
         contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, test_key_identifier_data);
         contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key1.getBytes());
         contentValues.put(CarrierDatabaseHelper.EXPIRATION_TIME, test_key_expiration);
@@ -199,8 +195,9 @@
             ContentValues updatedValues = new ContentValues();
             updatedValues.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key2);
             mContentResolver.update(CarrierProvider.CONTENT_URI, updatedValues,
-                    "mcc=? and mnc=? and key_type=?", new String[] { test_mcc, test_mnc,
-                            String.valueOf(test_type) });
+                    "mcc=? and mnc=? and carrier_id=? and key_type=?",
+                    new String[]{test_mcc, test_mnc, Integer.toString(TEST_CARRIER_ID_1),
+                            String.valueOf(test_type)});
         } catch (Exception e) {
             Log.d(TAG, "Error updating values:" + e);
         }
@@ -208,8 +205,9 @@
         try {
             String[] columns ={CarrierDatabaseHelper.PUBLIC_KEY};
             Cursor findEntry = mContentResolver.query(CarrierProvider.CONTENT_URI, columns,
-                    "mcc=? and mnc=? and key_type=?",
-                    new String[] { test_mcc, test_mnc, String.valueOf(test_type) }, null);
+                    "mcc=? and mnc=? and carrier_id=? and key_type=?",
+                    new String[]{test_mcc, test_mnc, Integer.toString(TEST_CARRIER_ID_1),
+                            String.valueOf(test_type)}, null);
             findEntry.moveToFirst();
             key = findEntry.getString(0);
         } catch (Exception e) {
@@ -229,8 +227,7 @@
         contentValues.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
         contentValues.put(CarrierDatabaseHelper.MCC, test_mcc);
         contentValues.put(CarrierDatabaseHelper.MNC, test_mnc);
-        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, test_mvno_type);
-        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, test_mvno_match_data);
+        contentValues.put(CarrierDatabaseHelper.CARRIER_ID, TEST_CARRIER_ID_1);
         contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, test_key_identifier_data);
         contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key1.getBytes());
 
@@ -238,8 +235,7 @@
         contentValuesNew.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
         contentValuesNew.put(CarrierDatabaseHelper.MCC, test_mcc);
         contentValuesNew.put(CarrierDatabaseHelper.MNC, test_mnc2);
-        contentValuesNew.put(CarrierDatabaseHelper.MVNO_TYPE, test_mvno_type);
-        contentValuesNew.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, test_mvno_match_data);
+        contentValues.put(CarrierDatabaseHelper.CARRIER_ID, TEST_CARRIER_ID_1);
         contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, test_key_identifier_data);
         contentValuesNew.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key2.getBytes());
 
@@ -265,6 +261,97 @@
     }
 
     /**
+     * Test inserting cert with same MCC and MNC but with diff carrier ID
+     */
+    @Test
+    @SmallTest
+    public void testMnoandMvnoCertificates() {
+        int count = -1;
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
+        contentValues.put(CarrierDatabaseHelper.MCC, test_mcc);
+        contentValues.put(CarrierDatabaseHelper.MNC, test_mnc);
+        contentValues.put(CarrierDatabaseHelper.CARRIER_ID, TEST_CARRIER_ID_1);
+        contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, test_key_identifier_data);
+        contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key1.getBytes());
+
+        ContentValues contentValuesNew = new ContentValues();
+        contentValuesNew.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
+        contentValuesNew.put(CarrierDatabaseHelper.MCC, test_mcc);
+        contentValuesNew.put(CarrierDatabaseHelper.MNC, test_mnc);
+        contentValuesNew.put(CarrierDatabaseHelper.CARRIER_ID, TEST_CARRIER_ID_2);
+        contentValuesNew.put(CarrierDatabaseHelper.KEY_IDENTIFIER, test_key_identifier_data);
+        contentValuesNew.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key1.getBytes());
+
+        try {
+            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValues);
+            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValuesNew);
+        } catch (Exception e) {
+            System.out.println("Error inserting certificates:: " + e);
+        }
+
+        try {
+            Cursor countCursor = mContentResolver.query(CarrierProvider.CONTENT_URI,
+                    new String[]{"count(*) AS count"},
+                    null,
+                    null,
+                    null);
+            countCursor.moveToFirst();
+            count = countCursor.getInt(0);
+        } catch (Exception e) {
+            Log.d(TAG, "Exception in getting count:" + e);
+        }
+        assertEquals(2, count);
+    }
+
+    /**
+     * once upgrade to version 3, carrierId = -1
+     * After upgrade, it triggers for new download with correct carrierId
+     * This test case will test writing the new entry, even old entry for same
+     * operator is already existed
+     */
+    @Test
+    @SmallTest
+    public void testOldAndNewDBEntries() {
+        int count = -1;
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
+        contentValues.put(CarrierDatabaseHelper.MCC, test_mcc);
+        contentValues.put(CarrierDatabaseHelper.MNC, test_mnc);
+        contentValues.put(CarrierDatabaseHelper.CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);
+        contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, test_key_identifier_data);
+        contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key1.getBytes());
+
+        ContentValues contentValuesNew = new ContentValues();
+        contentValuesNew.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
+        contentValuesNew.put(CarrierDatabaseHelper.MCC, test_mcc);
+        contentValuesNew.put(CarrierDatabaseHelper.MNC, test_mnc);
+        contentValuesNew.put(CarrierDatabaseHelper.CARRIER_ID, TEST_CARRIER_ID_2);
+        contentValuesNew.put(CarrierDatabaseHelper.KEY_IDENTIFIER, test_key_identifier_data);
+        contentValuesNew.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key1.getBytes());
+
+        try {
+            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValues);
+            mContentResolver.insert(CarrierProvider.CONTENT_URI, contentValuesNew);
+        } catch (Exception e) {
+            System.out.println("Error inserting certificates:: " + e);
+        }
+
+        try {
+            Cursor countCursor = mContentResolver.query(CarrierProvider.CONTENT_URI,
+                    new String[]{"count(*) AS count"},
+                    null,
+                    null,
+                    null);
+            countCursor.moveToFirst();
+            count = countCursor.getInt(0);
+        } catch (Exception e) {
+            Log.d(TAG, "Exception in getting count:" + e);
+        }
+        assertEquals(2, count);
+    }
+
+    /**
      * Test inserting duplicate values in carrier key table. Ensure that a SQLException is thrown.
      */
     @Test(expected = SQLException.class)
@@ -273,8 +360,7 @@
         contentValues.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
         contentValues.put(CarrierDatabaseHelper.MCC, test_mcc);
         contentValues.put(CarrierDatabaseHelper.MNC, test_mnc);
-        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, test_mvno_type);
-        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, test_mvno_match_data);
+        contentValues.put(CarrierDatabaseHelper.CARRIER_ID, TEST_CARRIER_ID_1);
         contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key1.getBytes());
 
         try {
@@ -300,8 +386,7 @@
         contentValues.put(CarrierDatabaseHelper.KEY_TYPE, test_type);
         contentValues.put(CarrierDatabaseHelper.MCC, test_mcc);
         contentValues.put(CarrierDatabaseHelper.MNC, test_mnc);
-        contentValues.put(CarrierDatabaseHelper.MVNO_TYPE, test_mvno_type);
-        contentValues.put(CarrierDatabaseHelper.MVNO_MATCH_DATA, test_mvno_match_data);
+        contentValues.put(CarrierDatabaseHelper.CARRIER_ID, TEST_CARRIER_ID_1);
         contentValues.put(CarrierDatabaseHelper.KEY_IDENTIFIER, test_key_identifier_data);
         contentValues.put(CarrierDatabaseHelper.PUBLIC_KEY, test_key1.getBytes());
         contentValues.put(CarrierDatabaseHelper.EXPIRATION_TIME, test_key_expiration);
@@ -313,9 +398,11 @@
         }
 
         try {
-            String whereClause = "mcc=? and mnc=?";
-            String[] whereArgs = new String[] { test_mcc, test_mnc };
-            numRowsDeleted = mContentResolver.delete(CarrierProvider.CONTENT_URI, whereClause, whereArgs);
+            String whereClause = "mcc=? and mnc=? and carrier_id=?";
+            String[] whereArgs = new String[]{test_mcc, test_mnc, Integer.toString(
+                    TEST_CARRIER_ID_1)};
+            numRowsDeleted = mContentResolver.delete(CarrierProvider.CONTENT_URI, whereClause,
+                    whereArgs);
         } catch (Exception e) {
             Log.d(TAG, "Error updating values:" + e);
         }