tests: без больших тел (платформа MTU 51с); превышение лимита через MaximumMessageSize=1024
This commit is contained in:
+17
-6
@@ -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)
|
||||
|
||||
@@ -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 — фактическая длительность ---
|
||||
|
||||
Reference in New Issue
Block a user