diff --git a/shared-sqs/tests/hardcore_test.sh b/shared-sqs/tests/hardcore_test.sh index 98716cf..d071808 100644 --- a/shared-sqs/tests/hardcore_test.sh +++ b/shared-sqs/tests/hardcore_test.sh @@ -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: удаляем тестовых тенантов ──" # ═══════════════════════════════════════════