|
| 1 | +from collections.abc import AsyncGenerator |
| 2 | + |
| 3 | +import pytest |
| 4 | +from taskiq.acks import AckableMessage |
| 5 | +from taskiq.result import TaskiqResult |
| 6 | + |
| 7 | +from tests.conftest import AWSCredentials, _queue_name_from_url |
| 8 | + |
| 9 | +from taskiq_sqs import S3ResultBackend, SQSBroker |
| 10 | + |
| 11 | + |
| 12 | +BATCH_SIZE = 10 |
| 13 | +RESULT_TASK_ID = "benchmark-task" |
| 14 | + |
| 15 | + |
| 16 | +async def ack(message: AckableMessage) -> None: |
| 17 | + result = message.ack() |
| 18 | + if result is not None: |
| 19 | + await result |
| 20 | + |
| 21 | + |
| 22 | +@pytest.fixture |
| 23 | +async def bench_broker( |
| 24 | + aws_credentials: AWSCredentials, |
| 25 | + sqs_queue: str, |
| 26 | +) -> AsyncGenerator[SQSBroker, None]: |
| 27 | + """The shared `sqs_broker`, but tuned for measuring a round-trip. |
| 28 | +
|
| 29 | + Two settings differ from the default broker: long polling, because with `wait_time_seconds=0` a receive returns |
| 30 | + immediately and usually empty, so a round-trip would measure idle polls; and a batch size that lets a single |
| 31 | + `ReceiveMessage` call serve the whole batch. |
| 32 | + """ |
| 33 | + broker = SQSBroker( |
| 34 | + queue_name=_queue_name_from_url(sqs_queue), |
| 35 | + wait_time_seconds=1, |
| 36 | + max_number_of_messages=BATCH_SIZE, |
| 37 | + **aws_credentials, |
| 38 | + ) |
| 39 | + await broker.startup() |
| 40 | + yield broker |
| 41 | + await broker.shutdown() |
| 42 | + |
| 43 | + |
| 44 | +@pytest.fixture |
| 45 | +async def listener(bench_broker: SQSBroker) -> AsyncGenerator[AsyncGenerator[AckableMessage, None], None]: |
| 46 | + """A single `listen()` generator, created outside the measured test body.""" |
| 47 | + messages = bench_broker.listen() |
| 48 | + yield messages |
| 49 | + await messages.aclose() |
| 50 | + |
| 51 | + |
| 52 | +@pytest.fixture |
| 53 | +async def stored_result(s3_backend: S3ResultBackend[str]) -> TaskiqResult[str]: |
| 54 | + """A result already written to the bucket, so read benchmarks only measure reads.""" |
| 55 | + result: TaskiqResult[str] = TaskiqResult( |
| 56 | + is_err=False, |
| 57 | + return_value="benchmark", |
| 58 | + execution_time=0.1, |
| 59 | + log=None, |
| 60 | + ) |
| 61 | + await s3_backend.set_result(RESULT_TASK_ID, result) |
| 62 | + return result |
0 commit comments