You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/04/09 17:48:31 UTC
[isis] 03/03: ISIS-2445: synchronize JPA testing when in fork mode
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 02ab4ed613adfb3f0a1c427ba23aa6501b7a1c59
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Apr 9 19:48:22 2022 +0200
ISIS-2445: synchronize JPA testing when in fork mode
---
.../injecting/jpa/JpaEntityInjectingTest.java | 6 +++-
...actionRollbackTest_usingInteractionService.java | 10 +++++-
...actionRollbackTest_usingTransactionService.java | 10 +++++-
...TransactionRollbackTest_usingTransactional.java | 7 +++-
.../jpa/JpaTransactionScopeListenerTest.java | 20 ++++++++---
.../isis/testdomain/jpa/JpaTestDomainPersona.java | 40 +++++++++++++++++++---
.../publishing/PublishingTestFactoryAbstract.java | 4 +++
.../publishing/PublishingTestFactoryJdo.java | 5 +++
.../publishing/PublishingTestFactoryJpa.java | 11 ++++--
.../isis/testdomain/util/kv/KVStoreForTesting.java | 27 ++++++++++++---
10 files changed, 118 insertions(+), 22 deletions(-)
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/injecting/jpa/JpaEntityInjectingTest.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/injecting/jpa/JpaEntityInjectingTest.java
index ad9fcf2200..bc27697992 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/injecting/jpa/JpaEntityInjectingTest.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/injecting/jpa/JpaEntityInjectingTest.java
@@ -69,8 +69,10 @@ class JpaEntityInjectingTest extends IsisIntegrationTestAbstract {
@Test @Order(0) @Rollback(false)
void init() {
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryRequestLock);
+
// cleanup
- fixtureScripts.runPersona(JpaTestDomainPersona.PurgeAll);
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryPurgeAll);
kvStore.clear(JpaBook.class);
// given
@@ -122,6 +124,8 @@ class JpaEntityInjectingTest extends IsisIntegrationTestAbstract {
//assertInjectCountRange(1, 4);
log.debug("TEST 3 EXITING");
+
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryReleaseLock);
}
// -- HELPER
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingInteractionService.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingInteractionService.java
index 87465940e5..71a79998ef 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingInteractionService.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingInteractionService.java
@@ -23,6 +23,7 @@ import java.util.function.Consumer;
import javax.inject.Inject;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -79,13 +80,20 @@ class JpaTransactionRollbackTest_usingInteractionService
@BeforeEach
void setUp() {
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryRequestLock);
+
// cleanup
- fixtureScripts.runPersona(JpaTestDomainPersona.PurgeAll);
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryPurgeAll);
transactionAfterCompletionEvent =
_Refs.<TransactionAfterCompletionEvent>objectRef(null);
}
+ @AfterEach
+ void cleanUp() {
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryReleaseLock);
+ }
+
@Test
void happyCaseTx_shouldCommit() {
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingTransactionService.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingTransactionService.java
index 27031b4169..d09f73d2a1 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingTransactionService.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingTransactionService.java
@@ -23,6 +23,7 @@ import java.util.function.Consumer;
import javax.inject.Inject;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -77,13 +78,20 @@ class JpaTransactionRollbackTest_usingTransactionService
@BeforeEach
void setUp() {
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryRequestLock);
+
// cleanup
- fixtureScripts.runPersona(JpaTestDomainPersona.PurgeAll);
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryPurgeAll);
transactionAfterCompletionEvent =
_Refs.<TransactionAfterCompletionEvent>objectRef(null);
}
+ @AfterEach
+ void cleanUp() {
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryReleaseLock);
+ }
+
@Test
void happyCaseTx_shouldCommit() {
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingTransactional.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingTransactional.java
index 29f4e240cb..87d4699828 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingTransactional.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionRollbackTest_usingTransactional.java
@@ -68,8 +68,11 @@ extends IsisIntegrationTestAbstract
@Test @Order(1) @Commit
void cleanup_justInCase() {
+
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryRequestLock);
+
// cleanup just in case
- fixtureScripts.runPersona(JpaTestDomainPersona.PurgeAll);
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryPurgeAll);
}
@Test @Order(2)
@@ -90,6 +93,8 @@ extends IsisIntegrationTestAbstract
// expected condition
assertEquals(0, repository.allInstances(JpaBook.class).size());
+
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryReleaseLock);
}
}
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionScopeListenerTest.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionScopeListenerTest.java
index 90aceecac0..31f09f7592 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionScopeListenerTest.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionScopeListenerTest.java
@@ -20,6 +20,7 @@ package org.apache.isis.testdomain.transactions.jpa;
import javax.inject.Inject;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -72,16 +73,23 @@ class JpaTransactionScopeListenerTest {
@BeforeEach
void setUp() {
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryRequestLock);
+
// new IsisInteractionScope with a new transaction (#1)
interactionService.runAnonymous(()->{
// cleanup
- fixtureScripts.runPersona(JpaTestDomainPersona.PurgeAll);
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryPurgeAll);
});
}
+ @AfterEach
+ void cleanUp() {
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryReleaseLock);
+ }
+
@Test
void sessionScopedProbe_shouldBeReused_andBeAwareofTransactionBoundaries() {
@@ -105,10 +113,12 @@ class JpaTransactionScopeListenerTest {
});
- assertEquals(2, InteractionBoundaryProbe.totalInteractionsStarted(kvStoreForTesting));
- assertEquals(2, InteractionBoundaryProbe.totalInteractionsEnded(kvStoreForTesting));
- assertEquals(2, InteractionBoundaryProbe.totalTransactionsEnding(kvStoreForTesting));
- assertEquals(2, InteractionBoundaryProbe.totalTransactionsCommitted(kvStoreForTesting));
+ final int expectedIaCount = 3; // 2 + 1 (afterEach)
+
+ assertEquals(expectedIaCount, InteractionBoundaryProbe.totalInteractionsStarted(kvStoreForTesting));
+ assertEquals(expectedIaCount, InteractionBoundaryProbe.totalInteractionsEnded(kvStoreForTesting));
+ assertEquals(expectedIaCount, InteractionBoundaryProbe.totalTransactionsEnding(kvStoreForTesting));
+ assertEquals(expectedIaCount, InteractionBoundaryProbe.totalTransactionsCommitted(kvStoreForTesting));
}
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestDomainPersona.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestDomainPersona.java
index c66e588e8c..b874774313 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestDomainPersona.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestDomainPersona.java
@@ -33,6 +33,7 @@ import org.apache.isis.testdomain.jpa.entities.JpaInventory;
import org.apache.isis.testdomain.jpa.entities.JpaProduct;
import org.apache.isis.testdomain.ldap.LdapConstants;
import org.apache.isis.testdomain.util.dto.BookDto;
+import org.apache.isis.testdomain.util.kv.KVStoreForTesting;
import org.apache.isis.testing.fixtures.applib.personas.BuilderScriptAbstract;
import org.apache.isis.testing.fixtures.applib.personas.BuilderScriptWithResult;
import org.apache.isis.testing.fixtures.applib.personas.BuilderScriptWithoutResult;
@@ -43,10 +44,39 @@ import lombok.val;
public enum JpaTestDomainPersona
implements PersonaWithBuilderScript<BuilderScriptAbstract<?>> {
- PurgeAll {
+ /** support for forked surefire run */
+ InventoryRequestLock {
@Override
public BuilderScriptWithoutResult builder() {
return new BuilderScriptWithoutResult() {
+ @Inject private KVStoreForTesting kvStore;
+ @Override protected void execute(final ExecutionContext ec) {
+ kvStore.requestLock(JpaTestDomainPersona.class);
+ }
+ };
+ }
+ },
+
+ /** support for forked surefire run */
+ InventoryReleaseLock {
+ @Override
+ public BuilderScriptWithoutResult builder() {
+ return new BuilderScriptWithoutResult() {
+ @Inject private KVStoreForTesting kvStore;
+ @Override protected void execute(final ExecutionContext ec) {
+ kvStore.releaseLock(JpaTestDomainPersona.class);
+ }
+
+ };
+ }
+ },
+
+ InventoryPurgeAll {
+ @Override
+ public BuilderScriptWithoutResult builder() {
+ return new BuilderScriptWithoutResult() {
+
+ @Inject private RepositoryService repository;
@Override
protected void execute(final ExecutionContext ec) {
@@ -62,8 +92,6 @@ implements PersonaWithBuilderScript<BuilderScriptAbstract<?>> {
}
- @Inject private RepositoryService repository;
-
};
}
},
@@ -73,6 +101,8 @@ implements PersonaWithBuilderScript<BuilderScriptAbstract<?>> {
public BuilderScriptWithResult<JpaInventory> builder() {
return new BuilderScriptWithResult<JpaInventory>() {
+ @Inject private RepositoryService repository;
+
@Override
protected JpaInventory buildResult(final ExecutionContext ec) {
@@ -87,8 +117,6 @@ implements PersonaWithBuilderScript<BuilderScriptAbstract<?>> {
}
- @Inject private RepositoryService repository;
-
};
}
},
@@ -129,5 +157,7 @@ implements PersonaWithBuilderScript<BuilderScriptAbstract<?>> {
;
+ private static Object $LOCK = new Object();
+
}
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryAbstract.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryAbstract.java
index dc6c35f0de..230ef8d473 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryAbstract.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryAbstract.java
@@ -282,6 +282,8 @@ public abstract class PublishingTestFactoryAbstract {
/** to setup the test - method is embedded in its own interaction and transaction */
protected abstract void setupEntity(PublishingTestContext context);
+ protected abstract void releaseContext(PublishingTestContext context);
+
/** a test - method is embedded in its own interaction and transaction */
protected abstract void programmaticExecution(PublishingTestContext context);
@@ -379,6 +381,8 @@ public abstract class PublishingTestFactoryAbstract {
} finally {
+
+ releaseContext(testContext);
traceLog.log("5. exit test %s", displayName);
traceLog.footer();
}
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJdo.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJdo.java
index 645a8d5912..8b7bcb6899 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJdo.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJdo.java
@@ -90,6 +90,11 @@ extends PublishingTestFactoryAbstract {
// -- TEST SETUP
+ @Override
+ protected void releaseContext(final PublishingTestContext context) {
+
+ }
+
@Override
protected void setupEntity(final PublishingTestContext context) {
switch(context.getScenario()) {
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJpa.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJpa.java
index bbd359b481..8d2dff0123 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJpa.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJpa.java
@@ -86,6 +86,11 @@ extends PublishingTestFactoryAbstract {
// -- TEST SETUP
+ @Override
+ protected void releaseContext(final PublishingTestContext context) {
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryReleaseLock);
+ }
+
@Override
protected void setupEntity(final PublishingTestContext context) {
switch(context.getScenario()) {
@@ -96,9 +101,9 @@ extends PublishingTestFactoryAbstract {
case ENTITY_PERSISTING:
-
// given
- fixtureScripts.runPersona(JpaTestDomainPersona.PurgeAll);
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryRequestLock);
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryPurgeAll);
break;
case ENTITY_LOADING:
@@ -398,7 +403,7 @@ extends PublishingTestFactoryAbstract {
val em = jpaSupport.getEntityManagerElseFail(JpaBook.class);
// cleanup
- fixtureScripts.runPersona(JpaTestDomainPersona.PurgeAll);
+ fixtureScripts.runPersona(JpaTestDomainPersona.InventoryPurgeAll);
// given Inventory with 1 Book
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/kv/KVStoreForTesting.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/kv/KVStoreForTesting.java
index a802e1d28c..0a65dd883a 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/kv/KVStoreForTesting.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/kv/KVStoreForTesting.java
@@ -29,10 +29,10 @@ import javax.inject.Singleton;
import org.springframework.stereotype.Service;
import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.concurrent.AwaitableLatch;
import org.apache.isis.commons.internal.collections._Maps;
import lombok.NonNull;
+import lombok.SneakyThrows;
import lombok.Value;
import lombok.val;
import lombok.extern.log4j.Log4j2;
@@ -139,10 +139,27 @@ public class KVStoreForTesting {
@NonNull String keyStr;
}
- public AwaitableLatch latch(final Class<?> callerType) {
- val latch = new CountDownLatch(1);
- latchMap.put(callerType, latch);
- return AwaitableLatch.of(latch);
+ /** blocks until a new lock becomes available */
+ @SneakyThrows
+ public void requestLock(final Class<?> callerType) {
+ synchronized(this) {
+ val latch = latchMap.get(callerType);
+ if(latch!=null) {
+ latch.await();
+ }
+ val newLatch = new CountDownLatch(1);
+ latchMap.put(callerType, newLatch);
+ }
+ }
+
+ /** unblocks any threads waiting for a new lock */
+ public void releaseLock(final Class<?> callerType) {
+ synchronized(this) {
+ val latch = latchMap.remove(callerType);
+ if(latch!=null) {
+ latch.countDown();
+ }
+ }
}
}