def test_fixed_window_with_elastic_expiry_memcache_concurrency(self): storage = MemcachedStorage('memcached://localhost:11211') limiter = FixedWindowElasticExpiryRateLimiter(storage) start = int(time.time()) limit = RateLimitItemPerSecond(100, 2) def _c(): for i in range(0,50): limiter.hit(limit) t1, t2 = threading.Thread(target=_c), threading.Thread(target=_c) t1.start(), t2.start() [t1.join(), t2.join()] self.assertEqual(limiter.get_window_stats(limit)[1], 0) self.assertTrue(start + 2 <= limiter.get_window_stats(limit)[0] <= start + 3) self.assertEqual(storage.get(limit.key_for()), 100)
def test_fixed_window_with_elastic_expiry_memcache_concurrency(self): storage = MemcachedStorage('memcached://localhost:11211') limiter = FixedWindowElasticExpiryRateLimiter(storage) start = int(time.time()) limit = RateLimitItemPerSecond(100, 2) def _c(): for i in range(0, 50): limiter.hit(limit) t1, t2 = threading.Thread(target=_c), threading.Thread(target=_c) t1.start(), t2.start() [t1.join(), t2.join()] self.assertEqual(limiter.get_window_stats(limit)[1], 0) self.assertTrue( start + 2 <= limiter.get_window_stats(limit)[0] <= start + 3) self.assertEqual(storage.get(limit.key_for()), 100)
def test_fixed_window_with_elastic_expiry_redis(self): storage = RedisStorage('redis://localhost:6379') limiter = FixedWindowElasticExpiryRateLimiter(storage) limit = RateLimitItemPerSecond(10, 2) self.assertTrue(all([limiter.hit(limit) for _ in range(0,10)])) time.sleep(1) self.assertFalse(limiter.hit(limit)) time.sleep(1) self.assertFalse(limiter.hit(limit)) self.assertEqual(limiter.get_window_stats(limit)[1], 0)
def test_fixed_window_with_elastic_expiry_in_memory(self): storage = MemoryStorage() limiter = FixedWindowElasticExpiryRateLimiter(storage) with hiro.Timeline().freeze() as timeline: start = int(time.time()) limit = RateLimitItemPerSecond(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) # three extensions to the expiry self.assertEqual(limiter.get_window_stats(limit)[0], start + 3) timeline.forward(1) self.assertFalse(limiter.hit(limit)) timeline.forward(3) start = int(time.time()) self.assertTrue(limiter.hit(limit)) self.assertEqual(limiter.get_window_stats(limit)[1], 9) self.assertEqual(limiter.get_window_stats(limit)[0], start + 2)
def test_fixed_window_with_elastic_expiry_in_memory(self): storage = MemoryStorage() limiter = FixedWindowElasticExpiryRateLimiter(storage) with hiro.Timeline().freeze() as timeline: start = int(time.time()) limit = RateLimitItemPerSecond(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) # three extensions to the expiry self.assertEqual(limiter.get_window_stats(limit)[0], start + 3) timeline.forward(1) self.assertFalse(limiter.hit(limit)) timeline.forward(3) start = int(time.time()) self.assertTrue(limiter.hit(limit)) self.assertEqual(limiter.get_window_stats(limit)[1], 9) self.assertEqual(limiter.get_window_stats(limit)[0], start + 2)
def test_fixed_window_with_elastic_expiry_redis(self): storage = RedisStorage('redis://localhost:7379') limiter = FixedWindowElasticExpiryRateLimiter(storage) limit = RateLimitItemPerSecond(10, 2) self.assertTrue(all([limiter.hit(limit) for _ in range(0, 10)])) time.sleep(1) self.assertFalse(limiter.hit(limit)) time.sleep(1) self.assertFalse(limiter.hit(limit)) self.assertEqual(limiter.get_window_stats(limit)[1], 0)
def test_fixed_window_with_elastic_expiry_redis_sentinel(self): storage = RedisSentinelStorage("redis+sentinel://localhost:26379", service_name="localhost-redis-sentinel") limiter = FixedWindowElasticExpiryRateLimiter(storage) limit = RateLimitItemPerSecond(10, 2) self.assertTrue(all([limiter.hit(limit) for _ in range(0, 10)])) time.sleep(1) self.assertFalse(limiter.hit(limit)) time.sleep(1) self.assertFalse(limiter.hit(limit)) self.assertEqual(limiter.get_window_stats(limit)[1], 0)
def test_fixed_window_with_elastic_expiry_redis_sentinel(self): storage = RedisSentinelStorage( "redis+sentinel://localhost:26379", service_name="localhost-redis-sentinel" ) limiter = FixedWindowElasticExpiryRateLimiter(storage) limit = RateLimitItemPerSecond(10, 2) self.assertTrue(all([limiter.hit(limit) for _ in range(0,10)])) time.sleep(1) self.assertFalse(limiter.hit(limit)) time.sleep(1) self.assertFalse(limiter.hit(limit)) self.assertEqual(limiter.get_window_stats(limit)[1], 0)