rule-evaluator-regression.sh 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #!/usr/bin/env bash
  2. # S8-REGRESSION-FIXTURE-1 统一回归 driver(dev/test only, aidopdev)。
  3. #
  4. # 顺序运行子脚本,统一汇总 PASS / SKIP / FAIL:
  5. # 1. sched-exec-regression.sh — 调度执行 + antiflap + DetectionLog 主链
  6. # 2. r2-timeout-regression.sh — TIMEOUT 主链(默认复用 demo rule 10)
  7. # 3. r3-shortage-regression.sh — SHORTAGE 主链(当前 dev 无 demo SHORTAGE,SKIP)
  8. # 4. r3-out-of-range-regression.sh — OUT_OF_RANGE 主链(默认复用 demo rule 11)
  9. # 5. r6-detection-log-edge-regression.sh — NO_HIT/EVALUATE_FAILED edge
  10. # 6. recovered-edge-regression.sh — RECOVERED 主链 + recover_count_required 抗抖
  11. # 7. active-exception-id-trigger1-regression.sh — trigger=1 首 tick state.active_exception_id 回填
  12. #
  13. # 退出码:
  14. # - 仅 FAIL>0 时 exit 1;
  15. # - 全 PASS 或 PASS+SKIP 混合(FAIL=0)→ exit 0;
  16. # - 致命错误(mysql/auth)→ exit 2。
  17. set -uo pipefail
  18. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  19. # shellcheck source=./s8-regression-common.sh
  20. source "${SCRIPT_DIR}/s8-regression-common.sh"
  21. TOTAL_PASS=0
  22. TOTAL_FAIL=0
  23. TOTAL_SKIP=0
  24. declare -a CHILD_RESULTS
  25. baseline_before=$(read_baseline)
  26. echo "============================================================"
  27. echo "S8 Regression Driver — baseline_before=${baseline_before}"
  28. echo "============================================================"
  29. run_child() {
  30. local label="$1"
  31. local script="$2"
  32. if [[ ! -x "${script}" ]]; then
  33. echo "[${label}] SKIP — script not executable: ${script}"
  34. TOTAL_SKIP=$((TOTAL_SKIP + 1))
  35. CHILD_RESULTS+=("${label}: SKIP (not executable)")
  36. return 0
  37. fi
  38. echo
  39. echo "===> [${label}] ${script}"
  40. local out
  41. local rc=0
  42. set +e
  43. out=$(bash "${script}" 2>&1)
  44. rc=$?
  45. set -e
  46. echo "${out}"
  47. local p f s
  48. p=$(printf '%s\n' "${out}" | grep -c '^PASS:' || true)
  49. f=$(printf '%s\n' "${out}" | grep -c '^FAIL:' || true)
  50. s=$(printf '%s\n' "${out}" | grep -c '^SKIP:' || true)
  51. TOTAL_PASS=$((TOTAL_PASS + p))
  52. TOTAL_FAIL=$((TOTAL_FAIL + f))
  53. TOTAL_SKIP=$((TOTAL_SKIP + s))
  54. local status
  55. if [[ "${rc}" == "0" && "${f}" == "0" ]]; then
  56. if [[ "${p}" == "0" && "${s}" -gt 0 ]]; then
  57. status="SKIP"
  58. else
  59. status="PASS"
  60. fi
  61. else
  62. status="FAIL"
  63. fi
  64. CHILD_RESULTS+=("${label}: ${status} (pass=${p} fail=${f} skip=${s} rc=${rc})")
  65. echo "[${label}] result: ${status} pass=${p} fail=${f} skip=${s} rc=${rc}"
  66. }
  67. run_child "sched-exec" "${SCRIPT_DIR}/sched-exec-regression.sh"
  68. run_child "r2-timeout" "${SCRIPT_DIR}/r2-timeout-regression.sh"
  69. run_child "r3-shortage" "${SCRIPT_DIR}/r3-shortage-regression.sh"
  70. run_child "r3-oor" "${SCRIPT_DIR}/r3-out-of-range-regression.sh"
  71. run_child "r6-edge" "${SCRIPT_DIR}/r6-detection-log-edge-regression.sh"
  72. run_child "recovered" "${SCRIPT_DIR}/recovered-edge-regression.sh"
  73. run_child "trigger1-active" "${SCRIPT_DIR}/active-exception-id-trigger1-regression.sh"
  74. baseline_after=$(read_baseline)
  75. echo
  76. echo "============================================================"
  77. echo "Driver Summary"
  78. echo "============================================================"
  79. echo "baseline_before=${baseline_before}"
  80. echo "baseline_after=${baseline_after}"
  81. if [[ "${baseline_before}" == "${baseline_after}" ]]; then
  82. echo "baseline: UNCHANGED"
  83. else
  84. echo "baseline: DRIFTED (${baseline_before} -> ${baseline_after})"
  85. TOTAL_FAIL=$((TOTAL_FAIL + 1))
  86. fi
  87. # 验证 demo rule 10/11/12 守恒
  88. demo_state=$(mysql_run "SELECT GROUP_CONCAT(CONCAT(id,':',enabled,':',IFNULL(paused_until,'NULL'),':',trigger_count_required,':',recover_count_required) ORDER BY id) FROM ado_s8_watch_rule WHERE id IN (10,11,12);")
  89. expected="10:1:NULL:1:1,11:1:NULL:1:1,12:1:NULL:1:1"
  90. echo "demo_rule_state(10/11/12)=${demo_state}"
  91. if [[ "${demo_state}" == "${expected}" ]]; then
  92. echo "demo rule 10/11/12: CONSERVED (enabled=1, paused_until=NULL, trigger=1, recover=1)"
  93. else
  94. echo "demo rule 10/11/12: DRIFTED (expected ${expected})"
  95. TOTAL_FAIL=$((TOTAL_FAIL + 1))
  96. fi
  97. # 验证 TEMP_SCHED_TIMEOUT_ANTIFLAP 收尾态
  98. temp_state=$(mysql_run "SELECT IFNULL(GROUP_CONCAT(CONCAT(id,':',enabled)),'absent') FROM ado_s8_watch_rule WHERE rule_code='TEMP_SCHED_TIMEOUT_ANTIFLAP';")
  99. temp_visible=$(mysql_run "SELECT COUNT(*) FROM ado_s8_exception WHERE source_rule_code='TEMP_SCHED_TIMEOUT_ANTIFLAP' AND is_deleted=0;")
  100. echo "temp_rule_state=${temp_state} temp_active_in_default_list=${temp_visible}"
  101. echo
  102. echo "Per-child:"
  103. for r in "${CHILD_RESULTS[@]}"; do
  104. echo " - ${r}"
  105. done
  106. echo
  107. echo "Used fixtures:"
  108. echo " - DEMO_ORDER_DELIVERY_TIMEOUT (rule id=10)"
  109. echo " - DEMO_ORDER_DIMENSION_OOR (rule id=11)"
  110. echo " - TEMP_SCHED_TIMEOUT_ANTIFLAP (TEMP fixture, post-test enabled=0)"
  111. echo " - SHORTAGE / G01_TEST_* (absent → SKIP)"
  112. echo
  113. echo "Totals: passed=${TOTAL_PASS} failed=${TOTAL_FAIL} skipped=${TOTAL_SKIP}"
  114. if (( TOTAL_FAIL > 0 )); then
  115. echo "Driver result: FAIL"
  116. exit 1
  117. fi
  118. echo "Driver result: PASS (FAIL=0)"
  119. exit 0