Keep database snapshot tables out of the global table registries.

This commit is contained in:
Greyson Parrelli
2026-08-19 19:05:47 -04:00
committed by Cody Henthorne
parent 265331f3e2
commit daf89f79bd
4 changed files with 66 additions and 7 deletions
@@ -40,12 +40,14 @@ public abstract class DatabaseTable {
this.context = context;
this.databaseHelper = databaseHelper;
if (this instanceof RecipientIdDatabaseReference) {
recipientIdDatabaseTables.add((RecipientIdDatabaseReference) this);
}
if (databaseHelper != null && databaseHelper.isPrimaryDatabase()) {
if (this instanceof RecipientIdDatabaseReference) {
recipientIdDatabaseTables.add((RecipientIdDatabaseReference) this);
}
if (this instanceof ThreadIdDatabaseReference) {
threadIdDatabaseTables.add((ThreadIdDatabaseReference) this);
if (this instanceof ThreadIdDatabaseReference) {
threadIdDatabaseTables.add((ThreadIdDatabaseReference) this);
}
}
}
@@ -30,6 +30,8 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data
),
SignalDatabaseOpenHelper {
val isPrimaryDatabase: Boolean = name == DATABASE_NAME
val messageTable: MessageTable = MessageTable(context, this)
val attachmentTable: AttachmentTable = AttachmentTable(context, this, attachmentSecret)
val mediaTable: MediaTable = MediaTable(context, this)
@@ -0,0 +1,54 @@
/*
* Copyright 2026 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.database
import android.app.Application
import androidx.test.core.app.ApplicationProvider
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.testing.JdbcSqliteDatabase
import org.thoughtcrime.securesms.testing.TestSignalDatabase
@RunWith(RobolectricTestRunner::class)
@Config(manifest = Config.NONE, application = Application::class)
class DatabaseTableTest {
@Before
fun setUp() {
DatabaseTable.clearTableReferencesForTests()
}
@After
fun tearDown() {
DatabaseTable.clearTableReferencesForTests()
}
@Test
fun snapshotDatabasesDoNotRegisterTheirTables() {
createDatabase(SignalDatabase.DATABASE_NAME)
val recipientTableCount = DatabaseTable.recipientIdDatabaseTables.size
val threadTableCount = DatabaseTable.threadIdDatabaseTables.size
assertTrue(recipientTableCount > 0)
assertTrue(threadTableCount > 0)
createDatabase("remote-signal-snapshot.db")
assertEquals(recipientTableCount, DatabaseTable.recipientIdDatabaseTables.size)
assertEquals(threadTableCount, DatabaseTable.threadIdDatabaseTables.size)
}
private fun createDatabase(name: String): TestSignalDatabase {
val db = JdbcSqliteDatabase.createInMemory()
return TestSignalDatabase(ApplicationProvider.getApplicationContext(), db, db, name)
}
}
@@ -15,8 +15,9 @@ import net.zetetic.database.sqlcipher.SQLiteDatabase as SQLCipherSQLiteDatabase
class TestSignalDatabase(
context: Application,
val supportReadableDatabase: SupportSQLiteDatabase,
val supportWritableDatabase: SupportSQLiteDatabase
) : SignalDatabase(context, DatabaseSecret(ByteArray(32).apply { SecureRandom().nextBytes(this) }), AttachmentSecret(null, null, ByteArray(32).apply { SecureRandom().nextBytes(this) })) {
val supportWritableDatabase: SupportSQLiteDatabase,
name: String = SignalDatabase.DATABASE_NAME
) : SignalDatabase(context, DatabaseSecret(ByteArray(32).apply { SecureRandom().nextBytes(this) }), AttachmentSecret(null, null, ByteArray(32).apply { SecureRandom().nextBytes(this) }), name) {
constructor(context: Application, testOpenHelper: SupportSQLiteOpenHelper) : this(context, testOpenHelper.readableDatabase, testOpenHelper.writableDatabase)