#!/bin/bash # hardcore_test.sh — public compatibility test for shared-SQS set -euo pipefail BASE_URL="${BASE_URL:-https://qu.kube5s.ru}" AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID:-}" AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY:-}" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION:-us-east-1}" ENDPOINT="--endpoint-url ${BASE_URL}" TS=$(date +%s) QUEUE_NAME="hardcore-${TS}" PASS=0 FAIL=0 require_env() { local name="$1" if [[ -z "${!name:-}" ]]; then echo "Missing required env: $name" exit 2 fi } ok() { echo " [PASS] $1" PASS=$((PASS + 1)) } fail() { echo " [FAIL] $1" FAIL=$((FAIL + 1)) } check() { local label="$1" local body="$2" local pattern="$3" if echo "$body" | grep -qE "$pattern"; then ok "$label" else fail "$label :: $(echo "$body" | head -3 | tr '\n' ' ')" fi } require_env AWS_ACCESS_KEY_ID require_env AWS_SECRET_ACCESS_KEY export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION echo "═══════════════════════════════════════════" echo " shared-SQS Hardcore Test" echo " Endpoint: $BASE_URL" echo " Queue: $QUEUE_NAME" echo "═══════════════════════════════════════════" R=$(aws sqs create-queue --queue-name "$QUEUE_NAME" $ENDPOINT 2>&1) check "CreateQueue" "$R" "QueueUrl" QURL=$(echo "$R" | python3 -c 'import sys,json; print(json.load(sys.stdin)["QueueUrl"])' 2>/dev/null || true) R=$(aws sqs list-queues $ENDPOINT 2>&1) check "ListQueues" "$R" "$QUEUE_NAME" R=$(aws sqs get-queue-url --queue-name "$QUEUE_NAME" $ENDPOINT 2>&1) check "GetQueueUrl" "$R" "QueueUrl" R=$(aws sqs get-queue-attributes --queue-url "$QURL" --attribute-names All $ENDPOINT 2>&1) check "GetQueueAttributes" "$R" "Attributes|VisibilityTimeout" aws sqs set-queue-attributes --queue-url "$QURL" --attributes '{"VisibilityTimeout":"45"}' $ENDPOINT >/dev/null 2>&1 && ok "SetQueueAttributes" || fail "SetQueueAttributes" aws sqs tag-queue --queue-url "$QURL" --tags env=test,team=qa $ENDPOINT >/dev/null 2>&1 && ok "TagQueue" || fail "TagQueue" R=$(aws sqs list-queue-tags --queue-url "$QURL" $ENDPOINT 2>&1) check "ListQueueTags" "$R" "env|team|test|qa" aws sqs untag-queue --queue-url "$QURL" --tag-keys env $ENDPOINT >/dev/null 2>&1 && ok "UntagQueue" || fail "UntagQueue" R=$(aws sqs send-message --queue-url "$QURL" --message-body "single-$TS" $ENDPOINT 2>&1) check "SendMessage" "$R" "MessageId" R=$(aws sqs receive-message --queue-url "$QURL" --visibility-timeout 30 $ENDPOINT 2>&1) check "ReceiveMessage" "$R" "single-$TS" RH=$(echo "$R" | python3 -c 'import sys,json; msgs=json.load(sys.stdin).get("Messages", []); print(msgs[0]["ReceiptHandle"] if msgs else "")' 2>/dev/null || true) if [[ -n "$RH" ]]; then aws sqs change-message-visibility --queue-url "$QURL" --receipt-handle "$RH" --visibility-timeout 60 $ENDPOINT >/dev/null 2>&1 && ok "ChangeMessageVisibility" || fail "ChangeMessageVisibility" aws sqs delete-message --queue-url "$QURL" --receipt-handle "$RH" $ENDPOINT >/dev/null 2>&1 && ok "DeleteMessage" || fail "DeleteMessage" else fail "ReceiptHandle for single message" fi BATCH='[{"Id":"1","MessageBody":"b1"},{"Id":"2","MessageBody":"b2"},{"Id":"3","MessageBody":"b3"}]' R=$(aws sqs send-message-batch --queue-url "$QURL" --entries "$BATCH" $ENDPOINT 2>&1) check "SendMessageBatch" "$R" "Successful" R=$(aws sqs receive-message --queue-url "$QURL" --max-number-of-messages 3 $ENDPOINT 2>&1) check "ReceiveMessage batch" "$R" "Messages|ReceiptHandle" RECEIPTS=$(echo "$R" | python3 -c 'import sys,json; msgs=json.load(sys.stdin).get("Messages", []); print("\n".join(m["ReceiptHandle"] for m in msgs))' 2>/dev/null || true) if [[ -n "$RECEIPTS" ]]; then CMV_ENTRIES=$(echo "$RECEIPTS" | python3 -c 'import sys,json; entries=[] for i,rh in enumerate(sys.stdin.read().strip().split("\n"), 1): if rh: entries.append({"Id": f"c{i}", "ReceiptHandle": rh, "VisibilityTimeout": 60}) print(json.dumps(entries))' 2>/dev/null || echo '[]') R=$(aws sqs change-message-visibility-batch --queue-url "$QURL" --entries "$CMV_ENTRIES" $ENDPOINT 2>&1) check "ChangeMessageVisibilityBatch" "$R" "Successful" DEL_ENTRIES=$(echo "$RECEIPTS" | python3 -c 'import sys,json; entries=[] for i,rh in enumerate(sys.stdin.read().strip().split("\n"), 1): if rh: entries.append({"Id": f"d{i}", "ReceiptHandle": rh}) print(json.dumps(entries))' 2>/dev/null || echo '[]') R=$(aws sqs delete-message-batch --queue-url "$QURL" --entries "$DEL_ENTRIES" $ENDPOINT 2>&1) check "DeleteMessageBatch" "$R" "Successful" else fail "Batch receipts" fi aws sqs send-message --queue-url "$QURL" --message-body "purge-me" $ENDPOINT >/dev/null 2>&1 || true aws sqs purge-queue --queue-url "$QURL" $ENDPOINT >/dev/null 2>&1 && ok "PurgeQueue" || fail "PurgeQueue" aws sqs delete-queue --queue-url "$QURL" $ENDPOINT >/dev/null 2>&1 && ok "DeleteQueue" || fail "DeleteQueue" echo "═══════════════════════════════════════════" echo " RESULT: PASS=$PASS FAIL=$FAIL" echo "═══════════════════════════════════════════" [[ $FAIL -eq 0 ]]