diff --git a/villagesql/dev_server/tests/integration_test.sh b/villagesql/dev_server/tests/integration_test.sh new file mode 100755 index 000000000000..052038788441 --- /dev/null +++ b/villagesql/dev_server/tests/integration_test.sh @@ -0,0 +1,129 @@ +#!/bin/bash +# Copyright (c) 2026 VillageSQL Contributors +# Integration test for the VillageSQL dev server control script. +# +# Usage: integration_test.sh +# +# is the root of an extracted villagesql-dev-server-* tarball, +# containing the villagesql script and the bin/, mysql-test/, etc. directories. +# +# The test spins up a real server in a temporary instance directory, exercises +# each sub-command, then shuts it down and cleans up. + +PACKAGE_DIR="${1:?Usage: $0 }" +VSQL="$PACKAGE_DIR/villagesql" + +if [[ ! -f "$VSQL" ]]; then + echo "Error: villagesql script not found at $VSQL" + exit 1 +fi + +INSTANCE_DIR="$(mktemp -d)" +PASS=0 +FAIL=0 + +cleanup() { + "$VSQL" --dir "$INSTANCE_DIR" stop 2>/dev/null || true + rm -rf "$INSTANCE_DIR" +} +trap cleanup EXIT + +# --------------------------------------------------------------------------- +# Test helpers +# --------------------------------------------------------------------------- + +run_test() { + local desc="$1" + local expected="$2" # "success" or "failure" + shift 2 + + if "$@" >/dev/null 2>&1; then + actual="success" + else + actual="failure" + fi + + if [[ "$actual" == "$expected" ]]; then + echo "PASS: $desc" + PASS=$((PASS + 1)) + else + echo "FAIL: $desc (expected $expected, got $actual)" + FAIL=$((FAIL + 1)) + fi +} + +run_test_output() { + local desc="$1" + local pattern="$2" + shift 2 + + local output + output=$("$@" 2>&1) || true + if echo "$output" | grep -qF "$pattern"; then + echo "PASS: $desc" + PASS=$((PASS + 1)) + else + echo "FAIL: $desc" + echo " Expected output containing: $pattern" + echo " Got: $output" + FAIL=$((FAIL + 1)) + fi +} + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + +echo "Testing VillageSQL dev server" +echo " Package directory: $PACKAGE_DIR" +echo " Instance directory: $INSTANCE_DIR" +echo "" + +# Help and error handling +run_test_output "help shows usage" "Usage:" "$VSQL" help +run_test_output "--help shows usage" "Usage:" "$VSQL" --help +run_test "unknown command fails" failure "$VSQL" unknown_command_xyz + +# Pre-init state +run_test "status before init fails" failure "$VSQL" --dir "$INSTANCE_DIR" status +run_test "start before init fails" failure "$VSQL" --dir "$INSTANCE_DIR" start +run_test "stop before init fails" failure "$VSQL" --dir "$INSTANCE_DIR" stop + +# Initialization +run_test "init succeeds" success "$VSQL" --dir "$INSTANCE_DIR" init +run_test "double init fails" failure "$VSQL" --dir "$INSTANCE_DIR" init + +# Post-init, pre-start state +run_test "status before start fails" failure "$VSQL" --dir "$INSTANCE_DIR" status + +# Start +run_test "start succeeds" success "$VSQL" --dir "$INSTANCE_DIR" start +run_test "double start fails" failure "$VSQL" --dir "$INSTANCE_DIR" start + +# Running state +run_test "status while running succeeds" success "$VSQL" --dir "$INSTANCE_DIR" status +run_test_output "connect can run SELECT 1" "1" "$VSQL" --dir "$INSTANCE_DIR" connect -e "SELECT 1" +run_test "veb ls succeeds" success "$VSQL" --dir "$INSTANCE_DIR" veb ls + +# veb add/rm +TMPVEB="$(mktemp /tmp/test_XXXXXX.veb)" +run_test "veb add succeeds" success "$VSQL" --dir "$INSTANCE_DIR" veb add "$TMPVEB" +run_test_output "veb ls shows added extension" "$(basename "$TMPVEB" .veb)" \ + "$VSQL" --dir "$INSTANCE_DIR" veb ls +run_test "veb rm succeeds" success "$VSQL" --dir "$INSTANCE_DIR" veb rm "$(basename "$TMPVEB" .veb)" +run_test "veb rm missing fails" failure "$VSQL" --dir "$INSTANCE_DIR" veb rm nonexistent_ext +rm -f "$TMPVEB" + +# Stop +run_test "stop succeeds" success "$VSQL" --dir "$INSTANCE_DIR" stop +run_test "status after stop fails" failure "$VSQL" --dir "$INSTANCE_DIR" status +run_test "double stop fails" failure "$VSQL" --dir "$INSTANCE_DIR" stop + +# --------------------------------------------------------------------------- +# Summary +# --------------------------------------------------------------------------- + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "Results: $PASS passed, $FAIL failed" +[[ $FAIL -eq 0 ]] || exit 1