Files
SQS/hardcore_test.sh

272 lines
12 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 '(?<=<MD5OfMessageBody>)[^<]+' | 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