#!/bin/bash # hardcore_test.sh — Полный тест SQS-сервиса (AWS CLI + curl) # Проверяет: CRUD, невалидный ввод, спецсимволы, visibility, purge, MD5 # Требования: aws cli (pip install awscli), curl, bash, python3 (для md5) # Запуск: bash hardcore_test.sh set -euo pipefail # ═══════════════════════════════════════════ # КОНФИГУРАЦИЯ — измените под свой тенант # ═══════════════════════════════════════════ SQS_ENDPOINT="https://sqs.kube5s.ru/sqs/test001" export AWS_ACCESS_KEY_ID="SQSAK-test001-ae4dc8" export AWS_SECRET_ACCESS_KEY="J8mElXq8Nwww8iFRtGJCm8KfxM9XSTluTqS2A67xsEE" export AWS_DEFAULT_REGION="us-east-1" EP="--endpoint-url ${SQS_ENDPOINT}" AUTH="${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" VER="2012-11-05" TS=$(date +%s) PASS=0; FAIL=0; TOTAL=0 check() { TOTAL=$((TOTAL + 1)) if echo "$2" | grep -q "$3"; then PASS=$((PASS + 1)); echo " ✅ $1" else FAIL=$((FAIL + 1)); echo " ❌ $1" echo " ожидалось: $3" echo " получено: $(echo "$2" | head -2)" fi } check_not() { TOTAL=$((TOTAL + 1)) if echo "$2" | grep -q "$3"; then FAIL=$((FAIL + 1)); echo " ❌ $1 (содержит '$3')" else PASS=$((PASS + 1)); echo " ✅ $1" fi } curl_sqs() { curl -s --max-time 15 -u "$AUTH" "${SQS_ENDPOINT}?${1}&Version=${VER}" 2>&1 } echo "╔═══════════════════════════════════════════════════════╗" echo "║ SQS Hardcore Test — $(date '+%Y-%m-%d %H:%M:%S') ║" echo "║ Endpoint: ${SQS_ENDPOINT} ║" echo "║ Метод: AWS CLI + curl ║" echo "╚═══════════════════════════════════════════════════════╝" echo "" # Проверяем что aws cli доступен if ! command -v aws &>/dev/null; then echo "❌ aws cli не найден. Установите: pip install awscli" echo " Подробнее: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" exit 1 fi # ═══════════════════════════════════════════ echo "── 1. CRUD через AWS CLI ──" # ═══════════════════════════════════════════ Q1="hc-cli-${TS}" # Создание R=$(aws sqs create-queue --queue-name "$Q1" $EP --output text 2>&1) check "CLI: создание очереди" "$R" "$Q1" QURL="$R" # Список — очередь видна R=$(aws sqs list-queues $EP --output text 2>&1) check "CLI: очередь в списке" "$R" "$Q1" # Отправка R=$(aws sqs send-message --queue-url "$QURL" --message-body "cli-test-msg" $EP --output json 2>&1) check "CLI: отправка" "$R" "MessageId" # Получение R=$(aws sqs receive-message --queue-url "$QURL" $EP --output json 2>&1) check "CLI: получение" "$R" "cli-test-msg" # Атрибуты R=$(aws sqs get-queue-attributes --queue-url "$QURL" --attribute-names All $EP --output json 2>&1) check "CLI: атрибуты" "$R" "ApproximateNumberOfMessages\|Attributes" # Purge aws sqs send-message --queue-url "$QURL" --message-body "to-purge" $EP >/dev/null 2>&1 R=$(aws sqs purge-queue --queue-url "$QURL" $EP 2>&1 && echo "OK" || echo "FAIL") check "CLI: purge" "$R" "OK" # Удаление R=$(aws sqs delete-queue --queue-url "$QURL" $EP 2>&1 && echo "OK" || echo "FAIL") check "CLI: удаление" "$R" "OK" # Проверка что удалилась R=$(aws sqs list-queues $EP --output text 2>&1) check_not "CLI: очередь исчезла" "$R" "$Q1" echo "" # ═══════════════════════════════════════════ echo "── 2. CRUD через curl ──" # ═══════════════════════════════════════════ Q2="hc-curl-${TS}" R=$(curl_sqs "Action=CreateQueue&QueueName=${Q2}") check "curl: создание" "$R" "CreateQueueResult" R=$(curl_sqs "Action=SendMessage&QueueUrl=${SQS_ENDPOINT}/test001/${Q2}&MessageBody=curl-test") check "curl: отправка" "$R" "MessageId" R=$(curl_sqs "Action=ReceiveMessage&QueueUrl=${SQS_ENDPOINT}/test001/${Q2}") check "curl: получение" "$R" "curl-test" R=$(curl_sqs "Action=DeleteQueue&QueueUrl=${SQS_ENDPOINT}/test001/${Q2}") check "curl: удаление" "$R" "DeleteQueueResponse" echo "" # ═══════════════════════════════════════════ echo "── 3. CLI отправляет → curl получает (и наоборот) ──" # ═══════════════════════════════════════════ Q3="hc-cross-${TS}" QURL3=$(aws sqs create-queue --queue-name "$Q3" $EP --output text 2>&1) # CLI → curl aws sqs send-message --queue-url "$QURL3" --message-body "from-cli" $EP >/dev/null 2>&1 R=$(curl_sqs "Action=ReceiveMessage&QueueUrl=${SQS_ENDPOINT}/test001/${Q3}&MaxNumberOfMessages=10") check "CLI→curl: сообщение доставлено" "$R" "from-cli" # curl → CLI curl_sqs "Action=SendMessage&QueueUrl=${SQS_ENDPOINT}/test001/${Q3}&MessageBody=from-curl" >/dev/null R=$(aws sqs receive-message --queue-url "$QURL3" $EP --output json 2>&1) check "curl→CLI: сообщение доставлено" "$R" "from-curl" aws sqs delete-queue --queue-url "$QURL3" $EP >/dev/null 2>&1 echo "" # ═══════════════════════════════════════════ echo "── 4. Невалидный ввод ──" # ═══════════════════════════════════════════ # Несуществующая очередь R=$(aws sqs send-message --queue-url "${SQS_ENDPOINT}/test001/no-such-queue-${TS}" --message-body "x" $EP 2>&1 || true) check "Несуществующая очередь" "$R" "NonExistentQueue\|error\|Error\|does not exist" # Пустое тело через curl R=$(curl_sqs "Action=SendMessage&QueueUrl=${SQS_ENDPOINT}/test001/no-such-queue-${TS}") check "curl: без body" "$R" "Error\|MissingParameter\|must contain" # Неизвестный Action R=$(curl_sqs "Action=DoSomethingWeird") check "curl: неизвестный Action" "$R" "InvalidAction\|UnknownAction\|InvalidParameterValue\|Error" echo "" # ═══════════════════════════════════════════ echo "── 5. Спецсимволы в сообщениях ──" # ═══════════════════════════════════════════ Q5="hc-spec-${TS}" QURL5=$(aws sqs create-queue --queue-name "$Q5" $EP --output text 2>&1) # JSON aws sqs send-message --queue-url "$QURL5" --message-body '{"key":"value","num":42}' $EP >/dev/null 2>&1 R=$(aws sqs receive-message --queue-url "$QURL5" $EP --output json 2>&1) check "JSON в теле" "$R" "key" # XML-символы через curl curl_sqs "Action=SendMessage&QueueUrl=${SQS_ENDPOINT}/test001/${Q5}&MessageBody=a%26b%3Cc%3Ed" >/dev/null R=$(curl_sqs "Action=ReceiveMessage&QueueUrl=${SQS_ENDPOINT}/test001/${Q5}") check "XML спецсимволы (&<>)" "$R" "Body" # Unicode aws sqs send-message --queue-url "$QURL5" --message-body "Привет мир 🚀" $EP >/dev/null 2>&1 R=$(aws sqs receive-message --queue-url "$QURL5" $EP --output json 2>&1) check "Unicode + эмодзи" "$R" "Привет\|мир" aws sqs delete-queue --queue-url "$QURL5" $EP >/dev/null 2>&1 echo "" # ═══════════════════════════════════════════ echo "── 6. Visibility timeout ──" # ═══════════════════════════════════════════ Q6="hc-vis-${TS}" QURL6=$(aws sqs create-queue --queue-name "$Q6" $EP --output text 2>&1) aws sqs send-message --queue-url "$QURL6" --message-body "vis-test" $EP >/dev/null 2>&1 # Получаем с visibility=2 R=$(aws sqs receive-message --queue-url "$QURL6" --visibility-timeout 2 $EP --output json 2>&1) check "Receive с visibility" "$R" "vis-test" # Сразу повторно — пусто R=$(aws sqs receive-message --queue-url "$QURL6" $EP --output json 2>&1) check_not "Скрыто во время visibility" "$R" "vis-test" # Ждём 3 сек — снова доступно sleep 3 R=$(aws sqs receive-message --queue-url "$QURL6" $EP --output json 2>&1) check "Снова доступно после timeout" "$R" "vis-test" aws sqs delete-queue --queue-url "$QURL6" $EP >/dev/null 2>&1 echo "" # ═══════════════════════════════════════════ echo "── 7. Множественные сообщения (10 шт) ──" # ═══════════════════════════════════════════ Q7="hc-multi-${TS}" QURL7=$(aws sqs create-queue --queue-name "$Q7" $EP --output text 2>&1) # Отправляем 10 for i in $(seq 1 10); do aws sqs send-message --queue-url "$QURL7" --message-body "msg-${i}" $EP >/dev/null 2>&1 done # Получаем все GOT=0 for _ in $(seq 1 15); do R=$(aws sqs receive-message --queue-url "$QURL7" --max-number-of-messages 10 $EP --output json 2>&1) COUNT=$(echo "$R" | grep -c '"Body"' || true) GOT=$((GOT + COUNT)) [ "$COUNT" -eq 0 ] && break [ "$GOT" -ge 10 ] && break done TOTAL=$((TOTAL + 1)) if [ "$GOT" -ge 10 ]; then PASS=$((PASS + 1)); echo " ✅ Получены все 10 сообщений ($GOT)" else FAIL=$((FAIL + 1)); echo " ❌ Получено $GOT/10 сообщений" fi aws sqs delete-queue --queue-url "$QURL7" $EP >/dev/null 2>&1 echo "" # ═══════════════════════════════════════════ echo "── 8. MD5 целостность ──" # ═══════════════════════════════════════════ Q8="hc-md5-${TS}" curl_sqs "Action=CreateQueue&QueueName=${Q8}" >/dev/null MSG="integrity-check-${TS}" EXPECTED=$(echo -n "$MSG" | md5sum | awk '{print $1}') R=$(curl_sqs "Action=SendMessage&QueueUrl=${SQS_ENDPOINT}/test001/${Q8}&MessageBody=${MSG}") GOT_MD5=$(echo "$R" | grep -oP '(?<=)[^<]+' | head -1) TOTAL=$((TOTAL + 1)) if [ "$EXPECTED" = "$GOT_MD5" ]; then PASS=$((PASS + 1)); echo " ✅ MD5 совпадает ($EXPECTED)" else FAIL=$((FAIL + 1)); echo " ❌ MD5: ожидалось $EXPECTED, получено $GOT_MD5" fi curl_sqs "Action=DeleteQueue&QueueUrl=${SQS_ENDPOINT}/test001/${Q8}" >/dev/null echo "" # ═══════════════════════════════════════════ echo "╔═══════════════════════════════════════════════════════╗" echo "║ ИТОГО ║" echo "╠═══════════════════════════════════════════════════════╣" printf "║ Всего: %-3s ✅ PASS: %-3s ❌ FAIL: %-3s ║\n" "$TOTAL" "$PASS" "$FAIL" echo "╚═══════════════════════════════════════════════════════╝" [ "$FAIL" -eq 0 ] && exit 0 || exit 1