#!/bin/bash set -euo pipefail SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) MAIN_DIR=$(cd "${SCRIPT_DIR}/.." && pwd) # Variables for cleanup COMPOSE_FILE="${SCRIPT_DIR}/compose.yaml" CLEANUP_NEEDED=false # FUNCTIONS function title() { echo "----------------------------------------" # Center the text local text="$1" local line_length=40 local text_length=${#text} local padding=$(( (line_length - text_length) / 2 )) printf "%*s%s%*s\n" $padding "" "$text" $padding "" echo "----------------------------------------" } function cleanup() { if [ "$CLEANUP_NEEDED" = true ]; then echo "" title "Cleaning up containers" # Stop and remove the test container docker stop sos-test 2>/dev/null || true docker rm -v sos-test 2>/dev/null || true # Use docker compose to clean up if [ -f "${COMPOSE_FILE}" ]; then docker compose -f "${COMPOSE_FILE}" down 2>/dev/null || true docker compose -f "${COMPOSE_FILE}" rm -v -f 2>/dev/null || true fi echo "Cleanup completed" fi } function die() { title "error: $1" cleanup exit 1 } # Set up trap to ensure cleanup on exit trap cleanup EXIT INT TERM function wait_for_container { container_id="$1" container_name="$(docker inspect "${container_id}" --format '{{ .Name }}')" echo "Waiting for container: ${container_name} [${container_id}]" waiting_done="false" while [[ "${waiting_done}" != "true" ]]; do container_state="$(docker inspect "${container_id}" --format '{{ .State.Status }}')" if [[ "${container_state}" == "running" ]]; then health_status="$(docker inspect "${container_id}" --format '{{ .State.Health.Status }}')" echo "${container_name}: container_state=${container_state}, health_status=${health_status}" if [[ ${health_status} == "healthy" ]]; then waiting_done="true" fi else echo "${container_name}: container_state=${container_state}" health_status="${container_state}" waiting_done="true" fi sleep 1; done; [ "${health_status}" == "healthy" ] } title "Building" ${SCRIPT_DIR}/../build.sh #------------------------------------------------------------------------------------------------ # Use static test configuration with known tokens for Docker testing title "Setting up test configuration" # Use the static Docker config with known hashes cp "${SCRIPT_DIR}/sos_config_docker.json" "${SCRIPT_DIR}/sos_config.json" # Export the known plaintext tokens that correspond to the hashes in sos_config_docker.json export TEST_TOKEN1="t570H7DmK2VBfCwUmtFaUXyzVklL90E1" export TEST_TOKEN2="U3x9V39Y7rjXdRK0oxZsCz5lD6jFFDtm" export TEST_TOKEN3="UhtchhGDEGXlJ37GumimFtPe0imjAvak" echo "Using static test configuration with known tokens" #------------------------------------------------------------------------------------------------ # run the docker container title "Running docker container" # Config file is always in SCRIPT_DIR after the copy above LOCALCONFIG="${SCRIPT_DIR}/sos_config.json" [ -f "${LOCALCONFIG}" ] || die "Config file not found: ${LOCALCONFIG}" [ -f "${COMPOSE_FILE}" ] || die "Compose file not found: ${COMPOSE_FILE}" #------------------------------------------------------------------------------------------------ title "Running tests" PREV_DIR=$(pwd) cd "${SCRIPT_DIR}" # Clean up any existing containers before starting docker stop sos-test 2>/dev/null || true docker rm -v sos-test 2>/dev/null || true # Start the container (without config volume mount) docker compose -f "${COMPOSE_FILE}" up -d # Mark that we need cleanup from this point on CLEANUP_NEEDED=true # Copy the config file into the running container echo "Copying config file into container..." docker cp "${LOCALCONFIG}" sos-test:/testing/sos_config.json # wait until healthy. if ! wait_for_container "sos-test"; then echo "----------------------------------------" echo "Container sos-test is not healthy" echo "----------------------------------------" docker logs sos-test die "Container sos-test is not healthy" fi # Verify the config and test files are accessible echo "Verifying test environment..." docker exec sos-test ls -la /testing/ || die "Cannot access /testing directory in container" # Run the tests inside the container echo "Running tests inside container..." docker exec -i \ -e TEST_TOKEN1="${TEST_TOKEN1:-}" \ -e TEST_TOKEN2="${TEST_TOKEN2:-}" \ -e TEST_TOKEN3="${TEST_TOKEN3:-}" \ sos-test /bin/bash -c "cd /testing && ./test.sh http://127.0.0.1:7703" RESULT=$? cd "${PREV_DIR}" # Cleanup will be handled by the trap exit $RESULT