99 lines
3.3 KiB
Bash
99 lines
3.3 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
|
|
case "${repo_root}" in
|
|
/mnt/*|/media/*)
|
|
echo "FAIL: run this test from a WSL-native copy, not a mounted Windows path." >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
|
|
cd "${repo_root}"
|
|
|
|
for command in mysql mysqladmin node npm openssl; do
|
|
command -v "${command}" >/dev/null || {
|
|
echo "FAIL: required command is missing: ${command}" >&2
|
|
exit 2
|
|
}
|
|
done
|
|
|
|
mysqladmin ping --silent >/dev/null || {
|
|
echo "FAIL: local MySQL is not responding." >&2
|
|
exit 2
|
|
}
|
|
|
|
mysql_version="$(mysql --batch --skip-column-names -e 'SELECT VERSION()')"
|
|
mysql_major="${mysql_version%%.*}"
|
|
if [[ "${mysql_major}" != "8" ]]; then
|
|
echo "FAIL: MySQL 8 is required; actual version is ${mysql_version}." >&2
|
|
exit 2
|
|
fi
|
|
|
|
mysql --batch --skip-column-names -e 'SELECT CURRENT_USER()' >/dev/null
|
|
|
|
run_id="$(date -u +%Y%m%d%H%M%S)_$$_$(openssl rand -hex 3)"
|
|
database="qipai_m01c_test_${run_id}"
|
|
username="qmb_$$_$(openssl rand -hex 4)"
|
|
password="$(openssl rand -hex 24)"
|
|
created=0
|
|
|
|
cleanup() {
|
|
if [[ "${created}" == "1" ]]; then
|
|
mysql --batch --skip-column-names <<SQL >/dev/null
|
|
DROP DATABASE IF EXISTS \`${database}\`;
|
|
DROP USER IF EXISTS '${username}'@'127.0.0.1';
|
|
SQL
|
|
fi
|
|
}
|
|
trap cleanup EXIT INT TERM
|
|
|
|
create_temporary_resources() {
|
|
created=1
|
|
mysql --batch --skip-column-names <<SQL >/dev/null
|
|
CREATE DATABASE \`${database}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
CREATE USER '${username}'@'127.0.0.1' IDENTIFIED BY '${password}';
|
|
GRANT ALL PRIVILEGES ON \`${database}\`.* TO '${username}'@'127.0.0.1';
|
|
SQL
|
|
}
|
|
|
|
if [[ "${1:-}" == "--force-failure" ]]; then
|
|
create_temporary_resources
|
|
exit 23
|
|
fi
|
|
|
|
if [[ "${1:-}" == "--cleanup-probe" ]]; then
|
|
before_database_count="$(mysql --batch --skip-column-names -e "SELECT COUNT(*) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME LIKE 'qipai_m01c_test_%'")"
|
|
before_user_count="$(mysql --batch --skip-column-names -e "SELECT COUNT(*) FROM mysql.user WHERE User LIKE 'qmb_%' AND Host = '127.0.0.1'")"
|
|
set +e
|
|
bash "${BASH_SOURCE[0]}" --force-failure
|
|
probe_status=$?
|
|
set -e
|
|
[[ "${probe_status}" == "23" ]] || {
|
|
echo "FAIL: cleanup probe did not produce the expected interrupted status." >&2
|
|
exit 1
|
|
}
|
|
after_database_count="$(mysql --batch --skip-column-names -e "SELECT COUNT(*) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME LIKE 'qipai_m01c_test_%'")"
|
|
after_user_count="$(mysql --batch --skip-column-names -e "SELECT COUNT(*) FROM mysql.user WHERE User LIKE 'qmb_%' AND Host = '127.0.0.1'")"
|
|
if [[ "${before_database_count}" != "${after_database_count}" || "${before_user_count}" != "${after_user_count}" ]]; then
|
|
echo "FAIL: temporary MySQL resources survived an interrupted test." >&2
|
|
exit 1
|
|
fi
|
|
echo "PASS: interrupted-run cleanup removed the temporary database and account."
|
|
exit 0
|
|
fi
|
|
|
|
create_temporary_resources
|
|
|
|
export NODE_ENV=test
|
|
export QIPAI_MYSQL_HOST=127.0.0.1
|
|
export QIPAI_MYSQL_PORT=3306
|
|
export QIPAI_MYSQL_DATABASE="${database}"
|
|
export QIPAI_MYSQL_USER="${username}"
|
|
export QIPAI_MYSQL_PASSWORD="${password}"
|
|
export QIPAI_MYSQL_CONNECTION_LIMIT=2
|
|
|
|
echo "INFO: MySQL ${mysql_version}; running M01-B through M03-A migration roundtrip in a temporary database."
|
|
npm --prefix backend run test:mysql:migration
|
|
echo "PASS: M01-B through M03-A live MySQL migration roundtrip completed."
|