myxce/src/frontend/tests/regression/run.sh

180 lines
6.7 KiB
Bash
Executable file

#!/usr/bin/env bash
# Regression test suite: xcecli ↔ apiserver
# Usage:
# ./run.sh # uses defaults below
# XCE=/path/to/xce URL=http://host:8080 ./run.sh
#
# Requires a running apiserver with builtin test data and config_file auth.
# Exit code: 0 = all passed, non-zero = failures found.
set -euo pipefail
XCE="${XCE:-/tmp/xce_static}"
URL="${URL:-http://localhost:8080}"
PASS=0
FAIL=0
SKIP=0
# ── helpers ──────────────────────────────────────────────────────────────────
GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m'
pass() { echo -e "${GREEN}PASS${NC} $1"; PASS=$((PASS+1)); }
fail() { echo -e "${RED}FAIL${NC} $1 — $2"; FAIL=$((FAIL+1)); }
skip() { echo -e "${YELLOW}SKIP${NC} $1 — $2"; SKIP=$((SKIP+1)); }
# Run command, assert stdout contains expected string
assert_contains() {
local desc="$1" expected="$2"; shift 2
local out
out=$("$@" 2>&1) || true
if echo "$out" | grep -qF "$expected"; then
pass "$desc"
else
fail "$desc" "expected '${expected}' in output, got: $(echo "$out" | head -3)"
fi
}
# Run command, assert stdout does NOT contain string
assert_not_contains() {
local desc="$1" unexpected="$2"; shift 2
local out
out=$("$@" 2>&1) || true
if echo "$out" | grep -qF "$unexpected"; then
fail "$desc" "unexpected '${unexpected}' found in output"
else
pass "$desc"
fi
}
# Assert command exits successfully (any output)
assert_ok() {
local desc="$1"; shift
if "$@" >/dev/null 2>&1; then
pass "$desc"
else
fail "$desc" "command exited non-zero"
fi
}
# ── setup ────────────────────────────────────────────────────────────────────
echo "=== Regression Suite ==="
echo "XCE : $XCE"
echo "URL : $URL"
echo ""
if [[ ! -x "$XCE" ]]; then
echo "ERROR: xce binary not found at $XCE"
echo "Build with: cd xcecli && CGO_ENABLED=0 go build -o /tmp/xce_static ./cmd/main.go"
exit 1
fi
# Check server reachable
if ! "$XCE" login -u admin -p admin --url "$URL" 2>&1 | grep -q "login successfully"; then
echo "ERROR: cannot login to $URL — is apiserver running?"
exit 1
fi
echo "--- Auth ---"
# ── auth ─────────────────────────────────────────────────────────────────────
assert_contains "login admin" "login successfully" $XCE login -u admin -p admin --url "$URL"
assert_contains "list shows url" "$URL" $XCE list
assert_contains "whoami returns user" "admin" $XCE users whoami
assert_contains "logout clears session" "clear login info" $XCE logout --url "$URL"
# Re-login for remaining tests
$XCE login -u admin -p admin --url "$URL" >/dev/null 2>&1
echo ""
echo "--- Permissions ---"
assert_contains "permissions list returns data" "job:view" $XCE permissions list
assert_not_contains "permissions list no error" "failed" $XCE permissions list
echo ""
echo "--- Roles ---"
# T1 fix: roles list must not send unknown param
assert_not_contains "roles list no 400 error" "invalid parameters" $XCE roles list
assert_not_contains "roles list no unique error" "unique" $XCE roles list
# roles add / delete round-trip
$XCE roles delete -r regression_test_role >/dev/null 2>&1 || true
assert_contains "roles add" "created successfully" $XCE roles add -r regression_test_role -p "job:view=all"
assert_contains "roles delete" "deleted successfully" $XCE roles delete -r regression_test_role
echo ""
echo "--- Users ---"
# T1 fix: users list must not send unknown param
assert_not_contains "users list no 400 error" "invalid parameters" $XCE users list
assert_not_contains "users list no unique error" "unique" $XCE users list
assert_contains "users whoami" "admin" $XCE users whoami
# ensure clean state before assign
$XCE users unassignrole -u user1 -r basic_user >/dev/null 2>&1 || true
assert_contains "users assignrole" "assigned roles" $XCE users assignrole -u user1 -r basic_user
assert_contains "users unassignrole" "deleted successfully" $XCE users unassignrole -u user1 -r basic_user
echo ""
echo "--- Hosts ---"
assert_not_contains "hosts list no error" "failed" $XCE hosts list
assert_contains "hosts open" "open" $XCE hosts open host1
assert_contains "hosts close" "close" $XCE hosts close host1
echo ""
echo "--- Queues ---"
assert_not_contains "queues list no error" "failed" $XCE queues list
assert_contains "queues open" "open" $XCE queues open normal
assert_contains "queues close" "close" $XCE queues close normal
assert_contains "queues active" "active" $XCE queues active normal
assert_contains "queues deactive" "deactive" $XCE queues deactive normal
echo ""
echo "--- Jobs ---"
# submit returns a job ID
SUBMIT_OUT=$($XCE jobs submit -J regression_test -q normal sleep 1 2>&1)
if echo "$SUBMIT_OUT" | grep -qE "Job <[0-9]+> is submitted"; then
pass "jobs submit"
JOB_ID=$(echo "$SUBMIT_OUT" | grep -oE '[0-9]{10,}' | head -1)
else
fail "jobs submit" "unexpected output: $SUBMIT_OUT"
JOB_ID=""
fi
assert_not_contains "jobs list -u all no error" "failed" $XCE jobs list -u all
# Verify submit time is parsed (not showing '-')
$XCE login -u user1 -p user1 --url "$URL" >/dev/null 2>&1
assert_not_contains "jobs list submit_time not dash" "- " $XCE jobs list
$XCE login -u admin -p admin --url "$URL" >/dev/null 2>&1
if [[ -n "$JOB_ID" ]]; then
assert_not_contains "jobs kill by id no crash" "panic" $XCE jobs kill "$JOB_ID"
else
skip "jobs kill" "no job ID from submit"
fi
echo ""
echo "--- Resources ---"
assert_not_contains "resources distribution list no error" "failed" $XCE resources distribution list
assert_not_contains "resources definition list no error" "failed" $XCE resources definition list
echo ""
echo "--- Clusters ---"
assert_not_contains "clusters list no error" "failed" $XCE id
echo ""
echo "─────────────────────────────────────────"
echo -e "Results: ${GREEN}${PASS} passed${NC} ${RED}${FAIL} failed${NC} ${YELLOW}${SKIP} skipped${NC}"
echo "─────────────────────────────────────────"
[[ $FAIL -eq 0 ]]