package com.github.jaceko.circuitswitcher;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Test;
import com.github.jaceko.circuitswitcher.Circuit;
public class CircuitTest {
private Circuit circuit;
@Test
public void shouldBeAvailableByDefault() {
circuit = new Circuit(null, 0, 0);
assertThat(circuit.connectionAvailable(), is(true));
}
@Test
public void shouldBeAvailableAfterFirstFailure() {
int maxFailures = 3;
circuit = new Circuit(null, maxFailures, 200);
circuit.handleFailedConnection();
assertThat(circuit.connectionAvailable(), is(true));
}
@Test
public void shouldBeAvailableAfterTwoFailures() {
int maxFailures = 3;
circuit = new Circuit(null, maxFailures, 200);
circuit.handleFailedConnection();
circuit.handleFailedConnection();
assertThat(circuit.connectionAvailable(), is(true));
}
@Test
public void shouldNotBeAvailableAfterExceedeingThreshold() {
int maxFailures = 3;
circuit = new Circuit(null, maxFailures, 200);
circuit.handleFailedConnection();
circuit.handleFailedConnection();
circuit.handleFailedConnection();
assertThat(circuit.connectionAvailable(), is(false));
}
@Test
public void shouldBeAvailableAfterResetTimeout() throws InterruptedException {
long resetTimeout = 50;
circuit = new Circuit(null, 0, resetTimeout);
circuit.handleFailedConnection();
assertThat(circuit.connectionAvailable(), is(false));
Thread.sleep(70);
assertThat(circuit.connectionAvailable(), is(true));
}
@Test
public void shouldGoIntoFailedStateAfterGiongBackToNormal() throws InterruptedException {
long resetTimeout = 50;
circuit = new Circuit(null, 0, resetTimeout);
circuit.handleFailedConnection();
assertThat(circuit.connectionAvailable(), is(false));
Thread.sleep(70);
assertThat(circuit.connectionAvailable(), is(true));
circuit.handleFailedConnection();
assertThat(circuit.connectionAvailable(), is(false));
}
@Test
public void shouldReturnCirucitsInitialRepresenation() {
String targetAddress = "http://someUrl";
long resetTimeout = 50;
int failureThreshold = 3;
circuit = new Circuit(targetAddress, failureThreshold, resetTimeout);
assertThat(
circuit.toString(),
is("Circuit [targetAddress=http://someUrl, state=CircuitClosed [failureCount=0], failureThreshold=3, resetTimeout=50]"));
}
@Test
public void shouldReturnCirucitsRepresenationAfterFirstFailure() {
String targetAddress = "http://someUrl";
long resetTimeout = 50;
int failureThreshold = 3;
circuit = new Circuit(targetAddress, failureThreshold, resetTimeout);
circuit.handleFailedConnection();
assertThat(
circuit.toString(),
is("Circuit [targetAddress=http://someUrl, state=CircuitClosed [failureCount=1], failureThreshold=3, resetTimeout=50]"));
circuit.handleSuccesfullConnection();
assertThat(
circuit.toString(),
is("Circuit [targetAddress=http://someUrl, state=CircuitClosed [failureCount=0], failureThreshold=3, resetTimeout=50]"));
}
@Test
public void shouldReturnCirucitsRepresenationAfterExceedingFailureThreshold() {
String targetAddress = "http://someUrl";
long resetTimeout = 50;
int failureThreshold = 2;
circuit = new Circuit(targetAddress, failureThreshold, resetTimeout);
circuit.handleFailedConnection();
circuit.handleFailedConnection();
assertThat(circuit.toString(), containsString("Circuit [targetAddress=http://someUrl, state=CircuitOpen"));
}
@Test
public void shouldReturnCirucitsRepresenationResetTimeout() throws InterruptedException {
String targetAddress = "http://someUrlABC";
long resetTimeout = 50;
int failureThreshold = 2;
circuit = new Circuit(targetAddress, failureThreshold, resetTimeout);
circuit.handleFailedConnection();
circuit.handleFailedConnection();
Thread.sleep(70);
circuit.connectionAvailable();
assertThat(
circuit.toString(),
is("Circuit [targetAddress=http://someUrlABC, state=CircuitHalfOpen, failureThreshold=2, resetTimeout=50]"));
circuit.handleSuccesfullConnection();
assertThat(
circuit.toString(),
is("Circuit [targetAddress=http://someUrlABC, state=CircuitClosed [failureCount=0], failureThreshold=2, resetTimeout=50]"));
}
}