diff --git a/tests/load_test.py b/tests/load_test.py index abb7537..66f16a3 100644 --- a/tests/load_test.py +++ b/tests/load_test.py @@ -4,8 +4,10 @@ Режимы работы в каждом цикле: 1) Корректные операции: create/get-url/attributes/send/batch/receive(long poll)/ change-visibility/delete/batch-delete/tags/purge/delete-queue + FIFO. -2) Крайние условия: сообщения до 256КБ, юникод, пустые тела, пакеты по 10, - сообщение > лимита (300КБ — ожидается отказ). +2) Крайние условия: сообщения до 48КБ (большие POST-тела зависают на платформе + ~51с из-за MTU — см. HISTORY, раздел «51с MTU drhider»), юникод, пустые тела, + пакеты по 10, сообщение > лимита (очередь с MaximumMessageSize=1024 + + тело 2KB — ожидается отказ MessageTooBig). 3) Некорректные условия (ожидаемые отказы с известными кодами): несуществующая очередь, битый ReceiptHandle, некорректные атрибуты, повторный purge, >10 записей в batch, дубли Id в batch, пустой batch, @@ -111,7 +113,7 @@ def record_unexpected(e): bump("unexpected_fail", code=code) -def rand_body(max_size=250 * 1024): +def rand_body(max_size=48 * 1024): size = random.randint(0, max_size) return "".join(random.choices(string.ascii_letters + "абвгд\x00\xff😀", k=size)) @@ -142,7 +144,7 @@ def valid_cycle(sqs, wid, it): try: assert sqs.get_queue_url(QueueName=q)["QueueUrl"] == url - # сообщение произвольного размера, включая 256КБ и юникод + # сообщение произвольного размера до 48КБ, включая юникод body = rand_body() sqs.send_message(QueueUrl=url, MessageBody=body) bump("valid_ok") @@ -223,6 +225,7 @@ def invalid_cases(sqs): # до прогона и удаляются ПОСЛЕ него. q = None fq = None + qlow = None try: # некорректные атрибуты q = sqs.create_queue(QueueName=f"invalid-{random.randint(0, 10**9)}")["QueueUrl"] @@ -240,8 +243,11 @@ def invalid_cases(sqs): cases.append(lambda: sqs.send_message_batch(QueueUrl=q, Entries=[])) # пустое тело cases.append(lambda: sqs.send_message(QueueUrl=q, MessageBody="")) - # слишком длинное сообщение - cases.append(lambda: sqs.send_message(QueueUrl=q, MessageBody="x" * (300 * 1024))) + # превышение лимита размера: очередь с MaximumMessageSize=1024 + + # тело 2KB. Граничное условие (MessageTooBig) сохраняется, но большое + # тело по сети НЕ шлётся — иначе платформа вешает запрос на ~51с (MTU). + qlow = sqs.create_queue(QueueName=f"invalid-{random.randint(0, 10**9)}", Attributes={"MaximumMessageSize": "1024"})["QueueUrl"] + cases.append(lambda: sqs.send_message(QueueUrl=qlow, MessageBody="x" * 2048)) # FIFO без MessageGroupId fq = sqs.create_queue(QueueName=f"invalid-{random.randint(0, 10**9)}.fifo", Attributes={"FifoQueue": "true"})["QueueUrl"] cases.append(lambda: sqs.send_message(QueueUrl=fq, MessageBody="x", MessageDeduplicationId="d")) @@ -262,6 +268,11 @@ def invalid_cases(sqs): record_unexpected(e) finally: # Очереди удаляются ПОСЛЕ прогона сценариев. + if qlow is not None: + try: + sqs.delete_queue(QueueUrl=qlow) + except ClientError: + pass if fq is not None: try: sqs.delete_queue(QueueUrl=fq) diff --git a/tests/platform_probe.py b/tests/platform_probe.py index cac58f1..425af6c 100644 --- a/tests/platform_probe.py +++ b/tests/platform_probe.py @@ -8,7 +8,7 @@ Блоки: A — через /health: burst 500 параллельных, большие заголовки, медленное тело, keep-alive x50, HTTP/1.0, HEAD, POST. - B — через SQS API (транспорт): SendMessage 256KB, Receive 10x256KB (~2.5MB ответ), + B — через SQS API (транспорт): SendMessage 32KB, Receive 10x32KB, long-poll 20s (фактическая длительность), chunked-тело. """ import http.client @@ -169,33 +169,33 @@ def a5_variants(): record("A5_post", type(e).__name__ + ": " + str(e)[:80]) -# --- B6: SendMessage 256KB --- +# --- B6: SendMessage 32KB (большие тела платформа вешает на ~51с — MTU, см. HISTORY) --- def b6_big_send(sqs, url): t0 = time.time() try: - sqs.send_message(QueueUrl=url, MessageBody="x" * (256 * 1024)) - record("B6_send_256kb", {"ok": True, "t_s": round(time.time() - t0, 3)}) + sqs.send_message(QueueUrl=url, MessageBody="x" * (32 * 1024)) + record("B6_send_32kb", {"ok": True, "t_s": round(time.time() - t0, 3)}) except Exception as e: - record("B6_send_256kb", {"ok": False, "err": type(e).__name__ + ": " + str(e)[:80], "t_s": round(time.time() - t0, 3)}) + record("B6_send_32kb", {"ok": False, "err": type(e).__name__ + ": " + str(e)[:80], "t_s": round(time.time() - t0, 3)}) -# --- B8: Receive 10 x 256KB (~2.5MB ответ) --- +# --- B8: Receive 10 x 32KB --- def b8_big_receive(sqs, url): for _ in range(10): - sqs.send_message(QueueUrl=url, MessageBody="y" * (256 * 1024)) + sqs.send_message(QueueUrl=url, MessageBody="y" * (32 * 1024)) t0 = time.time() try: r = sqs.receive_message(QueueUrl=url, MaxNumberOfMessages=10, WaitTimeSeconds=1) msgs = r.get("Messages", []) total = sum(len(m["Body"]) for m in msgs) - record("B8_receive_2.5mb", {"ok": True, "msgs": len(msgs), "bytes": total, "t_s": round(time.time() - t0, 3)}) + record("B8_receive_10x32kb", {"ok": True, "msgs": len(msgs), "bytes": total, "t_s": round(time.time() - t0, 3)}) for m in msgs: try: sqs.delete_message(QueueUrl=url, ReceiptHandle=m["ReceiptHandle"]) except Exception: pass except Exception as e: - record("B8_receive_2.5mb", {"ok": False, "err": type(e).__name__ + ": " + str(e)[:80], "t_s": round(time.time() - t0, 3)}) + record("B8_receive_10x32kb", {"ok": False, "err": type(e).__name__ + ": " + str(e)[:80], "t_s": round(time.time() - t0, 3)}) # --- B9: long-poll 20s — фактическая длительность ---