aboutsummaryrefslogtreecommitdiffstats
path: root/vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/GracePeriodCircuitBreakerTest.java
diff options
context:
space:
mode:
authorMorten Tokle <mortent@verizonmedia.com>2021-12-07 12:52:42 +0100
committerMorten Tokle <mortent@verizonmedia.com>2021-12-07 12:52:42 +0100
commit5e956429169d3a733114e5f76f051167f291c786 (patch)
treefa2b9cc664c8c639482397e9a4566149dac3ae29 /vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/GracePeriodCircuitBreakerTest.java
parentae09069f544a086af4ae02a092ec66788a3cae9e (diff)
Extract vespa-feed-client-api module from vespa-feed-client
Diffstat (limited to 'vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/GracePeriodCircuitBreakerTest.java')
-rw-r--r--vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/GracePeriodCircuitBreakerTest.java61
1 files changed, 61 insertions, 0 deletions
diff --git a/vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/GracePeriodCircuitBreakerTest.java b/vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/GracePeriodCircuitBreakerTest.java
new file mode 100644
index 00000000000..b7dac5ce52e
--- /dev/null
+++ b/vespa-feed-client/src/test/java/ai/vespa/feed/client/impl/GracePeriodCircuitBreakerTest.java
@@ -0,0 +1,61 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package ai.vespa.feed.client.impl;
+
+import ai.vespa.feed.client.FeedClient.CircuitBreaker;
+import org.junit.jupiter.api.Test;
+
+import java.time.Duration;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static ai.vespa.feed.client.FeedClient.CircuitBreaker.State.CLOSED;
+import static ai.vespa.feed.client.FeedClient.CircuitBreaker.State.HALF_OPEN;
+import static ai.vespa.feed.client.FeedClient.CircuitBreaker.State.OPEN;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+ * @author jonmv
+ */
+class GracePeriodCircuitBreakerTest {
+
+ @Test
+ void testCircuitBreaker() {
+ AtomicLong now = new AtomicLong(0);
+ long SECOND = 1000;
+ CircuitBreaker breaker = new GracePeriodCircuitBreaker(now::get, Duration.ofSeconds(1), Duration.ofMinutes(1));
+ Throwable error = new Error();
+
+ assertEquals(CLOSED, breaker.state(), "Initial state is closed");
+
+ now.addAndGet(100 * SECOND);
+ assertEquals(CLOSED, breaker.state(), "State is closed after some time without activity");
+
+ breaker.success();
+ assertEquals(CLOSED, breaker.state(), "State is closed after a success");
+
+ now.addAndGet(100 * SECOND);
+ assertEquals(CLOSED, breaker.state(), "State is closed some time after a success");
+
+ breaker.failure(error);
+ assertEquals(CLOSED, breaker.state(), "State is closed right after a failure");
+
+ now.addAndGet(SECOND);
+ assertEquals(CLOSED, breaker.state(), "State is closed until grace period has passed");
+
+ now.addAndGet(1);
+ assertEquals(HALF_OPEN, breaker.state(), "State is half-open when grace period has passed");
+
+ breaker.success();
+ assertEquals(CLOSED, breaker.state(), "State is closed after a new success");
+
+ breaker.failure(error);
+ now.addAndGet(60 * SECOND);
+ assertEquals(HALF_OPEN, breaker.state(), "State is half-open until doom period has passed");
+
+ now.addAndGet(1);
+ assertEquals(OPEN, breaker.state(), "State is open when doom period has passed");
+
+ breaker.success();
+ assertEquals(OPEN, breaker.state(), "State remains open in spite of new successes");
+ }
+
+}