#!/bin/bash set -e # 1. Start Floci echo "=== Starting Floci with docker-compose ===" docker compose up -d --build # Wait for healthy echo "Waiting for Floci to be healthy..." # Portable wait without 'timeout' command MAX_RETRIES=60 COUNT=0 until curl -sf http://localhost:4566/_floci/health >/dev/null 2>&1; do if [ $COUNT -ge $MAX_RETRIES ]; then echo "Floci failed to become healthy in time" exit 1 fi sleep 1 COUNT=$((COUNT + 1)) echo -n "." done echo " Floci is up!" # 2. Network setup (Floci uses floci_default from compose) NETWORK="floci_default" DOCKER_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || stat -f '%g' /var/run/docker.sock) # Floci's embedded DNS server resolves *.floci → Floci's IP. # Passing --dns to test containers lets the S3 virtual-host client # send to .floci:4566 which Floci DNS resolves correctly. Without this, # Docker's built-in DNS only resolves the exact service name "floci", not # wildcard subdomains like my-bucket.floci. FLOCI_CONTAINER=$(docker compose ps -q floci 2>/dev/null | head -1) FLOCI_IP=$(docker inspect -f "{{.NetworkSettings.Networks.${NETWORK}.IPAddress}}" "$FLOCI_CONTAINER" 2>/dev/null || true) # 3. Test suites SUITES=( "sdk-test-python" "sdk-test-node" "sdk-test-java" "sdk-test-go" "sdk-test-awscli" "compat-cdk" "compat-terraform" "compat-opentofu" ) # results dir mkdir -p test-results FAILED=0 for suite in "${SUITES[@]}"; do echo "=== Running $suite in Docker ===" IMAGE_NAME="compat-$suite" # Build if ! docker build -q -t "$IMAGE_NAME" "compatibility-tests/$suite"; then echo "Test suite $suite failed to build" FAILED=1 continue fi # Build DNS args: if we resolved Floci's IP, inject it as the DNS server so # wildcard subdomains like .floci resolve inside test containers. DNS_ARGS=() if [ -n "$FLOCI_IP" ]; then DNS_ARGS=(--dns "$FLOCI_IP") fi # Per-suite extra args, mirroring .github/workflows/compatibility.yml. # sdk-test-java's Lambda hot-reload test needs a host directory that the Docker # daemon can bind-mount into the hot-reload Lambda container. EXTRA_ARGS=() if [ "$suite" = "sdk-test-java" ]; then mkdir -p /tmp/floci-hot-reload EXTRA_ARGS=(-v /tmp/floci-hot-reload:/tmp/floci-hot-reload -e HOT_RELOAD_BASE_DIR=/tmp/floci-hot-reload) fi # Run if ! docker run --rm --network "$NETWORK" \ "${DNS_ARGS[@]}" \ -e FLOCI_ENDPOINT=http://floci:4566 \ -e FLOCI_S3_VHOST_ENDPOINT=http://floci:4566 \ -v "$(pwd)/test-results:/results" \ -v /var/run/docker.sock:/var/run/docker.sock \ --group-add "$DOCKER_GID" \ "${EXTRA_ARGS[@]}" \ "$IMAGE_NAME"; then echo "Test suite $suite failed" FAILED=1 fi done echo "=== All Docker tests completed ===" exit "$FAILED"