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;

Reply via email to