Example #1
0
    def test_large_dataset_redis_sentinel_moving_window_expiry(self):
        storage = RedisSentinelStorage("redis+sentinel://localhost:26379",
                                       service_name="localhost-redis-sentinel")
        limiter = MovingWindowRateLimiter(storage)
        limit = RateLimitItemPerSecond(1000)
        keys_start = storage.sentinel.slave_for(
            "localhost-redis-sentinel").keys("%s/*" % limit.namespace)
        # 100 routes
        fake_routes = [uuid4().hex for _ in range(0, 100)]
        # go as fast as possible in 2 seconds.
        start = time.time()

        def smack(e):
            while not e.is_set():
                self.assertTrue(limiter.hit(limit, random.choice(fake_routes)))

        events = [threading.Event() for _ in range(0, 100)]
        threads = [threading.Thread(target=smack, args=(e, )) for e in events]
        [k.start() for k in threads]
        while time.time() - start < 2:
            time.sleep(0.1)
        [k.set() for k in events]
        time.sleep(2)
        self.assertTrue(
            storage.sentinel.slave_for("localhost-redis-sentinel").keys(
                "%s/*" % limit.namespace) == [])
Example #2
0
 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))
Example #3
0
 def test_fixed_window_with_elastic_expiry_memcache(self):
     storage = MemcachedStorage('memcached://localhost:11211')
     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))
Example #4
0
 def test_test_moving_window(self):
     with hiro.Timeline().freeze():
         store = MemoryStorage()
         limit = RateLimitItemPerSecond(2, 1)
         limiter = MovingWindowRateLimiter(store)
         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)
Example #5
0
 def test_test_fixed_window(self):
     with hiro.Timeline().freeze() as timeline:
         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)
Example #6
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)
Example #7
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)
Example #8
0
    def test_fixed_window_with_elastic_expiry(self):
        storage = MemcachedStorage("memcached://localhost:22122")
        limiter = FixedWindowElasticExpiryRateLimiter(storage)
        per_sec = RateLimitItemPerSecond(2, 2)

        self.assertTrue(limiter.hit(per_sec))
        self.assertTrue(limiter.hit(per_sec))
        time.sleep(1)
        self.assertFalse(limiter.test(per_sec))
        time.sleep(1)
        self.assertTrue(limiter.test(per_sec))
Example #9
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))
Example #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)]
Example #11
0
 def test_moving_window_redis(self):
     storage = RedisStorage("redis://localhost:6379")
     limiter = MovingWindowRateLimiter(storage)
     limit = RateLimitItemPerSecond(10, 2)
     for i in range(0, 10):
         self.assertTrue(limiter.hit(limit))
         self.assertEqual(limiter.get_window_stats(limit)[1], 10 - (i + 1))
         time.sleep(2 * 0.095)
     self.assertFalse(limiter.hit(limit))
     time.sleep(0.4)
     self.assertTrue(limiter.hit(limit))
     self.assertTrue(limiter.hit(limit))
     self.assertEqual(limiter.get_window_stats(limit)[1], 0)
Example #12
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))
Example #13
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))
Example #14
0
 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()])
Example #15
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))
Example #16
0
 def test_moving_window_expiry(self):
     limiter = MovingWindowRateLimiter(self.storage)
     limit = RateLimitItemPerSecond(2)
     self.assertTrue(limiter.hit(limit))
     time.sleep(0.9)
     self.assertTrue(limiter.hit(limit))
     self.assertFalse(limiter.hit(limit))
     time.sleep(0.1)
     self.assertTrue(limiter.hit(limit))
     last = time.time()
     while time.time() - last <= 1:
         time.sleep(0.05)
     self.assertTrue(
         self.storage.storage.keys("%s/*" % limit.namespace) == [])
Example #17
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))
Example #18
0
    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)
Example #19
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_memory_storage_moving_window(self):
        storage = MemoryStorage()
        limiter = MovingWindowRateLimiter(storage)
        per_second = RateLimitItemPerSecond(100)

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

        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)