272 lines
12 KiB
Bash
272 lines
12 KiB
Bash
#!/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
|