Пример #1
0
async def test_large_batch_size() -> None:
    def iterator() -> Iterator[int]:
        yield 1

    aiterator = concurrency.iter_in_thread(iterator(), batch_size=1000000)
    values = [value async for value in aiterator]
    assert values == [1]
Пример #2
0
async def test_small_batch_size() -> None:
    def iterator() -> Iterator[int]:
        yield from range(100)

    aiterator = concurrency.iter_in_thread(iterator(), batch_size=1)
    values = [value async for value in aiterator]
    assert values == list(range(100))
Пример #3
0
async def test_really_in_thread() -> None:
    def iterator() -> Iterator[int]:
        yield threading.get_ident()

    outside_ids = [threading.get_ident()]
    aiterator = concurrency.iter_in_thread(iterator())
    inside_ids = [value async for value in aiterator]
    assert outside_ids != inside_ids
Пример #4
0
 async def test_empty_directory(self) -> None:
     # this technically breaks isolation (non-isolated config listens on
     # default ports and will bootstrap dht, etc), but it must be tested!
     await concurrency.to_thread(services.CONFIG_PATH.unlink)
     contents = await concurrency.alist(
         concurrency.iter_in_thread(pathlib.Path().iterdir()))
     self.assertEqual(contents, [])
     async with self.start_stop_session():
         pass
Пример #5
0
async def test_exception() -> None:
    def iterator() -> Iterator[int]:
        yield 1
        raise DummyException()

    aiterator = concurrency.iter_in_thread(iterator())
    with pytest.raises(DummyException):
        async for value in aiterator:
            pass
Пример #6
0
async def test_return_value() -> None:
    def iterator() -> Iterator[int]:
        yield 1
        yield 2
        yield 3

    aiterator = concurrency.iter_in_thread(iterator())
    values = [value async for value in aiterator]
    assert values == [1, 2, 3]
Пример #7
0
    async def test_save_and_load_resume_data(self) -> None:
        async with self.start_stop_session():
            session = await asyncio.wait_for(services.get_session(), 5)
            atp = tdummy.DEFAULT.atp()
            atp.save_path = self.tempdir.name
            session.async_add_torrent(atp)

        def get_resume_data() -> Iterator[lt.add_torrent_params]:
            with services.resume_db_pool() as conn:
                yield from resume_lib.iter_resume_data_from_db(conn)

        resume_data = await concurrency.alist(
            concurrency.iter_in_thread(get_resume_data()))

        self.assertEqual(len(resume_data), 1)

        async with self.start_stop_session():
            session = await asyncio.wait_for(services.get_session(), 5)
            torrents = await concurrency.to_thread(session.get_torrents)
            self.assertEqual(len(torrents), 1)
Пример #8
0
    async def get_resume_data(self) -> list[lt.add_torrent_params]:
        def inner() -> Iterator[lt.add_torrent_params]:
            with dbver.null_pool(self.conn_factory)() as conn:
                yield from resume_lib.iter_resume_data_from_db(conn)

        return await concurrency.alist(concurrency.iter_in_thread(inner()))