This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/main by this push:
new a23b77a4275 CAUSEWAY-3883: new attempt to fix integration test
stability
a23b77a4275 is described below
commit a23b77a42751ab1494e19fca1ea402809630a21c
Author: Andi Huber <[email protected]>
AuthorDate: Thu Jun 26 17:57:04 2025 +0200
CAUSEWAY-3883: new attempt to fix integration test stability
- reverts previous attempt to fix integration test stability via
ReentrantLock
---
.../wrapper/AsyncProxyInternal.java | 7 ++++++-
.../BackgroundService_IntegTestAbstract.java | 22 +++++++---------------
.../integtests/WrapperFactory_async_IntegTest.java | 6 ++++--
3 files changed, 17 insertions(+), 18 deletions(-)
diff --git
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/AsyncProxyInternal.java
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/AsyncProxyInternal.java
index a2f3a8a67aa..682f4bc0d2a 100644
---
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/AsyncProxyInternal.java
+++
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/AsyncProxyInternal.java
@@ -24,6 +24,7 @@
import java.util.function.Function;
import org.apache.causeway.applib.services.wrapper.WrapperFactory.AsyncProxy;
+import org.apache.causeway.core.runtime.wrap.WrappingObject;
//TODO this is just a proof of concept; chaining makes non sense once future
is no longer a proxy
record AsyncProxyInternal<T>(CompletableFuture<T> future, AsyncExecutorService
executor) implements AsyncProxy<T> {
@@ -39,8 +40,12 @@ record AsyncProxyInternal<T>(CompletableFuture<T> future,
AsyncExecutorService e
return map(in->in.orTimeout(timeout, unit));
}
+ @SuppressWarnings("unchecked")
@Override public T join() {
- return future.join();
+ var t = future.join();
+ return t instanceof WrappingObject wrappingObject
+ ? (T) WrappingObject.getOrigin(wrappingObject).pojo()
+ : t;
}
// -- HELPER
diff --git
a/extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/integtest/BackgroundService_IntegTestAbstract.java
b/extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/integtest/BackgroundService_IntegTestAbstract.java
index 0190cb6c198..fae8a8e4a22 100644
---
a/extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/integtest/BackgroundService_IntegTestAbstract.java
+++
b/extensions/core/commandlog/applib/src/test/java/org/apache/causeway/extensions/commandlog/applib/integtest/BackgroundService_IntegTestAbstract.java
@@ -20,12 +20,10 @@
import java.util.List;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.ReentrantLock;
import jakarta.inject.Inject;
import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -73,9 +71,6 @@ public abstract class BackgroundService_IntegTestAbstract
extends CausewayIntegr
protected abstract <T extends Counter> T newCounter(String name);
- /// don't allow these tests to run concurrent
- private final static ReentrantLock LOCK = new ReentrantLock();
-
private static boolean prototypingOrig;
@BeforeAll
@@ -91,8 +86,6 @@ static void reset_environment() {
@BeforeEach
void setup_counter() {
- LOCK.lock();
-
transactionService.runTransactional(Propagation.REQUIRES_NEW, () -> {
counterRepository.removeAll();
@@ -110,11 +103,6 @@ void setup_counter() {
assertThat(counter.getNum()).isNull();
}
- @AfterEach
- void releaseLock() {
- LOCK.unlock();
- }
-
@Test
void async_using_default_executor_service() {
@@ -140,13 +128,17 @@ void async_using_default_executor_service() {
transactionService.runTransactional(Propagation.REQUIRES_NEW, () -> {
var counter = bookmarkService.lookup(bookmark,
Counter.class).orElseThrow();
assertThat(counter.getNum()).isEqualTo(1L);
-
- // when
var control = AsyncControl.defaults();
- wrapperFactory.asyncWrapMixin(Counter_bumpUsingMixin.class,
counter, control)
+
+ // when ...
+ // return the counter entity, which might not yet have been
persisted,
+ // such that we can immediately check whether the action was
executed
+ counter =
wrapperFactory.asyncWrapMixin(Counter_bumpUsingMixin.class, counter, control)
.thenApplyAsync(Counter_bumpUsingMixin::act)
.join(); // wait till done
+ assertThat(counter.getNum()).isEqualTo(2L);
+
}).ifFailureFail();
// then
transactionService.runTransactional(Propagation.REQUIRES_NEW, () -> {
diff --git
a/regressiontests/core-wrapperfactory/src/test/java/org/apache/causeway/regressiontests/core/wrapperfactory/integtests/WrapperFactory_async_IntegTest.java
b/regressiontests/core-wrapperfactory/src/test/java/org/apache/causeway/regressiontests/core/wrapperfactory/integtests/WrapperFactory_async_IntegTest.java
index 2721f98a817..7df220cc30e 100644
---
a/regressiontests/core-wrapperfactory/src/test/java/org/apache/causeway/regressiontests/core/wrapperfactory/integtests/WrapperFactory_async_IntegTest.java
+++
b/regressiontests/core-wrapperfactory/src/test/java/org/apache/causeway/regressiontests/core/wrapperfactory/integtests/WrapperFactory_async_IntegTest.java
@@ -105,8 +105,10 @@ void async_using_default_executor_service(final String
displayName, final Execut
var asyncControl = AsyncControl.defaults()
.with(executorService);
- // when
- wrapperFactory.asyncWrapMixin(Counter_bumpUsingMixin.class,
counter, asyncControl)
+ // when ...
+ // return the counter entity, which might not yet have been
persisted,
+ // such that we can immediately check whether the action was
executed
+ counter =
wrapperFactory.asyncWrapMixin(Counter_bumpUsingMixin.class, counter,
asyncControl)
.thenApplyAsync(Counter_bumpUsingMixin::act)
// let's wait max 5 sec to allow executor to complete before
continuing
.orTimeout(5_000, TimeUnit.MILLISECONDS)