#!/usr/bin/env bash # deploy.sh 中重启计划相关逻辑的单元测试 # # 用法: bash vps-xray/tests/test-restart-schedule.sh # # 不需要 root,不接触真实 systemd:所有写入路径都被重定向到临时目录, # systemctl 用 PATH 打桩拦截。 # # 加载方式说明:deploy.sh 结尾会直接调用 main,且顶层有 root 检查与参数解析, # 不能整份 source。这里只抽取「多行函数定义」(形如 `name() {` 开头、`}` 结尾)。 # 单行函数(log/warn/error/step)抽不到,正好由下面的桩覆盖。 set -u TEST_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DEPLOY="${TEST_DIR}/../deploy.sh" if [ ! -f "$DEPLOY" ]; then echo "找不到 $DEPLOY" >&2 exit 1 fi eval "$(sed -n '/^[a-z_][a-z_]*() {$/,/^}$/p' "$DEPLOY")" # 日志桩:error 保留输出便于断言,其余静音 log() { :; } warn() { :; } step() { :; } error() { echo "ERROR: $*" >&2; } PASS=0 FAIL=0 ok() { PASS=$((PASS + 1)); echo " ok - $1"; } bad() { FAIL=$((FAIL + 1)); echo " FAIL - $1"; echo " 期望: $2"; echo " 实际: $3"; } # is <描述> <实际值> <期望值> is() { if [ "$2" = "$3" ]; then ok "$1"; else bad "$1" "$3" "$2"; fi; } echo "== normalize_restart_time ==" is "04:00 原样通过" "$(normalize_restart_time 04:00)" "04:00" is "4:00 补零" "$(normalize_restart_time 4:00)" "04:00" is "08:30 不被当八进制" "$(normalize_restart_time 08:30)" "08:30" is "23:59 边界" "$(normalize_restart_time 23:59)" "23:59" is "00:00 边界" "$(normalize_restart_time 00:00)" "00:00" normalize_restart_time "24:00" >/dev/null 2>&1 is "24:00 被拒" "$?" "1" normalize_restart_time "04:60" >/dev/null 2>&1 is "04:60 被拒" "$?" "1" normalize_restart_time "abc" >/dev/null 2>&1 is "abc 被拒" "$?" "1" normalize_restart_time "" >/dev/null 2>&1 is "空串被拒" "$?" "1" echo "== resolve_restart_config ==" reset_env() { unset XRAY_RESTART_EVERY_DAYS XRAY_RESTART_TIME XRAY_RESTART_TIMEZONE XRAY_DAILY_RESTART RESTART_EVERY_DAYS=""; RESTART_TIME=""; RESTART_TZ="" } reset_env resolve_restart_config is "全空时天数默认 0" "$RESTART_EVERY_DAYS" "0" is "全空时时间默认" "$RESTART_TIME" "04:00" is "全空时时区默认" "$RESTART_TZ" "Asia/Shanghai" reset_env; XRAY_RESTART_EVERY_DAYS=7; XRAY_RESTART_TIME=5:30 resolve_restart_config is "读取新字段天数" "$RESTART_EVERY_DAYS" "7" is "读取新字段时间并补零" "$RESTART_TIME" "05:30" reset_env; XRAY_DAILY_RESTART=true resolve_restart_config is "迁移 true → 1" "$RESTART_EVERY_DAYS" "1" reset_env; XRAY_DAILY_RESTART=TRUE resolve_restart_config is "迁移 TRUE → 1" "$RESTART_EVERY_DAYS" "1" reset_env; XRAY_DAILY_RESTART=false resolve_restart_config is "迁移 false → 0" "$RESTART_EVERY_DAYS" "0" reset_env; XRAY_DAILY_RESTART=true; XRAY_RESTART_EVERY_DAYS=3 resolve_restart_config is "新字段优先于旧字段" "$RESTART_EVERY_DAYS" "3" reset_env; XRAY_DAILY_RESTART=true; XRAY_RESTART_EVERY_DAYS=0 resolve_restart_config is "新字段显式 0 覆盖旧 true" "$RESTART_EVERY_DAYS" "0" reset_env; XRAY_RESTART_EVERY_DAYS=abc resolve_restart_config 2>/dev/null is "天数非数字报错" "$?" "1" reset_env; XRAY_RESTART_EVERY_DAYS=-1 resolve_restart_config 2>/dev/null is "天数负数报错" "$?" "1" reset_env; XRAY_RESTART_TIME=25:00 resolve_restart_config 2>/dev/null is "时间非法报错" "$?" "1" reset_env; XRAY_RESTART_TIMEZONE="" resolve_restart_config 2>/dev/null is "时区空串报错" "$?" "1" echo "== update_env_field ==" TMP="$(mktemp -d)" trap 'rm -rf "$TMP"' EXIT cat > "${TMP}/.env" << 'ENVEOF' # 这是用户自己加的注释 XRAY_PORT=443 XRAY_RESTART_EVERY_DAYS=0 # 尾部注释 ENVEOF update_env_field "${TMP}/.env" XRAY_RESTART_EVERY_DAYS 7 is "替换已有字段" "$(grep '^XRAY_RESTART_EVERY_DAYS=' "${TMP}/.env")" "XRAY_RESTART_EVERY_DAYS=7" is "保留用户注释" "$(grep -c '这是用户自己加的注释' "${TMP}/.env")" "1" is "保留尾部注释" "$(grep -c '尾部注释' "${TMP}/.env")" "1" is "不影响其它字段" "$(grep '^XRAY_PORT=' "${TMP}/.env")" "XRAY_PORT=443" update_env_field "${TMP}/.env" XRAY_RESTART_TIME 05:30 is "追加缺失字段" "$(grep '^XRAY_RESTART_TIME=' "${TMP}/.env")" "XRAY_RESTART_TIME=05:30" update_env_field "${TMP}/.env" XRAY_RESTART_TIMEZONE Asia/Shanghai is "含斜杠的值不被 sed 分隔符干扰" \ "$(grep '^XRAY_RESTART_TIMEZONE=' "${TMP}/.env")" "XRAY_RESTART_TIMEZONE=Asia/Shanghai" update_env_field "${TMP}/.env" XRAY_RESTART_TIMEZONE Europe/Berlin is "含斜杠的值可被再次替换" \ "$(grep '^XRAY_RESTART_TIMEZONE=' "${TMP}/.env")" "XRAY_RESTART_TIMEZONE=Europe/Berlin" is "字段总行数正确" "$(grep -c '^XRAY_RESTART_TIMEZONE=' "${TMP}/.env")" "1" update_env_field "${TMP}/nonexistent" FOO bar 2>/dev/null is "文件不存在返回 1" "$?" "1" echo "" echo "通过 ${PASS},失败 ${FAIL}" [ "$FAIL" -eq 0 ]