Skip to content

Commit 92b9b10

Browse files
committed
[feat] add test tool
1 parent b92f302 commit 92b9b10

File tree

5 files changed

+468
-0
lines changed

5 files changed

+468
-0
lines changed

run_all_tests.sh

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
#!/bin/bash
2+
# 完整測試套件 - 運行所有測試
3+
4+
echo "🚀 開始 Andromeda 完整測試套件..."
5+
echo "======================================"
6+
7+
# 檢查必要工具
8+
echo "🔧 檢查測試工具..."
9+
MISSING_TOOLS=""
10+
11+
if ! command -v valgrind &> /dev/null; then
12+
MISSING_TOOLS="$MISSING_TOOLS valgrind"
13+
fi
14+
15+
if ! command -v nc &> /dev/null && ! command -v netcat &> /dev/null; then
16+
MISSING_TOOLS="$MISSING_TOOLS netcat"
17+
fi
18+
19+
if ! command -v protoc &> /dev/null; then
20+
MISSING_TOOLS="$MISSING_TOOLS protobuf-compiler"
21+
fi
22+
23+
if [ -n "$MISSING_TOOLS" ]; then
24+
echo "⚠️ 缺少測試工具: $MISSING_TOOLS"
25+
echo "請安裝: sudo apt-get install$MISSING_TOOLS"
26+
echo "繼續進行可用的測試..."
27+
fi
28+
29+
# 設置測試環境
30+
TEST_RESULTS=""
31+
TOTAL_TESTS=0
32+
PASSED_TESTS=0
33+
34+
# 記錄測試結果的函數
35+
record_test() {
36+
TOTAL_TESTS=$((TOTAL_TESTS + 1))
37+
if [ $1 -eq 0 ]; then
38+
PASSED_TESTS=$((PASSED_TESTS + 1))
39+
TEST_RESULTS="$TEST_RESULTS\n✅ $2"
40+
echo "$2 - 通過"
41+
else
42+
TEST_RESULTS="$TEST_RESULTS\n❌ $2"
43+
echo "$2 - 失敗"
44+
fi
45+
}
46+
47+
echo ""
48+
echo "======================================"
49+
echo "🔨 1. 編譯測試"
50+
echo "======================================"
51+
bash test_build.sh
52+
record_test $? "編譯測試"
53+
54+
echo ""
55+
echo "======================================"
56+
echo "⚙️ 2. 功能測試"
57+
echo "======================================"
58+
bash test_functions.sh
59+
record_test $? "功能測試"
60+
61+
echo ""
62+
echo "======================================"
63+
echo "🔤 3. 字符串安全測試"
64+
echo "======================================"
65+
bash test_strings.sh
66+
record_test $? "字符串安全測試"
67+
68+
echo ""
69+
if command -v valgrind &> /dev/null then
70+
echo "======================================"
71+
echo "🛡️ 4. 內存安全測試"
72+
echo "======================================"
73+
bash test_memory.sh
74+
record_test $? "內存安全測試"
75+
else
76+
echo "⏭️ 跳過內存安全測試 (valgrind 未安裝)"
77+
fi
78+
79+
# 額外的快速檢查
80+
echo ""
81+
echo "======================================"
82+
echo "🔍 5. 快速健康檢查"
83+
echo "======================================"
84+
85+
# 檢查編譯輸出
86+
if [ -f "build/andromeda" ]; then
87+
echo "✅ 可執行文件存在"
88+
89+
# 檢查文件大小 (應該大於 100KB)
90+
FILE_SIZE=$(stat -c%s "build/andromeda" 2>/dev/null || stat -f%z "build/andromeda" 2>/dev/null)
91+
if [ $FILE_SIZE -gt 100000 ]; then
92+
echo "✅ 可執行文件大小正常 ($FILE_SIZE 字節)"
93+
record_test 0 "可執行文件檢查"
94+
else
95+
echo "⚠️ 可執行文件大小異常 ($FILE_SIZE 字節)"
96+
record_test 1 "可執行文件檢查"
97+
fi
98+
else
99+
echo "❌ 可執行文件不存在"
100+
record_test 1 "可執行文件檢查"
101+
fi
102+
103+
# 檢查關鍵源文件是否存在修復
104+
echo "🔍 檢查安全修復..."
105+
SECURITY_CHECKS=0
106+
SECURITY_PASSED=0
107+
108+
# 檢查是否使用了安全的字符串函數
109+
if grep -q "strnlen" app/andro_log.cxx app/andro_conf.cxx app/andro_setproctitle.cxx; then
110+
echo "✅ 安全字符串函數 (strnlen) 已使用"
111+
SECURITY_PASSED=$((SECURITY_PASSED + 1))
112+
else
113+
echo "❌ 未發現安全字符串函數使用"
114+
fi
115+
SECURITY_CHECKS=$((SECURITY_CHECKS + 1))
116+
117+
# 檢查是否使用了 nanosleep 替代 usleep
118+
if grep -q "nanosleep" misc/andro_threadpool.cxx net/andro_socket_time.cxx net/andro_socket_conn.cxx; then
119+
echo "✅ 現代系統調用 (nanosleep) 已使用"
120+
SECURITY_PASSED=$((SECURITY_PASSED + 1))
121+
else
122+
echo "❌ 未發現現代系統調用使用"
123+
fi
124+
SECURITY_CHECKS=$((SECURITY_CHECKS + 1))
125+
126+
# 檢查 umask 設置
127+
if grep -q "umask(077)" proc/andro_daemon.cxx; then
128+
echo "✅ 安全文件權限 (umask 077) 已設置"
129+
SECURITY_PASSED=$((SECURITY_PASSED + 1))
130+
else
131+
echo "❌ 未發現安全文件權限設置"
132+
fi
133+
SECURITY_CHECKS=$((SECURITY_CHECKS + 1))
134+
135+
if [ $SECURITY_PASSED -eq $SECURITY_CHECKS ]; then
136+
record_test 0 "安全修復檢查"
137+
else
138+
record_test 1 "安全修復檢查"
139+
fi
140+
141+
# 生成測試報告
142+
echo ""
143+
echo "======================================"
144+
echo "📊 測試報告"
145+
echo "======================================"
146+
echo -e "$TEST_RESULTS"
147+
echo ""
148+
echo "總測試數: $TOTAL_TESTS"
149+
echo "通過測試: $PASSED_TESTS"
150+
echo "失敗測試: $((TOTAL_TESTS - PASSED_TESTS))"
151+
echo "成功率: $(( PASSED_TESTS * 100 / TOTAL_TESTS ))%"
152+
153+
if [ $PASSED_TESTS -eq $TOTAL_TESTS ]; then
154+
echo ""
155+
echo "🎉 所有測試通過!您的修復工作正確!"
156+
exit 0
157+
else
158+
echo ""
159+
echo "⚠️ 部分測試失敗,請檢查上述輸出以了解詳情"
160+
exit 1
161+
fi

test_build.sh

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/bin/bash
2+
# 測試腳本:驗證所有修復是否正確
3+
4+
echo "🔧 開始測試 Andromeda 修復功能..."
5+
6+
# 1. 清理之前的構建
7+
echo "📁 清理構建目錄..."
8+
rm -rf build cmake-build-debug
9+
mkdir build
10+
cd build
11+
12+
# 2. 生成 Protocol Buffer 文件
13+
echo "🔄 生成 Protocol Buffer 文件..."
14+
cd ..
15+
protoc -I=./proto --cpp_out=./generated ./proto/*.proto
16+
if [ $? -ne 0 ]; then
17+
echo "❌ Protocol Buffer 生成失敗"
18+
exit 1
19+
fi
20+
echo "✅ Protocol Buffer 文件生成成功"
21+
22+
# 3. CMake 配置
23+
echo "⚙️ 配置 CMake..."
24+
cd build
25+
cmake ..
26+
if [ $? -ne 0 ]; then
27+
echo "❌ CMake 配置失敗"
28+
exit 1
29+
fi
30+
echo "✅ CMake 配置成功"
31+
32+
# 4. 編譯項目
33+
echo "🔨 編譯項目..."
34+
make -j$(nproc)
35+
if [ $? -ne 0 ]; then
36+
echo "❌ 編譯失敗"
37+
exit 1
38+
fi
39+
echo "✅ 編譯成功"
40+
41+
# 5. 檢查可執行文件
42+
if [ -f "./andromeda" ]; then
43+
echo "✅ 可執行文件 andromeda 生成成功"
44+
ls -la ./andromeda
45+
else
46+
echo "❌ 可執行文件未生成"
47+
exit 1
48+
fi
49+
50+
echo "🎉 所有編譯測試通過!"

test_functions.sh

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#!/bin/bash
2+
# 功能測試腳本
3+
4+
echo "⚙️ 開始功能測試..."
5+
6+
cd build
7+
8+
# 1. 測試配置文件加載
9+
echo "📝 測試配置文件加載..."
10+
if [ -f "../andromeda.conf" ]; then
11+
echo "✅ 配置文件存在"
12+
13+
# 檢查配置文件內容
14+
if grep -q "Port0" ../andromeda.conf; then
15+
echo "✅ 配置文件格式正確"
16+
else
17+
echo "❌ 配置文件格式異常"
18+
fi
19+
else
20+
echo "❌ 配置文件不存在"
21+
fi
22+
23+
# 2. 測試進程標題設置功能
24+
echo "🏷️ 測試進程標題設置..."
25+
./andromeda &
26+
SERVER_PID=$!
27+
sleep 2
28+
29+
# 檢查進程標題
30+
PROCESS_TITLE=$(ps -p $SERVER_PID -o comm= 2>/dev/null)
31+
if [ -n "$PROCESS_TITLE" ]; then
32+
echo "✅ 进程标题设置成功: $PROCESS_TITLE"
33+
else
34+
echo "⚠️ 無法獲取進程標題"
35+
fi
36+
37+
# 3. 測試網路連接
38+
echo "🌐 測試網路連接..."
39+
sleep 2
40+
41+
# 檢查端口是否開放
42+
if netstat -tuln | grep -q ":9000.*LISTEN"; then
43+
echo "✅ 服務器在端口 9000 監聽"
44+
45+
# 測試基本連接
46+
if timeout 3s bash -c "echo > /dev/tcp/localhost/9000" 2>/dev/null; then
47+
echo "✅ TCP 連接測試成功"
48+
else
49+
echo "⚠️ TCP 連接測試失敗"
50+
fi
51+
else
52+
echo "❌ 服務器未在端口 9000 監聽"
53+
fi
54+
55+
# 4. 測試日誌功能
56+
echo "📋 測試日誌功能..."
57+
if [ -f "logs/error.log" ]; then
58+
echo "✅ 日誌文件已創建"
59+
60+
# 檢查日誌內容
61+
if grep -q "listen() successful" logs/error.log; then
62+
echo "✅ 日誌內容正常"
63+
else
64+
echo "⚠️ 日誌內容可能異常"
65+
fi
66+
67+
echo "📄 最新日誌內容:"
68+
tail -5 logs/error.log
69+
else
70+
echo "⚠️ 日誌文件未創建"
71+
fi
72+
73+
# 5. 測試守護進程模式
74+
echo "👻 測試守護進程模式..."
75+
kill -TERM $SERVER_PID 2>/dev/null
76+
wait $SERVER_PID 2>/dev/null || true
77+
78+
# 修改配置以啟用守護進程模式
79+
cp ../andromeda.conf ../andromeda.conf.bak
80+
sed -i 's/Daemon = 0/Daemon = 1/g' ../andromeda.conf 2>/dev/null || \
81+
sed -i '' 's/Daemon = 0/Daemon = 1/g' ../andromeda.conf 2>/dev/null || true
82+
83+
./andromeda
84+
sleep 3
85+
86+
if pgrep -f andromeda > /dev/null; then
87+
echo "✅ 守護進程模式工作正常"
88+
pkill -f andromeda
89+
else
90+
echo "⚠️ 守護進程模式可能有問題"
91+
fi
92+
93+
# 恢復配置
94+
cp ../andromeda.conf.bak ../andromeda.conf
95+
96+
echo "🎉 功能測試完成"

test_memory.sh

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/bin/bash
2+
# 內存安全測試腳本
3+
4+
echo "🛡️ 開始內存安全測試..."
5+
6+
# 1. 使用 Valgrind 檢查內存安全
7+
echo "🔍 運行 Valgrind 內存檢查..."
8+
cd build
9+
10+
# 創建測試用的日誌目錄
11+
mkdir -p logs
12+
13+
# 運行 Valgrind 檢查(限時30秒)
14+
timeout 30s valgrind \
15+
--tool=memcheck \
16+
--leak-check=full \
17+
--show-leak-kinds=all \
18+
--track-origins=yes \
19+
--verbose \
20+
--log-file=valgrind_test.log \
21+
./andromeda &
22+
23+
VALGRIND_PID=$!
24+
sleep 5
25+
26+
# 發送一些測試數據
27+
echo "📡 發送測試數據..."
28+
echo "test" | timeout 2s nc localhost 9000 2>/dev/null || true
29+
echo "longer test string for boundary testing" | timeout 2s nc localhost 9000 2>/dev/null || true
30+
31+
# 等待一會兒讓服務器處理
32+
sleep 3
33+
34+
# 停止服務器
35+
kill -TERM $VALGRIND_PID 2>/dev/null || true
36+
wait $VALGRIND_PID 2>/dev/null || true
37+
38+
# 檢查 Valgrind 結果
39+
echo "📊 分析 Valgrind 結果..."
40+
if [ -f "valgrind_test.log" ]; then
41+
echo "=== Valgrind 報告摘要 ==="
42+
43+
# 檢查內存洩漏
44+
LEAKS=$(grep -c "definitely lost:" valgrind_test.log)
45+
ERRORS=$(grep -c "ERROR SUMMARY:" valgrind_test.log)
46+
47+
if grep -q "definitely lost: 0 bytes in 0 blocks" valgrind_test.log; then
48+
echo "✅ 無內存洩漏"
49+
else
50+
echo "⚠️ 發現潛在內存洩漏:"
51+
grep "definitely lost:" valgrind_test.log
52+
fi
53+
54+
if grep -q "ERROR SUMMARY: 0 errors" valgrind_test.log; then
55+
echo "✅ 無內存錯誤"
56+
else
57+
echo "⚠️ 發現內存錯誤:"
58+
grep "ERROR SUMMARY:" valgrind_test.log
59+
fi
60+
61+
echo "📄 完整報告位於: build/valgrind_test.log"
62+
else
63+
echo "❌ Valgrind 日誌文件未生成"
64+
fi
65+
66+
echo "🎯 內存安全測試完成"

0 commit comments

Comments
 (0)