#!/usr/bin/env bash set -euo pipefail SCRIPT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)/deploy.sh TEST_ROOT=$(mktemp -d "${TMPDIR:-/tmp}/sw-frontend-deploy-test.XXXXXX") cleanup() { [[ "$TEST_ROOT" == "${TMPDIR:-/tmp}/sw-frontend-deploy-test."* ]] || exit 1 rm -rf -- "$TEST_ROOT" } trap cleanup EXIT mkdir "$TEST_ROOT/bin" cat > "$TEST_ROOT/bin/docker" <<'DOCKER' #!/usr/bin/env bash set -euo pipefail printf '%s\n' "$*" >> "$TEST_STATE/calls" command=$1; shift case "$command" in inspect) format='' if [[ "$1" == --format ]]; then format=$2; shift 2; fi [[ -d "$TEST_STATE/$1" ]] || exit 1 case "$format" in *com.sw2.application*) cat "$TEST_STATE/$1/app" ;; *org.opencontainers.image.revision*) cat "$TEST_STATE/$1/version" ;; *State.Running*) cat "$TEST_STATE/$1/running" ;; esac ;; network|build) exit 0 ;; run) name=''; version='new' while (($#)); do if [[ "$1" == --name ]]; then name=$2; shift 2; else shift; fi done [[ -n "$name" ]] || exit 0 mkdir "$TEST_STATE/$name" printf 'sw2' > "$TEST_STATE/$name/app" printf '%s' "$version" > "$TEST_STATE/$name/version" printf 'true' > "$TEST_STATE/$name/running" printf 'new-container' > "$TEST_STATE/$name/id" ;; port) printf '127.0.0.1:19603\n' ;; stop) name="${!#}"; printf 'false' > "$TEST_STATE/$name/running" ;; start) printf 'true' > "$TEST_STATE/$1/running" ;; rename) mv -- "$TEST_STATE/$1" "$TEST_STATE/$2" ;; rm) name="${!#}" [[ "$name" == sw2-frontend* ]] || exit 1 rm -rf -- "$TEST_STATE/$name" ;; *) echo "Unexpected docker command: $command" >&2; exit 1 ;; esac DOCKER cat > "$TEST_ROOT/bin/curl" <<'CURL' #!/usr/bin/env bash set -euo pipefail url="${!#}" if [[ "$TEST_MODE" == preflight-fail && "$url" == *:19603/* ]]; then exit 1; fi if [[ "$TEST_MODE" == final-fail && "$url" == *:9601/* ]]; then exit 1; fi if [[ "$url" == */version.txt ]]; then printf 'new'; else printf 'ok'; fi CURL printf '#!/usr/bin/env bash\nexit 0\n' > "$TEST_ROOT/bin/flock" chmod +x "$TEST_ROOT/bin/"* export PATH="$TEST_ROOT/bin:$PATH" export SW_HEALTH_ATTEMPTS=1 for scenario in success preflight-fail final-fail build-only unmanaged; do export TEST_STATE="$TEST_ROOT/$scenario" export TEST_MODE="$scenario" export SW_DEPLOY_BASE="$TEST_STATE/base" mkdir -p "$SW_DEPLOY_BASE/frontend-releases/new/dist" "$TEST_STATE/sw2-frontend" "$TEST_STATE/sw2-backend" cp "$SCRIPT" "$SW_DEPLOY_BASE/frontend-releases/new/deploy.sh" printf 'test' > "$SW_DEPLOY_BASE/frontend-releases/new/dist/index.html" printf 'new\n' > "$SW_DEPLOY_BASE/frontend-releases/new/dist/version.txt" printf 'old\n' > "$SW_DEPLOY_BASE/current-frontend-release" printf 'sw2' > "$TEST_STATE/sw2-frontend/app" printf 'old' > "$TEST_STATE/sw2-frontend/version" printf 'true' > "$TEST_STATE/sw2-frontend/running" printf 'old-container' > "$TEST_STATE/sw2-frontend/id" printf 'backend-unchanged' > "$TEST_STATE/sw2-backend/id" if [[ "$scenario" == unmanaged ]]; then printf 'other' > "$TEST_STATE/sw2-frontend/app"; fi mode=''; [[ "$scenario" != build-only ]] || mode='--build-only' result=0 bash "$SW_DEPLOY_BASE/frontend-releases/new/deploy.sh" new "$mode" > "$TEST_STATE/output" 2>&1 || result=$? case "$scenario" in success) [[ "$result" == 0 && "$(cat "$TEST_STATE/sw2-frontend/id")" == new-container && "$(cat "$TEST_STATE/sw2-frontend-previous/id")" == old-container ]] [[ "$(cat "$SW_DEPLOY_BASE/current-frontend-release")" == new ]] ;; build-only) [[ "$result" == 0 && "$(cat "$TEST_STATE/sw2-frontend/id")" == old-container ]] [[ "$(cat "$SW_DEPLOY_BASE/current-frontend-release")" == old ]] ;; *) [[ "$result" != 0 && "$(cat "$TEST_STATE/sw2-frontend/id")" == old-container && "$(cat "$TEST_STATE/sw2-frontend/running")" == true ]] [[ "$(cat "$SW_DEPLOY_BASE/current-frontend-release")" == old ]] ;; esac [[ "$(cat "$TEST_STATE/sw2-backend/id")" == backend-unchanged ]] ! grep -E '(stop|start|rename|rm|run).*sw2-backend' "$TEST_STATE/calls" [[ "$(find "$TEST_STATE" -maxdepth 1 -name 'sw2-frontend-candidate-*' | wc -l)" == 0 ]] done echo 'all deployment scenarios passed'