def test_in_memory_expiry(self): with hiro.Timeline().freeze() as timeline: storage = MemoryStorage() limiter = FixedWindowRateLimiter(storage) per_min = RateLimitItemPerMinute(10) for i in range(0,10): self.assertTrue(limiter.hit(per_min)) timeline.forward(60) # touch another key and yield limiter.hit(RateLimitItemPerSecond(1)) time.sleep(0.1) self.assertTrue(per_min.key_for() not in storage.storage)
def test_in_memory_expiry(self): with hiro.Timeline().freeze() as timeline: storage = MemoryStorage() limiter = FixedWindowRateLimiter(storage) per_min = RateLimitItemPerMinute(10) for i in range(0, 10): self.assertTrue(limiter.hit(per_min)) timeline.forward(60) # touch another key and yield limiter.hit(RateLimitItemPerSecond(1)) time.sleep(0.1) self.assertTrue(per_min.key_for() not in storage.storage)
def test_in_memory_expiry_moving_window(self): with hiro.Timeline().freeze() as timeline: storage = MemoryStorage() limiter = MovingWindowRateLimiter(storage) per_min = RateLimitItemPerMinute(10) per_sec = RateLimitItemPerSecond(1) for i in range(0,2): for i in range(0,10): self.assertTrue(limiter.hit(per_min)) timeline.forward(60) self.assertTrue(limiter.hit(per_sec)) time.sleep(1) self.assertEqual([], storage.events[per_min.key_for()])
def test_in_memory_expiry_moving_window(self): with hiro.Timeline().freeze() as timeline: storage = MemoryStorage() limiter = MovingWindowRateLimiter(storage) per_min = RateLimitItemPerMinute(10) per_sec = RateLimitItemPerSecond(1) for i in range(0, 2): for i in range(0, 10): self.assertTrue(limiter.hit(per_min)) timeline.forward(60) self.assertTrue(limiter.hit(per_sec)) time.sleep(1) self.assertEqual([], storage.events[per_min.key_for()])
def test_redis_cluster_reset(self): storage = RedisClusterStorage("redis+cluster://localhost:7000") limiter = FixedWindowRateLimiter(storage) for i in range(0, 10000): rate = RateLimitItemPerMinute(i) limiter.hit(rate) self.assertEqual(storage.reset(), 10000)
def test_moving_window_clear(self): limiter = MovingWindowRateLimiter(self.storage) per_min = RateLimitItemPerMinute(1) limiter.hit(per_min) self.assertFalse(limiter.hit(per_min)) limiter.clear(per_min) self.assertTrue(limiter.hit(per_min))
def test_memcached_clear(self): limiter = FixedWindowRateLimiter(self.storage) per_min = RateLimitItemPerMinute(1) limiter.hit(per_min) self.assertFalse(limiter.hit(per_min)) limiter.clear(per_min) self.assertTrue(limiter.hit(per_min))
def test_redis_sentinel_reset(self): storage = RedisSentinelStorage("redis+sentinel://localhost:26379", service_name="localhost-redis-sentinel") limiter = FixedWindowRateLimiter(storage) for i in range(0, 10000): rate = RateLimitItemPerMinute(i) limiter.hit(rate) self.assertEqual(storage.reset(), 10000)
def test_clear(self): storage = MemcachedStorage("memcached://localhost:22122") limiter = FixedWindowRateLimiter(storage) per_min = RateLimitItemPerMinute(1) limiter.hit(per_min) self.assertFalse(limiter.hit(per_min)) limiter.clear(per_min) self.assertTrue(limiter.hit(per_min))
def test_redis_cluster_clear(self): storage = RedisClusterStorage("redis+cluster://localhost:7000") limiter = MovingWindowRateLimiter(storage) per_min = RateLimitItemPerMinute(1) limiter.hit(per_min) self.assertFalse(limiter.hit(per_min)) limiter.clear(per_min) self.assertTrue(limiter.hit(per_min))
def test_in_memory_fixed_window_clear(self): storage = MemoryStorage() limiter = FixedWindowRateLimiter(storage) per_min = RateLimitItemPerMinute(1) limiter.hit(per_min) self.assertFalse(limiter.hit(per_min)) limiter.clear(per_min) self.assertTrue(limiter.hit(per_min))
def test_in_memory(self): with hiro.Timeline().freeze() as timeline: limiter = FixedWindowRateLimiter(self.storage) per_min = RateLimitItemPerMinute(10) for i in range(0, 10): self.assertTrue(limiter.hit(per_min)) self.assertFalse(limiter.hit(per_min)) timeline.forward(61) self.assertTrue(limiter.hit(per_min))
def test_reset(self): limiter = FixedWindowRateLimiter(self.storage) per_min = RateLimitItemPerMinute(10) for i in range(0, 10): self.assertTrue(limiter.hit(per_min)) self.assertFalse(limiter.hit(per_min)) self.storage.reset() for i in range(0, 10): self.assertTrue(limiter.hit(per_min)) self.assertFalse(limiter.hit(per_min))
def test_moving_window_in_memory(self): storage = MemoryStorage() limiter = MovingWindowRateLimiter(storage) with hiro.Timeline().freeze() as timeline: limit = RateLimitItemPerMinute(10) for i in range(0, 5): self.assertTrue(limiter.hit(limit)) self.assertTrue(limiter.hit(limit)) self.assertEqual( limiter.get_window_stats(limit)[1], 10 - ((i + 1) * 2)) timeline.forward(10) self.assertEqual(limiter.get_window_stats(limit)[1], 0) self.assertFalse(limiter.hit(limit)) timeline.forward(20) self.assertEqual(limiter.get_window_stats(limit)[1], 2) self.assertEqual( limiter.get_window_stats(limit)[0], int(time.time() + 30)) timeline.forward(31) self.assertEqual(limiter.get_window_stats(limit)[1], 10)
def test_reset(self): limiter = FixedWindowRateLimiter(self.storage) for i in range(0, 10): rate = RateLimitItemPerMinute(i) limiter.hit(rate) self.assertEqual(self.storage.reset(), 10)