Skip to content

Commit cf44394

Browse files
committed
ch8: add timeout control in test.sh
1 parent 8736ed4 commit cf44394

3 files changed

Lines changed: 52 additions & 8 deletions

File tree

tg-rcore-tutorial-ch8/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -750,6 +750,8 @@ cargo run --features exercise
750750

751751
```bash
752752
./test.sh exercise
753+
# CI中,可根据需要设置超时时间(单位:秒),例如:
754+
TIMEOUT_SEC=300 ./test.sh exercise
753755
```
754756

755757
> **说明**:本次实验框架变动较大,不要求合并之前的实验内容,只需通过 ch8 的全部测例和其他章节的基础测例即可。

tg-rcore-tutorial-ch8/exercise.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ cargo run --features exercise
9191
- 测试练习测例:
9292
```bash
9393
./test.sh exercise
94+
# 自动测试时,可根据需要设置超时时间(单位:秒),例如:
95+
TIMEOUT_SEC=300 ./test.sh exercise
9496
```
9597

9698
### 说明

tg-rcore-tutorial-ch8/test.sh

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
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

1014
set -e
1115

@@ -14,7 +18,6 @@ RED='\033[0;31m'
1418
YELLOW='\033[0;33m'
1519
NC='\033[0m'
1620

17-
# 检查并安装 tg-rcore-tutorial-checker
1821
ensure_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

3033
ensure_tg_checker
3134

32-
# 使用 pipefail 确保管道中任意命令失败都能被捕获
3335
set -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+
3579
run_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

Comments
 (0)