60 lines
3.3 KiB
Java
60 lines
3.3 KiB
Java
import com.chaegeon.niro.WeatherRefreshGate;
|
|
|
|
public final class WeatherRefreshGateTest {
|
|
private static void check(boolean condition, String name) {
|
|
if (!condition) {
|
|
throw new AssertionError(name);
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
WeatherRefreshGate gate = new WeatherRefreshGate(60000L, 10000L, 2000L);
|
|
check(gate.admit(100L) == WeatherRefreshGate.Admission.FETCH,
|
|
"first fetch accepted");
|
|
check(gate.isRunning(), "running");
|
|
check(gate.admit(101L) == WeatherRefreshGate.Admission.COALESCE,
|
|
"in-flight request coalesced");
|
|
gate.finish(200L, WeatherRefreshGate.Admission.FETCH, true);
|
|
check(!gate.isRunning(), "finished");
|
|
check(gate.admit(300L) == WeatherRefreshGate.Admission.REPLAY,
|
|
"recent successful response replayed");
|
|
check(gate.replayDelayMillis(300L) == 1900L,
|
|
"first replay waits until two seconds after fetch callback");
|
|
check(gate.admit(301L) == WeatherRefreshGate.Admission.COALESCE,
|
|
"in-flight replay coalesced");
|
|
gate.finish(400L, WeatherRefreshGate.Admission.REPLAY, true);
|
|
check(gate.admit(500L) == WeatherRefreshGate.Admission.REPLAY,
|
|
"second replay admitted without new fetch");
|
|
check(gate.replayDelayMillis(500L) == 1900L,
|
|
"subsequent replay is paced from previous callback");
|
|
gate.finish(501L, WeatherRefreshGate.Admission.REPLAY, true);
|
|
check(gate.admit(60199L) == WeatherRefreshGate.Admission.REPLAY,
|
|
"replay does not extend fetch TTL");
|
|
check(gate.replayDelayMillis(60199L) == 0L,
|
|
"replay runs immediately after spacing elapsed");
|
|
gate.finish(60200L, WeatherRefreshGate.Admission.REPLAY, true);
|
|
check(gate.admit(60200L) == WeatherRefreshGate.Admission.FETCH,
|
|
"new fetch accepted at original TTL boundary");
|
|
gate.finish(60300L, WeatherRefreshGate.Admission.FETCH, false);
|
|
check(gate.admit(60301L) == WeatherRefreshGate.Admission.BACKOFF,
|
|
"fast failed-fetch retry is throttled");
|
|
check(!gate.isRunning(), "backoff does not start worker");
|
|
check(gate.admit(70299L) == WeatherRefreshGate.Admission.BACKOFF,
|
|
"retry stays throttled until boundary");
|
|
check(gate.admit(70300L) == WeatherRefreshGate.Admission.FETCH,
|
|
"failed fetch may retry after ten seconds");
|
|
gate.finish(70302L, WeatherRefreshGate.Admission.FETCH, true);
|
|
check(gate.admit(70303L) == WeatherRefreshGate.Admission.REPLAY,
|
|
"successful response becomes replayable");
|
|
gate.finish(70304L, WeatherRefreshGate.Admission.REPLAY, false);
|
|
check(gate.admit(70305L) == WeatherRefreshGate.Admission.BACKOFF,
|
|
"failed replay invalidates cache and throttles retry");
|
|
check(gate.admit(80303L) == WeatherRefreshGate.Admission.BACKOFF,
|
|
"failed replay still throttled before retry boundary");
|
|
check(gate.admit(80304L) == WeatherRefreshGate.Admission.FETCH,
|
|
"failed replay retries with fresh fetch after ten seconds");
|
|
gate.finish(80306L, WeatherRefreshGate.Admission.FETCH, false);
|
|
System.out.println("result=PASS_WEATHER_REFRESH_GATE");
|
|
}
|
|
}
|