#!/usr/bin/env bash
# Copyright IBM Corp. 2020, 2026
# SPDX-License-Identifier: BUSL-1.1


# TERM isn't set automatically in CI so we need to make sure it's always there.
export TERM=${TERM:=dumb}

function die {
    echo $*
    exit -1
}

# error out early if missing a command
which boundary || die "missing boundary"
which jq       || die "missing jq"
which bats     || die "missing bats"
which nc       || die "missing nc"

echo "starting boundary dev in background"
boundary dev --create-loopback-plugin &>/dev/null &
boundary_pid=$!

function cleanup {
    rv=$?
    echo "stopping boundary dev"
    if [[ -n ${boundary_pid} ]]; then
        kill ${boundary_pid}
    fi
    exit $rv
}

trap cleanup EXIT

max=120
c=0
until boundary scopes list; do
    echo 'waiting for boundary to be up'
    ((c+=1))
    if [[ $c -ge $max ]]; then
        die "timeout waiting for boundary controller to get healthy"
    fi
    sleep 1
done

c=0
until curl -s http://localhost:9203/health\?worker_info\=1 | jq -e '.worker_process_info.upstream_connection_state == "READY"' > /dev/null; do
    echo 'waiting for boundary worker to be up'
    ((c+=1))
    if [[ $c -ge $max ]]; then
        die "timeout waiting for boundary worker to get healthy"
    fi
    sleep 1
done

# Wait a little longer to ensure the worker is fully ready before we start
# running tests. Without this, there were some flaky tests, specifically when
# trying to connect to a target in the alias tests (those are the first to run).
# The worker health check alone was not sufficient during testing, and it was
# not clear what else could be checked to ensure the worker was fully ready.
sleep 10

echo "running bats tests"
bats -p ./boundary
