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