From 4a9a07a9ef274fb24bfc7101c4981d906af5e45e Mon Sep 17 00:00:00 2001 From: Clark Date: Mon, 22 May 2023 17:16:38 -0400 Subject: [PATCH] Run post transaction tasks only after root transaction ends. --- .../securesms/database/SQLiteDatabaseTest.kt | 41 +++++++++++++++++++ ...umentationApplicationDependencyProvider.kt | 4 +- .../securesms/database/SQLiteDatabase.java | 11 ++--- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/SQLiteDatabaseTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/SQLiteDatabaseTest.kt index c217c9b630..ba6d6aa712 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/SQLiteDatabaseTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/SQLiteDatabaseTest.kt @@ -180,4 +180,45 @@ class SQLiteDatabaseTest { assertTrue(hasRun1.get()) assertTrue(hasRun2.get()) } + + @Test + fun runPostSuccessfulTransaction_runsAfterMainTransactionInNestedTransaction() { + val hasRun1 = AtomicBoolean(false) + val hasRun2 = AtomicBoolean(false) + + db.beginTransaction() + + db.runPostSuccessfulTransaction { + assertFalse(hasRun1.get()) + assertFalse(hasRun2.get()) + hasRun1.set(true) + } + + assertFalse(hasRun1.get()) + assertFalse(hasRun2.get()) + + db.beginTransaction() + + db.runPostSuccessfulTransaction { + assertTrue(hasRun1.get()) + assertFalse(hasRun2.get()) + hasRun2.set(true) + } + + db.setTransactionSuccessful() + + assertFalse(hasRun1.get()) + assertFalse(hasRun2.get()) + + db.endTransaction() + db.setTransactionSuccessful() + + assertFalse(hasRun1.get()) + assertFalse(hasRun2.get()) + + db.endTransaction() + + assertTrue(hasRun1.get()) + assertTrue(hasRun2.get()) + } } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt index 680e85add2..5697867e9a 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt @@ -82,10 +82,12 @@ class InstrumentationApplicationDependencyProvider(application: Application, def arrayOf(SignalKeyBackupServiceUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), arrayOf(SignalStorageUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), arrayOf(SignalCdsiUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), + emptyArray(), emptyList(), Optional.of(SignalServiceNetworkAccess.DNS), Optional.empty(), - Base64.decode(BuildConfig.ZKGROUP_SERVER_PUBLIC_PARAMS) + Base64.decode(BuildConfig.ZKGROUP_SERVER_PUBLIC_PARAMS), + Base64.decode(BuildConfig.GENERIC_SERVER_PUBLIC_PARAMS) ) serviceNetworkAccessMock = mock { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java index 40e1215d63..9759ac5735 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java @@ -313,12 +313,13 @@ public class SQLiteDatabase implements SupportSQLiteDatabase { public void endTransaction() { trace("endTransaction()", wrapped::endTransaction); traceLockEnd(); - - Set tasks = getPostSuccessfulTransactionTasks(); - for (Runnable r : new HashSet<>(tasks)) { - r.run(); + if (!wrapped.inTransaction()) { + Set tasks = getPostSuccessfulTransactionTasks(); + for (Runnable r : new HashSet<>(tasks)) { + r.run(); + } + tasks.clear(); } - tasks.clear(); } public void setTransactionSuccessful() {