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