test-fallback.sh 2.12 KB
#!/usr/bin/env bash
# 本地可跑的检查:假 dsh 模拟 GLM 额度用尽 → 应切 DeepSeek;冷却过后应切回 GLM。
set -u
D="$(cd "$(dirname "$0")" && pwd)"; T=$(mktemp -d)
export DSH_FB_STATE="$T/state" DSH_FB_MIN_COOLDOWN=2 DSH_FB_MARGIN=0 HOME="$T"
cat > "$T/fake" <<'F'
#!/usr/bin/env bash
if [[ "$*" == *deepseek* ]]; then echo "answer-from-deepseek"; exit 0; fi
if [ -e "$GLM_DOWN" ]; then echo "dsh: ${GLM_MSG:-QUOTA usage limit}" >&2; exit 1; fi
echo "answer-from-glm"
F
chmod +x "$T/fake"; export GLM_DOWN="$T/down"
. "$D/fallback.sh"; DSH_FB_PATCH="$T/deepseek.yml"
run() { dsh_with_fallback "$T/fake" @PATCH@ task 2>/dev/null; }
[ "$(run)" = answer-from-glm ] || { echo "FAIL 1 平时应走 GLM"; exit 1; }
touch "$GLM_DOWN"
[ "$(run)" = answer-from-deepseek ] || { echo "FAIL 2 额度用尽应切 DeepSeek"; exit 1; }
rm "$GLM_DOWN"
[ "$(run)" = answer-from-deepseek ] || { echo "FAIL 3 冷却期内应继续 DeepSeek"; exit 1; }
sleep 3
[ "$(run)" = answer-from-glm ] || { echo "FAIL 4 冷却后 GLM 恢复应切回"; exit 1; }
# 额度类:冷却取 next_flush_time(3 种格式);取不到=MIN_COOLDOWN;瞬时类 1302=SHORT
export DSH_FB_MIN_COOLDOWN=100 DSH_FB_SHORT=7
chk() {  # chk <名字> <GLM_MSG> <最小秒> <最大秒>
  rm -f "$DSH_FB_STATE"; touch "$GLM_DOWN"; export GLM_MSG="$2"; run >/dev/null
  d=$(( $(cat "$DSH_FB_STATE") - $(date +%s) ))
  [ "$d" -ge "$3" ] && [ "$d" -le "$4" ] || { echo "FAIL $1 期望 $3~$4s,实得 +${d}s"; exit 1; }
}
now=$(date +%s)
chk "秒级时间戳" "1308 {\"next_flush_time\":$((now+4))}" 1 8
chk "毫秒时间戳" "1310 {\"next_flush_time\": $(( (now+4)*1000 ))}" 1 8
chk "日期串(北京时间)" "1308 已达到使用上限 next_flush_time: $(python3 -c 'import time;print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time()+8*3600+4)))')" 1 8
chk "额度类无时间=最短冷却" "1308 已达到 5 小时的使用上限" 95 105
chk "瞬时 1302=短冷却" "1302 您的账户已达到速率限制" 5 9
rm -f "$DSH_FB_STATE"; touch "$GLM_DOWN"; export GLM_MSG="boom"; run >/dev/null; [ ! -e "$DSH_FB_STATE" ] || { echo "FAIL 未知错误不应切换"; exit 1; }
echo PASS