From 8917eb80a4e8f15a85859259074fa9788572944a Mon Sep 17 00:00:00 2001 From: Oleksandr Semenov Date: Wed, 3 Mar 2021 15:17:13 +0200 Subject: [PATCH] Nested transactions withn listener issue --- .../net/zetetic/tests/TestSuiteRunner.java | 9 ++- .../TransactionNestedWithListenerTest.java | 77 +++++++++++++++++++ .../TransactionNestedWithListenerTest2.java | 73 ++++++++++++++++++ 3 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/net/zetetic/tests/support/TransactionNestedWithListenerTest.java create mode 100644 app/src/main/java/net/zetetic/tests/support/TransactionNestedWithListenerTest2.java diff --git a/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java b/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java index 7d869cc..48cc29d 100644 --- a/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java +++ b/app/src/main/java/net/zetetic/tests/TestSuiteRunner.java @@ -10,6 +10,8 @@ import net.sqlcipher.CursorWindowAllocation; import net.sqlcipher.database.SQLiteDatabase; import net.zetetic.ZeteticApplication; +import net.zetetic.tests.support.TransactionNestedWithListenerTest; +import net.zetetic.tests.support.TransactionNestedWithListenerTest2; import java.util.ArrayList; import java.util.List; @@ -72,6 +74,11 @@ private List getTestsToRun() { tests.add(new SummingStepTest()); + tests.add(new TransactionNonExclusiveTest()); + tests.add(new TransactionWithListenerTest()); + tests.add(new TransactionNestedWithListenerTest()); + tests.add(new TransactionNestedWithListenerTest2()); + tests.add(new JsonCastTest()); tests.add(new SimpleQueryTest()); tests.add(new DefaultCursorWindowAllocationTest()); @@ -105,8 +112,6 @@ private List getTestsToRun() { tests.add(new WriteAheadLoggingWithTransactionTest()); tests.add(new WriteAheadLoggingWithInMemoryDatabaseTest()); tests.add(new WriteAheadLoggingWithAttachedDatabaseTest()); - tests.add(new TransactionNonExclusiveTest()); - tests.add(new TransactionWithListenerTest()); tests.add(new LargeDatabaseCursorAccessTest()); //// tests.add(new TimeLargeByteArrayQueryTest()); diff --git a/app/src/main/java/net/zetetic/tests/support/TransactionNestedWithListenerTest.java b/app/src/main/java/net/zetetic/tests/support/TransactionNestedWithListenerTest.java new file mode 100644 index 0000000..47fdabe --- /dev/null +++ b/app/src/main/java/net/zetetic/tests/support/TransactionNestedWithListenerTest.java @@ -0,0 +1,77 @@ +package net.zetetic.tests.support; + +import android.util.Log; + +import net.sqlcipher.database.SQLiteDatabase; +import net.sqlcipher.database.SQLiteTransactionListener; +import net.zetetic.tests.SQLCipherTest; + +import java.util.concurrent.atomic.AtomicInteger; + +public class TransactionNestedWithListenerTest extends SQLCipherTest { + + private static final String TAG = TransactionNestedWithListenerTest.class.getSimpleName(); + + @Override + public boolean execute(SQLiteDatabase database) { + CustomTransactionListener outer = new CustomTransactionListener(); + CustomTransactionListener inner = new CustomTransactionListener(); + + database.beginTransactionWithListener(outer); + database.execSQL("create table t1(a,b);"); + + //Nested start + database.beginTransactionWithListener(inner); + database.execSQL("create table t2(a,b);"); + database.setTransactionSuccessful(); + database.endTransaction(); + //Nested end + + database.setTransactionSuccessful(); + database.endTransaction(); + + if (!outer.isComplete() || !inner.isComplete()) { + Log.e(TAG, "Outer listener started times - " + outer.startCalled.get() + + ", ended times - " + outer.endCalled.get() + ); + Log.e(TAG, "Inner listener started times - " + inner.startCalled.get() + + ", ended times - " + inner.endCalled.get() + ); + return false; + } + + return true; + } + + @Override + public String getName() { + return "Nested transactions with listener"; + } + + private static class CustomTransactionListener implements SQLiteTransactionListener { + + private final AtomicInteger startCalled = new AtomicInteger(); + private final AtomicInteger endCalled = new AtomicInteger(); + + @Override + public void onBegin() { + startCalled.incrementAndGet(); + } + + @Override + public void onCommit() { + endCalled.incrementAndGet(); + } + + @Override + public void onRollback() { + endCalled.incrementAndGet(); + } + + boolean isComplete() { + return (startCalled.get() == endCalled.get()) && startCalled.get() == 1; + } + + } + +} diff --git a/app/src/main/java/net/zetetic/tests/support/TransactionNestedWithListenerTest2.java b/app/src/main/java/net/zetetic/tests/support/TransactionNestedWithListenerTest2.java new file mode 100644 index 0000000..7dd5998 --- /dev/null +++ b/app/src/main/java/net/zetetic/tests/support/TransactionNestedWithListenerTest2.java @@ -0,0 +1,73 @@ +package net.zetetic.tests.support; + +import android.util.Log; + +import net.sqlcipher.database.SQLiteDatabase; +import net.sqlcipher.database.SQLiteTransactionListener; +import net.zetetic.tests.SQLCipherTest; + +import java.util.concurrent.atomic.AtomicInteger; + +public class TransactionNestedWithListenerTest2 extends SQLCipherTest { + + private static final String TAG = TransactionNestedWithListenerTest2.class.getSimpleName(); + + @Override + public boolean execute(SQLiteDatabase database) { + CustomTransactionListener listener = new CustomTransactionListener(); + + database.beginTransactionWithListener(listener); + database.execSQL("create table t11(a,b);"); + + //Nested start + database.beginTransactionWithListener(listener); + database.execSQL("create table t22(a,b);"); + database.setTransactionSuccessful(); + database.endTransaction(); + //Nested end + + database.setTransactionSuccessful(); + database.endTransaction(); + + if (!listener.isComplete()) { + Log.e(TAG, "Listener didn't receive end, started times - " + + listener.startCalled.get() + ", ended times - " + listener.endCalled.get() + ); + return false; + } + + return true; + } + + @Override + public String getName() { + return "Nested transactions with listener 2"; + } + + private static class CustomTransactionListener implements SQLiteTransactionListener { + + private final AtomicInteger startCalled = new AtomicInteger(); + private final AtomicInteger endCalled = new AtomicInteger(); + + @Override + public void onBegin() { + startCalled.incrementAndGet(); + } + + @Override + public void onCommit() { + endCalled.incrementAndGet(); + } + + @Override + public void onRollback() { + endCalled.incrementAndGet(); + } + + boolean isComplete() { + return (startCalled.get() == endCalled.get()); + } + + } + +}