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