[go: nahoru, domu]

blob: 917f4ebcc95973c644e6284bd30dc044238ad457 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.room.integration.testapp.migration;
import static com.google.common.truth.Truth.assertThat;
import android.database.SQLException;
import androidx.annotation.NonNull;
import androidx.room.migration.Migration;
import androidx.room.testing.MigrationTestHelper;
import androidx.room.util.TableInfo;
import androidx.sqlite.db.SupportSQLiteDatabase;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
/**
* Test custom database migrations.
*/
@RunWith(AndroidJUnit4.class)
@LargeTest
public class AutoMigrationTest {
private static final String TEST_DB = "auto-migration-test";
@Rule
public MigrationTestHelper helper;
public AutoMigrationTest() {
helper = new MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
AutoMigrationDb.class
);
}
// Run this to create the very 1st version of the db.
public void createFirstVersion() throws IOException {
SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 1);
db.execSQL("INSERT INTO Entity9 (id, name) VALUES (1, 'row1')");
db.execSQL("INSERT INTO Entity9 (id, name) VALUES (2, 'row2')");
db.execSQL("INSERT INTO Entity27 (id27) VALUES (3)");
db.execSQL("INSERT INTO Entity27 (id27) VALUES (5)");
db.close();
}
@Test
public void goFromV1ToV2() throws IOException {
createFirstVersion();
SupportSQLiteDatabase db = helper.runMigrationsAndValidate(
TEST_DB,
2,
true
);
final TableInfo info = TableInfo.read(db, AutoMigrationDb.Entity1.TABLE_NAME);
assertThat(info.columns.size()).isEqualTo(3);
}
@Test
public void goFromV1ToV3() throws IOException {
createFirstVersion();
try {
SupportSQLiteDatabase db = helper.runMigrationsAndValidate(
TEST_DB,
3,
true
);
} catch (SQLException e) {
assertThat(e.getMessage()).isEqualTo("Foreign key violation(s) detected in 'Entity9'."
+ "\nNumber of different violations discovered: 1"
+ "\nNumber of rows in violation: 2"
+ "\nViolation(s) detected in the following constraint(s):\n"
+ "\tParent Table = Entity27, Foreign Key Constraint Index = 0\n");
}
}
@Test
public void testAutoMigrationWithNewEmbeddedField() throws IOException {
MigrationTestHelper embeddedHelper = new MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
EmbeddedAutoMigrationDb.class
);
SupportSQLiteDatabase db = embeddedHelper.createDatabase(
"embedded-auto-migration-test",
1
);
db.execSQL("INSERT INTO Entity1 (id, name) VALUES (1, 'row1')");
final TableInfo info = TableInfo.read(
embeddedHelper.runMigrationsAndValidate(
"embedded-auto-migration-test",
2,
true
),
EmbeddedAutoMigrationDb.EmbeddedEntity1.TABLE_NAME);
assertThat(info.columns.size()).isEqualTo(3);
}
/**
* Verifies that the user defined migration is selected over using an autoMigration.
*/
@Test
public void testAutoMigrationsNotProcessedBeforeCustomMigrations() throws IOException {
createFirstVersion();
try {
helper.runMigrationsAndValidate(
TEST_DB,
2,
true,
MIGRATION_1_2
);
} catch (SQLException e) {
assertThat(e.getMessage()).containsMatch("no such table: Entity0");
}
}
@Test
public void autoMigrationShouldBeAddedToMigrations_WhenManualDowngradeMigrationIsPresent()
throws IOException {
createFirstVersion();
SupportSQLiteDatabase db = helper.runMigrationsAndValidate(
TEST_DB,
2,
true,
MIGRATION_1_0
);
}
private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {
db.execSQL("ALTER TABLE `Entity0` ADD COLUMN `addedInV2` INTEGER NOT NULL "
+ "DEFAULT 2");
}
};
private static final Migration MIGRATION_1_0 = new Migration(1, 0) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) { }
};
}