From 6dba93131301887c1ca55f22b70f9b410dc909bb Mon Sep 17 00:00:00 2001 From: Robby Decosemaeker Date: Thu, 16 Dec 2021 12:58:36 +0100 Subject: [PATCH 1/2] Add test to verify behaviour --- .../test/java/org/awaitility/core/ConditionAwaiterTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java b/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java index c4a9c20a..757adbe1 100644 --- a/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java +++ b/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java @@ -1,6 +1,7 @@ package org.awaitility.core; +import org.awaitility.Awaitility; import org.junit.Test; import java.time.Duration; @@ -49,4 +50,9 @@ public class ConditionAwaiterTest { assertThat(Thread.getDefaultUncaughtExceptionHandler(), is(originalUncaughtExceptionHandler)); } + + @Test + public void shouldHandleImmediateResultWithAtMost(){ + Awaitility.await().atMost(Duration.ofMillis(10)).pollInterval(Duration.ofMillis(5)).until(() -> true); + } } \ No newline at end of file From bebc83b4fde9dd44b4f08e63d7c40d05a4a257a2 Mon Sep 17 00:00:00 2001 From: Robby Decosemaeker Date: Thu, 23 Dec 2021 12:04:45 +0100 Subject: [PATCH 2/2] Initial ugly implementation --- .../java/org/awaitility/core/ConditionAwaiter.java | 12 ++++++++---- .../org/awaitility/core/ConditionAwaiterTest.java | 5 ++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/awaitility/src/main/java/org/awaitility/core/ConditionAwaiter.java b/awaitility/src/main/java/org/awaitility/core/ConditionAwaiter.java index f0d35d22..38fc9bfd 100755 --- a/awaitility/src/main/java/org/awaitility/core/ConditionAwaiter.java +++ b/awaitility/src/main/java/org/awaitility/core/ConditionAwaiter.java @@ -112,9 +112,9 @@ public void await(final ConditionEvaluationHandler conditionEvaluationHan pollInterval = conditionSettings.getPollInterval().next(pollCount, pollInterval); sleepUninterruptibly(pollInterval.toNanos(), NANOSECONDS); - evaluationDuration = calculateConditionEvaluationDuration(pollDelay, pollingStartedNanos); + evaluationDuration = calculateConditionEvaluationDuration(pollDelay, pollingStartedNanos, firstSucceedSinceStarted, minWaitTime, holdPredicateWaitTime); } - evaluationDuration = calculateConditionEvaluationDuration(pollDelay, pollingStartedNanos); + evaluationDuration = calculateConditionEvaluationDuration(pollDelay, pollingStartedNanos, firstSucceedSinceStarted, minWaitTime, holdPredicateWaitTime); succeededBeforeTimeout = maxWaitTime.compareTo(evaluationDuration) > 0; } catch (TimeoutException e) { lastResult = new ConditionEvaluationResult(false, null, e); @@ -239,8 +239,12 @@ public ConditionEvaluationResult call() { } } - static Duration calculateConditionEvaluationDuration(Duration pollDelay, long pollingStarted) { - final long calculatedDuration = System.nanoTime() - pollingStarted - pollDelay.toNanos(); + static Duration calculateConditionEvaluationDuration(Duration pollDelay, long pollingStarted, long firstSucceedSinceStarted, Duration minWaitTime, Duration holdPredicateWaitTime) { + final long now = System.nanoTime(); + long calculatedDuration = now - pollingStarted - pollDelay.toNanos(); + if(firstSucceedSinceStarted > 0 && minWaitTime.isZero() && holdPredicateWaitTime.isZero()){ + calculatedDuration = now - firstSucceedSinceStarted; + } final long potentiallyCompensatedDuration = Math.max(calculatedDuration, 1L); return Duration.of(potentiallyCompensatedDuration, NANOS); } diff --git a/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java b/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java index 757adbe1..377aace2 100644 --- a/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java +++ b/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java @@ -1,7 +1,6 @@ package org.awaitility.core; -import org.awaitility.Awaitility; import org.junit.Test; import java.time.Duration; @@ -19,7 +18,7 @@ public class ConditionAwaiterTest { */ @Test public void calculates_a_duration_of_1_nano_when_system_nano_time_is_skewed() { - Duration duration = ConditionAwaiter.calculateConditionEvaluationDuration(Duration.ofNanos(10000000L), System.nanoTime()); + Duration duration = ConditionAwaiter.calculateConditionEvaluationDuration(Duration.ofNanos(10000000L), System.nanoTime(), 0, Duration.ofNanos(0), Duration.ofNanos(0)); assertThat(duration.toNanos(), is(1L)); } @@ -53,6 +52,6 @@ public class ConditionAwaiterTest { @Test public void shouldHandleImmediateResultWithAtMost(){ - Awaitility.await().atMost(Duration.ofMillis(10)).pollInterval(Duration.ofMillis(5)).until(() -> true); + await().atMost(Duration.ofMillis(10)).pollInterval(Duration.ofMillis(5)).until(() -> true); } } \ No newline at end of file