rule-evaluator-regression.sh 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/usr/bin/env bash
  2. # R3-RULE-EVALUATOR-CLOSEOUT-1 unified regression driver (dev/test only, aidopdev).
  3. #
  4. # Sequentially runs the three per-type regression scripts and summarizes
  5. # PASS / FAIL. Intended as a single gate before R4 (rule config UI) work, so
  6. # any UI / schema change can be validated against all three evaluator main
  7. # chains at once.
  8. #
  9. # Each child script self-validates DB_NAME=aidopdev and storage-state token,
  10. # so this driver does not duplicate those checks. On first FAIL the driver
  11. # exits non-zero with the failing script name; remaining scripts are skipped.
  12. set -euo pipefail
  13. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  14. PROJECT_DIR="${PROJECT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
  15. DB_HOST="${DB_HOST:-123.60.180.165}"
  16. DB_PORT="${DB_PORT:-3306}"
  17. DB_NAME="${DB_NAME:-aidopdev}"
  18. DB_USER="${DB_USER:-aidopremote}"
  19. DB_PASS="${DB_PASS:-1234567890aiDOP#}"
  20. fail() { echo "FAIL: $*" >&2; exit 1; }
  21. ok() { echo "OK: $*"; }
  22. [[ "${DB_NAME}" == "aidopdev" ]] || fail "DB_NAME must be aidopdev, got ${DB_NAME}"
  23. mysql_query() {
  24. MYSQL_PWD="${DB_PASS}" mysql -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}" "${DB_NAME}" \
  25. --default-character-set=utf8mb4 --connect-timeout=8 -N -B -e "$1" 2>/dev/null
  26. }
  27. baseline=$(mysql_query "SELECT COUNT(*) FROM ado_s8_exception_type WHERE tenant_id=0 AND factory_id=0;")
  28. [[ "${baseline}" == "13" ]] || fail "baseline regression: expected 13, got ${baseline}"
  29. ok "baseline = 13"
  30. run_child() {
  31. local label="$1"
  32. local script="$2"
  33. [[ -x "${script}" ]] || fail "${label}: script not executable: ${script}"
  34. echo "===> ${label}: ${script}"
  35. if bash "${script}"; then
  36. ok "${label} PASS"
  37. else
  38. fail "${label} FAILED (see output above): ${script}"
  39. fi
  40. }
  41. run_child "TIMEOUT" "${SCRIPT_DIR}/r2-timeout-regression.sh"
  42. run_child "SHORTAGE" "${SCRIPT_DIR}/r3-shortage-regression.sh"
  43. run_child "OUT_OF_RANGE" "${SCRIPT_DIR}/r3-out-of-range-regression.sh"
  44. # Post-suite invariants: each evaluator's sample exception remains active and unique.
  45. oor_active=$(mysql_query "SELECT COUNT(*) FROM ado_s8_exception WHERE source_rule_code='G01_TEST_WATCH' AND status<>'CLOSED' AND is_deleted=0;")
  46. to_active=$(mysql_query "SELECT COUNT(*) FROM ado_s8_exception WHERE source_rule_code='G01_TEST_TIMEOUT' AND status<>'CLOSED' AND is_deleted=0;")
  47. sh_active=$(mysql_query "SELECT COUNT(*) FROM ado_s8_exception WHERE source_rule_code='G01_TEST_SHORTAGE' AND status<>'CLOSED' AND is_deleted=0;")
  48. [[ "${oor_active}" == "1" ]] || fail "OUT_OF_RANGE active count expected 1, got ${oor_active}"
  49. [[ "${to_active}" == "1" ]] || fail "TIMEOUT active count expected 1, got ${to_active}"
  50. [[ "${sh_active}" == "1" ]] || fail "SHORTAGE active count expected 1, got ${sh_active}"
  51. ok "post-suite active counts: OUT_OF_RANGE=1 / TIMEOUT=1 / SHORTAGE=1"
  52. ok "rule evaluator regression PASSED"