예제 #1
0
 async def middle_stage(self, in_q, out_q, num, minsize):
     async for batch in Stage.batches(in_q, minsize):
         self.assertTrue(batch)
         self.assertGreaterEqual(len(batch), min(minsize, num))
         num -= len(batch)
         for b in batch:
             await out_q.put(b)
     self.assertEqual(num, 0)
     await out_q.put(None)
예제 #2
0
 async def test_batch_and_single_none(self):
     in_q = asyncio.Queue()
     in_q.put_nowait(1)
     in_q.put_nowait(2)
     batch_it = Stage.batches(in_q)
     self.assertEqual([1, 2], await batch_it.__anext__())
     in_q.put_nowait(None)
     with self.assertRaises(StopAsyncIteration):
         await batch_it.__anext__()
예제 #3
0
 async def test_two_batches(self):
     in_q = asyncio.Queue()
     in_q.put_nowait(1)
     in_q.put_nowait(2)
     batch_it = Stage.batches(in_q, minsize=1)
     self.assertEqual([1, 2], await batch_it.__anext__())
     in_q.put_nowait(3)
     in_q.put_nowait(4)
     in_q.put_nowait(None)
     self.assertEqual([3, 4], await batch_it.__anext__())
     with self.assertRaises(StopAsyncIteration):
         await batch_it.__anext__()
예제 #4
0
class TestStage(asynctest.TestCase):
    def setUp(self):
        self.in_q = asyncio.Queue()
        self.stage = Stage()
        self.stage._connect(self.in_q, None)

    async def test_none_only(self):
        self.in_q.put_nowait(None)
        batch_it = self.stage.batches(minsize=1)
        with self.assertRaises(StopAsyncIteration):
            await batch_it.__anext__()

    async def test_single_batch_and_none(self):
        c1 = mock.Mock(does_batch=True)
        c2 = mock.Mock(does_batch=True)
        self.in_q.put_nowait(c1)
        self.in_q.put_nowait(c2)
        self.in_q.put_nowait(None)
        batch_it = self.stage.batches(minsize=1)
        self.assertEqual([c1, c2], await batch_it.__anext__())
        with self.assertRaises(StopAsyncIteration):
            await batch_it.__anext__()

    async def test_batch_and_single_none(self):
        c1 = mock.Mock(does_batch=True)
        c2 = mock.Mock(does_batch=True)
        self.in_q.put_nowait(c1)
        self.in_q.put_nowait(c2)
        batch_it = self.stage.batches(minsize=1)
        self.assertEqual([c1, c2], await batch_it.__anext__())
        self.in_q.put_nowait(None)
        with self.assertRaises(StopAsyncIteration):
            await batch_it.__anext__()

    async def test_two_batches(self):
        c1 = mock.Mock(does_batch=True)
        c2 = mock.Mock(does_batch=True)
        c3 = mock.Mock(does_batch=True)
        c4 = mock.Mock(does_batch=True)
        self.in_q.put_nowait(c1)
        self.in_q.put_nowait(c2)
        batch_it = self.stage.batches(minsize=1)
        self.assertEqual([c1, c2], await batch_it.__anext__())
        self.in_q.put_nowait(c3)
        self.in_q.put_nowait(c4)
        self.in_q.put_nowait(None)
        self.assertEqual([c3, c4], await batch_it.__anext__())
        with self.assertRaises(StopAsyncIteration):
            await batch_it.__anext__()
예제 #5
0
 def setUp(self):
     self.in_q = asyncio.Queue()
     self.stage = Stage()
     self.stage._connect(self.in_q, None)
예제 #6
0
class TestStage(asynctest.TestCase):
    def setUp(self):
        self.in_q = asyncio.Queue()
        self.stage = Stage()
        self.stage._connect(self.in_q, None)

    async def test_none_only(self):
        self.in_q.put_nowait(None)
        batch_it = self.stage.batches(minsize=1)
        with self.assertRaises(StopAsyncIteration):
            await batch_it.__anext__()

    async def test_single_batch_and_none(self):
        c1 = mock.Mock()
        c2 = mock.Mock()
        self.in_q.put_nowait(c1)
        self.in_q.put_nowait(c2)
        self.in_q.put_nowait(None)
        batch_it = self.stage.batches(minsize=1)
        self.assertEqual([c1, c2], await batch_it.__anext__())
        with self.assertRaises(StopAsyncIteration):
            await batch_it.__anext__()

    async def test_batch_and_single_none(self):
        c1 = mock.Mock()
        c2 = mock.Mock()
        self.in_q.put_nowait(c1)
        self.in_q.put_nowait(c2)
        batch_it = self.stage.batches(minsize=1)
        self.assertEqual([c1, c2], await batch_it.__anext__())
        self.in_q.put_nowait(None)
        with self.assertRaises(StopAsyncIteration):
            await batch_it.__anext__()

    async def test_two_batches(self):
        c1 = mock.Mock()
        c2 = mock.Mock()
        c3 = mock.Mock()
        c4 = mock.Mock()
        self.in_q.put_nowait(c1)
        self.in_q.put_nowait(c2)
        batch_it = self.stage.batches(minsize=1)
        self.assertEqual([c1, c2], await batch_it.__anext__())
        self.in_q.put_nowait(c3)
        self.in_q.put_nowait(c4)
        self.in_q.put_nowait(None)
        self.assertEqual([c3, c4], await batch_it.__anext__())
        with self.assertRaises(StopAsyncIteration):
            await batch_it.__anext__()

    async def test_thaw_queue(self):
        # Test that awaiting `resolved` on DeclarativeContent does not dead lock
        c1 = DeclarativeContent(mock.Mock())
        c2 = DeclarativeContent(mock.Mock())
        c3 = DeclarativeContent(mock.Mock())
        c4 = DeclarativeContent(mock.Mock())
        batch_it = self.stage.batches(minsize=4)
        fetch_task = asyncio.ensure_future(batch_it.__anext__())
        fetch_task.add_done_callback(lambda _: c2.resolve())
        self.in_q.put_nowait(c1)
        self.in_q.put_nowait(c2)
        self.in_q.put_nowait(c3)
        wait_task = asyncio.ensure_future(c2.resolution())
        wait_task.add_done_callback(lambda _: self.in_q.put_nowait(c4))
        batch, c2_res = await asyncio.gather(fetch_task, wait_task)
        self.assertEqual([c1, c2, c3], batch)
        self.assertEqual(c2.content, c2_res)
        self.in_q.put_nowait(None)
        self.assertEqual([c4], await batch_it.__anext__())
        with self.assertRaises(StopAsyncIteration):
            await batch_it.__anext__()
예제 #7
0
 async def test_none_only(self):
     in_q = asyncio.Queue()
     in_q.put_nowait(None)
     batch_it = Stage.batches(in_q)
     with self.assertRaises(StopAsyncIteration):
         await batch_it.__anext__()
예제 #8
0
 async def last_stage(self, in_q, num, minsize):
     async for batch in Stage.batches(in_q, minsize):
         self.assertTrue(batch)
         self.assertGreaterEqual(len(batch), min(minsize, num))
         num -= len(batch)
     self.assertEqual(num, 0)