mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-29 04:57:48 +01:00
Objects: support parallel test running
crashes with env maxreaders reached though
This commit is contained in:
@@ -88,6 +88,11 @@
|
|||||||
<forkCount>1C</forkCount>
|
<forkCount>1C</forkCount>
|
||||||
<reuseForks>false</reuseForks>
|
<reuseForks>false</reuseForks>
|
||||||
<parallel>classes</parallel>
|
<parallel>classes</parallel>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<junit.jupiter.execution.parallel.enabled>
|
||||||
|
false
|
||||||
|
</junit.jupiter.execution.parallel.enabled>
|
||||||
|
</systemPropertyVariables>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
|||||||
@@ -7,10 +7,7 @@ import com.usatiuk.objects.transaction.Transaction;
|
|||||||
import com.usatiuk.objects.transaction.TransactionManager;
|
import com.usatiuk.objects.transaction.TransactionManager;
|
||||||
import io.quarkus.logging.Log;
|
import io.quarkus.logging.Log;
|
||||||
import jakarta.inject.Inject;
|
import jakarta.inject.Inject;
|
||||||
import org.junit.jupiter.api.Assertions;
|
import org.junit.jupiter.api.*;
|
||||||
import org.junit.jupiter.api.Disabled;
|
|
||||||
import org.junit.jupiter.api.RepeatedTest;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
import org.junit.jupiter.params.provider.EnumSource;
|
import org.junit.jupiter.params.provider.EnumSource;
|
||||||
|
|
||||||
@@ -57,121 +54,121 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void createObject() {
|
void createObject(TestInfo testInfo) {
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var newParent = new Parent(JObjectKey.of("ParentCreate"), "John");
|
var newParent = new Parent(JObjectKey.of(testInfo.getDisplayName() + "ParentCreate"), "John");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
});
|
});
|
||||||
|
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl("ParentCreate")).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "ParentCreate")).orElse(null);
|
||||||
Assertions.assertEquals("John", parent.name());
|
Assertions.assertEquals("John", parent.name());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void onCommitHookTest() {
|
void onCommitHookTest(TestInfo testInfo) {
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var newParent = new Parent(JObjectKey.of("ParentOnCommitHook"), "John");
|
var newParent = new Parent(JObjectKey.of(testInfo.getDisplayName() + "ParentOnCommitHook"), "John");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
curTx.onCommit(() -> txm.run(() -> {
|
curTx.onCommit(() -> txm.run(() -> {
|
||||||
curTx.put(new Parent(JObjectKey.of("ParentOnCommitHook2"), "John2"));
|
curTx.put(new Parent(JObjectKey.of(testInfo.getDisplayName() + "ParentOnCommitHook2"), "John2"));
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
curTx.onCommit(() -> txm.run(() -> {
|
curTx.onCommit(() -> txm.run(() -> {
|
||||||
curTx.put(new Parent(JObjectKey.of("ParentOnCommitHook3"), "John3"));
|
curTx.put(new Parent(JObjectKey.of(testInfo.getDisplayName() + "ParentOnCommitHook3"), "John3"));
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl("ParentOnCommitHook")).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "ParentOnCommitHook")).orElse(null);
|
||||||
Assertions.assertEquals("John", parent.name());
|
Assertions.assertEquals("John", parent.name());
|
||||||
var parent2 = curTx.get(Parent.class, new JObjectKeyImpl("ParentOnCommitHook2")).orElse(null);
|
var parent2 = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "ParentOnCommitHook2")).orElse(null);
|
||||||
Assertions.assertEquals("John2", parent2.name());
|
Assertions.assertEquals("John2", parent2.name());
|
||||||
var parent3 = curTx.get(Parent.class, new JObjectKeyImpl("ParentOnCommitHook3")).orElse(null);
|
var parent3 = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "ParentOnCommitHook3")).orElse(null);
|
||||||
Assertions.assertEquals("John3", parent3.name());
|
Assertions.assertEquals("John3", parent3.name());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void createGetObject() {
|
void createGetObject(TestInfo testInfo) {
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var newParent = new Parent(JObjectKey.of("ParentCreateGet"), "John");
|
var newParent = new Parent(JObjectKey.of(testInfo.getDisplayName() + "ParentCreateGet"), "John");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
var parent = curTx.get(Parent.class, JObjectKey.of("ParentCreateGet")).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "ParentCreateGet")).orElse(null);
|
||||||
Assertions.assertEquals("John", parent.name());
|
Assertions.assertEquals("John", parent.name());
|
||||||
});
|
});
|
||||||
|
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl("ParentCreateGet")).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "ParentCreateGet")).orElse(null);
|
||||||
Assertions.assertEquals("John", parent.name());
|
Assertions.assertEquals("John", parent.name());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void createDeleteObject() {
|
void createDeleteObject(TestInfo testInfo) {
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var newParent = new Parent(JObjectKey.of("ParentCreateDeleteObject"), "John");
|
var newParent = new Parent(JObjectKey.of(testInfo.getDisplayName() + "ParentCreateDeleteObject"), "John");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
});
|
});
|
||||||
|
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var parent = curTx.get(Parent.class, JObjectKey.of("ParentCreateDeleteObject")).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "ParentCreateDeleteObject")).orElse(null);
|
||||||
Assertions.assertEquals("John", parent.name());
|
Assertions.assertEquals("John", parent.name());
|
||||||
});
|
});
|
||||||
|
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
curTx.delete(new JObjectKeyImpl("ParentCreateDeleteObject"));
|
curTx.delete(JObjectKey.of(testInfo.getDisplayName() + "ParentCreateDeleteObject"));
|
||||||
});
|
});
|
||||||
|
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl("ParentCreateDeleteObject")).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "ParentCreateDeleteObject")).orElse(null);
|
||||||
Assertions.assertNull(parent);
|
Assertions.assertNull(parent);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void createCreateObject() {
|
void createCreateObject(TestInfo testInfo) {
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var newParent = new Parent(JObjectKey.of("Parent7"), "John");
|
var newParent = new Parent(JObjectKey.of(testInfo.getDisplayName() + "Parent7"), "John");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var newParent = new Parent(JObjectKey.of("Parent7"), "John2");
|
var newParent = new Parent(JObjectKey.of(testInfo.getDisplayName() + "Parent7"), "John2");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl("Parent7")).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "Parent7")).orElse(null);
|
||||||
Assertions.assertEquals("John2", parent.name());
|
Assertions.assertEquals("John2", parent.name());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void editObject() {
|
void editObject(TestInfo testInfo) {
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var newParent = new Parent(JObjectKey.of("Parent3"), "John");
|
var newParent = new Parent(JObjectKey.of(testInfo.getDisplayName() + "Parent3"), "John");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
});
|
});
|
||||||
|
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl("Parent3"), LockingStrategy.OPTIMISTIC).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "Parent3"), LockingStrategy.OPTIMISTIC).orElse(null);
|
||||||
Assertions.assertEquals("John", parent.name());
|
Assertions.assertEquals("John", parent.name());
|
||||||
curTx.put(parent.withName("John2"));
|
curTx.put(parent.withName("John2"));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl("Parent3"), LockingStrategy.WRITE).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "Parent3"), LockingStrategy.WRITE).orElse(null);
|
||||||
Assertions.assertEquals("John2", parent.name());
|
Assertions.assertEquals("John2", parent.name());
|
||||||
curTx.put(parent.withName("John3"));
|
curTx.put(parent.withName("John3"));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl("Parent3")).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "Parent3")).orElse(null);
|
||||||
Assertions.assertEquals("John3", parent.name());
|
Assertions.assertEquals("John3", parent.name());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Disabled
|
@Disabled
|
||||||
void createObjectConflict() {
|
void createObjectConflict(TestInfo testInfo) {
|
||||||
AtomicBoolean thread1Failed = new AtomicBoolean(true);
|
AtomicBoolean thread1Failed = new AtomicBoolean(true);
|
||||||
AtomicBoolean thread2Failed = new AtomicBoolean(true);
|
AtomicBoolean thread2Failed = new AtomicBoolean(true);
|
||||||
|
|
||||||
@@ -187,8 +184,8 @@ public abstract class ObjectsTestImpl {
|
|||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
var got = curTx.get(Parent.class, new JObjectKeyImpl("Parent2")).orElse(null);
|
var got = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "Parent2")).orElse(null);
|
||||||
var newParent = new Parent(JObjectKey.of("Parent2"), "John");
|
var newParent = new Parent(JObjectKey.of(testInfo.getDisplayName() + "Parent2"), "John");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
Log.warn("Thread 1 commit");
|
Log.warn("Thread 1 commit");
|
||||||
}, 0);
|
}, 0);
|
||||||
@@ -207,8 +204,8 @@ public abstract class ObjectsTestImpl {
|
|||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
var got = curTx.get(Parent.class, new JObjectKeyImpl("Parent2")).orElse(null);
|
var got = curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "Parent2")).orElse(null);
|
||||||
var newParent = new Parent(JObjectKey.of("Parent2"), "John2");
|
var newParent = new Parent(JObjectKey.of(testInfo.getDisplayName() + "Parent2"), "John2");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
Log.warn("Thread 2 commit");
|
Log.warn("Thread 2 commit");
|
||||||
}, 0);
|
}, 0);
|
||||||
@@ -226,7 +223,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var got = txm.run(() -> {
|
var got = txm.run(() -> {
|
||||||
return curTx.get(Parent.class, new JObjectKeyImpl("Parent2")).orElse(null);
|
return curTx.get(Parent.class, JObjectKey.of(testInfo.getDisplayName() + "Parent2")).orElse(null);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!thread1Failed.get()) {
|
if (!thread1Failed.get()) {
|
||||||
@@ -241,8 +238,8 @@ public abstract class ObjectsTestImpl {
|
|||||||
|
|
||||||
@ParameterizedTest
|
@ParameterizedTest
|
||||||
@EnumSource(LockingStrategy.class)
|
@EnumSource(LockingStrategy.class)
|
||||||
void editConflict(LockingStrategy strategy) {
|
void editConflict(LockingStrategy strategy, TestInfo testInfo) {
|
||||||
String key = "Parent4" + strategy.name();
|
String key = testInfo.getDisplayName() + "Parent4" + strategy.name();
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var newParent = new Parent(JObjectKey.of(key), "John3");
|
var newParent = new Parent(JObjectKey.of(key), "John3");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
@@ -263,7 +260,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl(key), strategy).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(key), strategy).orElse(null);
|
||||||
curTx.put(parent.withName("John"));
|
curTx.put(parent.withName("John"));
|
||||||
Log.warn("Thread 1 commit");
|
Log.warn("Thread 1 commit");
|
||||||
}, 0);
|
}, 0);
|
||||||
@@ -279,7 +276,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
Log.warn("Thread 2");
|
Log.warn("Thread 2");
|
||||||
barrier.await(); // Ensure thread 2 tx id is larger than thread 1
|
barrier.await(); // Ensure thread 2 tx id is larger than thread 1
|
||||||
txm.runTries(() -> {
|
txm.runTries(() -> {
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl(key), strategy).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(key), strategy).orElse(null);
|
||||||
curTx.put(parent.withName("John2"));
|
curTx.put(parent.withName("John2"));
|
||||||
Log.warn("Thread 2 commit");
|
Log.warn("Thread 2 commit");
|
||||||
}, 0);
|
}, 0);
|
||||||
@@ -298,7 +295,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var got = txm.run(() -> {
|
var got = txm.run(() -> {
|
||||||
return curTx.get(Parent.class, new JObjectKeyImpl(key)).orElse(null);
|
return curTx.get(Parent.class, JObjectKey.of(key)).orElse(null);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!thread1Failed.get() && !thread2Failed.get()) {
|
if (!thread1Failed.get() && !thread2Failed.get()) {
|
||||||
@@ -322,8 +319,8 @@ public abstract class ObjectsTestImpl {
|
|||||||
|
|
||||||
@ParameterizedTest
|
@ParameterizedTest
|
||||||
@EnumSource(LockingStrategy.class)
|
@EnumSource(LockingStrategy.class)
|
||||||
void editConflict2(LockingStrategy strategy) {
|
void editConflict2(LockingStrategy strategy, TestInfo testInfo) {
|
||||||
String key = "EditConflict2" + strategy.name();
|
String key = testInfo.getDisplayName() + "EditConflict2" + strategy.name();
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var newParent = new Parent(JObjectKey.of(key), "John3");
|
var newParent = new Parent(JObjectKey.of(key), "John3");
|
||||||
curTx.put(newParent);
|
curTx.put(newParent);
|
||||||
@@ -344,7 +341,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl(key), strategy).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(key), strategy).orElse(null);
|
||||||
curTx.put(parent.withName("John"));
|
curTx.put(parent.withName("John"));
|
||||||
Log.warn("Thread 1 commit");
|
Log.warn("Thread 1 commit");
|
||||||
}, 0);
|
}, 0);
|
||||||
@@ -365,7 +362,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
var parent = curTx.get(Parent.class, new JObjectKeyImpl(key), strategy).orElse(null);
|
var parent = curTx.get(Parent.class, JObjectKey.of(key), strategy).orElse(null);
|
||||||
curTx.put(parent.withName("John2"));
|
curTx.put(parent.withName("John2"));
|
||||||
Log.warn("Thread 2 commit");
|
Log.warn("Thread 2 commit");
|
||||||
}, 0);
|
}, 0);
|
||||||
@@ -384,7 +381,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var got = txm.run(() -> {
|
var got = txm.run(() -> {
|
||||||
return curTx.get(Parent.class, new JObjectKeyImpl(key)).orElse(null);
|
return curTx.get(Parent.class, JObjectKey.of(key)).orElse(null);
|
||||||
});
|
});
|
||||||
|
|
||||||
Assertions.assertFalse(!thread1Failed.get() && !thread2Failed.get());
|
Assertions.assertFalse(!thread1Failed.get() && !thread2Failed.get());
|
||||||
@@ -402,8 +399,8 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void snapshotTest1() {
|
void snapshotTest1(TestInfo testInfo) {
|
||||||
var key = "SnapshotTest1";
|
var key = testInfo.getDisplayName() + "SnapshotTest1";
|
||||||
var barrier1 = new CyclicBarrier(2);
|
var barrier1 = new CyclicBarrier(2);
|
||||||
var barrier2 = new CyclicBarrier(2);
|
var barrier2 = new CyclicBarrier(2);
|
||||||
try (ExecutorService ex = Executors.newFixedThreadPool(3)) {
|
try (ExecutorService ex = Executors.newFixedThreadPool(3)) {
|
||||||
@@ -435,7 +432,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
Log.info("Thread 1 reading");
|
Log.info("Thread 1 reading");
|
||||||
Assertions.assertTrue(curTx.get(Parent.class, new JObjectKeyImpl(key)).isEmpty());
|
Assertions.assertTrue(curTx.get(Parent.class, JObjectKey.of(key)).isEmpty());
|
||||||
Log.info("Thread 1 done reading");
|
Log.info("Thread 1 done reading");
|
||||||
});
|
});
|
||||||
Log.info("Thread 1 finished");
|
Log.info("Thread 1 finished");
|
||||||
@@ -452,14 +449,14 @@ public abstract class ObjectsTestImpl {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
Assertions.assertEquals("John", curTx.get(Parent.class, new JObjectKeyImpl(key)).orElseThrow().name());
|
Assertions.assertEquals("John", curTx.get(Parent.class, JObjectKey.of(key)).orElseThrow().name());
|
||||||
});
|
});
|
||||||
deleteAndCheck(new JObjectKeyImpl(key));
|
deleteAndCheck(JObjectKey.of(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void snapshotTest2() {
|
void snapshotTest2(TestInfo testInfo) {
|
||||||
var key = "SnapshotTest2";
|
var key = testInfo.getDisplayName() + "SnapshotTest2";
|
||||||
var barrier1 = new CyclicBarrier(2);
|
var barrier1 = new CyclicBarrier(2);
|
||||||
var barrier2 = new CyclicBarrier(2);
|
var barrier2 = new CyclicBarrier(2);
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
@@ -494,7 +491,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
Log.info("Thread 1 reading");
|
Log.info("Thread 1 reading");
|
||||||
Assertions.assertEquals("John", curTx.get(Parent.class, new JObjectKeyImpl(key)).orElseThrow().name());
|
Assertions.assertEquals("John", curTx.get(Parent.class, JObjectKey.of(key)).orElseThrow().name());
|
||||||
Log.info("Thread 1 done reading");
|
Log.info("Thread 1 done reading");
|
||||||
});
|
});
|
||||||
Log.info("Thread 1 finished");
|
Log.info("Thread 1 finished");
|
||||||
@@ -511,14 +508,14 @@ public abstract class ObjectsTestImpl {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
Assertions.assertEquals("John2", curTx.get(Parent.class, new JObjectKeyImpl(key)).orElseThrow().name());
|
Assertions.assertEquals("John2", curTx.get(Parent.class, JObjectKey.of(key)).orElseThrow().name());
|
||||||
});
|
});
|
||||||
deleteAndCheck(new JObjectKeyImpl(key));
|
deleteAndCheck(JObjectKey.of(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void snapshotTest3() {
|
void snapshotTest3(TestInfo testInfo) {
|
||||||
var key = "SnapshotTest3";
|
var key = testInfo.getDisplayName() + "SnapshotTest3";
|
||||||
var barrier0 = new CountDownLatch(1);
|
var barrier0 = new CountDownLatch(1);
|
||||||
var barrier1 = new CyclicBarrier(2);
|
var barrier1 = new CyclicBarrier(2);
|
||||||
var barrier2 = new CyclicBarrier(2);
|
var barrier2 = new CyclicBarrier(2);
|
||||||
@@ -559,7 +556,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
Log.info("Thread 1 reading");
|
Log.info("Thread 1 reading");
|
||||||
Assertions.assertEquals("John", curTx.get(Parent.class, new JObjectKeyImpl(key)).orElseThrow().name());
|
Assertions.assertEquals("John", curTx.get(Parent.class, JObjectKey.of(key)).orElseThrow().name());
|
||||||
Log.info("Thread 1 done reading");
|
Log.info("Thread 1 done reading");
|
||||||
});
|
});
|
||||||
Log.info("Thread 1 finished");
|
Log.info("Thread 1 finished");
|
||||||
@@ -576,14 +573,14 @@ public abstract class ObjectsTestImpl {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
Assertions.assertEquals("John2", curTx.get(Parent.class, new JObjectKeyImpl(key)).orElseThrow().name());
|
Assertions.assertEquals("John2", curTx.get(Parent.class, JObjectKey.of(key)).orElseThrow().name());
|
||||||
});
|
});
|
||||||
deleteAndCheck(new JObjectKeyImpl(key));
|
deleteAndCheck(JObjectKey.of(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void simpleIterator1() {
|
void simpleIterator1(TestInfo testInfo) {
|
||||||
var key = "SimpleIterator1";
|
var key = testInfo.getDisplayName() + "SimpleIterator1";
|
||||||
var key1 = key + "_1";
|
var key1 = key + "_1";
|
||||||
var key2 = key + "_2";
|
var key2 = key + "_2";
|
||||||
var key3 = key + "_3";
|
var key3 = key + "_3";
|
||||||
@@ -596,7 +593,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
curTx.put(new Parent(JObjectKey.of(key4), "John4"));
|
curTx.put(new Parent(JObjectKey.of(key4), "John4"));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key));
|
var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key));
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key1, got.getKey().name());
|
Assertions.assertEquals(key1, got.getKey().name());
|
||||||
got = iter.next();
|
got = iter.next();
|
||||||
@@ -610,8 +607,8 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void simpleIterator2() {
|
void simpleIterator2(TestInfo testInfo) {
|
||||||
var key = "SimpleIterator2";
|
var key = testInfo.getDisplayName() + "SimpleIterator2";
|
||||||
var key1 = key + "_1";
|
var key1 = key + "_1";
|
||||||
var key2 = key + "_2";
|
var key2 = key + "_2";
|
||||||
var key3 = key + "_3";
|
var key3 = key + "_3";
|
||||||
@@ -624,7 +621,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
curTx.put(new Parent(JObjectKey.of(key4), "John4"));
|
curTx.put(new Parent(JObjectKey.of(key4), "John4"));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key1, got.getKey().name());
|
Assertions.assertEquals(key1, got.getKey().name());
|
||||||
got = iter.next();
|
got = iter.next();
|
||||||
@@ -636,7 +633,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
try (var iter = curTx.getIterator(IteratorStart.LT, new JObjectKeyImpl(key + "_5"))) {
|
try (var iter = curTx.getIterator(IteratorStart.LT, JObjectKey.of(key + "_5"))) {
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key4, got.getKey().name());
|
Assertions.assertEquals(key4, got.getKey().name());
|
||||||
Assertions.assertTrue(iter.hasPrev());
|
Assertions.assertTrue(iter.hasPrev());
|
||||||
@@ -648,22 +645,22 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
curTx.delete(new JObjectKeyImpl(key));
|
curTx.delete(JObjectKey.of(key));
|
||||||
curTx.delete(new JObjectKeyImpl(key1));
|
curTx.delete(JObjectKey.of(key1));
|
||||||
curTx.delete(new JObjectKeyImpl(key2));
|
curTx.delete(JObjectKey.of(key2));
|
||||||
curTx.delete(new JObjectKeyImpl(key3));
|
curTx.delete(JObjectKey.of(key3));
|
||||||
curTx.delete(new JObjectKeyImpl(key4));
|
curTx.delete(JObjectKey.of(key4));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
|
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void concurrentIterator1() {
|
void concurrentIterator1(TestInfo testInfo) {
|
||||||
var key = "ConcurrentIterator1";
|
var key = testInfo.getDisplayName() + "ConcurrentIterator1";
|
||||||
var key1 = key + "_1";
|
var key1 = key + "_1";
|
||||||
var key2 = key + "_2";
|
var key2 = key + "_2";
|
||||||
var key3 = key + "_3";
|
var key3 = key + "_3";
|
||||||
@@ -696,7 +693,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
try {
|
try {
|
||||||
barrier.await();
|
barrier.await();
|
||||||
barrier2.await();
|
barrier2.await();
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key1, got.getKey().name());
|
Assertions.assertEquals(key1, got.getKey().name());
|
||||||
got = iter.next();
|
got = iter.next();
|
||||||
@@ -711,7 +708,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
});
|
});
|
||||||
Log.info("All threads finished");
|
Log.info("All threads finished");
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key1, got.getKey().name());
|
Assertions.assertEquals(key1, got.getKey().name());
|
||||||
got = iter.next();
|
got = iter.next();
|
||||||
@@ -723,22 +720,22 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
curTx.delete(new JObjectKeyImpl(key));
|
curTx.delete(JObjectKey.of(key));
|
||||||
curTx.delete(new JObjectKeyImpl(key1));
|
curTx.delete(JObjectKey.of(key1));
|
||||||
curTx.delete(new JObjectKeyImpl(key2));
|
curTx.delete(JObjectKey.of(key2));
|
||||||
curTx.delete(new JObjectKeyImpl(key3));
|
curTx.delete(JObjectKey.of(key3));
|
||||||
curTx.delete(new JObjectKeyImpl(key4));
|
curTx.delete(JObjectKey.of(key4));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
|
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void concurrentIterator2() {
|
void concurrentIterator2(TestInfo testInfo) {
|
||||||
var key = "ConcurrentIterator2";
|
var key = testInfo.getDisplayName() + "ConcurrentIterator2";
|
||||||
var key1 = key + "_1";
|
var key1 = key + "_1";
|
||||||
var key2 = key + "_2";
|
var key2 = key + "_2";
|
||||||
var key3 = key + "_3";
|
var key3 = key + "_3";
|
||||||
@@ -772,7 +769,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
try {
|
try {
|
||||||
barrier.await();
|
barrier.await();
|
||||||
barrier2.await();
|
barrier2.await();
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key1, got.getKey().name());
|
Assertions.assertEquals(key1, got.getKey().name());
|
||||||
got = iter.next();
|
got = iter.next();
|
||||||
@@ -790,7 +787,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
});
|
});
|
||||||
Log.info("All threads finished");
|
Log.info("All threads finished");
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key1, got.getKey().name());
|
Assertions.assertEquals(key1, got.getKey().name());
|
||||||
got = iter.next();
|
got = iter.next();
|
||||||
@@ -803,22 +800,22 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
curTx.delete(new JObjectKeyImpl(key));
|
curTx.delete(JObjectKey.of(key));
|
||||||
curTx.delete(new JObjectKeyImpl(key1));
|
curTx.delete(JObjectKey.of(key1));
|
||||||
curTx.delete(new JObjectKeyImpl(key2));
|
curTx.delete(JObjectKey.of(key2));
|
||||||
curTx.delete(new JObjectKeyImpl(key3));
|
curTx.delete(JObjectKey.of(key3));
|
||||||
curTx.delete(new JObjectKeyImpl(key4));
|
curTx.delete(JObjectKey.of(key4));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
|
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void concurrentIterator3() {
|
void concurrentIterator3(TestInfo testInfo) {
|
||||||
var key = "ConcurrentIterator3";
|
var key = testInfo.getDisplayName() + "ConcurrentIterator3";
|
||||||
var key1 = key + "_1";
|
var key1 = key + "_1";
|
||||||
var key2 = key + "_2";
|
var key2 = key + "_2";
|
||||||
var key3 = key + "_3";
|
var key3 = key + "_3";
|
||||||
@@ -841,7 +838,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
curTx.put(new Parent(JObjectKey.of(key3), "John3"));
|
curTx.put(new Parent(JObjectKey.of(key3), "John3"));
|
||||||
curTx.delete(new JObjectKeyImpl(key2));
|
curTx.delete(JObjectKey.of(key2));
|
||||||
Log.info("Thread 1 committing");
|
Log.info("Thread 1 committing");
|
||||||
});
|
});
|
||||||
Log.info("Thread 1 commited");
|
Log.info("Thread 1 commited");
|
||||||
@@ -852,7 +849,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
try {
|
try {
|
||||||
barrier.await();
|
barrier.await();
|
||||||
barrier2.await();
|
barrier2.await();
|
||||||
try (var iter = curTx.getIterator(IteratorStart.LE, new JObjectKeyImpl(key3))) {
|
try (var iter = curTx.getIterator(IteratorStart.LE, JObjectKey.of(key3))) {
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key2, got.getKey().name());
|
Assertions.assertEquals(key2, got.getKey().name());
|
||||||
Assertions.assertEquals("John2", ((Parent) got.getValue()).name());
|
Assertions.assertEquals("John2", ((Parent) got.getValue()).name());
|
||||||
@@ -878,7 +875,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
got = iter.next();
|
got = iter.next();
|
||||||
Assertions.assertEquals(key4, got.getKey().name());
|
Assertions.assertEquals(key4, got.getKey().name());
|
||||||
}
|
}
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key1, got.getKey().name());
|
Assertions.assertEquals(key1, got.getKey().name());
|
||||||
got = iter.next();
|
got = iter.next();
|
||||||
@@ -896,7 +893,7 @@ public abstract class ObjectsTestImpl {
|
|||||||
});
|
});
|
||||||
Log.info("All threads finished");
|
Log.info("All threads finished");
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
var got = iter.next();
|
var got = iter.next();
|
||||||
Assertions.assertEquals(key1, got.getKey().name());
|
Assertions.assertEquals(key1, got.getKey().name());
|
||||||
got = iter.next();
|
got = iter.next();
|
||||||
@@ -906,37 +903,37 @@ public abstract class ObjectsTestImpl {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
curTx.delete(new JObjectKeyImpl(key));
|
curTx.delete(JObjectKey.of(key));
|
||||||
curTx.delete(new JObjectKeyImpl(key1));
|
curTx.delete(JObjectKey.of(key1));
|
||||||
curTx.delete(new JObjectKeyImpl(key3));
|
curTx.delete(JObjectKey.of(key3));
|
||||||
curTx.delete(new JObjectKeyImpl(key4));
|
curTx.delete(JObjectKey.of(key4));
|
||||||
});
|
});
|
||||||
txm.run(() -> {
|
txm.run(() -> {
|
||||||
try (var iter = curTx.getIterator(IteratorStart.GT, new JObjectKeyImpl(key))) {
|
try (var iter = curTx.getIterator(IteratorStart.GT, JObjectKey.of(key))) {
|
||||||
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
|
Assertions.assertTrue(!iter.hasNext() || !iter.next().getKey().name().startsWith(key));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@RepeatedTest(100)
|
@RepeatedTest(100)
|
||||||
void allParallel() {
|
void allParallel(TestInfo testInfo) {
|
||||||
Just.runAll(
|
Just.runAll(
|
||||||
() -> createObject(),
|
() -> createObject(testInfo),
|
||||||
() -> createGetObject(),
|
() -> createGetObject(testInfo),
|
||||||
() -> createDeleteObject(),
|
() -> createDeleteObject(testInfo),
|
||||||
() -> createCreateObject(),
|
() -> createCreateObject(testInfo),
|
||||||
() -> editConflict(LockingStrategy.WRITE),
|
() -> editConflict(LockingStrategy.WRITE, testInfo),
|
||||||
() -> editConflict(LockingStrategy.OPTIMISTIC),
|
() -> editConflict(LockingStrategy.OPTIMISTIC, testInfo),
|
||||||
() -> editConflict2(LockingStrategy.WRITE),
|
() -> editConflict2(LockingStrategy.WRITE, testInfo),
|
||||||
() -> editConflict2(LockingStrategy.OPTIMISTIC),
|
() -> editConflict2(LockingStrategy.OPTIMISTIC, testInfo),
|
||||||
() -> snapshotTest1(),
|
() -> snapshotTest1(testInfo),
|
||||||
() -> snapshotTest2(),
|
() -> snapshotTest2(testInfo),
|
||||||
() -> snapshotTest3(),
|
() -> snapshotTest3(testInfo),
|
||||||
() -> simpleIterator1(),
|
() -> simpleIterator1(testInfo),
|
||||||
() -> simpleIterator2(),
|
() -> simpleIterator2(testInfo),
|
||||||
() -> concurrentIterator1(),
|
() -> concurrentIterator1(testInfo),
|
||||||
() -> concurrentIterator2(),
|
() -> concurrentIterator2(testInfo),
|
||||||
() -> concurrentIterator3()
|
() -> concurrentIterator3(testInfo)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user