예제 #1
0
 def test_refresh(self):
     reg = {}
     x = buckets.TaskBucket(task_registry=reg)
     reg['foo'] = 'something'
     x.refresh()
     self.assertIn('foo', x.buckets)
     self.assertTrue(x.get_bucket_for_type('foo'))
예제 #2
0
    def test_auto_add_on_missing_put(self):
        reg = {}
        b = buckets.TaskBucket(task_registry=reg)
        reg["nonexisting.task"] = "foo"

        b.put(MockJob(uuid(), "nonexisting.task", (), {}))
        self.assertIn("nonexisting.task", b.buckets)
예제 #3
0
    def test_auto_add_on_missing_put(self):
        reg = {}
        b = buckets.TaskBucket(task_registry=reg)
        reg['nonexisting.task'] = 'foo'

        b.put(MockJob(uuid(), 'nonexisting.task', (), {}))
        self.assertIn('nonexisting.task', b.buckets)
예제 #4
0
 def test_refresh(self):
     reg = {}
     x = buckets.TaskBucket(task_registry=reg)
     reg["foo"] = "something"
     x.refresh()
     self.assertIn("foo", x.buckets)
     self.assertTrue(x.get_bucket_for_type("foo"))
예제 #5
0
    def test_get_block(self, sleep):
        x = buckets.TaskBucket(task_registry=self.registry)
        x.not_empty = Mock()
        get = x._get = Mock()
        calls = [0]
        remaining = [0]

        def effect():
            try:
                if not calls[0]:
                    raise Empty()
                rem = remaining[0]
                remaining[0] = 0
                return rem, Mock()
            finally:
                calls[0] += 1

        get.side_effect = effect

        with mock_context(Mock()) as context:
            x.not_empty = context
            x.wait = Mock()
            x.get(block=True)

            calls[0] = 0
            remaining[0] = 1
            x.get(block=True)
예제 #6
0
 def test_empty(self):
     x = buckets.TaskBucket(task_registry=self.registry)
     self.assertTrue(x.empty())
     x.put(MockJob(uuid(), TaskC.name, [], {}))
     self.assertFalse(x.empty())
     x.clear()
     self.assertTrue(x.empty())
예제 #7
0
 def test_auto_add_on_missing(self):
     b = buckets.TaskBucket(task_registry=self.registry)
     for task_cls in self.task_classes:
         self.assertIn(task_cls.name, b.buckets.keys())
     self.registry.register(TaskD)
     self.assertTrue(b.get_bucket_for_type(TaskD.name))
     self.assertIn(TaskD.name, b.buckets.keys())
     self.registry.unregister(TaskD)
 def test_has_rate_limits(self):
     b = buckets.TaskBucket(task_registry=self.registry)
     self.assertEqual(b.buckets[TaskA.name].fill_rate, 10)
     self.assertIsInstance(b.buckets[TaskB.name], buckets.Queue)
     self.assertEqual(b.buckets[TaskC.name].fill_rate, 1)
     self.registry.register(TaskD)
     b.init_with_registry()
     try:
         self.assertEqual(b.buckets[TaskD.name].fill_rate, 1000 / 60.0)
     finally:
         self.registry.unregister(TaskD)
    def test__very_busy_queue_doesnt_block_others(self):
        b = buckets.TaskBucket(task_registry=self.registry)

        cjob = lambda i, t: MockJob(gen_unique_id(), t.name, [i], {})
        ajobs = [cjob(i, TaskA) for i in xrange(10)]
        bjobs = [cjob(i, TaskB) for i in xrange(20)]
        jobs = list(chain(*izip(bjobs, ajobs)))
        map(b.put, jobs)

        got_ajobs = 0
        for job in (b.get() for i in xrange(20)):
            if job.task_name == TaskA.name:
                got_ajobs += 1

        self.assertGreater(got_ajobs, 2)
예제 #10
0
    def test_fill_rate(self):
        b = buckets.TaskBucket(task_registry=self.registry)

        cjob = lambda i: MockJob(uuid(), TaskA.name, [i], {})
        jobs = [cjob(i) for i in xrange(20)]
        [b.put(job) for job in jobs]

        self.assertEqual(b.qsize(), 20)

        # 20 items should take at least one second to complete
        time_start = time.time()
        for i, job in enumerate(jobs):
            sys.stderr.write('.')
            self.assertEqual(b.get(), job)
        self.assertGreater(time.time() - time_start, 1.5)
예제 #11
0
    def test_thorough__multiple_types(self):
        self.registry.register(TaskD)
        try:
            b = buckets.TaskBucket(task_registry=self.registry)

            cjob = lambda i, t: MockJob(uuid(), t.name, [i], {})

            ajobs = [cjob(i, TaskA) for i in xrange(10)]
            bjobs = [cjob(i, TaskB) for i in xrange(10)]
            cjobs = [cjob(i, TaskC) for i in xrange(10)]
            djobs = [cjob(i, TaskD) for i in xrange(10)]

            # Spread the jobs around.
            jobs = list(chain(*izip(ajobs, bjobs, cjobs, djobs)))

            [b.put(job) for job in jobs]
            for i, job in enumerate(jobs):
                sys.stderr.write('.')
                self.assertTrue(b.get(), job)
            self.assertEqual(i + 1, len(jobs))
        finally:
            self.registry.unregister(TaskD)
예제 #12
0
    def test_get_block(self, sleep):
        x = buckets.TaskBucket(task_registry=self.registry)
        x.not_empty = Mock()
        get = x._get = Mock()
        remaining = [0]

        def effect():
            if get.call_count == 1:
                raise Empty()
            rem = remaining[0]
            remaining[0] = 0
            return rem, Mock()
        get.side_effect = effect

        with mock_context(Mock()) as context:
            x.not_empty = context
            x.wait = Mock()
            x.get(block=True)

            get.reset()
            remaining[0] = 1
            x.get(block=True)
예제 #13
0
 def test_put__get(self):
     b = buckets.TaskBucket(task_registry=self.registry)
     job = MockJob(uuid(), TaskA.name, ['theqbf'], {'foo': 'bar'})
     b.put(job)
     self.assertEqual(b.get(), job)
 def test_get_nowait(self):
     x = buckets.TaskBucket(task_registry=self.registry)
     self.assertRaises(buckets.QueueEmpty, x.get_nowait)
예제 #15
0
 def test__get_queue_for_type(self):
     x = buckets.TaskBucket(task_registry={})
     x.buckets["foo"] = buckets.TokenBucketQueue(fill_rate=1)
     self.assertIs(x._get_queue_for_type("foo"), x.buckets["foo"].queue)
     x.buckets["bar"] = buckets.FastQueue()
     self.assertIs(x._get_queue_for_type("bar"), x.buckets["bar"])
예제 #16
0
 def test_on_empty_buckets__get_raises_empty(self):
     b = buckets.TaskBucket(task_registry=self.registry)
     with self.assertRaises(buckets.Empty):
         b.get(block=False)
     self.assertEqual(b.qsize(), 0)
예제 #17
0
 def test_put__get(self):
     b = buckets.TaskBucket(task_registry=self.registry)
     job = MockJob(uuid(), TaskA.name, ["theqbf"], {"foo": "bar"})
     b.put(job)
     self.assertEqual(b.get(), job)
예제 #18
0
 def test_update_bucket_for_type(self):
     bucket = buckets.TaskBucket(task_registry=self.registry)
     b = bucket._get_queue_for_type(TaskC.name)
     self.assertIs(bucket.update_bucket_for_type(TaskC.name).queue, b)
     self.assertIs(bucket.buckets[TaskC.name].queue, b)
예제 #19
0
 def test__get_queue_for_type(self):
     x = buckets.TaskBucket(task_registry={})
     x.buckets['foo'] = buckets.TokenBucketQueue(fill_rate=1)
     self.assertIs(x._get_queue_for_type('foo'), x.buckets['foo'].queue)
     x.buckets['bar'] = buckets.FastQueue()
     self.assertIs(x._get_queue_for_type('bar'), x.buckets['bar'])
예제 #20
0
 def test_get_nowait(self):
     x = buckets.TaskBucket(task_registry=self.registry)
     with self.assertRaises(buckets.Empty):
         x.get_nowait()
 def test_on_empty_buckets__get_raises_empty(self):
     b = buckets.TaskBucket(task_registry=self.registry)
     self.assertRaises(buckets.QueueEmpty, b.get)
     self.assertEqual(b.qsize(), 0)
예제 #22
0
 def test_items(self):
     x = buckets.TaskBucket(task_registry=self.registry)
     x.buckets[TaskA.name].put(1)
     x.buckets[TaskB.name].put(2)
     x.buckets[TaskC.name].put(3)
     self.assertEqual(sorted(x.items), [1, 2, 3])
예제 #23
0
 def test_get_raises_rate(self):
     x = buckets.TaskBucket(task_registry=self.registry)
     x.buckets = {1: Mock()}
     x.buckets[1].get_nowait.side_effect = buckets.RateLimitExceeded()
     x.buckets[1].expected_time.return_value = 0
     x._get()