This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 9c0e636cdfe9bf96f5f48ae709c50f57e06a47af Author: LanKhuat <[email protected]> AuthorDate: Wed Mar 25 18:07:35 2020 +0700 JAMES-3117 Use reactor test library for testing with virtual time --- server/container/guice/guice-common/pom.xml | 5 ++- .../org/apache/james/PeriodicalHealthChecks.java | 22 ++++++----- .../apache/james/PeriodicalHealthChecksTest.java | 46 ++++++++++------------ 3 files changed, 36 insertions(+), 37 deletions(-) diff --git a/server/container/guice/guice-common/pom.xml b/server/container/guice/guice-common/pom.xml index 4433636..e24d450 100644 --- a/server/container/guice/guice-common/pom.xml +++ b/server/container/guice/guice-common/pom.xml @@ -152,8 +152,9 @@ <artifactId>guice</artifactId> </dependency> <dependency> - <groupId>org.awaitility</groupId> - <artifactId>awaitility</artifactId> + <groupId>io.projectreactor</groupId> + <artifactId>reactor-test</artifactId> + <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/PeriodicalHealthChecks.java b/server/container/guice/guice-common/src/main/java/org/apache/james/PeriodicalHealthChecks.java index a18998c..86d5806 100644 --- a/server/container/guice/guice-common/src/main/java/org/apache/james/PeriodicalHealthChecks.java +++ b/server/container/guice/guice-common/src/main/java/org/apache/james/PeriodicalHealthChecks.java @@ -31,26 +31,28 @@ import org.apache.james.lifecycle.api.Startable; import reactor.core.Disposable; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; public class PeriodicalHealthChecks implements Startable { - private final Flux<HealthCheck> healthChecks; - private final long initialDelay; - private final long period; + private final Set<HealthCheck> healthChecks; + private final Scheduler scheduler; + private final Duration period; private Disposable disposable; @Inject - PeriodicalHealthChecks(Set<HealthCheck> healthChecks, PeriodicalHealthChecksConfiguration config) { - this.healthChecks = Flux.fromIterable(healthChecks); - this.initialDelay = config.getInitialDelay(); + PeriodicalHealthChecks(Set<HealthCheck> healthChecks, Scheduler scheduler, PeriodicalHealthChecksConfiguration config) { + this.healthChecks = healthChecks; + this.scheduler = scheduler; this.period = config.getPeriod(); } public void start() { - disposable = Flux.interval(Duration.ofSeconds(initialDelay), Duration.ofSeconds(period)) - .flatMap(any -> - healthChecks.flatMap(healthCheck -> Mono.just(healthCheck.check()))) + disposable = Flux.interval(period, scheduler) + .flatMap(any -> Flux.fromIterable(healthChecks) + .flatMap(healthCheck -> + Mono.fromCallable(healthCheck::check))) .subscribeOn(Schedulers.elastic()) .subscribe(); } @@ -59,4 +61,4 @@ public class PeriodicalHealthChecks implements Startable { public void stop() { disposable.dispose(); } -} +} \ No newline at end of file diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/PeriodicalHealthChecksTest.java b/server/container/guice/guice-common/src/test/java/org/apache/james/PeriodicalHealthChecksTest.java index 8253899..dfc241f 100644 --- a/server/container/guice/guice-common/src/test/java/org/apache/james/PeriodicalHealthChecksTest.java +++ b/server/container/guice/guice-common/src/test/java/org/apache/james/PeriodicalHealthChecksTest.java @@ -25,32 +25,28 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.util.HashSet; -import java.util.Set; +import java.time.Duration; import org.apache.james.core.healthcheck.ComponentName; import org.apache.james.core.healthcheck.HealthCheck; import org.apache.james.core.healthcheck.Result; import org.apache.james.mailbox.events.EventDeadLettersHealthCheck; -import org.awaitility.Awaitility; -import org.awaitility.Duration; -import org.awaitility.core.ConditionFactory; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -public class PeriodicalHealthChecksTest { +import com.google.common.collect.ImmutableSet; + +import reactor.test.scheduler.VirtualTimeScheduler; - private static final long INITIAL_DELAY = 1; - private static final long PERIOD = 1; - private static final ConditionFactory AWAIT = Awaitility.await() - .atMost(Duration.TEN_SECONDS) - .with() - .pollInterval(Duration.ONE_SECOND); +public class PeriodicalHealthChecksTest { + private static final long PERIOD = 10; + private static final int EXPECTED_INVOKED_TIME = 10; private HealthCheck mockHealthCheck1; private HealthCheck mockHealthCheck2; + private VirtualTimeScheduler scheduler; private PeriodicalHealthChecks testee; @BeforeEach @@ -60,11 +56,10 @@ public class PeriodicalHealthChecksTest { when(mockHealthCheck1.check()).thenReturn(Result.healthy(new ComponentName("mockHealthCheck1"))); when(mockHealthCheck2.check()).thenReturn(Result.healthy(new ComponentName("mockHealthCheck2"))); - Set<HealthCheck> healthCheckSet = new HashSet<>(); - healthCheckSet.add(mockHealthCheck1); - healthCheckSet.add(mockHealthCheck2); - - testee = new PeriodicalHealthChecks(healthCheckSet, new PeriodicalHealthChecksConfiguration(INITIAL_DELAY, PERIOD)); + scheduler = VirtualTimeScheduler.getOrSet(); + testee = new PeriodicalHealthChecks(ImmutableSet.of(mockHealthCheck1, mockHealthCheck2), + scheduler, + new PeriodicalHealthChecksConfiguration(Duration.ofMillis(PERIOD))); testee.start(); } @@ -72,22 +67,23 @@ public class PeriodicalHealthChecksTest { void tearDown() { testee.stop(); } - + @Test void startShouldCallHealthCheckAtLeastOnce() { - AWAIT.untilAsserted(() -> verify(mockHealthCheck1, atLeast(1)).check()); + scheduler.advanceTimeBy(Duration.ofMillis(PERIOD)); + verify(mockHealthCheck1, atLeast(1)).check(); } @Test void startShouldCallHealthCheckMultipleTimes() { - AWAIT.untilAsserted(() -> verify(mockHealthCheck1, times(5)).check()); + scheduler.advanceTimeBy(Duration.ofMillis(PERIOD * EXPECTED_INVOKED_TIME)); + verify(mockHealthCheck1, times(EXPECTED_INVOKED_TIME)).check(); } @Test void startShouldCallAllHealthChecks() { - AWAIT.untilAsserted(() -> { - verify(mockHealthCheck1, atLeast(5)).check(); - verify(mockHealthCheck2, atLeast(5)).check(); - }); + scheduler.advanceTimeBy(Duration.ofMillis(PERIOD * EXPECTED_INVOKED_TIME)); + verify(mockHealthCheck1, times(EXPECTED_INVOKED_TIME)).check(); + verify(mockHealthCheck2, times(EXPECTED_INVOKED_TIME)).check(); } -} +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
