"""Tests for ConnThrottler — TDD: tests before implementation.""" import time import pytest from i2p_apps.i2ptunnel.throttler import ConnThrottler class TestConnThrottler: def test_allow_under_limit(self): t = ConnThrottler(max_per_peer=5, max_total=100, window_seconds=60, ban_seconds=300) t.record("peer1") assert t.allow("peer1") is True def test_reject_at_per_peer_limit(self): t = ConnThrottler(max_per_peer=3, max_total=100, window_seconds=60, ban_seconds=300) for _ in range(3): t.record("peer1") assert t.allow("peer1") is False def test_reject_at_global_limit(self): t = ConnThrottler(max_per_peer=100, max_total=3, window_seconds=60, ban_seconds=300) for i in range(3): t.record(f"peer{i}") assert t.allow("peer99") is False def test_different_peers_independent(self): t = ConnThrottler(max_per_peer=2, max_total=100, window_seconds=60, ban_seconds=300) t.record("peer1") t.record("peer1") assert t.allow("peer1") is False assert t.allow("peer2") is True # different peer, still under limit def test_ban_expiry(self): t = ConnThrottler(max_per_peer=2, max_total=100, window_seconds=60, ban_seconds=10) t.record("peer1") t.record("peer1") # At limit, peer is banned assert t.allow("peer1") is False # Force ban to be expired t._ban_expiry["peer1"] = time.monotonic() - 1 # After ban expires, records are cleared — peer can connect again assert t.allow("peer1") is True def test_window_expiry(self): t = ConnThrottler(max_per_peer=1, max_total=100, window_seconds=1, ban_seconds=300) t.record("peer1") # At limit, peer is banned assert t.allow("peer1") is False # Simulate both ban and window passing t._ban_expiry["peer1"] = time.monotonic() - 1 t._peer_records["peer1"].clear() t._global_records.clear() assert t.allow("peer1") is True def test_allow_no_records(self): t = ConnThrottler(max_per_peer=5, max_total=100, window_seconds=60, ban_seconds=300) assert t.allow("newpeer") is True def test_zero_limits_means_unlimited(self): t = ConnThrottler(max_per_peer=0, max_total=0, window_seconds=60, ban_seconds=300) for _ in range(100): t.record("peer1") assert t.allow("peer1") is True