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

Commit dc91c4a6 authored by Rahul Sabnis's avatar Rahul Sabnis
Browse files

Add tests for MetadataDatabase migration from version 102 to 103

Bug: 145720612
Test: atest DatabaseManagerTest
Change-Id: Ib351d7b40f912888a12cb6d04a99c715ad604521
parent 6d136dbb
Loading
Loading
Loading
Loading
+166 −6
Original line number Diff line number Diff line
@@ -16,7 +16,15 @@

package com.android.bluetooth.btservice.storage;

import static org.mockito.Mockito.*;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
@@ -446,7 +454,7 @@ public final class DatabaseManagerTest {
        device.put("unthethered_left_charging", testString);
        device.put("unthethered_right_charging", testString);
        device.put("unthethered_case_charging", testString);
        Assert.assertThat(db.insert("metadata", SQLiteDatabase.CONFLICT_IGNORE, device),
        assertThat(db.insert("metadata", SQLiteDatabase.CONFLICT_IGNORE, device),
                CoreMatchers.not(-1));

        // Check the metadata names on version 101
@@ -529,22 +537,174 @@ public final class DatabaseManagerTest {
        }
    }

    @Test
    public void testDatabaseMigration_102_103() throws IOException {
        String testString = "TEST STRING";

        // Create a database with version 102
        SupportSQLiteDatabase db = testHelper.createDatabase(DB_NAME, 102);
        Cursor cursor = db.query("SELECT * FROM metadata");

        // insert a device to the database
        ContentValues device = new ContentValues();
        device.put("address", TEST_BT_ADDR);
        device.put("migrated", false);
        device.put("a2dpSupportsOptionalCodecs", -1);
        device.put("a2dpOptionalCodecsEnabled", -1);
        device.put("a2dp_priority", 1000);
        device.put("a2dp_sink_priority", 1000);
        device.put("hfp_priority", 1000);
        device.put("hfp_client_priority", 1000);
        device.put("hid_host_priority", 1000);
        device.put("pan_priority", 1000);
        device.put("pbap_priority", 1000);
        device.put("pbap_client_priority", 1000);
        device.put("map_priority", 1000);
        device.put("sap_priority", 1000);
        device.put("hearing_aid_priority", 1000);
        device.put("map_client_priority", 1000);
        device.put("manufacturer_name", testString);
        device.put("model_name", testString);
        device.put("software_version", testString);
        device.put("hardware_version", testString);
        device.put("companion_app", testString);
        device.put("main_icon", testString);
        device.put("is_untethered_headset", testString);
        device.put("untethered_left_icon", testString);
        device.put("untethered_right_icon", testString);
        device.put("untethered_case_icon", testString);
        device.put("untethered_left_battery", testString);
        device.put("untethered_right_battery", testString);
        device.put("untethered_case_battery", testString);
        device.put("untethered_left_charging", testString);
        device.put("untethered_right_charging", testString);
        device.put("untethered_case_charging", testString);
        assertThat(db.insert("metadata", SQLiteDatabase.CONFLICT_IGNORE, device),
                CoreMatchers.not(-1));

        // Check the metadata names on version 102
        assertHasColumn(cursor, "a2dp_priority", true);
        assertHasColumn(cursor, "a2dp_sink_priority", true);
        assertHasColumn(cursor, "hfp_priority", true);
        assertHasColumn(cursor, "hfp_client_priority", true);
        assertHasColumn(cursor, "hid_host_priority", true);
        assertHasColumn(cursor, "pan_priority", true);
        assertHasColumn(cursor, "pbap_priority", true);
        assertHasColumn(cursor, "pbap_client_priority", true);
        assertHasColumn(cursor, "map_priority", true);
        assertHasColumn(cursor, "sap_priority", true);
        assertHasColumn(cursor, "hearing_aid_priority", true);
        assertHasColumn(cursor, "map_client_priority", true);

        // Migrate database from 102 to 103
        db.close();
        db = testHelper.runMigrationsAndValidate(DB_NAME, 103, true,
                MetadataDatabase.MIGRATION_102_103);
        cursor = db.query("SELECT * FROM metadata");

        // metadata names should be changed on version 103
        assertHasColumn(cursor, "a2dp_priority", false);
        assertHasColumn(cursor, "a2dp_sink_priority", false);
        assertHasColumn(cursor, "hfp_priority", false);
        assertHasColumn(cursor, "hfp_client_priority", false);
        assertHasColumn(cursor, "hid_host_priority", false);
        assertHasColumn(cursor, "pan_priority", false);
        assertHasColumn(cursor, "pbap_priority", false);
        assertHasColumn(cursor, "pbap_client_priority", false);
        assertHasColumn(cursor, "map_priority", false);
        assertHasColumn(cursor, "sap_priority", false);
        assertHasColumn(cursor, "hearing_aid_priority", false);
        assertHasColumn(cursor, "map_client_priority", false);

        assertHasColumn(cursor, "a2dp_connection_policy", true);
        assertHasColumn(cursor, "a2dp_sink_connection_policy", true);
        assertHasColumn(cursor, "hfp_connection_policy", true);
        assertHasColumn(cursor, "hfp_client_connection_policy", true);
        assertHasColumn(cursor, "hid_host_connection_policy", true);
        assertHasColumn(cursor, "pan_connection_policy", true);
        assertHasColumn(cursor, "pbap_connection_policy", true);
        assertHasColumn(cursor, "pbap_client_connection_policy", true);
        assertHasColumn(cursor, "map_connection_policy", true);
        assertHasColumn(cursor, "sap_connection_policy", true);
        assertHasColumn(cursor, "hearing_aid_connection_policy", true);
        assertHasColumn(cursor, "map_client_connection_policy", true);

        while (cursor.moveToNext()) {
            // Check PRIORITY_AUTO_CONNECT (1000) was replaced with CONNECTION_POLICY_ALLOWED (100)
            assertColumnIntData(cursor, "a2dp_connection_policy", 100);
            assertColumnIntData(cursor, "a2dp_sink_connection_policy", 100);
            assertColumnIntData(cursor, "hfp_connection_policy", 100);
            assertColumnIntData(cursor, "hfp_client_connection_policy", 100);
            assertColumnIntData(cursor, "hid_host_connection_policy", 100);
            assertColumnIntData(cursor, "pan_connection_policy", 100);
            assertColumnIntData(cursor, "pbap_connection_policy", 100);
            assertColumnIntData(cursor, "pbap_client_connection_policy", 100);
            assertColumnIntData(cursor, "map_connection_policy", 100);
            assertColumnIntData(cursor, "sap_connection_policy", 100);
            assertColumnIntData(cursor, "hearing_aid_connection_policy", 100);
            assertColumnIntData(cursor, "map_client_connection_policy", 100);

            // Check whether metadata data type are blob
            assertColumnBlob(cursor, "manufacturer_name");
            assertColumnBlob(cursor, "model_name");
            assertColumnBlob(cursor, "software_version");
            assertColumnBlob(cursor, "hardware_version");
            assertColumnBlob(cursor, "companion_app");
            assertColumnBlob(cursor, "main_icon");
            assertColumnBlob(cursor, "is_untethered_headset");
            assertColumnBlob(cursor, "untethered_left_icon");
            assertColumnBlob(cursor, "untethered_right_icon");
            assertColumnBlob(cursor, "untethered_case_icon");
            assertColumnBlob(cursor, "untethered_left_battery");
            assertColumnBlob(cursor, "untethered_right_battery");
            assertColumnBlob(cursor, "untethered_case_battery");
            assertColumnBlob(cursor, "untethered_left_charging");
            assertColumnBlob(cursor, "untethered_right_charging");
            assertColumnBlob(cursor, "untethered_case_charging");

            // Check whether metadata values are migrated to version 103 successfully
            assertColumnBlobData(cursor, "manufacturer_name", testString.getBytes());
            assertColumnBlobData(cursor, "model_name", testString.getBytes());
            assertColumnBlobData(cursor, "software_version", testString.getBytes());
            assertColumnBlobData(cursor, "hardware_version", testString.getBytes());
            assertColumnBlobData(cursor, "companion_app", testString.getBytes());
            assertColumnBlobData(cursor, "main_icon", testString.getBytes());
            assertColumnBlobData(cursor, "is_untethered_headset", testString.getBytes());
            assertColumnBlobData(cursor, "untethered_left_icon", testString.getBytes());
            assertColumnBlobData(cursor, "untethered_right_icon", testString.getBytes());
            assertColumnBlobData(cursor, "untethered_case_icon", testString.getBytes());
            assertColumnBlobData(cursor, "untethered_left_battery", testString.getBytes());
            assertColumnBlobData(cursor, "untethered_right_battery", testString.getBytes());
            assertColumnBlobData(cursor, "untethered_case_battery", testString.getBytes());
            assertColumnBlobData(cursor, "untethered_left_charging", testString.getBytes());
            assertColumnBlobData(cursor, "untethered_right_charging", testString.getBytes());
            assertColumnBlobData(cursor, "untethered_case_charging", testString.getBytes());
        }
    }

    /**
     * Helper function to check whether the database has the expected column
     */
    void assertHasColumn(Cursor cursor, String columnName, boolean hasColumn) {
        if (hasColumn) {
            Assert.assertThat(cursor.getColumnIndex(columnName), CoreMatchers.not(-1));
            assertThat(cursor.getColumnIndex(columnName), CoreMatchers.not(-1));
        } else {
            Assert.assertThat(cursor.getColumnIndex(columnName), CoreMatchers.is(-1));
            assertThat(cursor.getColumnIndex(columnName), CoreMatchers.is(-1));
        }
    }

    /**
     * Helper function to check whether the database has the expected value
     */
    void assertColumnIntData(Cursor cursor, String columnName, int value) {
        assertThat(cursor.getInt(cursor.getColumnIndex(columnName)), CoreMatchers.is(value));
    }

    /**
     * Helper function to check whether the column data type is BLOB
     */
    void assertColumnBlob(Cursor cursor, String columnName) {
        Assert.assertThat(cursor.getType(cursor.getColumnIndex(columnName)),
        assertThat(cursor.getType(cursor.getColumnIndex(columnName)),
                CoreMatchers.is(Cursor.FIELD_TYPE_BLOB));
    }

@@ -552,7 +712,7 @@ public final class DatabaseManagerTest {
     * Helper function to check the BLOB data in a column is expected
     */
    void assertColumnBlobData(Cursor cursor, String columnName, byte[] data) {
        Assert.assertThat(cursor.getBlob(cursor.getColumnIndex(columnName)),
        assertThat(cursor.getBlob(cursor.getColumnIndex(columnName)),
                CoreMatchers.is(data));
    }

+226 −0
Original line number Diff line number Diff line
{
  "formatVersion": 1,
  "database": {
    "version": 103,
    "identityHash": "2feccd539474eca8e3dec65a98c8b084",
    "entities": [
      {
        "tableName": "metadata",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`address` TEXT NOT NULL, `migrated` INTEGER NOT NULL, `a2dpSupportsOptionalCodecs` INTEGER NOT NULL, `a2dpOptionalCodecsEnabled` INTEGER NOT NULL, `a2dp_connection_policy` INTEGER, `a2dp_sink_connection_policy` INTEGER, `hfp_connection_policy` INTEGER, `hfp_client_connection_policy` INTEGER, `hid_host_connection_policy` INTEGER, `pan_connection_policy` INTEGER, `pbap_connection_policy` INTEGER, `pbap_client_connection_policy` INTEGER, `map_connection_policy` INTEGER, `sap_connection_policy` INTEGER, `hearing_aid_connection_policy` INTEGER, `map_client_connection_policy` INTEGER, `manufacturer_name` BLOB, `model_name` BLOB, `software_version` BLOB, `hardware_version` BLOB, `companion_app` BLOB, `main_icon` BLOB, `is_untethered_headset` BLOB, `untethered_left_icon` BLOB, `untethered_right_icon` BLOB, `untethered_case_icon` BLOB, `untethered_left_battery` BLOB, `untethered_right_battery` BLOB, `untethered_case_battery` BLOB, `untethered_left_charging` BLOB, `untethered_right_charging` BLOB, `untethered_case_charging` BLOB, `enhanced_settings_ui_uri` BLOB, PRIMARY KEY(`address`))",
        "fields": [
          {
            "fieldPath": "address",
            "columnName": "address",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "migrated",
            "columnName": "migrated",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "a2dpSupportsOptionalCodecs",
            "columnName": "a2dpSupportsOptionalCodecs",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "a2dpOptionalCodecsEnabled",
            "columnName": "a2dpOptionalCodecsEnabled",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "profileConnectionPolicies.a2dp_connection_policy",
            "columnName": "a2dp_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.a2dp_sink_connection_policy",
            "columnName": "a2dp_sink_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.hfp_connection_policy",
            "columnName": "hfp_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.hfp_client_connection_policy",
            "columnName": "hfp_client_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.hid_host_connection_policy",
            "columnName": "hid_host_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.pan_connection_policy",
            "columnName": "pan_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.pbap_connection_policy",
            "columnName": "pbap_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.pbap_client_connection_policy",
            "columnName": "pbap_client_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.map_connection_policy",
            "columnName": "map_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.sap_connection_policy",
            "columnName": "sap_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.hearing_aid_connection_policy",
            "columnName": "hearing_aid_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "profileConnectionPolicies.map_client_connection_policy",
            "columnName": "map_client_connection_policy",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.manufacturer_name",
            "columnName": "manufacturer_name",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.model_name",
            "columnName": "model_name",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.software_version",
            "columnName": "software_version",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.hardware_version",
            "columnName": "hardware_version",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.companion_app",
            "columnName": "companion_app",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.main_icon",
            "columnName": "main_icon",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.is_untethered_headset",
            "columnName": "is_untethered_headset",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.untethered_left_icon",
            "columnName": "untethered_left_icon",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.untethered_right_icon",
            "columnName": "untethered_right_icon",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.untethered_case_icon",
            "columnName": "untethered_case_icon",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.untethered_left_battery",
            "columnName": "untethered_left_battery",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.untethered_right_battery",
            "columnName": "untethered_right_battery",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.untethered_case_battery",
            "columnName": "untethered_case_battery",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.untethered_left_charging",
            "columnName": "untethered_left_charging",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.untethered_right_charging",
            "columnName": "untethered_right_charging",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.untethered_case_charging",
            "columnName": "untethered_case_charging",
            "affinity": "BLOB",
            "notNull": false
          },
          {
            "fieldPath": "publicMetadata.enhanced_settings_ui_uri",
            "columnName": "enhanced_settings_ui_uri",
            "affinity": "BLOB",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "address"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '2feccd539474eca8e3dec65a98c8b084')"
    ]
  }
}
 No newline at end of file