123 lines
5.3 KiB
Bash
Executable File
123 lines
5.3 KiB
Bash
Executable File
#!/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 ]]
|