81 lines
2.9 KiB
Bash
81 lines
2.9 KiB
Bash
#!/bin/sh
|
|||
|
|
set -eu
|
||
|
|
|
||
|
|
# 使用临时替身验证入口分派、口令文件及引导失败,不启动编译或数据库。
|
||
|
|
repo=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
|
||
|
|
work=$(mktemp -d)
|
||
|
|
trap 'rm -rf "$work"' EXIT HUP INT TERM
|
||
|
|
export TEST_CALLS="$work/calls"
|
||
|
|
export TEST_PASSWORD="$work/received"
|
||
|
|
export CHUSQL_ADMIN_PASSWORD_FILE="$work/password"
|
||
|
|
export CHUSQL_CONFIG="$work/settings.toml"
|
||
|
|
export CHUSQL_ADMIN_USER=operator
|
||
|
|
mkdir "$work/bin"
|
||
|
|
export PATH="$work/bin:$PATH"
|
||
|
|
|
||
|
|
cat >"$work/bin/csql-bootstrap" <<'STUB'
|
||
|
|
#!/bin/sh
|
||
|
|
set -eu
|
||
|
|
printf 'bootstrap %s\n' "$*" >> "$TEST_CALLS"
|
||
|
|
cat > "$TEST_PASSWORD"
|
||
|
|
exit "${TEST_BOOTSTRAP_EXIT:-0}"
|
||
|
|
STUB
|
||
|
|
cat >"$work/bin/chusql-server" <<'STUB'
|
||
|
|
#!/bin/sh
|
||
|
|
printf 'server %s\n' "$*" >> "$TEST_CALLS"
|
||
|
|
STUB
|
||
|
|
cat >"$work/bin/chusql-web" <<'STUB'
|
||
|
|
#!/bin/sh
|
||
|
|
printf 'web %s\n' "$*" >> "$TEST_CALLS"
|
||
|
|
STUB
|
||
|
|
chmod +x "$work/bin/"*
|
||
|
|
|
||
|
|
# 缺失或空白口令应在启动程序前拒绝。
|
||
|
|
for password_kind in missing empty blank; do
|
||
|
|
rm -f "$CHUSQL_ADMIN_PASSWORD_FILE" "$TEST_CALLS"
|
||
|
|
case "$password_kind" in
|
||
|
|
empty) : >"$CHUSQL_ADMIN_PASSWORD_FILE" ;;
|
||
|
|
blank) printf ' \r\n' >"$CHUSQL_ADMIN_PASSWORD_FILE" ;;
|
||
|
|
esac
|
||
|
|
if sh "$repo/docker/entrypoint.sh" server >"$work/output" 2>&1; then
|
||
|
|
echo "Unexpected success for $password_kind password" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
test ! -e "$TEST_CALLS"
|
||
|
|
done
|
||
|
|
|
||
|
|
# 保留空格与反斜杠,引导后按原样传参。
|
||
|
|
printf 'test password\\value' >"$CHUSQL_ADMIN_PASSWORD_FILE"
|
||
|
|
sh "$repo/docker/entrypoint.sh" server --max-rows 42
|
||
|
|
printf 'test password\\value\n' >"$work/expected"
|
||
|
|
cmp "$work/expected" "$TEST_PASSWORD"
|
||
|
|
grep -Fq "bootstrap --config $CHUSQL_CONFIG --user operator --password-stdin" "$TEST_CALLS"
|
||
|
|
grep -Fq "server --config $CHUSQL_CONFIG --user operator --max-rows 42" "$TEST_CALLS"
|
||
|
|
test "$(wc -l <"$TEST_CALLS")" -eq 2
|
||
|
|
|
||
|
|
# 引导失败必须阻止启动,Web 不读取口令。
|
||
|
|
rm "$TEST_CALLS"
|
||
|
|
if TEST_BOOTSTRAP_EXIT=7 sh "$repo/docker/entrypoint.sh" server; then exit 1; fi
|
||
|
|
test "$(wc -l <"$TEST_CALLS")" -eq 1
|
||
|
|
rm "$CHUSQL_ADMIN_PASSWORD_FILE" "$TEST_CALLS"
|
||
|
|
sh "$repo/docker/entrypoint.sh" web
|
||
|
|
grep -Fq "web --config $CHUSQL_CONFIG --user operator" "$TEST_CALLS"
|
||
|
|
test "$(sh "$repo/docker/entrypoint.sh" printf passthrough)" = passthrough
|
||
|
|
# 健康检查必须识别协议状态和 HTTP 失败。
|
||
|
|
cat >"$work/bin/nc" <<'STUB'
|
||
|
|
#!/bin/sh
|
||
|
|
cat > /dev/null
|
||
|
|
printf '%s\n' "$TEST_TCP_RESPONSE"
|
||
|
|
exit "${TEST_NC_EXIT:-0}"
|
||
|
|
STUB
|
||
|
|
cat >"$work/bin/curl" <<'STUB'
|
||
|
|
#!/bin/sh
|
||
|
|
exit "${TEST_CURL_EXIT:-0}"
|
||
|
|
STUB
|
||
|
|
chmod +x "$work/bin/nc" "$work/bin/curl"
|
||
|
|
TEST_TCP_RESPONSE='{"status":"pong"}' sh "$repo/docker/healthcheck.sh" server
|
||
|
|
if TEST_TCP_RESPONSE='{"status":"error"}' sh "$repo/docker/healthcheck.sh" server; then exit 1; fi
|
||
|
|
if TEST_TCP_RESPONSE='{"status":"pong"}' TEST_NC_EXIT=1 sh "$repo/docker/healthcheck.sh" server; then exit 1; fi
|
||
|
|
sh "$repo/docker/healthcheck.sh" web
|
||
|
|
if TEST_CURL_EXIT=22 sh "$repo/docker/healthcheck.sh" web; then exit 1; fi
|
||
|
|
echo "entrypoint and healthcheck checks passed"
|