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();
+            }
+        }
     }
 
 }