92 lines
2.8 KiB
Bash
Executable File
92 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# lib.sh — общие утилиты для тест-скриптов fission-console.
|
|
# Подключается через: source "$(dirname "$0")/lib.sh"
|
|
|
|
BASE="${BASE:-https://fission.kube5s.ru/console/api}"
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
pass() { PASS=$((PASS+1)); echo " PASS: $1"; }
|
|
fail() { FAIL=$((FAIL+1)); echo " FAIL: $1"; }
|
|
|
|
check_http() {
|
|
local got="$1" want="$2" label="$3"
|
|
[ "$got" = "$want" ] && pass "$label (HTTP $got)" || fail "$label — got $got, want $want"
|
|
}
|
|
|
|
# json_field PAYLOAD KEY — извлекает строковое значение ключа из JSON
|
|
json_field() {
|
|
local payload="$1" key="$2"
|
|
printf '%s' "$payload" | python3 -c "
|
|
import json, sys
|
|
key = sys.argv[1]
|
|
try:
|
|
d = json.load(sys.stdin)
|
|
v = d.get(key)
|
|
if v is None:
|
|
print('')
|
|
elif isinstance(v, (dict, list)):
|
|
print(json.dumps(v))
|
|
else:
|
|
print(v)
|
|
except Exception:
|
|
print('')
|
|
" "$key" 2>/dev/null
|
|
}
|
|
|
|
# json_escape — читает stdin, возвращает JSON-строку
|
|
json_escape() {
|
|
python3 -c 'import json, sys; print(json.dumps(sys.stdin.read()))'
|
|
}
|
|
|
|
# json_len PAYLOAD — длина JSON-массива
|
|
json_len() {
|
|
printf '%s' "$1" | python3 -c "import json,sys
|
|
try:
|
|
print(len(json.load(sys.stdin)))
|
|
except Exception:
|
|
print(0)" 2>/dev/null
|
|
}
|
|
|
|
# wait_invoke SUB FN EXPECTED [TRIES=12] [DELAY=5]
|
|
# Ждёт пока invoke вернёт status=200 и тело содержит EXPECTED.
|
|
# Возвращает 0 при успехе, 1 при таймауте.
|
|
wait_invoke() {
|
|
local sub="$1" fn="$2" expected="$3"
|
|
local tries="${4:-12}" delay="${5:-5}"
|
|
local try resp status raw err
|
|
for try in $(seq 1 "$tries"); do
|
|
resp=$(curl -s --max-time 50 -X POST "${BASE}/functions/${fn}/invoke" \
|
|
-H "X-Auth-Token: ${sub}" -H "Content-Type: application/json" -d '{}')
|
|
status=$(json_field "$resp" status)
|
|
raw=$(json_field "$resp" response_raw)
|
|
err=$(json_field "$resp" error)
|
|
echo " TRY=$try fn=$fn status=$status raw=$(printf '%s' "$raw" | head -c 80) err=$(printf '%s' "$err" | head -c 80)"
|
|
if [ "$status" = "200" ] && printf '%s' "$raw" | grep -qF "$expected"; then
|
|
return 0
|
|
fi
|
|
[ "$try" -lt "$tries" ] && sleep "$delay"
|
|
done
|
|
return 1
|
|
}
|
|
|
|
# mk_run_id — возвращает уникальный 8-символьный hex ID
|
|
mk_run_id() {
|
|
(date +%s%N 2>/dev/null; od -An -N4 -tu4 /dev/urandom 2>/dev/null) \
|
|
| sha256sum | head -c 8
|
|
}
|
|
|
|
# setup_cleanup CLEANUP_FN — регистрирует trap EXIT
|
|
setup_cleanup() {
|
|
trap "$1" EXIT
|
|
}
|
|
|
|
# print_summary — итог тестов
|
|
print_summary() {
|
|
echo ""
|
|
echo "========================================"
|
|
printf " ИТОГ: PASS=%d FAIL=%d\n" "$PASS" "$FAIL"
|
|
echo "========================================"
|
|
[ "$FAIL" -eq 0 ]
|
|
}
|