118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar/* 218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * Copyright 2018 The Android Open Source Project 318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * 418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * Licensed under the Apache License, Version 2.0 (the "License"); 518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * you may not use this file except in compliance with the License. 618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * You may obtain a copy of the License at 718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * 818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * http://www.apache.org/licenses/LICENSE-2.0 918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * 1018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * Unless required by applicable law or agreed to in writing, software 1118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * distributed under the License is distributed on an "AS IS" BASIS, 1218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * See the License for the specific language governing permissions and 1418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar * limitations under the License. 1518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar */ 1618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 1718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarpackage androidx.work; 1818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 198dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Katariaimport static android.database.sqlite.SQLiteDatabase.CONFLICT_FAIL; 208dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria 2118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport static org.hamcrest.CoreMatchers.is; 2218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport static org.hamcrest.MatcherAssert.assertThat; 2318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 2418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport android.arch.persistence.db.SupportSQLiteDatabase; 2518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport android.arch.persistence.db.framework.FrameworkSQLiteOpenHelperFactory; 2618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport android.arch.persistence.room.testing.MigrationTestHelper; 278dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Katariaimport android.content.ContentValues; 2818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport android.database.Cursor; 2918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport android.database.sqlite.SQLiteException; 3018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport android.support.test.InstrumentationRegistry; 3118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport android.support.test.filters.MediumTest; 3218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport android.support.test.runner.AndroidJUnit4; 3318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 3418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport androidx.work.impl.WorkDatabase; 3518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport androidx.work.impl.WorkDatabaseMigrations; 368dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Katariaimport androidx.work.impl.model.WorkSpec; 378dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Katariaimport androidx.work.impl.model.WorkTypeConverters; 388dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Katariaimport androidx.work.worker.TestWorker; 3918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 4018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport org.junit.Before; 4118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport org.junit.Rule; 4218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport org.junit.Test; 4318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport org.junit.runner.RunWith; 4418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 4518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport java.io.File; 4618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport java.io.IOException; 4718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarimport java.util.UUID; 4818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 4918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar@RunWith(AndroidJUnit4.class) 5018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumarpublic class WorkDatabaseMigrationTest { 5118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 5218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final String TEST_DATABASE = "workdatabase-test"; 5318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final boolean VALIDATE_DROPPED_TABLES = true; 54e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar private static final int OLD_VERSION = 1; 5518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final int NEW_VERSION = 2; 5618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final String COLUMN_WORKSPEC_ID = "work_spec_id"; 5718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final String COLUMN_SYSTEM_ID = "system_id"; 58e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar private static final String COLUMN_ALARM_ID = "alarm_id"; 5918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 6018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar // Queries 6118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final String INSERT_ALARM_INFO = "INSERT INTO alarmInfo VALUES (?, ?)"; 62d865c2cf247d6b73d9f9510045dfd9ccd1f6ef12Rahul Ravikumar private static final String INSERT_SYSTEM_ID_INFO = "INSERT INTO SystemIdInfo VALUES (?, ?)"; 63d865c2cf247d6b73d9f9510045dfd9ccd1f6ef12Rahul Ravikumar private static final String CHECK_SYSTEM_ID_INFO = "SELECT * FROM SystemIdInfo"; 64e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar private static final String CHECK_ALARM_INFO = "SELECT * FROM alarmInfo"; 6518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final String CHECK_TABLE_NAME = "SELECT * FROM %s"; 6618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final String TABLE_ALARM_INFO = "alarmInfo"; 67d865c2cf247d6b73d9f9510045dfd9ccd1f6ef12Rahul Ravikumar private static final String TABLE_SYSTEM_ID_INFO = "SystemIdInfo"; 6818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final String TABLE_WORKSPEC = "WorkSpec"; 6918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final String TABLE_WORKTAG = "WorkTag"; 7018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private static final String TABLE_WORKNAME = "WorkName"; 7118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 7218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private File mDatabasePath; 7318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 7418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar @Rule 7518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar public MigrationTestHelper mMigrationTestHelper = new MigrationTestHelper( 7618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar InstrumentationRegistry.getInstrumentation(), 7718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar WorkDatabase.class.getCanonicalName(), 7818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar new FrameworkSQLiteOpenHelperFactory()); 7918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 8018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar @Before 8118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar public void setUp() { 8218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar // Delete the database if it exists. 8318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar mDatabasePath = InstrumentationRegistry.getContext().getDatabasePath(TEST_DATABASE); 8418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar if (mDatabasePath.exists()) { 8518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar mDatabasePath.delete(); 8618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar } 8718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar } 8818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 8918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar @Test 9018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar @MediumTest 9118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar public void testMigrationVersion1To2() throws IOException { 9218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar SupportSQLiteDatabase database = 93e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar mMigrationTestHelper.createDatabase(TEST_DATABASE, OLD_VERSION); 9418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 958dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria String workSpecId0 = UUID.randomUUID().toString(); 968dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria ContentValues contentValues = new ContentValues(); 978dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("id", workSpecId0); 988dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("state", WorkTypeConverters.StateIds.ENQUEUED); 998dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("worker_class_name", TestWorker.class.getName()); 1008dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("input_merger_class_name", OverwritingInputMerger.class.getName()); 1018dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("input", Data.toByteArray(Data.EMPTY)); 1028dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("output", Data.toByteArray(Data.EMPTY)); 1038dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("initial_delay", 0L); 1048dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("interval_duration", 0L); 1058dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("flex_duration", 0L); 1068dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("required_network_type", false); 1078dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("requires_charging", false); 1088dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("requires_device_idle", false); 1098dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("requires_battery_not_low", false); 1108dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("requires_storage_not_low", false); 1118dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("content_uri_triggers", 1128dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria WorkTypeConverters.contentUriTriggersToByteArray(new ContentUriTriggers())); 1138dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("run_attempt_count", 0); 1148dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("backoff_policy", 1158dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria WorkTypeConverters.backoffPolicyToInt(BackoffPolicy.EXPONENTIAL)); 1168dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("backoff_delay_duration", WorkRequest.DEFAULT_BACKOFF_DELAY_MILLIS); 1178dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("period_start_time", 0L); 1188dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("minimum_retention_duration", 0L); 1198dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria contentValues.put("schedule_requested_at", WorkSpec.SCHEDULE_NOT_REQUESTED_YET); 1208dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria database.insert("workspec", CONFLICT_FAIL, contentValues); 1218dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria 12218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar String workSpecId1 = UUID.randomUUID().toString(); 12318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar String workSpecId2 = UUID.randomUUID().toString(); 12418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 12518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar // insert alarmInfos 12618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar database.execSQL(INSERT_ALARM_INFO, new Object[]{workSpecId1, 1}); 12718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar database.execSQL(INSERT_ALARM_INFO, new Object[]{workSpecId2, 2}); 12818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 12918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar database.close(); 13018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 13118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar database = mMigrationTestHelper.runMigrationsAndValidate( 13218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar TEST_DATABASE, 13318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar NEW_VERSION, 13418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar VALIDATE_DROPPED_TABLES, 13518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar WorkDatabaseMigrations.MIGRATION_1_2); 13618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 1378dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria Cursor tagCursor = database.query("SELECT * FROM worktag"); 1388dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria assertThat(tagCursor.getCount(), is(1)); 1398dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria tagCursor.moveToFirst(); 1408dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria assertThat(tagCursor.getString(tagCursor.getColumnIndex("tag")), 1418dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria is(TestWorker.class.getName())); 1428dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria assertThat(tagCursor.getString(tagCursor.getColumnIndex("work_spec_id")), is(workSpecId0)); 1438dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria tagCursor.close(); 1448dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria 14518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar Cursor cursor = database.query(CHECK_SYSTEM_ID_INFO); 14618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar assertThat(cursor.getCount(), is(2)); 14718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar cursor.moveToFirst(); 14818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId1)); 14918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_SYSTEM_ID)), is(1)); 15018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar cursor.moveToNext(); 15118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId2)); 15218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_SYSTEM_ID)), is(2)); 15318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar cursor.close(); 15418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 15518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar assertThat(checkExists(database, TABLE_ALARM_INFO), is(false)); 15618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar assertThat(checkExists(database, TABLE_WORKSPEC), is(true)); 15718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar assertThat(checkExists(database, TABLE_WORKTAG), is(true)); 15818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar assertThat(checkExists(database, TABLE_WORKNAME), is(true)); 15918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar database.close(); 16018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar } 16118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar 162e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar @Test 163e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar @MediumTest 164e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar public void testMigrationVersion2To1() throws IOException { 165e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar SupportSQLiteDatabase database = 166e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar mMigrationTestHelper.createDatabase(TEST_DATABASE, NEW_VERSION); 167e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 168e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar String workSpecId1 = UUID.randomUUID().toString(); 169e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar String workSpecId2 = UUID.randomUUID().toString(); 170e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 171d865c2cf247d6b73d9f9510045dfd9ccd1f6ef12Rahul Ravikumar // insert SystemIdInfo 172e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database.execSQL(INSERT_SYSTEM_ID_INFO, new Object[]{workSpecId1, 1}); 173e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database.execSQL(INSERT_SYSTEM_ID_INFO, new Object[]{workSpecId2, 2}); 174e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 175e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database.close(); 176e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 177e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 178e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database = mMigrationTestHelper.runMigrationsAndValidate( 179e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar TEST_DATABASE, 180e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar OLD_VERSION, 181e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar VALIDATE_DROPPED_TABLES, 182e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar WorkDatabaseMigrations.MIGRATION_2_1); 183e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 184e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar Cursor cursor = database.query(CHECK_ALARM_INFO); 185e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getCount(), is(2)); 186e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar cursor.moveToFirst(); 187e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId1)); 188e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_ALARM_ID)), is(1)); 189e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar cursor.moveToNext(); 190e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId2)); 191e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_ALARM_ID)), is(2)); 192e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar cursor.close(); 193e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 194e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(checkExists(database, TABLE_SYSTEM_ID_INFO), is(false)); 195e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(checkExists(database, TABLE_WORKSPEC), is(true)); 196e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(checkExists(database, TABLE_WORKTAG), is(true)); 197e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(checkExists(database, TABLE_WORKNAME), is(true)); 198e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database.close(); 199e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar } 200e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 201e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar @Test 202e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar @MediumTest 203e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar public void testMigrationVersion1To2To1() throws IOException { 204e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar SupportSQLiteDatabase database = 205e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar mMigrationTestHelper.createDatabase(TEST_DATABASE, OLD_VERSION); 206e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 207e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar String workSpecId1 = UUID.randomUUID().toString(); 208e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar String workSpecId2 = UUID.randomUUID().toString(); 209e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 210e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar // insert alarmInfos 211e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database.execSQL(INSERT_ALARM_INFO, new Object[]{workSpecId1, 1}); 212e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database.execSQL(INSERT_ALARM_INFO, new Object[]{workSpecId2, 2}); 213e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 214e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database.close(); 215e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 216e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database = mMigrationTestHelper.runMigrationsAndValidate( 217e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar TEST_DATABASE, 218e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar NEW_VERSION, 219e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar VALIDATE_DROPPED_TABLES, 220e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar WorkDatabaseMigrations.MIGRATION_1_2); 221e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 222e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database.close(); 223e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 224e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database = mMigrationTestHelper.runMigrationsAndValidate( 225e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar TEST_DATABASE, 226e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar OLD_VERSION, 227e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar VALIDATE_DROPPED_TABLES, 228e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar WorkDatabaseMigrations.MIGRATION_2_1); 229e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 230e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar Cursor cursor = database.query(CHECK_ALARM_INFO); 231e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getCount(), is(2)); 232e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar cursor.moveToFirst(); 233e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId1)); 234e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_ALARM_ID)), is(1)); 235e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar cursor.moveToNext(); 236e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getString(cursor.getColumnIndex(COLUMN_WORKSPEC_ID)), is(workSpecId2)); 237e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(cursor.getInt(cursor.getColumnIndex(COLUMN_ALARM_ID)), is(2)); 238e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar cursor.close(); 239e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 240e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(checkExists(database, TABLE_SYSTEM_ID_INFO), is(false)); 241e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(checkExists(database, TABLE_WORKSPEC), is(true)); 242e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(checkExists(database, TABLE_WORKTAG), is(true)); 243e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar assertThat(checkExists(database, TABLE_WORKNAME), is(true)); 244e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar database.close(); 245e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar } 246e8143f1fa1ac28fc71b54f632e79142e51fc19efRahul Ravikumar 24718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar private boolean checkExists(SupportSQLiteDatabase database, String tableName) { 24818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar Cursor cursor = null; 24918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar try { 25018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar cursor = database.query(String.format(CHECK_TABLE_NAME, tableName)); 25118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar return true; 25218e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar } catch (SQLiteException ignored) { 25318e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar // Should fail with a SQLiteException (no such table: tableName) 25418e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar return false; 25518e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar } finally { 25618e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar if (cursor != null) { 25718e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar cursor.close(); 25818e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar } 25918e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar } 26018e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar } 26118e0a7e02c1198c5b3b33295b148c1017e32f016Rahul Ravikumar} 262