85963dc320
REQ-043: install.sh pulls release binary from public Gitea URL. User-level default (~/.local/bin/orca), --system for system-level (/usr/local/bin/orca). Defaults to latest release; --version pins. Env-overridable GITEA_URL/OWNER/REPO for testability. REQ-044: in-place update detects existing binary, reads version via 'orca version --json', prints update message, overwrites binary, preserves namespace dir (config/db/certs). Idempotent re-install. REQ-016 (completion): README quickstart now documents the 1-liner install + --system variant + update-in-place pattern. Tests: 8/8 pass in scripts/install_test.sh (real public Gitea releases, no mock server; timeout-guarded to prevent hangs). Docs: docs/install.md covers user/system install, version pinning, in-place update, uninstall, troubleshooting. ---ci--- project: orca phase: 2 milestone: v0.5 status: verify ---/ci---
129 lines
4.3 KiB
Bash
Executable File
129 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
|
# install_test.sh — tests for scripts/install.sh
|
|
#
|
|
# Tests install.sh against the real public Gitea releases (REQ-045 made
|
|
# the repo + releases publicly accessible). Uses real existing release
|
|
# tags (v0.4.1, v0.4.2) so no mock infrastructure is needed.
|
|
#
|
|
# Tests:
|
|
# 1. user-level install (binary at ~/.local/bin/orca)
|
|
# 2. in-place update (v0.4.1 -> v0.4.2) preserves namespace state
|
|
# 3. idempotent re-install (v0.4.2 -> v0.4.2)
|
|
# 4. --system install (requires root; /usr/local/bin/orca)
|
|
# 5. --system without root fails with error
|
|
#
|
|
# Usage: bash scripts/install_test.sh
|
|
# sudo bash scripts/install_test.sh (to include --system tests)
|
|
#
|
|
# Each test is wrapped in `timeout 30` to prevent hangs. The whole
|
|
# suite is wrapped in `timeout 120`.
|
|
|
|
set -uo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
INSTALL_SH="$SCRIPT_DIR/install.sh"
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
ok() { echo " PASS: $1"; PASS=$((PASS+1)); }
|
|
fail() { echo " FAIL: $1"; FAIL=$((FAIL+1)); }
|
|
|
|
# Kill any background processes on exit (defensive — no background procs
|
|
# expected in this version, but keeps the harness safe).
|
|
trap 'kill 0 2>/dev/null || true' EXIT
|
|
|
|
run_install() {
|
|
timeout 30 bash "$INSTALL_SH" "$@" 2>&1
|
|
}
|
|
|
|
echo "=== Test 1: user-level install (v0.4.1) ==="
|
|
FAKE_HOME="$(mktemp -d)"
|
|
export HOME="$FAKE_HOME"
|
|
if run_install --version v0.4.1 > /tmp/it1.log 2>&1; then
|
|
if [ -x "$FAKE_HOME/.local/bin/orca" ]; then
|
|
ok "binary at ~/.local/bin/orca"
|
|
else
|
|
fail "binary not at ~/.local/bin/orca"
|
|
fi
|
|
INSTALLED_VER="$(timeout 5 "$FAKE_HOME/.local/bin/orca" version --json 2>/dev/null | sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"
|
|
if [ "$INSTALLED_VER" = "v0.4.1" ]; then
|
|
ok "installed version is v0.4.1"
|
|
else
|
|
fail "installed version is '${INSTALLED_VER}', expected v0.4.1"
|
|
fi
|
|
else
|
|
fail "user install exited non-zero"; cat /tmp/it1.log
|
|
fi
|
|
|
|
echo "=== Test 2: in-place update (v0.4.1 -> v0.4.2) preserves namespace ==="
|
|
mkdir -p "$FAKE_HOME/.orca"
|
|
echo "preserve-me" > "$FAKE_HOME/.orca/orca.db"
|
|
if run_install --version v0.4.2 > /tmp/it2.log 2>&1; then
|
|
if grep -q "updated orca from v0.4.1 to v0.4.2" /tmp/it2.log; then
|
|
ok "update message printed"
|
|
else
|
|
fail "update message not printed"; cat /tmp/it2.log
|
|
fi
|
|
if [ "$(cat "$FAKE_HOME/.orca/orca.db" 2>/dev/null)" = "preserve-me" ]; then
|
|
ok "namespace state preserved during update"
|
|
else
|
|
fail "namespace state was modified or removed during update"
|
|
fi
|
|
INSTALLED_VER="$(timeout 5 "$FAKE_HOME/.local/bin/orca" version --json 2>/dev/null | sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"
|
|
if [ "$INSTALLED_VER" = "v0.4.2" ]; then
|
|
ok "binary updated to v0.4.2"
|
|
else
|
|
fail "binary version is '${INSTALLED_VER}', expected v0.4.2"
|
|
fi
|
|
else
|
|
fail "update exited non-zero"; cat /tmp/it2.log
|
|
fi
|
|
|
|
echo "=== Test 3: idempotent re-install (v0.4.2 -> v0.4.2) ==="
|
|
if run_install --version v0.4.2 > /tmp/it3.log 2>&1; then
|
|
if grep -q "reinstalled orca v0.4.2" /tmp/it3.log; then
|
|
ok "reinstall message printed"
|
|
else
|
|
fail "reinstall message not printed"; cat /tmp/it3.log
|
|
fi
|
|
else
|
|
fail "reinstall exited non-zero"; cat /tmp/it3.log
|
|
fi
|
|
|
|
echo "=== Test 4: --system install (requires root) ==="
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
if run_install --system --version v0.4.1 > /tmp/it4.log 2>&1; then
|
|
if [ -x /usr/local/bin/orca ]; then
|
|
ok "binary at /usr/local/bin/orca"
|
|
else
|
|
fail "binary not at /usr/local/bin/orca"
|
|
fi
|
|
if grep -q "namespace root: /root/.orca" /tmp/it4.log; then
|
|
ok "--system reports /root/.orca namespace"
|
|
else
|
|
fail "--system did not report /root/.orca namespace"; cat /tmp/it4.log
|
|
fi
|
|
rm -f /usr/local/bin/orca
|
|
else
|
|
fail "--system install exited non-zero"; cat /tmp/it4.log
|
|
fi
|
|
else
|
|
echo " SKIP: --system test (not running as root)"
|
|
fi
|
|
|
|
echo "=== Test 5: --system without root fails ==="
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
if run_install --system --version v0.4.1 2>&1 | grep -q "requires root"; then
|
|
ok "--system without root correctly errors"
|
|
else
|
|
fail "--system without root did not error"
|
|
fi
|
|
else
|
|
echo " SKIP: --system-without-root test (running as root)"
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== Results: $PASS passed, $FAIL failed ==="
|
|
rm -rf "$FAKE_HOME" /tmp/it1.log /tmp/it2.log /tmp/it3.log /tmp/it4.log 2>/dev/null
|
|
exit $FAIL |