This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch fix/flaky-tests in repository https://gitbox.apache.org/repos/asf/cxf.git
commit f65d12c246e33f04cf3c379894df1fb5fb9e8328 Author: Guillaume Nodet <[email protected]> AuthorDate: Wed Mar 11 15:29:07 2026 +0100 Fix flaky tests in Undertow, JMS, and tracing modules UndertowHTTPServerEngineTest: - Add @After cleanup to destroy ports after each test. Previously, port cleanup was only done at the end of each test body, so if a test failed mid-execution, ports remained bound causing cascading "Address already in use" failures in subsequent tests. AbstractJMSTester (JMS): - Fix lost-notification race condition in waitForReceiveInMessage() and waitForReceiveDestMessage(). The null check was outside the synchronized block, so if a message arrived between the check and the wait(), the notifyAll() would fire before wait() started, causing the test to block for the full timeout. Tracing tests (Brave, Micrometer, OpenTelemetry, OpenTracing): - Increase awaitility timeouts from 1 second to 10 seconds across all tracing tests. On slow CI machines, 1 second is insufficient for spans to arrive, causing ConditionTimeoutException instead of the expected ProcessingException in client timeout tests. - Add @Before cleanup to OpenTracingTracingTest to clear the static InMemoryReporter before each test, preventing span leakage from a previous test's asynchronous span delivery. Co-Authored-By: Claude Opus 4.6 <[email protected]> --- .../http_undertow/UndertowHTTPServerEngineTest.java | 19 +++++++------------ .../apache/cxf/transport/jms/AbstractJMSTester.java | 18 +++++++----------- .../brave/jaxrs/AbstractBraveTracingTest.java | 6 +++--- .../brave/jaxws/AbstractBraveTracingTest.java | 2 +- .../opentelemetry/OpenTelemetryTracingTest.java | 14 +++++++------- .../tracing/opentracing/OpenTracingTracingTest.java | 20 +++++++++++++------- .../opentelemetry/OpenTelemetryTracingTest.java | 4 ++-- .../tracing/opentracing/OpenTracingTracingTest.java | 4 ++-- 8 files changed, 42 insertions(+), 45 deletions(-) diff --git a/rt/transports/http-undertow/src/test/java/org/apache/cxf/transport/http_undertow/UndertowHTTPServerEngineTest.java b/rt/transports/http-undertow/src/test/java/org/apache/cxf/transport/http_undertow/UndertowHTTPServerEngineTest.java index 9daa8f2bd7..0b0c07b8e3 100644 --- a/rt/transports/http-undertow/src/test/java/org/apache/cxf/transport/http_undertow/UndertowHTTPServerEngineTest.java +++ b/rt/transports/http-undertow/src/test/java/org/apache/cxf/transport/http_undertow/UndertowHTTPServerEngineTest.java @@ -42,6 +42,7 @@ import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.management.InstrumentationManager; import org.apache.cxf.testutil.common.TestUtil; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -77,7 +78,13 @@ public class UndertowHTTPServerEngineTest { factory = new UndertowHTTPServerEngineFactory(); factory.setBus(bus); + } + @After + public void tearDown() throws Exception { + UndertowHTTPServerEngineFactory.destroyForPort(PORT1); + UndertowHTTPServerEngineFactory.destroyForPort(PORT2); + UndertowHTTPServerEngineFactory.destroyForPort(PORT3); } @@ -90,8 +97,6 @@ public class UndertowHTTPServerEngineTest { assertTrue( "Engine references for the same port should point to the same instance", engine == factory.retrieveUndertowHTTPServerEngine(PORT1)); - - UndertowHTTPServerEngineFactory.destroyForPort(PORT1); } @Test @@ -129,10 +134,6 @@ public class UndertowHTTPServerEngineTest { engine = factory.createUndertowHTTPServerEngine(PORT3, "https"); assertTrue("Protocol must be https", "https".equals(engine.getProtocol())); - - UndertowHTTPServerEngineFactory.destroyForPort(PORT1); - UndertowHTTPServerEngineFactory.destroyForPort(PORT2); - UndertowHTTPServerEngineFactory.destroyForPort(PORT3); } @Test @@ -186,9 +187,6 @@ public class UndertowHTTPServerEngineTest { engine.shutdown(); response = getResponse(urlStr2); assertEquals("The undertow http handler did not take effect", response, "string2"); - // set the get request - UndertowHTTPServerEngineFactory.destroyForPort(PORT1); - } /** @@ -233,9 +231,6 @@ public class UndertowHTTPServerEngineTest { s = CastUtils.cast(ManagementFactory.getPlatformMBeanServer(). queryNames(new ObjectName("org.xnio:type=Xnio,provider=\"nio\",worker=\"*\""), null)); assertEquals("Could not find 0 Undertow Server: " + s, 0, s.size()); - - UndertowHTTPServerEngineFactory.destroyForPort(PORT1); - UndertowHTTPServerEngineFactory.destroyForPort(PORT2); } private static String getResponse(String target) throws Exception { diff --git a/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/AbstractJMSTester.java b/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/AbstractJMSTester.java index dec83281bc..d0f807fbae 100644 --- a/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/AbstractJMSTester.java +++ b/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/AbstractJMSTester.java @@ -298,27 +298,23 @@ public abstract class AbstractJMSTester { protected Message waitForReceiveInMessage() throws InterruptedException { - if (null == inMessage.get()) { - synchronized (inMessage) { - inMessage.wait(MAX_RECEIVE_TIME * 1000L); - } + synchronized (inMessage) { if (null == inMessage.get()) { - assertNotNull("Can't receive the Conduit Message in " + MAX_RECEIVE_TIME + " seconds", inMessage.get()); + inMessage.wait(MAX_RECEIVE_TIME * 1000L); } } + assertNotNull("Can't receive the Conduit Message in " + MAX_RECEIVE_TIME + " seconds", inMessage.get()); return inMessage.getAndSet(null); } protected Message waitForReceiveDestMessage() throws InterruptedException { - if (null == destMessage.get()) { - synchronized (destMessage) { - destMessage.wait(MAX_RECEIVE_TIME * 1000L); - } + synchronized (destMessage) { if (null == destMessage.get()) { - assertNotNull("Can't receive the Destination message in " + MAX_RECEIVE_TIME + " seconds", - destMessage.get()); + destMessage.wait(MAX_RECEIVE_TIME * 1000L); } } + assertNotNull("Can't receive the Destination message in " + MAX_RECEIVE_TIME + " seconds", + destMessage.get()); return destMessage.getAndSet(null); } diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxrs/AbstractBraveTracingTest.java b/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxrs/AbstractBraveTracingTest.java index 0a248da9e7..741bd1aebe 100644 --- a/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxrs/AbstractBraveTracingTest.java +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxrs/AbstractBraveTracingTest.java @@ -265,7 +265,7 @@ public abstract class AbstractBraveTracingTest extends AbstractClientServerTestB } // Await till flush happens, usually a second is enough - await().atMost(Duration.ofSeconds(1L)).until(()-> TestSpanHandler.getAllSpans().size() == 4); + await().atMost(Duration.ofSeconds(10L)).until(()-> TestSpanHandler.getAllSpans().size() == 4); assertThat(TestSpanHandler.getAllSpans().size(), equalTo(4)); assertThat(TestSpanHandler.getAllSpans().get(3).name(), equalTo("test span")); @@ -292,7 +292,7 @@ public abstract class AbstractBraveTracingTest extends AbstractClientServerTestB } // Await till flush happens, usually a second is enough - await().atMost(Duration.ofSeconds(1L)).until(()-> TestSpanHandler.getAllSpans().size() == 4); + await().atMost(Duration.ofSeconds(10L)).until(()-> TestSpanHandler.getAllSpans().size() == 4); assertThat(TestSpanHandler.getAllSpans().size(), equalTo(4)); assertThat(TestSpanHandler.getAllSpans().get(3).name(), equalTo("test span")); @@ -340,7 +340,7 @@ public abstract class AbstractBraveTracingTest extends AbstractClientServerTestB try { client.get(); } finally { - await().atMost(Duration.ofSeconds(1L)).until(()-> TestSpanHandler.getAllSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(()-> TestSpanHandler.getAllSpans().size() == 2); assertThat(TestSpanHandler.getAllSpans().size(), equalTo(2)); assertThat(TestSpanHandler.getAllSpans().get(0).name(), equalTo("GET " + client.getCurrentURI())); assertThat(TestSpanHandler.getAllSpans().get(0).tags(), hasKey("error")); diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxws/AbstractBraveTracingTest.java b/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxws/AbstractBraveTracingTest.java index 07991044f4..54a13558cf 100644 --- a/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxws/AbstractBraveTracingTest.java +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxws/AbstractBraveTracingTest.java @@ -204,7 +204,7 @@ public abstract class AbstractBraveTracingTest extends AbstractClientServerTestB service.orderBooks(); // Await till flush happens, usually every second - await().atMost(Duration.ofSeconds(1L)).until(() -> TestSpanHandler.getAllSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(() -> TestSpanHandler.getAllSpans().size() == 2); assertThat(TestSpanHandler.getAllSpans().get(0).name(), equalTo("POST /BookStore")); assertThat(TestSpanHandler.getAllSpans().get(1).name(), diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/opentelemetry/OpenTelemetryTracingTest.java b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/opentelemetry/OpenTelemetryTracingTest.java index 280bf80996..919fd777fe 100644 --- a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/opentelemetry/OpenTelemetryTracingTest.java +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/opentelemetry/OpenTelemetryTracingTest.java @@ -257,7 +257,7 @@ public class OpenTelemetryTracingTest extends AbstractClientServerTestBase { final Response r = withTrace(createWebClient("/bookstore/books/async")).get(); assertEquals(Status.OK.getStatusCode(), r.getStatus()); - await().atMost(Duration.ofSeconds(1L)).until(() -> otelRule.getSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(() -> otelRule.getSpans().size() == 2); final List<SpanData> spans = getSpansSorted(); assertThat(spans.size(), equalTo(2)); @@ -287,7 +287,7 @@ public class OpenTelemetryTracingTest extends AbstractClientServerTestBase { final Response r = createWebClient("/bookstore/books/async").get(); assertEquals(Status.OK.getStatusCode(), r.getStatus()); - await().atMost(Duration.ofSeconds(1L)).until(() -> otelRule.getSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(() -> otelRule.getSpans().size() == 2); final List<SpanData> spans = getSpansSorted(); assertThat(spans.size(), equalTo(2)); @@ -303,7 +303,7 @@ public class OpenTelemetryTracingTest extends AbstractClientServerTestBase { final Response r = client.async().get().get(1L, TimeUnit.SECONDS); assertEquals(Status.OK.getStatusCode(), r.getStatus()); - await().atMost(Duration.ofSeconds(1L)).until(() -> otelRule.getSpans().size() == 3); + await().atMost(Duration.ofSeconds(10L)).until(() -> otelRule.getSpans().size() == 3); assertThat(otelRule.getSpans().size(), equalTo(3)); assertThat(otelRule.getSpans().get(0).getName(), equalTo("Get Books")); @@ -373,7 +373,7 @@ public class OpenTelemetryTracingTest extends AbstractClientServerTestBase { } // Await till flush happens, usually every second - await().atMost(Duration.ofSeconds(1L)).until(() -> otelRule.getSpans().size() == 4); + await().atMost(Duration.ofSeconds(10L)).until(() -> otelRule.getSpans().size() == 4); assertThat(otelRule.getSpans().size(), equalTo(4)); assertThat(otelRule.getSpans().get(3).getName(), equalTo("test span")); @@ -392,7 +392,7 @@ public class OpenTelemetryTracingTest extends AbstractClientServerTestBase { assertThat(Span.current().getSpanContext().getSpanId(), equalTo(span.getSpanContext().getSpanId())); - await().atMost(Duration.ofSeconds(1L)).until(() -> otelRule.getSpans().size() == 3); + await().atMost(Duration.ofSeconds(10L)).until(() -> otelRule.getSpans().size() == 3); assertThat(otelRule.getSpans().size(), equalTo(3)); assertThat(otelRule.getSpans().get(0).getName(), equalTo("Get Books")); @@ -406,7 +406,7 @@ public class OpenTelemetryTracingTest extends AbstractClientServerTestBase { } // Await till flush happens, usually every second - await().atMost(Duration.ofSeconds(1L)).until(() -> otelRule.getSpans().size() == 4); + await().atMost(Duration.ofSeconds(10L)).until(() -> otelRule.getSpans().size() == 4); assertThat(otelRule.getSpans().size(), equalTo(4)); assertThat(otelRule.getSpans().get(3).getName(), equalTo("test span")); @@ -443,7 +443,7 @@ public class OpenTelemetryTracingTest extends AbstractClientServerTestBase { try { client.get(); } finally { - await().atMost(Duration.ofSeconds(1L)).until(() -> otelRule.getSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(() -> otelRule.getSpans().size() == 2); assertThat(otelRule.getSpans().toString(), otelRule.getSpans().size(), equalTo(2)); assertThat(otelRule.getSpans().get(0).getName(), equalTo("GET " + client.getCurrentURI())); assertThat(otelRule.getSpans().get(0).getStatus().getStatusCode(), equalTo(StatusCode.ERROR)); diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/opentracing/OpenTracingTracingTest.java b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/opentracing/OpenTracingTracingTest.java index 7b816cf4ff..fbe00b0ab6 100644 --- a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/opentracing/OpenTracingTracingTest.java +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/opentracing/OpenTracingTracingTest.java @@ -65,6 +65,7 @@ import io.opentracing.propagation.TextMap; import io.opentracing.tag.Tags; import org.junit.After; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; @@ -130,6 +131,11 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { assertTrue("server did not launch correctly", launchServer(OpenTracingServer.class, true)); } + @Before + public void setUp() { + REPORTER.clear(); + } + @After public void tearDown() { REPORTER.clear(); @@ -199,7 +205,7 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { final Response r = withTrace(createWebClient("/bookstore/books/async"), spanId).get(); assertEquals(Status.OK.getStatusCode(), r.getStatus()); - await().atMost(Duration.ofSeconds(1L)).until(()-> REPORTER.getSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(()-> REPORTER.getSpans().size() == 2); final List<JaegerSpan> spans = getSpansSorted(); assertThat(spans.size(), equalTo(2)); @@ -226,7 +232,7 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { final Response r = createWebClient("/bookstore/books/async").get(); assertEquals(Status.OK.getStatusCode(), r.getStatus()); - await().atMost(Duration.ofSeconds(1L)).until(()-> REPORTER.getSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(()-> REPORTER.getSpans().size() == 2); final List<JaegerSpan> spans = getSpansSorted(); assertThat(spans.size(), equalTo(2)); @@ -241,7 +247,7 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { final Response r = client.async().get().get(1L, TimeUnit.SECONDS); assertEquals(Status.OK.getStatusCode(), r.getStatus()); - await().atMost(Duration.ofSeconds(1L)).until(()-> REPORTER.getSpans().size() == 3); + await().atMost(Duration.ofSeconds(10L)).until(()-> REPORTER.getSpans().size() == 3); assertThat(REPORTER.getSpans().size(), equalTo(3)); assertThat(REPORTER.getSpans().get(0).getOperationName(), equalTo("Get Books")); @@ -325,7 +331,7 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { } // Await till flush happens, usually every second - await().atMost(Duration.ofSeconds(1L)).until(()-> REPORTER.getSpans().size() == 4); + await().atMost(Duration.ofSeconds(10L)).until(()-> REPORTER.getSpans().size() == 4); assertThat(REPORTER.getSpans().size(), equalTo(4)); assertThat(REPORTER.getSpans().get(3).getOperationName(), equalTo("test span")); @@ -342,7 +348,7 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { assertEquals(Status.OK.getStatusCode(), r.getStatus()); assertThat(tracer.activeSpan().context(), equalTo(span.context())); - await().atMost(Duration.ofSeconds(1L)).until(()-> REPORTER.getSpans().size() == 3); + await().atMost(Duration.ofSeconds(10L)).until(()-> REPORTER.getSpans().size() == 3); assertThat(REPORTER.getSpans().size(), equalTo(3)); assertThat(REPORTER.getSpans().get(0).getOperationName(), equalTo("Get Books")); @@ -356,7 +362,7 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { } // Await till flush happens, usually every second - await().atMost(Duration.ofSeconds(1L)).until(()-> REPORTER.getSpans().size() == 4); + await().atMost(Duration.ofSeconds(10L)).until(()-> REPORTER.getSpans().size() == 4); assertThat(REPORTER.getSpans().size(), equalTo(4)); assertThat(REPORTER.getSpans().get(3).getOperationName(), equalTo("test span")); @@ -391,7 +397,7 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { try { client.get(); } finally { - await().atMost(Duration.ofSeconds(1L)).until(()-> REPORTER.getSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(()-> REPORTER.getSpans().size() == 2); assertThat(REPORTER.getSpans().toString(), REPORTER.getSpans().size(), equalTo(2)); assertThat(REPORTER.getSpans().get(0).getOperationName(), equalTo("GET " + client.getCurrentURI())); assertThat(REPORTER.getSpans().get(0).getTags(), hasItem(Tags.ERROR.getKey(), Boolean.TRUE)); diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/opentelemetry/OpenTelemetryTracingTest.java b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/opentelemetry/OpenTelemetryTracingTest.java index 71a9f499e2..b41c42b899 100644 --- a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/opentelemetry/OpenTelemetryTracingTest.java +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/opentelemetry/OpenTelemetryTracingTest.java @@ -247,7 +247,7 @@ public class OpenTelemetryTracingTest extends AbstractClientServerTestBase { } // Await till flush happens, usually every second - await().atMost(Duration.ofSeconds(1L)).until(() -> otelRule.getSpans().size() == 4); + await().atMost(Duration.ofSeconds(10L)).until(() -> otelRule.getSpans().size() == 4); assertThat(otelRule.getSpans().size(), equalTo(4)); assertThat(otelRule.getSpans().get(3).getName(), equalTo("test span")); @@ -331,7 +331,7 @@ public class OpenTelemetryTracingTest extends AbstractClientServerTestBase { service.orderBooks(); // Await till flush happens, usually every second - await().atMost(Duration.ofSeconds(1L)).until(() -> otelRule.getSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(() -> otelRule.getSpans().size() == 2); assertThat(otelRule.getSpans().get(0).getName(), equalTo("POST /BookStore")); assertThat(otelRule.getSpans().get(1).getName(), diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/opentracing/OpenTracingTracingTest.java b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/opentracing/OpenTracingTracingTest.java index c5ff413c2a..ab0103acc3 100644 --- a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/opentracing/OpenTracingTracingTest.java +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/opentracing/OpenTracingTracingTest.java @@ -178,7 +178,7 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { } // Await till flush happens, usually every second - await().atMost(Duration.ofSeconds(1L)).until(()-> REPORTER.getSpans().size() == 4); + await().atMost(Duration.ofSeconds(10L)).until(()-> REPORTER.getSpans().size() == 4); assertThat(REPORTER.getSpans().size(), equalTo(4)); assertThat(REPORTER.getSpans().get(3).getOperationName(), equalTo("test span")); @@ -234,7 +234,7 @@ public class OpenTracingTracingTest extends AbstractClientServerTestBase { service.orderBooks(); // Await till flush happens, usually every second - await().atMost(Duration.ofSeconds(1L)).until(() -> REPORTER.getSpans().size() == 2); + await().atMost(Duration.ofSeconds(10L)).until(() -> REPORTER.getSpans().size() == 2); assertThat(REPORTER.getSpans().get(0).getOperationName(), equalTo("POST /BookStore")); assertThat(REPORTER.getSpans().get(1).getOperationName(),
