diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseTable.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseTable.java index 3d61081e35..25683883aa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseTable.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseTable.java @@ -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); + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt index 221d7aed96..84590ee72d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt @@ -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) diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/DatabaseTableTest.kt b/app/src/test/java/org/thoughtcrime/securesms/database/DatabaseTableTest.kt new file mode 100644 index 0000000000..08ca8a7f9e --- /dev/null +++ b/app/src/test/java/org/thoughtcrime/securesms/database/DatabaseTableTest.kt @@ -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) + } +} diff --git a/app/src/test/java/org/thoughtcrime/securesms/testing/TestSignalDatabase.kt b/app/src/test/java/org/thoughtcrime/securesms/testing/TestSignalDatabase.kt index e33bdd4476..5db3bee0a1 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/testing/TestSignalDatabase.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/testing/TestSignalDatabase.kt @@ -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)