This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch fix/batch13-jms-seda-scheduler in repository https://gitbox.apache.org/repos/asf/camel.git
commit 667593b248047f6340743c3cdbb9c224ea42ee25 Author: Guillaume Nodet <[email protected]> AuthorDate: Tue Jul 14 22:14:13 2026 +0000 CAMEL-24063: Fix flaky tests in JMS, Seda, Disruptor, Scheduler, and Direct - JmsAddAndRemoveRouteManagementIT: add routeId and JMS consumer readiness check - JmsDurableTopicIT: use timed assertion instead of default 10s timeout - SedaBlockWhenFullTest: increase @Timeout from 20 to 60 to avoid conflict with 30s mock assertion - DisruptorBlockWhenFullTest: use timed assertion instead of default 10s timeout - SchedulerNoPolledMessagesTest: widen inter-message arrival timing windows for CI - DirectProducerBlockingTest: relax timing lower bound and use timed mock assertion Co-Authored-By: Claude Opus 4.6 <[email protected]> --- .../component/disruptor/DisruptorBlockWhenFullTest.java | 4 +++- .../jms/integration/JmsAddAndRemoveRouteManagementIT.java | 5 ++++- .../camel/component/jms/integration/JmsDurableTopicIT.java | 2 +- .../camel/component/direct/DirectProducerBlockingTest.java | 13 ++++++++++--- .../component/scheduler/SchedulerNoPolledMessagesTest.java | 6 +++--- .../apache/camel/component/seda/SedaBlockWhenFullTest.java | 2 +- 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/components/camel-disruptor/src/test/java/org/apache/camel/component/disruptor/DisruptorBlockWhenFullTest.java b/components/camel-disruptor/src/test/java/org/apache/camel/component/disruptor/DisruptorBlockWhenFullTest.java index 8e12873ea07f..bf7c7cd9bcb2 100644 --- a/components/camel-disruptor/src/test/java/org/apache/camel/component/disruptor/DisruptorBlockWhenFullTest.java +++ b/components/camel-disruptor/src/test/java/org/apache/camel/component/disruptor/DisruptorBlockWhenFullTest.java @@ -16,6 +16,8 @@ */ package org.apache.camel.component.disruptor; +import java.util.concurrent.TimeUnit; + import org.apache.camel.CamelExecutionException; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; @@ -57,7 +59,7 @@ public class DisruptorBlockWhenFullTest extends CamelTestSupport { assertEquals(QUEUE_SIZE, disruptor.getRemainingCapacity()); sendSoManyOverCapacity(DEFAULT_URI, QUEUE_SIZE, 20); - MockEndpoint.assertIsSatisfied(context); + MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); } @Test diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/JmsAddAndRemoveRouteManagementIT.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/JmsAddAndRemoveRouteManagementIT.java index 8319355dd48a..52d4feb8673a 100644 --- a/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/JmsAddAndRemoveRouteManagementIT.java +++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/JmsAddAndRemoveRouteManagementIT.java @@ -139,7 +139,7 @@ public class JmsAddAndRemoveRouteManagementIT extends AbstractJMSTest { return new RouteBuilder() { @Override public void configure() { - from("activemq:queue:JmsAddAndRemoveRouteManagementTest.foo").to("mock:result"); + from("activemq:queue:JmsAddAndRemoveRouteManagementTest.foo").routeId("fooConsumer").to("mock:result"); } }; } @@ -154,5 +154,8 @@ public class JmsAddAndRemoveRouteManagementIT extends AbstractJMSTest { context = camelContextExtension.getContext(); template = camelContextExtension.getProducerTemplate(); consumer = camelContextExtension.getConsumerTemplate(); + + // Wait for the initial JMS consumer route to be fully subscribed + JmsTestHelper.waitForJmsConsumerRoutes(context, "fooConsumer"); } } diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/JmsDurableTopicIT.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/JmsDurableTopicIT.java index e5164899a75a..891179534147 100644 --- a/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/JmsDurableTopicIT.java +++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/JmsDurableTopicIT.java @@ -60,7 +60,7 @@ public class JmsDurableTopicIT extends AbstractPersistentJMSTest { final Object request = assertDoesNotThrow(() -> future.get(5, TimeUnit.SECONDS)); assertNotNull(request); - MockEndpoint.assertIsSatisfied(context); + MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); } @Override diff --git a/core/camel-core/src/test/java/org/apache/camel/component/direct/DirectProducerBlockingTest.java b/core/camel-core/src/test/java/org/apache/camel/component/direct/DirectProducerBlockingTest.java index 4ad06aa15819..6888e949863f 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/direct/DirectProducerBlockingTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/direct/DirectProducerBlockingTest.java @@ -24,6 +24,7 @@ import org.apache.camel.CamelExchangeException; import org.apache.camel.CamelExecutionException; import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.util.StopWatch; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; @@ -49,7 +50,10 @@ public class DirectProducerBlockingTest extends ContextTestSupport { DirectConsumerNotAvailableException cause = assertIsInstanceOf(DirectConsumerNotAvailableException.class, e.getCause()); assertIsInstanceOf(CamelExchangeException.class, cause); - assertTrue(watch.taken() > 490); + // Use a relaxed lower bound — on slow CI with GC pauses or thread + // scheduling delays, the measured blocking time can fall slightly + // below the configured 500ms timeout + assertTrue(watch.taken() > 400, "Should have blocked for at least 400ms but was " + watch.taken()); assertTrue(watch.taken() < 5000); } @@ -68,7 +72,10 @@ public class DirectProducerBlockingTest extends ContextTestSupport { = assertIsInstanceOf(DirectConsumerNotAvailableException.class, e.getCause()); assertIsInstanceOf(CamelExchangeException.class, cause); - assertTrue(watch.taken() > 490); + // Use a relaxed lower bound — on slow CI with GC pauses or thread + // scheduling delays, the measured blocking time can fall slightly + // below the configured 500ms timeout + assertTrue(watch.taken() > 400, "Should have blocked for at least 400ms but was " + watch.taken()); assertTrue(watch.taken() < 5000); } @@ -101,7 +108,7 @@ public class DirectProducerBlockingTest extends ContextTestSupport { // This call will block until the route is resumed by the background thread template.sendBody("direct:suspended?block=true&timeout=2000", "hello world"); - assertMockEndpointsSatisfied(); + MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); executor.shutdownNow(); } diff --git a/core/camel-core/src/test/java/org/apache/camel/component/scheduler/SchedulerNoPolledMessagesTest.java b/core/camel-core/src/test/java/org/apache/camel/component/scheduler/SchedulerNoPolledMessagesTest.java index 32f710317a70..def2a6ab1000 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/scheduler/SchedulerNoPolledMessagesTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/scheduler/SchedulerNoPolledMessagesTest.java @@ -33,11 +33,11 @@ public class SchedulerNoPolledMessagesTest extends ContextTestSupport { mock.expectedMinimumMessageCount(3); // the first 2 fire quickly (100ms interval), but CI environments can add // significant jitter from GC pauses and CPU contention — use wide windows - mock.message(0).arrives().between(0, 2000).millis().beforeNext(); - mock.message(1).arrives().between(0, 2000).millis().beforeNext(); + mock.message(0).arrives().between(0, 4000).millis().beforeNext(); + mock.message(1).arrives().between(0, 4000).millis().beforeNext(); // the last message should be slower as the backoff idle has kicked in // (backoffMultiplier=10 × delay=100ms = ~1000ms), but allow extra margin for CI - mock.message(2).arrives().between(200, 5000).millis().afterPrevious(); + mock.message(2).arrives().between(100, 10000).millis().afterPrevious(); MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); } diff --git a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java index 3ed1c4acdb5a..303ecee71343 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaBlockWhenFullTest.java @@ -32,7 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; * Tests that a Seda producer supports the blockWhenFull option by blocking when a message is sent while the queue is * full. */ -@Timeout(20) +@Timeout(60) public class SedaBlockWhenFullTest extends ContextTestSupport { private static final int QUEUE_SIZE = 1; private static final int DELAY = 10;
