Пример #1
0
 def test_fixed_window_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))
Пример #2
0
 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)
Пример #3
0
 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))
Пример #4
0
 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)
Пример #5
0
 def _setup_logger(self):
     self._logger = get_logger(self.name)
     # rate limit our own messages to not spam around in case of temporary network errors, etc
     rate_limit_setting = constants.ERROR_LOG_RATE_LIMIT
     if rate_limit_setting:
         self._rate_limit_storage = MemoryStorage()
         self._rate_limit_strategy = FixedWindowRateLimiter(self._rate_limit_storage)
         self._rate_limit_item = parse_rate_limit(rate_limit_setting)
Пример #6
0
 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))
Пример #7
0
 def test_test_fixed_window(self):
     with hiro.Timeline().freeze():
         store = MemoryStorage()
         limiter = FixedWindowRateLimiter(store)
         limit = RateLimitItemPerSecond(2, 1)
         self.assertTrue(limiter.hit(limit), store)
         self.assertTrue(limiter.test(limit), store)
         self.assertTrue(limiter.hit(limit), store)
         self.assertFalse(limiter.test(limit), store)
         self.assertFalse(limiter.hit(limit), store)
Пример #8
0
 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))
Пример #9
0
 def test_expiry(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))
         timeline.forward(60)
         # touch another key and yield
         limiter.hit(RateLimitItemPerSecond(1))
         time.sleep(0.1)
         self.assertTrue(per_min.key_for() not in self.storage.storage)
Пример #10
0
 def test_fixed_window(self):
     limiter = FixedWindowRateLimiter(self.storage)
     per_second = RateLimitItemPerSecond(10)
     start = time.time()
     count = 0
     while time.time() - start < 0.5 and count < 10:
         self.assertTrue(limiter.hit(per_second))
         count += 1
     self.assertFalse(limiter.hit(per_second))
     while time.time() - start <= 1:
         time.sleep(0.1)
     [self.assertTrue(limiter.hit(per_second)) for _ in range(10)]
Пример #11
0
 def test_memcached(self):
     limiter = FixedWindowRateLimiter(self.storage)
     per_min = RateLimitItemPerSecond(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))
Пример #12
0
 def test_redis_cluster(self):
     storage = RedisClusterStorage("redis+cluster://localhost:7000")
     limiter = FixedWindowRateLimiter(storage)
     per_min = RateLimitItemPerSecond(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))
Пример #13
0
 def test_fixed_window(self):
     storage = MemcachedStorage("memcached://localhost:22122")
     limiter = FixedWindowRateLimiter(storage)
     per_min = RateLimitItemPerSecond(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))
Пример #14
0
 def test_redis_sentinel(self):
     storage = RedisSentinelStorage("redis+sentinel://localhost:26379",
                                    service_name="localhost-redis-sentinel")
     limiter = FixedWindowRateLimiter(storage)
     per_min = RateLimitItemPerSecond(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))
Пример #15
0
 def test_fixed_window(self):
     storage = MemoryStorage()
     limiter = FixedWindowRateLimiter(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)
         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))
Пример #16
0
    def test_memory_storage_fixed_window(self):
        storage = MemoryStorage()
        limiter = FixedWindowRateLimiter(storage)
        per_second = RateLimitItemPerSecond(100)

        [limiter.hit(per_second, uuid4().hex) for _ in range(1000)]

        key = uuid4().hex
        hits = []

        def hit():
            if limiter.hit(per_second, key):
                hits.append(None)

        start = time.time()

        threads = [threading.Thread(target=hit) for _ in range(1000)]
        [t.start() for t in threads]
        [t.join() for t in threads]

        self.assertTrue(time.time() - start < 1)
        self.assertEqual(len(hits), 100)
Пример #17
0
 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)