def test_in_memory(self): with hiro.Timeline().freeze() as timeline: storage = MemoryStorage() limiter = FixedWindowRateLimiter(storage) per_min = PER_MINUTE(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_in_memory_expiry(self): with hiro.Timeline().freeze() as timeline: storage = MemoryStorage() limiter = FixedWindowRateLimiter(storage) per_min = PER_MINUTE(10) for i in range(0, 10): self.assertTrue(limiter.hit(per_min)) timeline.forward(60) # touch another key and yield limiter.hit(PER_SECOND(1)) time.sleep(0.1) self.assertTrue(per_min.key_for() not in storage.storage)
def test_redis(self): storage = RedisStorage("redis://localhost:6379") limiter = FixedWindowRateLimiter(storage) per_min = PER_SECOND(10) start = time.time() count = 0 while time.time() - start < 0.5 and count < 10: self.assertTrue(limiter.hit(per_min)) count += 1 self.assertFalse(limiter.hit(per_min)) while time.time() - start <= 1: time.sleep(0.1) self.assertTrue(limiter.hit(per_min))
def test_memcached(self): storage = MemcachedStorage("memcached://localhost:11211") limiter = FixedWindowRateLimiter(storage) per_min = PER_SECOND(10) start = time.time() count = 0 while time.time() - start < 0.5 and count < 10: self.assertTrue(limiter.hit(per_min)) count += 1 self.assertFalse(limiter.hit(per_min)) while time.time() - start <= 1: time.sleep(0.1) self.assertTrue(limiter.hit(per_min))
def test_fixed_window(self): storage = MemoryStorage() limiter = FixedWindowRateLimiter(storage) with hiro.Timeline().freeze() as timeline: start = int(time.time()) limit = PER_SECOND(10, 2) self.assertTrue(all([limiter.hit(limit) for _ in range(0,10)])) timeline.forward(1) self.assertFalse(limiter.hit(limit)) self.assertEqual(limiter.get_window_stats(limit)[1], 0) self.assertEqual(limiter.get_window_stats(limit)[0], start + 2) timeline.forward(1) self.assertEqual(limiter.get_window_stats(limit)[1], 10) self.assertTrue(limiter.hit(limit))