#!/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 ] }