package dev.coph.nextusweb.server.ratelimit; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class TokenBucketLimiterTest { @Test void burstUpToCapacityIsAllowed() { TokenBucketLimiter lim = new TokenBucketLimiter(1, 3); long now = 0; assertTrue(lim.tryAcquire("k", now).allowed()); assertTrue(lim.tryAcquire("k", now).allowed()); assertTrue(lim.tryAcquire("k", now).allowed()); } @Test void emptyBucketIsDeniedAndRetryAfterIsPositive() { TokenBucketLimiter lim = new TokenBucketLimiter(1, 1); assertTrue(lim.tryAcquire("k", 0).allowed()); RateLimiter.Result r = lim.tryAcquire("k", 0); assertFalse(r.allowed()); assertTrue(r.retryAfterMillis() > 0); assertEquals(1, r.limit()); } @Test void refillAllowsAcquireAfterTime() { TokenBucketLimiter lim = new TokenBucketLimiter(10, 1); assertTrue(lim.tryAcquire("k", 0).allowed()); assertFalse(lim.tryAcquire("k", 0).allowed()); long oneSecLater = 1_000_000_000L; assertTrue(lim.tryAcquire("k", oneSecLater).allowed()); } @Test void differentKeysAreIndependent() { TokenBucketLimiter lim = new TokenBucketLimiter(1, 1); assertTrue(lim.tryAcquire("a", 0).allowed()); assertTrue(lim.tryAcquire("b", 0).allowed()); } @Test void cleanupDoesNotThrow() { TokenBucketLimiter lim = new TokenBucketLimiter(1, 1); lim.tryAcquire("k", System.nanoTime()); assertDoesNotThrow(() -> lim.cleanup(0)); } }