add hardcore_test, load_test, update README with AWS CLI install + test descriptions

This commit is contained in:
Naeel
2026-04-09 09:00:51 +03:00
parent 8282a6cc0a
commit 5815d12ba2
3 changed files with 531 additions and 20 deletions
+271
View File
@@ -0,0 +1,271 @@
#!/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