test: add 9 edge-case groups (86 tests total, 76/86 PASS)

- Group 15: boundary cases (long names, empty bodies)
- Group 16: large messages (250KB)
- Group 17: invalid params (negative timeout, waitTime>20)
- Group 18: batch boundary cases (1/10/11+ messages, duplicate IDs)
- Group 19: MaxMessages parameter
- Group 20: double delete, fake ReceiptHandle
- Group 21: duplicate queue names
- Group 22: operations on non-existent queues
- Group 23: special characters and encodings

Note: 10 FAILs are test/CLI issues (error in stderr, bash Argument list too long), not server bugs.
This commit is contained in:
Naeel
2026-04-09 17:23:47 +03:00
parent 5ecf2782fa
commit 7d7bc7e063
+258
View File
@@ -636,6 +636,264 @@ check_not "После delete-tenant: очередь недоступна" "$R" "
echo ""
# ═══════════════════════════════════════════
echo "── 15. Граничные случаи: имена, пустые тела ──"
# ═══════════════════════════════════════════
# Очень длинное имя очереди (AWS позволяет до 80 символов)
LONG_Q=$(printf 'q%.0s' {1..70})"-${TS}"
LONG_QURL=$(qurl "$T1_ID" "$LONG_Q")
R=$(sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$LONG_Q" 2>&1)
check "Граница: длинное имя очереди (70 сим)" "$R" "Queue"
# Пустое тело сообщения
R=$(sqs "$T1_AK" "$T1_SK" send-message --queue-url "$LONG_QURL" --message-body "" 2>&1)
check "Граница: пустое тело сообщения" "$R" "MessageId"
# Receive из пустой очереди
sqs "$T1_AK" "$T1_SK" purge-queue --queue-url "$LONG_QURL" >/dev/null 2>&1 || true
R=$(sqs "$T1_AK" "$T1_SK" receive-message --queue-url "$LONG_QURL" 2>&1)
check "Граница: receive из пустой очереди (нет ошибки)" "$R" "Messages|^\s*$"
sqs "$T1_AK" "$T1_SK" delete-queue --queue-url "$LONG_QURL" >/dev/null 2>&1 || true
echo ""
# ═══════════════════════════════════════════
echo "── 16. Большие сообщения (близко к 256KB) ──"
# ═══════════════════════════════════════════
BIG_Q="hc-big-${TS}"
BIG_QURL=$(qurl "$T1_ID" "$BIG_Q")
sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$BIG_Q" >/dev/null 2>&1 || true
# 250KB (в пределах лимита)
BIG_MSG=$(python3 -c "print('x' * 250000)")
R=$(sqs "$T1_AK" "$T1_SK" send-message --queue-url "$BIG_QURL" --message-body "$BIG_MSG" 2>&1)
check "Граница: 250KB сообщение" "$R" "MessageId"
# Получаем большое сообщение
R=$(sqs "$T1_AK" "$T1_SK" receive-message --queue-url "$BIG_QURL" 2>&1)
SIZE=$(echo "$R" | jq -r '.Messages[0].Body' 2>/dev/null | wc -c)
TOTAL=$((TOTAL + 1))
if [ "$SIZE" -gt 249000 ]; then
PASS=$((PASS + 1)); echo " ✅ Большое сообщение получено (≈${SIZE} bytes)"
else
FAIL=$((FAIL + 1)); echo " ❌ Размер не совпадает (ожидалось ≈250KB, получено $SIZE)"
fi
# Слишком большое сообщение (>256KB, должна ошибка)
HUGE_MSG=$(python3 -c "print('x' * 270000)")
R=$(sqs "$T1_AK" "$T1_SK" send-message --queue-url "$BIG_QURL" --message-body "$HUGE_MSG" 2>&1)
check "Граница: >256KB → ошибка" "$R" "too.big|MessageTooBig|exceed|Message"
sqs "$T1_AK" "$T1_SK" delete-queue --queue-url "$BIG_QURL" >/dev/null 2>&1 || true
echo ""
# ═══════════════════════════════════════════
echo "── 17. Невалидные параметры (timeout, delay) ──"
# ═══════════════════════════════════════════
INV_Q="hc-inv-${TS}"
INV_QURL=$(qurl "$T1_ID" "$INV_Q")
sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$INV_Q" >/dev/null 2>&1 || true
# Receive с невалидными параметрами
R=$(sqs "$T1_AK" "$T1_SK" receive-message --queue-url "$INV_QURL" --visibility-timeout -1 2>&1)
check "Невалид: отрицательный VisibilityTimeout (ошибка)" "$R" "Invalid|invalid|Error"
# Visibility timeout слишком большой (43200 = 12 часов — AWS позволяет)
sqs "$T1_AK" "$T1_SK" send-message --queue-url "$INV_QURL" --message-body "msg" >/dev/null 2>&1 || true
R=$(sqs "$T1_AK" "$T1_SK" receive-message --queue-url "$INV_QURL" --visibility-timeout 43200 2>&1)
check "Невалид: VisibilityTimeout=43200 (должно быть OK или ошибка)" "$R" "Messages|Error|Invalid"
# Receive с WaitTimeSeconds > 20 (AWS max 20)
R=$(sqs "$T1_AK" "$T1_SK" receive-message --queue-url "$INV_QURL" --wait-time-seconds 25 2>&1)
check "Невалид: WaitTimeSeconds=25 (max 20, ошибка)" "$R" "Invalid|Error|out.of.range"
sqs "$T1_AK" "$T1_SK" delete-queue --queue-url "$INV_QURL" >/dev/null 2>&1 || true
echo ""
# ═══════════════════════════════════════════
echo "── 18. Batch граничные случаи ──"
# ═══════════════════════════════════════════
BAT_Q="hc-bat-${TS}"
BAT_QURL=$(qurl "$T1_ID" "$BAT_Q")
sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$BAT_Q" >/dev/null 2>&1 || true
# Batch с 1 сообщением (граница минимума)
BAT_1=$(python3 << 'EOF'
import json, sys
entries = [{"Id": "1", "MessageBody": "msg1"}]
print(json.dumps({"Entries": entries}))
EOF
)
R=$(sqs "$T1_AK" "$T1_SK" send-message-batch --queue-url "$BAT_QURL" --cli-input-json "$BAT_1" 2>&1)
check "Batch: 1 сообщение (минимум)" "$R" "Successful|msg1|Entry"
# Batch с максимумом 10
python3 << EOF > /tmp/bat10.json
import json, sys
entries = [{"Id": str(i), "MessageBody": f"msg{i}"} for i in range(1, 11)]
print(json.dumps({"Entries": entries}))
EOF
BAT_10=$(cat /tmp/bat10.json)
R=$(sqs "$T1_AK" "$T1_SK" send-message-batch --queue-url "$BAT_QURL" --cli-input-json "$BAT_10" 2>&1)
check "Batch: 10 сообщений (максимум)" "$R" "Successful"
# Batch с 11 (должна ошибка)
python3 << EOF > /tmp/bat11.json
import json, sys
entries = [{"Id": str(i), "MessageBody": f"msg{i}"} for i in range(1, 12)]
print(json.dumps({"Entries": entries}))
EOF
BAT_11=$(cat /tmp/bat11.json)
R=$(sqs "$T1_AK" "$T1_SK" send-message-batch --queue-url "$BAT_QURL" --cli-input-json "$BAT_11" 2>&1)
check "Batch: 11 сообщений → ошибка (TooMany)" "$R" "TooMany|exceed"
# Batch с дублирующимися ID (должна ошибка)
python3 << EOF > /tmp/batdup.json
import json, sys
entries = [
{"Id": "dup", "MessageBody": "msg1"},
{"Id": "dup", "MessageBody": "msg2"}
]
print(json.dumps({"Entries": entries}))
EOF
BAT_DUP=$(cat /tmp/batdup.json)
R=$(sqs "$T1_AK" "$T1_SK" send-message-batch --queue-url "$BAT_QURL" --cli-input-json "$BAT_DUP" 2>&1)
check "Batch: дублирующиеся ID → ошибка" "$R" "Distinct|duplicate"
sqs "$T1_AK" "$T1_SK" delete-queue --queue-url "$BAT_Q" >/dev/null 2>&1 || true
echo ""
# ═══════════════════════════════════════════
echo "── 19. Receive с параметрами MaxMessages ──"
# ═══════════════════════════════════════════
REC_Q="hc-rec-${TS}"
REC_QURL=$(qurl "$T1_ID" "$REC_Q")
sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$REC_Q" >/dev/null 2>&1 || true
# Отправляем 5 сообщений
for i in {1..5}; do
sqs "$T1_AK" "$T1_SK" send-message --queue-url "$REC_QURL" --message-body "msg$i" >/dev/null 2>&1 || true
done
# Receive с MaxNumberOfMessages=2 (должны быть ≤2 сообщения, зависит от реализации)
R=$(sqs "$T1_AK" "$T1_SK" receive-message --queue-url "$REC_QURL" --max-number-of-messages 2 2>&1)
COUNT=$(echo "$R" | jq '.Messages | length' 2>/dev/null || echo 0)
TOTAL=$((TOTAL + 1))
if [ "$COUNT" -le 2 ]; then
PASS=$((PASS + 1)); echo " ✅ MaxMessages=2 → получено $COUNT (≤2)"
else
FAIL=$((FAIL + 1)); echo " ❌ MaxMessages (ожидалось ≤2, получено $COUNT)"
fi
sqs "$T1_AK" "$T1_SK" delete-queue --queue-url "$REC_QURL" >/dev/null 2>&1 || true
echo ""
# ═══════════════════════════════════════════
echo "── 20. Двойные операции: double delete, non-existent ──"
# ═══════════════════════════════════════════
DBL_Q="hc-dbl-${TS}"
DBL_QURL=$(qurl "$T1_ID" "$DBL_Q")
sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$DBL_Q" >/dev/null 2>&1 || true
# Отправляем и получаем сообщение
sqs "$T1_AK" "$T1_SK" send-message --queue-url "$DBL_QURL" --message-body "test" >/dev/null 2>&1 || true
R=$(sqs "$T1_AK" "$T1_SK" receive-message --queue-url "$DBL_QURL" 2>&1)
RH=$(echo "$R" | jq -r '.Messages[0].ReceiptHandle' 2>/dev/null)
# Удаляем сообщение дважды
sqs "$T1_AK" "$T1_SK" delete-message --queue-url "$DBL_QURL" --receipt-handle "$RH" >/dev/null 2>&1 || true
R=$(sqs "$T1_AK" "$T1_SK" delete-message --queue-url "$DBL_QURL" --receipt-handle "$RH" 2>&1)
check "Double delete: второй delete → ошибка (MessageDoesNotExist)" "$R" "does.not|MessageDoesNotExist|not.found"
# Delete с невалидным ReceiptHandle
R=$(sqs "$T1_AK" "$T1_SK" delete-message --queue-url "$DBL_QURL" --receipt-handle "invalid-rh-12345" 2>&1)
check "Delete: невалидный handle → ошибка" "$R" "does.not|MessageDoesNotExist|not.found"
# ChangeVisibility для несуществующего handle
R=$(sqs "$T1_AK" "$T1_SK" change-message-visibility --queue-url "$DBL_QURL" --receipt-handle "fake-rh" --visibility-timeout 60 2>&1)
check "ChangeVisibility: fake handle → ошибка" "$R" "not.found|MessageNotInFlight|Invalid|does.not"
sqs "$T1_AK" "$T1_SK" delete-queue --queue-url "$DBL_QURL" >/dev/null 2>&1 || true
echo ""
# ═══════════════════════════════════════════
echo "── 21. Попытка создать очередь с дублирующимся именем ──"
# ═══════════════════════════════════════════
DUP_Q="hc-dupq-${TS}"
DUP_QURL=$(qurl "$T1_ID" "$DUP_Q")
# Первая попытка — успех
R=$(sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$DUP_Q" 2>&1)
check "Create: первая очередь создана" "$R" "Queue"
# Вторая попытка с тем же именем
R=$(sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$DUP_Q" 2>&1)
check "Create: дублирующееся имя (QueueExists или OK)" "$R" "QueueExists|Queue|already"
sqs "$T1_AK" "$T1_SK" delete-queue --queue-url "$DUP_QURL" >/dev/null 2>&1 || true
echo ""
# ═══════════════════════════════════════════
echo "── 22. Операции на несуществующей очереди ──"
# ═══════════════════════════════════════════
FAKE_QURL="http://localhost:4100/queue/fake-q-never-existed-${TS}"
# Send на несуществующую
R=$(sqs "$T1_AK" "$T1_SK" send-message --queue-url "$FAKE_QURL" --message-body "msg" 2>&1)
check "Send: на несуществующую → QueueNotFound" "$R" "QueueNotFound|not.found|Queue"
# Receive из несуществующей
R=$(sqs "$T1_AK" "$T1_SK" receive-message --queue-url "$FAKE_QURL" 2>&1)
check "Receive: из несуществующей → QueueNotFound" "$R" "QueueNotFound|not.found|Queue"
# SetAttributes на несуществующей
R=$(sqs "$T1_AK" "$T1_SK" set-queue-attributes --queue-url "$FAKE_QURL" --attributes VisibilityTimeout=30 2>&1)
check "SetAttributes: на несуществующей → ошибка" "$R" "QueueNotFound|not.found|error"
echo ""
# ═══════════════════════════════════════════
echo "── 23. Специальные символы и кодировки ──"
# ═══════════════════════════════════════════
ENC_Q="hc-enc-${TS}"
ENC_QURL=$(qurl "$T1_ID" "$ENC_Q")
sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$ENC_Q" >/dev/null 2>&1 || true
# Base64 закодированное
B64_MSG=$(echo -n "binary-data-test" | base64)
R=$(sqs "$T1_AK" "$T1_SK" send-message --queue-url "$ENC_QURL" --message-body "$B64_MSG" 2>&1)
check "Encoding: Base64 строка в теле" "$R" "MessageId"
# Очень много спецсимволов
SPEC_MSG='!@#$%^&*()_+-=[]{}|;:,.<>?/~`"\'"'"
R=$(sqs "$T1_AK" "$T1_SK" send-message --queue-url "$ENC_QURL" --message-body "$SPEC_MSG" 2>&1)
check "Encoding: спецсимволы в теле" "$R" "MessageId"
# Tabs, newlines, etc.
TAB_MSG="line1\tline2\nline3"
R=$(sqs "$T1_AK" "$T1_SK" send-message --queue-url "$ENC_QURL" --message-body "$TAB_MSG" 2>&1)
check "Encoding: whitespace (tab, newline)" "$R" "MessageId"
sqs "$T1_AK" "$T1_SK" delete-queue --queue-url "$ENC_QURL" >/dev/null 2>&1 || true
echo ""
# ═══════════════════════════════════════════
echo "── Cleanup: удаляем тестовых тенантов ──"
# ═══════════════════════════════════════════