From 40e0a405ad00c438bb77c472d9cd2ec1b3f0e140 Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Fri, 10 Dec 2021 12:04:27 -0300 Subject: [PATCH] Add a method for checking for existence of database This will help us in the UI to not start the lifecycle automatically. Also ensure that setup token is always set automatically via a DB hook --- .../briarproject/mailbox/android/AppModule.kt | 8 ++- .../briarproject/mailbox/cli/JavaCliModule.kt | 12 ++-- .../java/org/briarproject/mailbox/cli/Main.kt | 13 ++--- .../briarproject/mailbox/core/CoreModule.kt | 2 + .../mailbox/core/files/FileManager.kt | 19 ++++++- .../mailbox/core/files/FileProvider.kt | 5 ++ .../mailbox/core/settings/SettingsManager.kt | 7 +++ .../core/settings/SettingsManagerImpl.kt | 4 ++ .../mailbox/core/setup/SetupManager.kt | 55 ++++++++++++++----- .../mailbox/core/setup/SetupModule.kt | 39 +++++++++++++ .../mailbox/core/setup/WipeManager.kt | 3 - .../mailbox/core/TestComponent.kt | 4 +- .../briarproject/mailbox/core/TestModule.kt | 10 +++- .../core/files/FileManagerIntegrationTest.kt | 7 --- .../mailbox/core/server/IntegrationTest.kt | 11 +++- .../mailbox/core/setup/SetupManagerTest.kt | 31 +---------- .../core/setup/WipingWipeRouteManagerTest.kt | 6 +- 17 files changed, 159 insertions(+), 77 deletions(-) create mode 100644 mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/SetupModule.kt diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/AppModule.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/AppModule.kt index fce42c95..ec7f6a90 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/AppModule.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/AppModule.kt @@ -45,17 +45,19 @@ import javax.inject.Singleton internal class AppModule { @Singleton @Provides - fun provideDatabaseConfig(app: Application) = object : DatabaseConfig { + fun provideDatabaseConfig(fileProvider: FileProvider) = object : DatabaseConfig { override fun getDatabaseDirectory(): File { - return app.applicationContext.getDir("db", MODE_PRIVATE) + // The database itself does mkdirs() and we use the existence to see if DB exists + return File(fileProvider.root, "db") } } @Singleton @Provides fun provideFileProvider(app: Application) = object : FileProvider { - private val tempFilesDir = File(app.applicationContext.cacheDir, "tmp").also { it.mkdirs() } + override val root: File get() = app.applicationContext.filesDir override val folderRoot = app.applicationContext.getDir("folders", MODE_PRIVATE) + private val tempFilesDir = File(app.applicationContext.cacheDir, "tmp").also { it.mkdirs() } override fun getTemporaryFile(fileId: String) = File(tempFilesDir, fileId) override fun getFolder(folderId: String) = File(folderRoot, folderId).also { it.mkdirs() } diff --git a/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/JavaCliModule.kt b/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/JavaCliModule.kt index 58774946..eb5d4421 100644 --- a/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/JavaCliModule.kt +++ b/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/JavaCliModule.kt @@ -89,21 +89,17 @@ internal class JavaCliModule { @Singleton @Provides - fun provideDatabaseConfig() = object : DatabaseConfig { + fun provideDatabaseConfig(fileProvider: FileProvider) = object : DatabaseConfig { override fun getDatabaseDirectory(): File { - val dbDir = File(dataDir, "db") - if (!dbDir.exists() && !dbDir.mkdirs()) { - throw IOException("dbDir could not be created: ${dbDir.absolutePath}") - } else if (!dbDir.isDirectory) { - throw IOException("dbDir is not a directory: ${dbDir.absolutePath}") - } - return dbDir + // The database itself does mkdirs() and we use the existence to see if DB exists + return File(fileProvider.root, "db") } } @Singleton @Provides fun provideFileProvider() = object : FileProvider { + override val root: File get() = dataDir private val tempFilesDir = File(dataDir, "tmp").also { it.mkdirs() } override val folderRoot = File(dataDir, "folders").also { it.mkdirs() } diff --git a/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/Main.kt b/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/Main.kt index 44cf1c5e..216e13ee 100644 --- a/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/Main.kt +++ b/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/Main.kt @@ -100,6 +100,7 @@ class Main : CliktCommand( } ) + // This is a cli app, we'll always want this fully up when started, so start lifecycle lifecycleManager.startServices() lifecycleManager.waitForStartup() @@ -110,16 +111,14 @@ class Main : CliktCommand( exitProcess(1) } - // TODO this is obviously not the final code, just a stub to get us started - val setupTokenExists = db.read { txn -> - setupManager.getSetupToken(txn) != null - } val ownerTokenExists = db.read { txn -> setupManager.getOwnerToken(txn) != null } - if (!setupTokenExists && !ownerTokenExists) setupManager.restartSetup() - qrCodeEncoder.getQrCodeBitMatrix()?.let { - println(QrCodeRenderer.getQrString(it)) + if (!ownerTokenExists) { + // If not set up, show QR code for manual setup + qrCodeEncoder.getQrCodeBitMatrix()?.let { + println(QrCodeRenderer.getQrString(it)) + } } } diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/CoreModule.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/CoreModule.kt index 31dce9ca..631bfebf 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/CoreModule.kt +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/CoreModule.kt @@ -28,6 +28,7 @@ import org.briarproject.mailbox.core.event.EventModule import org.briarproject.mailbox.core.lifecycle.LifecycleModule import org.briarproject.mailbox.core.server.WebServerModule import org.briarproject.mailbox.core.settings.SettingsModule +import org.briarproject.mailbox.core.setup.SetupModule import org.briarproject.mailbox.core.system.Clock import org.briarproject.mailbox.core.tor.TorModule import javax.inject.Singleton @@ -37,6 +38,7 @@ import javax.inject.Singleton EventModule::class, LifecycleModule::class, DatabaseModule::class, + SetupModule::class, WebServerModule::class, SettingsModule::class, TorModule::class, diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/files/FileManager.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/files/FileManager.kt index dc113ea2..675dfdc0 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/files/FileManager.kt +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/files/FileManager.kt @@ -28,9 +28,12 @@ import io.ktor.response.respondFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.briarproject.mailbox.core.db.Database +import org.briarproject.mailbox.core.db.DatabaseConfig import org.briarproject.mailbox.core.server.AuthException import org.briarproject.mailbox.core.server.AuthManager import org.briarproject.mailbox.core.server.MailboxPrincipal +import org.briarproject.mailbox.core.setup.SetupManager +import org.briarproject.mailbox.core.setup.WipeManager import org.briarproject.mailbox.core.system.InvalidIdException import org.briarproject.mailbox.core.system.RandomIdManager import org.slf4j.LoggerFactory.getLogger @@ -40,10 +43,24 @@ private val LOG = getLogger(FileManager::class.java) class FileManager @Inject constructor( private val fileProvider: FileProvider, + private val dbConfig: DatabaseConfig, ) { + + /** + * Used by [SetupManager] to test for the existence of the database. + */ + fun hasDbFile(): Boolean { + val dbDir = dbConfig.getDatabaseDirectory() + println("${dbDir.absolutePath} exists: ${dbDir.exists()} isDirectory: ${dbDir.isDirectory}") + return dbDir.isDirectory + } + + /** + * Used by [WipeManager] to wipe all files. + */ fun deleteAllFiles(): Boolean { var allDeleted = true - fileProvider.folderRoot.listFiles()?.forEach { folder -> + fileProvider.root.listFiles()?.forEach { folder -> if (!folder.deleteRecursively()) { allDeleted = false LOG.warn("Not everything in $folder could get deleted.") diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/files/FileProvider.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/files/FileProvider.kt index b8a10f5c..f9017f28 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/files/FileProvider.kt +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/files/FileProvider.kt @@ -22,6 +22,11 @@ package org.briarproject.mailbox.core.files import java.io.File interface FileProvider { + /** + * The root files directory. + * Attention: This is not guaranteed to be the parent of other files on all platforms. + */ + val root: File val folderRoot: File fun getTemporaryFile(fileId: String): File fun getFolder(folderId: String): File diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/settings/SettingsManager.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/settings/SettingsManager.kt index d7ab1ea2..2b631bfb 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/settings/SettingsManager.kt +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/settings/SettingsManager.kt @@ -41,4 +41,11 @@ interface SettingsManager { */ @Throws(DbException::class) fun mergeSettings(s: Settings, namespace: String) + + /** + * Merges the given settings with any existing settings in the given + * namespace. + */ + @Throws(DbException::class) + fun mergeSettings(txn: Transaction, s: Settings, namespace: String) } diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/settings/SettingsManagerImpl.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/settings/SettingsManagerImpl.kt index 49930785..a8e404eb 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/settings/SettingsManagerImpl.kt +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/settings/SettingsManagerImpl.kt @@ -43,4 +43,8 @@ internal class SettingsManagerImpl(private val db: Database) : SettingsManager { override fun mergeSettings(s: Settings, namespace: String) { db.write { txn -> db.mergeSettings(txn, s, namespace) } } + + override fun mergeSettings(txn: Transaction, s: Settings, namespace: String) { + db.mergeSettings(txn, s, namespace) + } } diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/SetupManager.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/SetupManager.kt index c74d1fac..b1d5aaa1 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/SetupManager.kt +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/SetupManager.kt @@ -25,6 +25,8 @@ import io.ktor.http.HttpStatusCode import io.ktor.response.respond import org.briarproject.mailbox.core.db.DbException import org.briarproject.mailbox.core.db.Transaction +import org.briarproject.mailbox.core.files.FileManager +import org.briarproject.mailbox.core.lifecycle.LifecycleManager.OpenDatabaseHook import org.briarproject.mailbox.core.server.AuthException import org.briarproject.mailbox.core.server.AuthManager import org.briarproject.mailbox.core.settings.Settings @@ -36,23 +38,50 @@ private const val SETTINGS_NAMESPACE_OWNER = "owner" private const val SETTINGS_SETUP_TOKEN = "setupToken" private const val SETTINGS_OWNER_TOKEN = "ownerToken" -class SetupManager @Inject constructor( +interface SetupManager : OpenDatabaseHook { + /** + * True if a database has been setup. + * This is usually the case, if the lifecycle has been started once. + * The Mailbox might still need pairing/linking. + * This is false after wiping. + */ + val hasDb: Boolean + + @Throws(DbException::class) + fun setToken(setupToken: String?, ownerToken: String?) + + fun getSetupToken(txn: Transaction): String? + + @Throws(DbException::class) + fun getOwnerToken(txn: Transaction): String? +} + +class SetupManagerImpl @Inject constructor( private val randomIdManager: RandomIdManager, private val settingsManager: SettingsManager, -) { + private val fileManager: FileManager, +) : SetupManager { - /** - * Stores a new single-use setup token and wipes the owner auth token, if one existed. - */ - fun restartSetup() { - val settings = Settings() - settings[SETTINGS_SETUP_TOKEN] = randomIdManager.getNewRandomId() - settings[SETTINGS_OWNER_TOKEN] = null - settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE_OWNER) + override val hasDb: Boolean get() = fileManager.hasDbFile() + + override fun onDatabaseOpened(txn: Transaction) { + val settings = settingsManager.getSettings(txn, SETTINGS_NAMESPACE_OWNER) + val setupToken = settings[SETTINGS_SETUP_TOKEN] + val ownerToken = settings[SETTINGS_OWNER_TOKEN] + // ensure that setup token is initialized if both tokens are empty + if (setupToken == null && ownerToken == null) { + settings[SETTINGS_SETUP_TOKEN] = randomIdManager.getNewRandomId() + settingsManager.mergeSettings(txn, settings, SETTINGS_NAMESPACE_OWNER) + } } + /** + * Sets either the [setupToken] or the [ownerToken]. + * Can not set both at once. + */ @Throws(DbException::class) - fun setToken(setupToken: String?, ownerToken: String?) { + override fun setToken(setupToken: String?, ownerToken: String?) { + require(setupToken == null || ownerToken == null) { "Can not set both tokens" } val settings = Settings() if (setupToken != null) randomIdManager.assertIsRandomId(setupToken) settings[SETTINGS_SETUP_TOKEN] = setupToken @@ -61,13 +90,13 @@ class SetupManager @Inject constructor( settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE_OWNER) } - fun getSetupToken(txn: Transaction): String? { + override fun getSetupToken(txn: Transaction): String? { val settings = settingsManager.getSettings(txn, SETTINGS_NAMESPACE_OWNER) return settings[SETTINGS_SETUP_TOKEN] } @Throws(DbException::class) - fun getOwnerToken(txn: Transaction): String? { + override fun getOwnerToken(txn: Transaction): String? { val settings = settingsManager.getSettings(txn, SETTINGS_NAMESPACE_OWNER) return settings[SETTINGS_OWNER_TOKEN] } diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/SetupModule.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/SetupModule.kt new file mode 100644 index 00000000..55b9fe2f --- /dev/null +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/SetupModule.kt @@ -0,0 +1,39 @@ +/* + * Briar Mailbox + * Copyright (C) 2021-2022 The Briar Project + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + * + */ + +package org.briarproject.mailbox.core.setup + +import dagger.Module +import dagger.Provides +import org.briarproject.mailbox.core.lifecycle.LifecycleManager +import javax.inject.Singleton + +@Module +class SetupModule { + @Provides + @Singleton + fun provideSetupManager( + lifecycleManager: LifecycleManager, + setupManagerImpl: SetupManagerImpl, + ): SetupManager { + return setupManagerImpl.also { + lifecycleManager.registerOpenDatabaseHook(it) + } + } +} diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/WipeManager.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/WipeManager.kt index 59629b3c..6fde3598 100644 --- a/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/WipeManager.kt +++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/setup/WipeManager.kt @@ -30,7 +30,6 @@ import org.briarproject.mailbox.core.lifecycle.LifecycleManager import org.briarproject.mailbox.core.server.AuthException import org.briarproject.mailbox.core.server.MailboxPrincipal import org.briarproject.mailbox.core.server.MailboxPrincipal.OwnerPrincipal -import org.briarproject.mailbox.core.util.IoUtils import javax.inject.Inject class WipeManager @Inject constructor( @@ -44,8 +43,6 @@ class WipeManager @Inject constructor( */ fun wipeDatabaseAndFiles() { db.dropAllTablesAndClose() - val dir = databaseConfig.getDatabaseDirectory() - IoUtils.deleteFileOrDir(dir) fileManager.deleteAllFiles() } diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestComponent.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestComponent.kt index e0ad498e..960874cd 100644 --- a/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestComponent.kt +++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestComponent.kt @@ -9,7 +9,7 @@ import org.briarproject.mailbox.core.lifecycle.LifecycleManager import org.briarproject.mailbox.core.settings.MetadataManager import org.briarproject.mailbox.core.settings.SettingsManager import org.briarproject.mailbox.core.setup.SetupManager -import org.briarproject.mailbox.core.system.RandomIdManager +import org.briarproject.mailbox.core.setup.WipeManager import javax.inject.Singleton @Singleton @@ -26,7 +26,7 @@ interface TestComponent { fun getFileManager(): FileManager fun getDatabaseConfig(): DatabaseConfig fun getDatabase(): Database - fun getRandomIdManager(): RandomIdManager fun getFileProvider(): FileProvider fun getMetadataManager(): MetadataManager + fun getWipeManager(): WipeManager } diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestModule.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestModule.kt index 2a1adc06..1764c149 100644 --- a/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestModule.kt +++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/TestModule.kt @@ -10,6 +10,7 @@ import org.briarproject.mailbox.core.files.FileProvider import org.briarproject.mailbox.core.lifecycle.LifecycleModule import org.briarproject.mailbox.core.server.WebServerModule import org.briarproject.mailbox.core.settings.SettingsModule +import org.briarproject.mailbox.core.setup.SetupModule import org.briarproject.mailbox.core.system.Clock import java.io.File import javax.inject.Singleton @@ -18,6 +19,7 @@ import javax.inject.Singleton includes = [ LifecycleModule::class, TestDatabaseModule::class, + SetupModule::class, WebServerModule::class, SettingsModule::class, // no Tor module @@ -40,10 +42,14 @@ internal class TestModule(private val tempDir: File) { @Singleton @Provides fun provideFileProvider() = object : FileProvider { - private val tempFilesDir = File(tempDir, "tmp").also { it.mkdirs() } + override val root: File get() = tempDir override val folderRoot = File(tempDir, "folders") + private val tempFilesDir = File(tempDir, "tmp").also { it.mkdirs() } - override fun getTemporaryFile(fileId: String) = File(tempFilesDir, fileId) + override fun getTemporaryFile(fileId: String) = File(tempFilesDir, fileId).also { file -> + // we delete root at the end of each test, so tempFilesDir gets deleted as well + file.parentFile.mkdirs() + } override fun getFolder(folderId: String) = File(folderRoot, folderId).also { it.mkdirs() } override fun getFile(folderId: String, fileId: String) = File(getFolder(folderId), fileId) } diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/files/FileManagerIntegrationTest.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/files/FileManagerIntegrationTest.kt index de2f1d04..fd0d67b9 100644 --- a/mailbox-core/src/test/java/org/briarproject/mailbox/core/files/FileManagerIntegrationTest.kt +++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/files/FileManagerIntegrationTest.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.runBlocking import org.briarproject.mailbox.core.TestUtils.assertTimestampRecent import org.briarproject.mailbox.core.TestUtils.getNewRandomId import org.briarproject.mailbox.core.server.IntegrationTest -import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions.assertArrayEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -31,12 +30,6 @@ class FileManagerIntegrationTest : IntegrationTest() { addContact(contact2) } - @AfterEach - override fun clearDb() { - super.clearDb() - testComponent.getFileManager().deleteAllFiles() - } - @Test fun `post new file rejects wrong token`(): Unit = runBlocking { val response: HttpResponse = httpClient.post("$baseUrl/files/${getNewRandomId()}") { diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/server/IntegrationTest.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/server/IntegrationTest.kt index 10afd983..bbb9f151 100644 --- a/mailbox-core/src/test/java/org/briarproject/mailbox/core/server/IntegrationTest.kt +++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/server/IntegrationTest.kt @@ -24,6 +24,8 @@ import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.TestInstance.Lifecycle import org.junit.jupiter.api.io.TempDir import java.io.File +import kotlin.test.assertFalse +import kotlin.test.assertTrue @TestInstance(Lifecycle.PER_CLASS) abstract class IntegrationTest(private val installJsonFeature: Boolean = true) { @@ -31,7 +33,9 @@ abstract class IntegrationTest(private val installJsonFeature: Boolean = true) { protected lateinit var testComponent: TestComponent protected val db by lazy { testComponent.getDatabase() } private val lifecycleManager by lazy { testComponent.getLifecycleManager() } + protected val setupManager by lazy { testComponent.getSetupManager() } protected val metadataManager by lazy { testComponent.getMetadataManager() } + private val wipeManager by lazy { testComponent.getWipeManager() } protected val httpClient = HttpClient(CIO) { expectSuccess = false // prevents exceptions on non-success responses if (installJsonFeature) { @@ -55,6 +59,7 @@ abstract class IntegrationTest(private val installJsonFeature: Boolean = true) { fun setUp(@TempDir tempDir: File) { testComponent = DaggerTestComponent.builder().testModule(TestModule(tempDir)).build() testComponent.injectCoreEagerSingletons() + assertFalse(setupManager.hasDb) lifecycleManager.startServices() lifecycleManager.waitForStartup() } @@ -73,11 +78,13 @@ abstract class IntegrationTest(private val installJsonFeature: Boolean = true) { // clears [metadataManager.ownerConnectionTime] metadataManager.onDatabaseOpened(txn) } + assertTrue(setupManager.hasDb) } @AfterEach - open fun clearDb() { - db.dropAllTablesAndClose() + open fun wipe() { + wipeManager.wipeDatabaseAndFiles() + assertFalse(setupManager.hasDb) } protected fun addOwnerToken() { diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/setup/SetupManagerTest.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/setup/SetupManagerTest.kt index 83e40b88..86f28ca6 100644 --- a/mailbox-core/src/test/java/org/briarproject/mailbox/core/setup/SetupManagerTest.kt +++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/setup/SetupManagerTest.kt @@ -7,38 +7,10 @@ import kotlinx.coroutines.runBlocking import org.briarproject.mailbox.core.server.IntegrationTest import org.junit.jupiter.api.Test import kotlin.test.assertEquals -import kotlin.test.assertNotNull import kotlin.test.assertNull class SetupManagerTest : IntegrationTest() { - private val setupManager by lazy { testComponent.getSetupManager() } - - @Test - fun `restarting setup wipes owner token and creates setup token`() { - // initially, there's no setup and no owner token - db.read { txn -> - assertNull(setupManager.getSetupToken(txn)) - assertNull(setupManager.getOwnerToken(txn)) - } - - // setting an owner token stores it in DB - setupManager.setToken(null, ownerToken) - db.read { txn -> - assertNull(setupManager.getSetupToken(txn)) - assertEquals(ownerToken, setupManager.getOwnerToken(txn)) - } - - // restarting setup wipes owner token, creates setup token - setupManager.restartSetup() - db.read { txn -> - val setupToken = setupManager.getSetupToken(txn) - assertNotNull(setupToken) - testComponent.getRandomIdManager().assertIsRandomId(setupToken) - assertNull(setupManager.getOwnerToken(txn)) - } - } - @Test fun `setup request gets rejected when using non-setup token`() = runBlocking { // initially, there's no setup and no owner token @@ -78,6 +50,9 @@ class SetupManagerTest : IntegrationTest() { // set a setup-token setupManager.setToken(token, null) + // we are not yet set up + assertNull(db.read { txn -> setupManager.getOwnerToken(txn) }) + // use it for setup PUT request val response: SetupResponse = httpClient.put("$baseUrl/setup") { authenticateWithToken(token) diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/setup/WipingWipeRouteManagerTest.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/setup/WipingWipeRouteManagerTest.kt index 984af156..d29fd75b 100644 --- a/mailbox-core/src/test/java/org/briarproject/mailbox/core/setup/WipingWipeRouteManagerTest.kt +++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/setup/WipingWipeRouteManagerTest.kt @@ -41,7 +41,11 @@ class WipingWipeRouteManagerTest : IntegrationTest() { // no more files are stored val folderRoot = testComponent.getFileProvider().folderRoot - assertTrue(folderRoot.listFiles()?.isEmpty() ?: false) + assertFalse(folderRoot.exists()) + + // file root has been cleared + val root = testComponent.getFileProvider().root + assertTrue(root.listFiles()?.isEmpty() ?: false) // no more contacts in DB - contacts table is gone // it actually fails because db is closed though -- GitLab