#!/bin/sh
#
# PostgreSQL regression test runner for ptest
#
# This script initializes a temporary PostgreSQL database cluster,
# starts a server instance, and executes the standard regression test
# suite via pg_regress against the installed PostgreSQL binaries.
#

set -e

PGDATA=/tmp/ptest_pgdata
PTEST_PATH=$(dirname "$(readlink -f "$0")")
TESTDIR="${PTEST_PATH}/test"
PGBIN=$(pg_config --bindir)
PKGLIBDIR=$(pg_config --pkglibdir)

cleanup() {
    su - postgres -c "pg_ctl -D ${PGDATA} stop -m immediate" 2>/dev/null || true
    rm -rf "${PGDATA}"
}
trap cleanup EXIT

# Initialize the database cluster
rm -rf "${PGDATA}"
su - postgres -c "${PGBIN}/initdb -D ${PGDATA} --no-locale" || exit 1

# Start the server
su - postgres -c "pg_ctl -D ${PGDATA} -l ${PGDATA}/logfile start -w -t 120" || exit 1

# Ensure the test directory is writable by the postgres user for
# regression output files (regression.out, regression.diffs, results/).
chown -R postgres:postgres "${TESTDIR}"

# Prepare the tablespace test directory
mkdir -p "${TESTDIR}/testtablespace"
chmod 0700 "${TESTDIR}/testtablespace"
chown postgres:postgres "${TESTDIR}/testtablespace"

# Disable set -e before the pipe so we can capture PIPESTATUS
set +e

# Run the regression tests.
# --dlpath points to the standard PostgreSQL package library directory
# where regress.so and contrib modules (autoinc.so, refint.so, etc.)
# are installed, so that CREATE FUNCTION ... AS tests can locate them.
su - postgres -c "cd ${TESTDIR} && \
    ${TESTDIR}/pg_regress \
        --inputdir=. \
        --bindir=${PGBIN} \
        --dlpath=${PKGLIBDIR} \
        --max-concurrent-tests=20 \
        --schedule=parallel_schedule" 2>&1 | \
    stdbuf -oL sed -n \
        -e 's/^ok [0-9]\+\s\+[+* ]\?\s*/PASS: /p' \
        -e 's/^not ok [0-9]\+\s\+[+* ]\?\s*/FAIL: /p'
RESULT=${PIPESTATUS[0]}

if [ "${RESULT}" = "0" ]; then
    echo "PASS: all tests passed"
else
    echo "FAIL: some tests failed"
fi

exit ${RESULT}
