Skip to content

Commit

Permalink
Consolidated common test-logic to "DatabaseTests.kt"
Browse files Browse the repository at this point in the history
Moved logic for configuring a test database, a "MigrationContainer" and creating a v0 database to "DatabaseTests.kt"

*This commit is related to issue #529 [1]*

[1] #529
  • Loading branch information
JaniruTEC committed Oct 18, 2024
1 parent 8251fc9 commit 998a476
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 107 deletions.
Original file line number Diff line number Diff line change
@@ -1,27 +1,11 @@
package org.cryptomator.data.db

import android.content.Context
import androidx.room.util.readVersion
import androidx.sqlite.db.SupportSQLiteDatabase
import androidx.sqlite.db.SupportSQLiteOpenHelper
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import org.cryptomator.data.db.migrations.MigrationContainer
import org.cryptomator.data.db.migrations.legacy.Upgrade10To11
import org.cryptomator.data.db.migrations.legacy.Upgrade11To12
import org.cryptomator.data.db.migrations.legacy.Upgrade12To13
import org.cryptomator.data.db.migrations.legacy.Upgrade1To2
import org.cryptomator.data.db.migrations.legacy.Upgrade2To3
import org.cryptomator.data.db.migrations.legacy.Upgrade3To4
import org.cryptomator.data.db.migrations.legacy.Upgrade4To5
import org.cryptomator.data.db.migrations.legacy.Upgrade5To6
import org.cryptomator.data.db.migrations.legacy.Upgrade6To7
import org.cryptomator.data.db.migrations.legacy.Upgrade7To8
import org.cryptomator.data.db.migrations.legacy.Upgrade8To9
import org.cryptomator.data.db.migrations.legacy.Upgrade9To10
import org.cryptomator.data.db.migrations.manual.Migration13To14
import org.cryptomator.data.db.templating.DbTemplateModule
import org.cryptomator.data.db.templating.TemplateDatabaseContext
import org.cryptomator.data.util.useFinally
Expand Down Expand Up @@ -64,23 +48,7 @@ class CorruptedDatabaseTest {
}
}

migrationContainer = MigrationContainer(
Upgrade1To2(), //
Upgrade2To3(context), //
Upgrade3To4(), //
Upgrade4To5(), //
Upgrade5To6(), //
Upgrade6To7(), //
Upgrade7To8(), //
Upgrade8To9(sharedPreferencesHandler), //
Upgrade9To10(sharedPreferencesHandler), //
Upgrade10To11(), //
Upgrade11To12(sharedPreferencesHandler), //
Upgrade12To13(context), //
//
Migration13To14(), //
//Auto: 14 -> 15
)
migrationContainer = createMigrationContainer(context, sharedPreferencesHandler)
}

@After
Expand All @@ -89,9 +57,13 @@ class CorruptedDatabaseTest {
templateDbStream.reset()
}

private fun createVersion0Database() {
createVersion0Database(context, TEST_DB)
}

@Test
fun testOpenVersion0Database() {
createVersion0Database(context, TEST_DB)
createVersion0Database()
DatabaseModule().provideInternalCryptomatorDatabase( //
context, //
migrationContainer.getPath(1).toTypedArray(), //
Expand All @@ -118,7 +90,7 @@ class CorruptedDatabaseTest {
}
}

createVersion0Database(context, TEST_DB)
createVersion0Database()
DatabaseModule().provideInternalCryptomatorDatabase( //
context, //
migrationContainer.getPath(1).toTypedArray(), //
Expand Down Expand Up @@ -174,40 +146,6 @@ class CorruptedDatabaseTest {
}
}

@Suppress("serial")
private class InterruptCreationException : Exception()

private fun createVersion0Database(context: Context, databaseName: String) {
val config = SupportSQLiteOpenHelper.Configuration.builder(context) //
.name(databaseName) //
.callback(object : SupportSQLiteOpenHelper.Callback(1) {
override fun onConfigure(db: SupportSQLiteDatabase) = db.applyDefaultConfiguration( //
assertedWalEnabledStatus = false //
)

override fun onCreate(db: SupportSQLiteDatabase) = throw InterruptCreationException()
override fun onUpgrade(db: SupportSQLiteDatabase, oldVersion: Int, newVersion: Int) = throw IllegalStateException()
}).build()

FrameworkSQLiteOpenHelperFactory().create(config).use { openHelper ->
openHelper.setWriteAheadLoggingEnabled(false)
try {
//The "use" block in "initVersion0Database" should not be reached, let alone finished; ...
initVersion0Database(openHelper)
} catch (e: InterruptCreationException) {
//... instead, the creation of the database should be interrupted by the InterruptCreationException thrown by "onCreate",
//so that this catch block is called and the database remains in version 0.
require(readVersion(context.getDatabasePath(databaseName)) == 0)
}
}
}

private fun initVersion0Database(openHelper: SupportSQLiteOpenHelper): Nothing {
openHelper.writableDatabase.use {
throw IllegalStateException("Creating a v0 database requires throwing an exception during creation (got ${it.version})")
}
}

private fun openHelperFactory(
invalidationCallback: () -> Unit = { throw IllegalStateException() }
): DatabaseOpenHelperFactory {
Expand Down
100 changes: 100 additions & 0 deletions data/src/androidTest/java/org/cryptomator/data/db/DatabaseTests.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package org.cryptomator.data.db

import android.content.Context
import androidx.room.util.readVersion
import androidx.sqlite.db.SupportSQLiteDatabase
import androidx.sqlite.db.SupportSQLiteOpenHelper
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
import org.cryptomator.data.db.migrations.MigrationContainer
import org.cryptomator.data.db.migrations.legacy.Upgrade10To11
import org.cryptomator.data.db.migrations.legacy.Upgrade11To12
import org.cryptomator.data.db.migrations.legacy.Upgrade12To13
import org.cryptomator.data.db.migrations.legacy.Upgrade1To2
import org.cryptomator.data.db.migrations.legacy.Upgrade2To3
import org.cryptomator.data.db.migrations.legacy.Upgrade3To4
import org.cryptomator.data.db.migrations.legacy.Upgrade4To5
import org.cryptomator.data.db.migrations.legacy.Upgrade5To6
import org.cryptomator.data.db.migrations.legacy.Upgrade6To7
import org.cryptomator.data.db.migrations.legacy.Upgrade7To8
import org.cryptomator.data.db.migrations.legacy.Upgrade8To9
import org.cryptomator.data.db.migrations.legacy.Upgrade9To10
import org.cryptomator.data.db.migrations.manual.Migration13To14
import org.cryptomator.util.SharedPreferencesHandler
import org.junit.Assert.assertEquals
import org.junit.Assert.fail

private const val LATEST_LEGACY_MIGRATION = 13

internal fun configureTestDatabase(context: Context, databaseName: String): SupportSQLiteOpenHelper.Configuration {
return SupportSQLiteOpenHelper.Configuration.builder(context) //
.name(databaseName) //
.callback(object : SupportSQLiteOpenHelper.Callback(LATEST_LEGACY_MIGRATION) {
override fun onConfigure(db: SupportSQLiteDatabase) = db.applyDefaultConfiguration( //
assertedWalEnabledStatus = false //
)

override fun onCreate(db: SupportSQLiteDatabase) {
fail("Database should not be created, but copied from template")
}

override fun onUpgrade(db: SupportSQLiteDatabase, oldVersion: Int, newVersion: Int) {
assertEquals(1, oldVersion)
assertEquals(LATEST_LEGACY_MIGRATION, newVersion)
}
}).build()
}

internal fun createVersion0Database(context: Context, databaseName: String) {
val config = SupportSQLiteOpenHelper.Configuration.builder(context) //
.name(databaseName) //
.callback(object : SupportSQLiteOpenHelper.Callback(1) {
override fun onConfigure(db: SupportSQLiteDatabase) = db.applyDefaultConfiguration( //
assertedWalEnabledStatus = false //
)

override fun onCreate(db: SupportSQLiteDatabase) = throw InterruptCreationException()
override fun onUpgrade(db: SupportSQLiteDatabase, oldVersion: Int, newVersion: Int) = throw IllegalStateException()
}).build()

FrameworkSQLiteOpenHelperFactory().create(config).use { openHelper ->
openHelper.setWriteAheadLoggingEnabled(false)
try {
//The "use" block in "initVersion0Database" should not be reached, let alone finished; ...
initVersion0Database(openHelper)
} catch (e: InterruptCreationException) {
//... instead, the creation of the database should be interrupted by the InterruptCreationException thrown by "onCreate",
//so that this catch block is called and the database remains in version 0.
require(readVersion(context.getDatabasePath(databaseName)) == 0)
}
}
}

@Suppress("serial")
private class InterruptCreationException : Exception()

private fun initVersion0Database(openHelper: SupportSQLiteOpenHelper): Nothing {
openHelper.writableDatabase.use {
throw IllegalStateException("Creating a v0 database requires throwing an exception during creation (got ${it.version})")
}
}

internal fun createMigrationContainer(
context: Context, //
sharedPreferencesHandler: SharedPreferencesHandler
) = MigrationContainer(
Upgrade1To2(), //
Upgrade2To3(context), //
Upgrade3To4(), //
Upgrade4To5(), //
Upgrade5To6(), //
Upgrade6To7(), //
Upgrade7To8(), //
Upgrade8To9(sharedPreferencesHandler), //
Upgrade9To10(sharedPreferencesHandler), //
Upgrade10To11(), //
Upgrade11To12(sharedPreferencesHandler), //
Upgrade12To13(context), //
//
Migration13To14(), //
//Auto: 14 -> 15
)
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import org.cryptomator.data.db.migrations.Sql
import org.cryptomator.data.db.migrations.legacy.Upgrade10To11
import org.cryptomator.data.db.migrations.legacy.Upgrade11To12
import org.cryptomator.data.db.migrations.legacy.Upgrade12To13
import org.cryptomator.data.db.migrations.legacy.Upgrade1To2
import org.cryptomator.data.db.migrations.legacy.Upgrade2To3
import org.cryptomator.data.db.migrations.legacy.Upgrade3To4
import org.cryptomator.data.db.migrations.legacy.Upgrade4To5
Expand All @@ -42,7 +41,6 @@ import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Assert.fail
import org.junit.Before
import org.junit.Rule
import org.junit.Test
Expand All @@ -51,7 +49,6 @@ import java.io.IOException
import java.nio.file.Files

private const val TEST_DB = "migration-test"
private const val LATEST_LEGACY_MIGRATION = 13

private const val UUID_LENGTH = 36

Expand Down Expand Up @@ -93,42 +90,9 @@ class UpgradeDatabaseTest {
Files.copy(templateDbStream, dbFile.toPath())
}

migrationContainer = MigrationContainer(
Upgrade1To2(), //
Upgrade2To3(context), //
Upgrade3To4(), //
Upgrade4To5(), //
Upgrade5To6(), //
Upgrade6To7(), //
Upgrade7To8(), //
Upgrade8To9(sharedPreferencesHandler), //
Upgrade9To10(sharedPreferencesHandler), //
Upgrade10To11(), //
Upgrade11To12(sharedPreferencesHandler), //
Upgrade12To13(context), //
//
Migration13To14(), //
//Auto: 14 -> 15
)

val config = SupportSQLiteOpenHelper.Configuration.builder(context) //
.name(TEST_DB) //
.callback(object : SupportSQLiteOpenHelper.Callback(LATEST_LEGACY_MIGRATION) {
override fun onConfigure(db: SupportSQLiteDatabase) = db.applyDefaultConfiguration( //
assertedWalEnabledStatus = false //
)

override fun onCreate(db: SupportSQLiteDatabase) {
fail("Database should not be created, but copied from template")
}

override fun onUpgrade(db: SupportSQLiteDatabase, oldVersion: Int, newVersion: Int) {
assertEquals(1, oldVersion)
assertEquals(LATEST_LEGACY_MIGRATION, newVersion)
}
}).build()
migrationContainer = createMigrationContainer(context, sharedPreferencesHandler)

openHelper = FrameworkSQLiteOpenHelperFactory().asCacheControlled().create(config)
openHelper = FrameworkSQLiteOpenHelperFactory().asCacheControlled().create(configureTestDatabase(context, TEST_DB))
openHelper.setWriteAheadLoggingEnabled(false)
db = openHelper.writableDatabase
}
Expand Down

0 comments on commit 998a476

Please sign in to comment.