Files
Pulse/scripts/tests/test-docker-agent-v2.sh
rcourtman 0fcfad3dc5 feat: add shared script library system and refactor docker-agent installer
Implements a comprehensive script improvement infrastructure to reduce code
duplication, improve maintainability, and enable easier testing of installer
scripts.

## New Infrastructure

### Shared Library System (scripts/lib/)
- common.sh: Core utilities (logging, sudo, dry-run, cleanup management)
- systemd.sh: Service management helpers with container-safe systemctl
- http.sh: HTTP/download helpers with curl/wget fallback and retry logic
- README.md: Complete API documentation for all library functions

### Bundler System
- scripts/bundle.sh: Concatenates library modules into single-file installers
- scripts/bundle.manifest: Defines bundling configuration for distributables
- Enables both modular development and curl|bash distribution

### Test Infrastructure
- scripts/tests/run.sh: Test harness for running all smoke tests
- scripts/tests/test-common-lib.sh: Common library validation (5 tests)
- scripts/tests/test-docker-agent-v2.sh: Installer smoke tests (4 tests)
- scripts/tests/integration/: Container-based integration tests (5 scenarios)
- All tests passing ✓

## Refactored Installer

### install-docker-agent-v2.sh
- Reduced from 1098 to 563 lines (48% code reduction)
- Uses shared libraries for all common operations
- NEW: --dry-run flag support
- Maintains 100% backward compatibility with original
- Fully tested with smoke and integration tests

### Key Improvements
- Sudo escalation: 100+ lines → 1 function call
- Download logic: 51 lines → 1 function call
- Service creation: 33 lines → 2 function calls
- Logging: Standardized across all operations
- Error handling: Improved with common library

## Documentation

### Rollout Strategy (docs/installer-v2-rollout.md)
- 3-phase rollout plan (Alpha → Beta → GA)
- Feature flag mechanism for gradual deployment
- Testing checklist and success metrics
- Rollback procedures and communication plan

### Developer Guides
- docs/script-library-guide.md: Complete library usage guide
- docs/CONTRIBUTING-SCRIPTS.md: Contribution workflow
- docs/installer-v2-quickref.md: Quick reference for operators

## Metrics

- Code reduction: 48% (1098 → 563 lines)
- Reusable functions: 0 → 30+
- Test coverage: 0 → 8 test scenarios
- Documentation: 0 → 5 comprehensive guides

## Testing

All tests passing:
- Smoke tests: 2/2 passed (8 test cases)
- Integration tests: 5/5 scenarios passed
- Bundled output: Syntax validated, dry-run tested

## Next Steps

This lays the foundation for migrating other installers (install.sh,
install-sensor-proxy.sh) to use the same pattern, reducing overall
maintenance burden and improving code quality across the project.
2025-10-20 15:13:38 +00:00

86 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Smoke tests for install-docker-agent-v2.sh
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
SCRIPT_PATH="${ROOT_DIR}/scripts/install-docker-agent-v2.sh"
TEST_NAME="install-docker-agent-v2"
if [[ ! -f "${SCRIPT_PATH}" ]]; then
echo "Missing script at ${SCRIPT_PATH}" >&2
exit 1
fi
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/pulse-test-XXXXXX")"
trap 'rm -rf "${TMP_DIR}"' EXIT
pass_count=0
fail_count=0
log_pass() {
echo "[PASS] $1"
((pass_count++))
return 0
}
log_fail() {
echo "[FAIL] $1" >&2
((fail_count++))
return 1
}
run_test() {
local desc="$1"
shift
if "$@"; then
log_pass "$desc"
else
local status=$?
log_fail "$desc (exit ${status})"
fi
}
set +e
run_test "syntax check" bash -n "${SCRIPT_PATH}"
set -e
# Test dry-run output captures action hints
set +e
DRY_RUN_OUTPUT="$("${SCRIPT_PATH}" --dry-run --url http://test.local --token testtoken 2>&1)"
DRY_STATUS=$?
set -e
if (( DRY_STATUS == 0 )) && [[ "${DRY_RUN_OUTPUT}" == *"[dry-run]"* ]]; then
log_pass "dry-run outputs actions"
else
log_fail "dry-run outputs actions"
echo "${DRY_RUN_OUTPUT}"
fi
if (( DRY_STATUS == 0 )); then
log_pass "dry-run exits successfully"
else
log_fail "dry-run exits successfully (exit ${DRY_STATUS})"
echo "${DRY_RUN_OUTPUT}"
fi
# Test argument validation (missing token)
MISSING_TOKEN_LOG="${TMP_DIR}/missing-token.log"
set +e
"${SCRIPT_PATH}" --dry-run --url http://test.local >"${MISSING_TOKEN_LOG}" 2>&1
ARG_STATUS=$?
set -e
if (( ARG_STATUS == 0 )); then
log_fail "missing token rejected"
cat "${MISSING_TOKEN_LOG}"
else
log_pass "missing token rejected"
fi
if (( fail_count > 0 )); then
echo "${TEST_NAME}: ${fail_count} failures" >&2
exit 1
fi
echo "All ${TEST_NAME} tests passed (${pass_count})"