170 lines
5.9 KiB
Bash
170 lines
5.9 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# test.sh - Run pgx tests against specific database targets
|
|
#
|
|
# Usage:
|
|
# ./test.sh [target] [go test flags...]
|
|
#
|
|
# Targets:
|
|
# pg14 - PostgreSQL 14 (port 5414)
|
|
# pg15 - PostgreSQL 15 (port 5415)
|
|
# pg16 - PostgreSQL 16 (port 5416)
|
|
# pg17 - PostgreSQL 17 (port 5417)
|
|
# pg18 - PostgreSQL 18 (port 5432) [default]
|
|
# crdb - CockroachDB (port 26257)
|
|
# all - Run against all targets sequentially
|
|
#
|
|
# Examples:
|
|
# ./test.sh # Test against PG18
|
|
# ./test.sh pg14 # Test against PG14
|
|
# ./test.sh crdb # Test against CockroachDB
|
|
# ./test.sh all # Test against all targets
|
|
# ./test.sh pg16 -run TestConnect # Test specific test against PG16
|
|
# ./test.sh pg18 -count=1 -v # Verbose, no cache, PG18
|
|
|
|
# Color output (disabled if not a terminal)
|
|
if [ -t 1 ]; then
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
else
|
|
GREEN=''
|
|
RED=''
|
|
BLUE=''
|
|
NC=''
|
|
fi
|
|
|
|
log_info() { echo -e "${BLUE}==> $*${NC}"; }
|
|
log_ok() { echo -e "${GREEN}==> $*${NC}"; }
|
|
log_err() { echo -e "${RED}==> $*${NC}" >&2; }
|
|
|
|
# Wait for a database to accept connections
|
|
wait_for_ready() {
|
|
local connstr="$1"
|
|
local label="$2"
|
|
local max_attempts=30
|
|
local attempt=0
|
|
|
|
log_info "Waiting for $label to be ready..."
|
|
while ! psql "$connstr" -c "SELECT 1" > /dev/null 2>&1; do
|
|
attempt=$((attempt + 1))
|
|
if [ "$attempt" -ge "$max_attempts" ]; then
|
|
log_err "$label did not become ready after $max_attempts attempts"
|
|
return 1
|
|
fi
|
|
sleep 1
|
|
done
|
|
log_ok "$label is ready"
|
|
}
|
|
|
|
# Directory containing this script (used to locate testsetup/)
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CERTS_DIR="$SCRIPT_DIR/testsetup/certs"
|
|
|
|
# Copy client certificates to /tmp for TLS tests
|
|
setup_client_certs() {
|
|
if [ -d "$CERTS_DIR" ]; then
|
|
base64 -d "$CERTS_DIR/ca.pem.b64" > /tmp/ca.pem
|
|
base64 -d "$CERTS_DIR/pgx_sslcert.crt.b64" > /tmp/pgx_sslcert.crt
|
|
base64 -d "$CERTS_DIR/pgx_sslcert.key.b64" > /tmp/pgx_sslcert.key
|
|
fi
|
|
}
|
|
|
|
# Initialize CockroachDB (create database if not exists)
|
|
init_crdb() {
|
|
local connstr="postgresql://root@localhost:26257/?sslmode=disable"
|
|
wait_for_ready "$connstr" "CockroachDB"
|
|
log_info "Ensuring pgx_test database exists on CockroachDB..."
|
|
psql "$connstr" -c "CREATE DATABASE IF NOT EXISTS pgx_test" 2>/dev/null || true
|
|
}
|
|
|
|
# Run tests against a single target
|
|
run_tests() {
|
|
local target="$1"
|
|
shift
|
|
local extra_args=("$@")
|
|
|
|
local label=""
|
|
local port=""
|
|
|
|
case "$target" in
|
|
pg14) label="PostgreSQL 14"; port=5414 ;;
|
|
pg15) label="PostgreSQL 15"; port=5415 ;;
|
|
pg16) label="PostgreSQL 16"; port=5416 ;;
|
|
pg17) label="PostgreSQL 17"; port=5417 ;;
|
|
pg18) label="PostgreSQL 18"; port=5432 ;;
|
|
crdb)
|
|
label="CockroachDB (port 26257)"
|
|
init_crdb
|
|
log_info "Testing against $label"
|
|
if ! PGX_TEST_DATABASE="postgresql://root@localhost:26257/pgx_test?sslmode=disable&experimental_enable_temp_tables=on" \
|
|
go test -count=1 "${extra_args[@]}" ./...; then
|
|
log_err "Tests FAILED against $label"
|
|
return 1
|
|
fi
|
|
log_ok "Tests passed against $label"
|
|
return 0
|
|
;;
|
|
*)
|
|
log_err "Unknown target: $target"
|
|
log_err "Valid targets: pg14, pg15, pg16, pg17, pg18, crdb, all"
|
|
return 1
|
|
;;
|
|
esac
|
|
|
|
setup_client_certs
|
|
|
|
log_info "Testing against $label (port $port)"
|
|
if ! PGX_TEST_DATABASE="host=localhost port=$port user=postgres password=postgres dbname=pgx_test" \
|
|
PGX_TEST_UNIX_SOCKET_CONN_STRING="host=/var/run/postgresql port=$port user=postgres dbname=pgx_test" \
|
|
PGX_TEST_TCP_CONN_STRING="host=127.0.0.1 port=$port user=pgx_md5 password=secret dbname=pgx_test" \
|
|
PGX_TEST_MD5_PASSWORD_CONN_STRING="host=127.0.0.1 port=$port user=pgx_md5 password=secret dbname=pgx_test" \
|
|
PGX_TEST_SCRAM_PASSWORD_CONN_STRING="host=127.0.0.1 port=$port user=pgx_scram password=secret dbname=pgx_test channel_binding=disable" \
|
|
PGX_TEST_SCRAM_PLUS_CONN_STRING="host=localhost port=$port user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=require" \
|
|
PGX_TEST_PLAIN_PASSWORD_CONN_STRING="host=127.0.0.1 port=$port user=pgx_pw password=secret dbname=pgx_test" \
|
|
PGX_TEST_TLS_CONN_STRING="host=localhost port=$port user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=disable" \
|
|
PGX_TEST_TLS_CLIENT_CONN_STRING="host=localhost port=$port user=pgx_sslcert sslmode=verify-full sslrootcert=/tmp/ca.pem sslcert=/tmp/pgx_sslcert.crt sslkey=/tmp/pgx_sslcert.key dbname=pgx_test" \
|
|
PGX_SSL_PASSWORD=certpw \
|
|
go test -count=1 "${extra_args[@]}" ./...; then
|
|
log_err "Tests FAILED against $label"
|
|
return 1
|
|
fi
|
|
log_ok "Tests passed against $label"
|
|
}
|
|
|
|
# Main
|
|
main() {
|
|
local target="${1:-pg18}"
|
|
|
|
if [ "$target" = "all" ]; then
|
|
shift || true
|
|
local targets=(pg14 pg15 pg16 pg17 pg18 crdb)
|
|
local failed=()
|
|
|
|
for t in "${targets[@]}"; do
|
|
echo ""
|
|
log_info "=========================================="
|
|
log_info "Target: $t"
|
|
log_info "=========================================="
|
|
if ! run_tests "$t" "$@"; then
|
|
failed+=("$t")
|
|
log_err "FAILED: $t"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
if [ ${#failed[@]} -gt 0 ]; then
|
|
log_err "Failed targets: ${failed[*]}"
|
|
return 1
|
|
else
|
|
log_ok "All targets passed"
|
|
fi
|
|
else
|
|
shift || true
|
|
run_tests "$target" "$@"
|
|
fi
|
|
}
|
|
|
|
main "$@"
|