From 9e40d37614fae55588b7d512a447f76804f3e312 Mon Sep 17 00:00:00 2001 From: Robby Decosemaeker Date: Fri, 4 Mar 2022 13:13:33 +0100 Subject: [PATCH] Fix #224 - handle immidiate success scenario (#228) * Add test to verify behaviour * Initial ugly implementation Co-authored-by: Robby Decosemaeker --- .../java/org/awaitility/core/ConditionAwaiter.java | 12 ++++++++---- .../org/awaitility/core/ConditionAwaiterTest.java | 7 ++++++- 2 files changed, 14 insertions(+), 5 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 c4a9c20a..377aace2 100644 --- a/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java +++ b/awaitility/src/test/java/org/awaitility/core/ConditionAwaiterTest.java @@ -18,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)); } @@ -49,4 +49,9 @@ public class ConditionAwaiterTest { assertThat(Thread.getDefaultUncaughtExceptionHandler(), is(originalUncaughtExceptionHandler)); } + + @Test + public void shouldHandleImmediateResultWithAtMost(){ + await().atMost(Duration.ofMillis(10)).pollInterval(Duration.ofMillis(5)).until(() -> true); + } } \ No newline at end of file