From a3b25acbb7b67c996d3e751ff81fc419e49c81dc Mon Sep 17 00:00:00 2001 From: Alexander Semenov Date: Tue, 16 Feb 2021 16:13:18 +0200 Subject: [PATCH 1/3] Demo of crash --- .../tests/SQLComileStatementFinalizeTest.java | 83 +++++++++++++++++++ .../net/zetetic/tests/TestSuiteRunner.java | 1 + 2 files changed, 84 insertions(+) create mode 100644 app/src/main/java/net/zetetic/tests/SQLComileStatementFinalizeTest.java diff --git a/app/src/main/java/net/zetetic/tests/SQLComileStatementFinalizeTest.java b/app/src/main/java/net/zetetic/tests/SQLComileStatementFinalizeTest.java new file mode 100644 index 0000000..d34206d --- /dev/null +++ b/app/src/main/java/net/zetetic/tests/SQLComileStatementFinalizeTest.java @@ -0,0 +1,83 @@ +package net.zetetic.tests; + +import net.sqlcipher.database.SQLiteDatabase; +import net.sqlcipher.database.SQLiteStatement; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +public class SQLComileStatementFinalizeTest extends SQLCipherTest { + + private final int count = 2; + + @Override + public boolean execute(final SQLiteDatabase database) { + + final CountDownLatch latchMain = new CountDownLatch(1); + final CountDownLatch latchTransaction = new CountDownLatch(1); + final CountDownLatch latchSQLRelease = new CountDownLatch(1); + + database.execSQL("CREATE TABLE TestTable(text_value TEXT);"); + + new Thread(new Runnable() { + @Override + public void run() { + + for (int i = 0; i < count; i++) { + SQLiteStatement statement = database.compileStatement("DELETE FROM TestTable"); + statement.executeUpdateDelete(); + } + + latchSQLRelease.countDown(); + try { + latchTransaction.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }).start(); + + new Thread(new Runnable() { + @Override + public void run() { + try { + latchSQLRelease.await(); + + database.beginTransaction(); + + latchTransaction.countDown(); + + long start = System.currentTimeMillis(); + while (System.currentTimeMillis() < start + TimeUnit.SECONDS.toMillis(40)) { + new Object(); + System.gc(); + } + database.setTransactionSuccessful(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + database.endTransaction(); + } + + latchMain.countDown(); + } + }).start(); + + + try { + latchMain.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + return false; + } + + return true; + } + + @Override + public String getName() { + return "Finalize SQLComileStatement causes crash on API 24-25"; + } + + +} diff --git a/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java b/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java index 7d869cc..a1f23e5 100644 --- a/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java +++ b/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java @@ -70,6 +70,7 @@ private void runSuite() { private List getTestsToRun() { List tests = new ArrayList<>(); + tests.add(new SQLComileStatementFinalizeTest()); tests.add(new SummingStepTest()); tests.add(new JsonCastTest()); From de8808079d257a964efad08fc52640956d5d1bd2 Mon Sep 17 00:00:00 2001 From: Alexander Semenov Date: Tue, 16 Feb 2021 16:21:18 +0200 Subject: [PATCH 2/3] Rename --- ...tFinalizeTest.java => SQLCompileStatementFinalizeTest.java} | 3 ++- app/src/main/java/net/zetetic/tests/TestSuiteRunner.java | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) rename app/src/main/java/net/zetetic/tests/{SQLComileStatementFinalizeTest.java => SQLCompileStatementFinalizeTest.java} (97%) diff --git a/app/src/main/java/net/zetetic/tests/SQLComileStatementFinalizeTest.java b/app/src/main/java/net/zetetic/tests/SQLCompileStatementFinalizeTest.java similarity index 97% rename from app/src/main/java/net/zetetic/tests/SQLComileStatementFinalizeTest.java rename to app/src/main/java/net/zetetic/tests/SQLCompileStatementFinalizeTest.java index d34206d..4606b4b 100644 --- a/app/src/main/java/net/zetetic/tests/SQLComileStatementFinalizeTest.java +++ b/app/src/main/java/net/zetetic/tests/SQLCompileStatementFinalizeTest.java @@ -6,7 +6,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -public class SQLComileStatementFinalizeTest extends SQLCipherTest { +public class SQLCompileStatementFinalizeTest extends SQLCipherTest { private final int count = 2; @@ -29,6 +29,7 @@ public void run() { } latchSQLRelease.countDown(); + try { latchTransaction.await(); } catch (InterruptedException e) { diff --git a/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java b/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java index a1f23e5..86cd140 100644 --- a/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java +++ b/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java @@ -8,7 +8,6 @@ import net.sqlcipher.CursorWindow; import net.sqlcipher.CursorWindowAllocation; -import net.sqlcipher.database.SQLiteDatabase; import net.zetetic.ZeteticApplication; import java.util.ArrayList; @@ -70,7 +69,7 @@ private void runSuite() { private List getTestsToRun() { List tests = new ArrayList<>(); - tests.add(new SQLComileStatementFinalizeTest()); + tests.add(new SQLCompileStatementFinalizeTest()); tests.add(new SummingStepTest()); tests.add(new JsonCastTest()); From 92acbf100fa5332afba21ee475aa75b5de948be9 Mon Sep 17 00:00:00 2001 From: Oleksandr Semenov Date: Fri, 11 Jun 2021 15:12:02 +0300 Subject: [PATCH 3/3] Updated tests with locking and non-locking versions --- .../SQLCompileStatementFinalizeTest.java | 26 ++++++++++++++----- .../net/zetetic/tests/TestSuiteRunner.java | 3 ++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/net/zetetic/tests/SQLCompileStatementFinalizeTest.java b/app/src/main/java/net/zetetic/tests/SQLCompileStatementFinalizeTest.java index 4606b4b..23cc063 100644 --- a/app/src/main/java/net/zetetic/tests/SQLCompileStatementFinalizeTest.java +++ b/app/src/main/java/net/zetetic/tests/SQLCompileStatementFinalizeTest.java @@ -1,25 +1,36 @@ package net.zetetic.tests; +import android.util.Log; + +import androidx.annotation.NonNull; + import net.sqlcipher.database.SQLiteDatabase; import net.sqlcipher.database.SQLiteStatement; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class SQLCompileStatementFinalizeTest extends SQLCipherTest { private final int count = 2; + private final boolean isLocking; + + public SQLCompileStatementFinalizeTest(Boolean useLocking) { + isLocking = useLocking; + } @Override public boolean execute(final SQLiteDatabase database) { - + database.setLockingEnabled(isLocking); final CountDownLatch latchMain = new CountDownLatch(1); final CountDownLatch latchTransaction = new CountDownLatch(1); final CountDownLatch latchSQLRelease = new CountDownLatch(1); database.execSQL("CREATE TABLE TestTable(text_value TEXT);"); - new Thread(new Runnable() { + Thread thread1 = new Thread(new Runnable() { @Override public void run() { @@ -36,9 +47,9 @@ public void run() { e.printStackTrace(); } } - }).start(); + }); - new Thread(new Runnable() { + Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { @@ -62,8 +73,10 @@ public void run() { latchMain.countDown(); } - }).start(); + }); + thread1.start(); + thread2.start(); try { latchMain.await(); @@ -77,8 +90,7 @@ public void run() { @Override public String getName() { - return "Finalize SQLComileStatement causes crash on API 24-25"; + return "SQLCompileStatement crash, locking=" + isLocking; } - } diff --git a/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java b/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java index 86cd140..bfff213 100644 --- a/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java +++ b/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java @@ -69,7 +69,8 @@ private void runSuite() { private List getTestsToRun() { List tests = new ArrayList<>(); - tests.add(new SQLCompileStatementFinalizeTest()); + tests.add(new SQLCompileStatementFinalizeTest(false)); + tests.add(new SQLCompileStatementFinalizeTest(true)); tests.add(new SummingStepTest()); tests.add(new JsonCastTest());