66# ./test.sh base # 运行基础测试
77# ./test.sh exercise # 运行练习测试
88# ./test.sh all # 运行全部测试(base + exercise)
9+ #
10+ # 可选环境变量:
11+ # TIMEOUT_SEC 设为正整数(秒)时:仅对 cargo run 限时,输出写入临时文件并 tee 到终端,
12+ # 结束或超时后由 tg-rcore-tutorial-checker 检查该文件。未设置则行为与原先一致(管道直连 checker)。
913
1014set -e
1115
@@ -14,7 +18,6 @@ RED='\033[0;31m'
1418YELLOW=' \033[0;33m'
1519NC=' \033[0m'
1620
17- # 检查并安装 tg-rcore-tutorial-checker
1821ensure_tg_checker () {
1922 if ! command -v tg-rcore-tutorial-checker & > /dev/null; then
2023 echo -e " ${YELLOW} tg-rcore-tutorial-checker 未安装,正在安装...${NC} "
@@ -29,17 +32,56 @@ ensure_tg_checker() {
2932
3033ensure_tg_checker
3134
32- # 使用 pipefail 确保管道中任意命令失败都能被捕获
3335set -o pipefail
3436
37+ # 超时路径:调用前设置 CARGO_EXTRA(数组,可为空);参数传给 checker(如 --exercise)。
38+ _tg_timed_cargo_check () {
39+ local log re ce
40+ log=$( mktemp) || return 1
41+ trap ' rm -f "$log"' EXIT
42+ set +e
43+ echo -e " ${YELLOW} cargo run 超时: ${TIMEOUT_SEC} s(TIMEOUT_SEC)${NC} "
44+ timeout -k 10 --foreground " ${TIMEOUT_SEC} " cargo run " ${CARGO_EXTRA[@]} " 2>&1 | tee " $log " | tee /dev/stderr
45+ re=${PIPESTATUS[0]}
46+ set -e
47+ [[ $re -eq 124 ]] && echo -e " ${RED} ✗ cargo run 已超时,仅统计超时前输出。${NC} " >&2
48+ set +e
49+ tg-rcore-tutorial-checker --ch 8 " $@ " < " $log "
50+ ce=$?
51+ set -e
52+ trap - EXIT
53+ rm -f " $log "
54+ [[ $re -eq 0 && $ce -eq 0 ]]
55+ }
56+
57+ _run_base () {
58+ local passed
59+ if [[ -n " ${TIMEOUT_SEC:- } " ]] && [[ " ${TIMEOUT_SEC} " =~ ^[0-9]+$ ]] && [[ " ${TIMEOUT_SEC} " -gt 0 ]]; then
60+ CARGO_EXTRA=()
61+ if _tg_timed_cargo_check; then passed=1; else passed=0; fi
62+ else
63+ if cargo run 2>&1 | tee /dev/stderr | tg-rcore-tutorial-checker --ch 8; then passed=1; else passed=0; fi
64+ fi
65+ [[ $passed -eq 1 ]]
66+ }
67+
68+ _run_exercise () {
69+ local passed
70+ if [[ -n " ${TIMEOUT_SEC:- } " ]] && [[ " ${TIMEOUT_SEC} " =~ ^[0-9]+$ ]] && [[ " ${TIMEOUT_SEC} " -gt 0 ]]; then
71+ CARGO_EXTRA=(--features exercise)
72+ if _tg_timed_cargo_check --exercise; then passed=1; else passed=0; fi
73+ else
74+ if cargo run --features exercise 2>&1 | tee /dev/stderr | tg-rcore-tutorial-checker --ch 8 --exercise; then passed=1; else passed=0; fi
75+ fi
76+ [[ $passed -eq 1 ]]
77+ }
78+
3579run_base () {
3680 echo " 运行 ch8 基础测试..."
3781 cargo clean
3882 export CHAPTER=-8
3983 echo -e " ${YELLOW} ────────── cargo run 输出 ──────────${NC} "
40-
41- # 使用 tee 将 cargo run 的输出同时显示在终端和传递给 tg-rcore-tutorial-checker
42- if cargo run 2>&1 | tee /dev/stderr | tg-rcore-tutorial-checker --ch 8; then
84+ if _run_base; then
4385 echo " "
4486 echo -e " ${YELLOW} ────────── 测试结果 ──────────${NC} "
4587 echo -e " ${GREEN} ✓ ch8 基础测试通过${NC} "
@@ -59,9 +101,7 @@ run_exercise() {
59101 cargo clean
60102 export CHAPTER=8
61103 echo -e " ${YELLOW} ────────── cargo run --features exercise 输出 ──────────${NC} "
62-
63- # 使用 tee 将 cargo run 的输出同时显示在终端和传递给 tg-rcore-tutorial-checker
64- if cargo run --features exercise 2>&1 | tee /dev/stderr | tg-rcore-tutorial-checker --ch 8 --exercise; then
104+ if _run_exercise; then
65105 echo " "
66106 echo -e " ${YELLOW} ────────── 测试结果 ──────────${NC} "
67107 echo -e " ${GREEN} ✓ ch8 练习测试通过${NC} "
0 commit comments