#!/bin/sh
# script/docker-smoke: build the Docker image, start it, and wait up to
# 30 seconds for its HEALTHCHECK to report healthy. Needs a Docker
# daemon, so it is not part of script/check; the Gitea workflow runs it
# after script/cibuild.
set -eu

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
ROOT="$(cd "$SCRIPT_DIR/.." && pwd -P)"

main() {
    cd "$ROOT"
    "$SCRIPT_DIR/docker"

    # A fresh random key: the container publishes no port and is
    # removed on exit.
    key="$(head -c 32 /dev/urandom | base64)"

    # --health-interval=1s overrides the image's 30s interval so the
    # first probe does not use up the whole wait.
    cid="$(docker create --health-interval=1s \
        -e PIXA_SIGNING_KEY="$key" "$("$SCRIPT_DIR/projectname")")"
    # Remove the container on any exit; turning signals into exit makes
    # an interrupted run clean up too.
    trap 'docker rm -f "$cid" >/dev/null' EXIT
    trap 'exit 1' HUP INT TERM
    docker start "$cid" >/dev/null

    deadline=$(($(date +%s) + 30))
    while [ "$(date +%s)" -lt "$deadline" ]; do
        health="$(docker inspect --format '{{.State.Health.Status}}' "$cid")"
        if [ "$health" = healthy ]; then
            echo "docker-smoke: container is healthy"
            return 0
        fi
        sleep 1
    done

    echo "docker-smoke: container not healthy after 30 seconds; its log:" >&2
    docker logs "$cid" >&2
    return 1
}

main "$@"
