xref: /aosp_15_r20/external/liburing/test/runtests.sh (revision 25da2bea747f3a93b4c30fd9708b0618ef55a0e6)
1*25da2beaSAndroid Build Coastguard Worker#!/usr/bin/env bash
2*25da2beaSAndroid Build Coastguard Worker
3*25da2beaSAndroid Build Coastguard WorkerTESTS=("$@")
4*25da2beaSAndroid Build Coastguard WorkerRET=0
5*25da2beaSAndroid Build Coastguard WorkerTIMEOUT=60
6*25da2beaSAndroid Build Coastguard WorkerDMESG_FILTER="cat"
7*25da2beaSAndroid Build Coastguard WorkerTEST_DIR=$(dirname "$0")
8*25da2beaSAndroid Build Coastguard WorkerFAILED=""
9*25da2beaSAndroid Build Coastguard WorkerSKIPPED=""
10*25da2beaSAndroid Build Coastguard WorkerTIMED_OUT=""
11*25da2beaSAndroid Build Coastguard WorkerTEST_FILES=""
12*25da2beaSAndroid Build Coastguard Workerdeclare -A TEST_MAP
13*25da2beaSAndroid Build Coastguard Worker
14*25da2beaSAndroid Build Coastguard Worker# Only use /dev/kmsg if running as root
15*25da2beaSAndroid Build Coastguard WorkerDO_KMSG="1"
16*25da2beaSAndroid Build Coastguard Worker[ "$(id -u)" != "0" ] && DO_KMSG="0"
17*25da2beaSAndroid Build Coastguard Worker
18*25da2beaSAndroid Build Coastguard Worker# Include config.local if exists and check TEST_FILES for valid devices
19*25da2beaSAndroid Build Coastguard Workerif [ -f "$TEST_DIR/config.local" ]; then
20*25da2beaSAndroid Build Coastguard Worker	# shellcheck source=/dev/null disable=SC1091
21*25da2beaSAndroid Build Coastguard Worker	. "$TEST_DIR/config.local"
22*25da2beaSAndroid Build Coastguard Worker	for dev in $TEST_FILES; do
23*25da2beaSAndroid Build Coastguard Worker		if [ ! -e "$dev" ]; then
24*25da2beaSAndroid Build Coastguard Worker			echo "Test file $dev not valid"
25*25da2beaSAndroid Build Coastguard Worker			exit 1
26*25da2beaSAndroid Build Coastguard Worker		fi
27*25da2beaSAndroid Build Coastguard Worker	done
28*25da2beaSAndroid Build Coastguard Worker	for dev in "${TEST_MAP[@]}"; do
29*25da2beaSAndroid Build Coastguard Worker		if [ ! -e "$dev" ]; then
30*25da2beaSAndroid Build Coastguard Worker			echo "Test file in map $dev not valid"
31*25da2beaSAndroid Build Coastguard Worker			exit 1
32*25da2beaSAndroid Build Coastguard Worker		fi
33*25da2beaSAndroid Build Coastguard Worker	done
34*25da2beaSAndroid Build Coastguard Workerfi
35*25da2beaSAndroid Build Coastguard Worker
36*25da2beaSAndroid Build Coastguard Worker_check_dmesg()
37*25da2beaSAndroid Build Coastguard Worker{
38*25da2beaSAndroid Build Coastguard Worker	local dmesg_marker="$1"
39*25da2beaSAndroid Build Coastguard Worker	local seqres="$2.seqres"
40*25da2beaSAndroid Build Coastguard Worker
41*25da2beaSAndroid Build Coastguard Worker	if [ "$DO_KMSG" -eq 0 ]; then
42*25da2beaSAndroid Build Coastguard Worker		return 0
43*25da2beaSAndroid Build Coastguard Worker	fi
44*25da2beaSAndroid Build Coastguard Worker
45*25da2beaSAndroid Build Coastguard Worker	dmesg | bash -c "$DMESG_FILTER" | grep -A 9999 "$dmesg_marker" >"${seqres}.dmesg"
46*25da2beaSAndroid Build Coastguard Worker	grep -q -e "kernel BUG at" \
47*25da2beaSAndroid Build Coastguard Worker	     -e "WARNING:" \
48*25da2beaSAndroid Build Coastguard Worker	     -e "BUG:" \
49*25da2beaSAndroid Build Coastguard Worker	     -e "Oops:" \
50*25da2beaSAndroid Build Coastguard Worker	     -e "possible recursive locking detected" \
51*25da2beaSAndroid Build Coastguard Worker	     -e "Internal error" \
52*25da2beaSAndroid Build Coastguard Worker	     -e "INFO: suspicious RCU usage" \
53*25da2beaSAndroid Build Coastguard Worker	     -e "INFO: possible circular locking dependency detected" \
54*25da2beaSAndroid Build Coastguard Worker	     -e "general protection fault:" \
55*25da2beaSAndroid Build Coastguard Worker	     -e "blktests failure" \
56*25da2beaSAndroid Build Coastguard Worker	     "${seqres}.dmesg"
57*25da2beaSAndroid Build Coastguard Worker	# shellcheck disable=SC2181
58*25da2beaSAndroid Build Coastguard Worker	if [[ $? -eq 0 ]]; then
59*25da2beaSAndroid Build Coastguard Worker		return 1
60*25da2beaSAndroid Build Coastguard Worker	else
61*25da2beaSAndroid Build Coastguard Worker		rm -f "${seqres}.dmesg"
62*25da2beaSAndroid Build Coastguard Worker		return 0
63*25da2beaSAndroid Build Coastguard Worker	fi
64*25da2beaSAndroid Build Coastguard Worker}
65*25da2beaSAndroid Build Coastguard Worker
66*25da2beaSAndroid Build Coastguard Workerrun_test()
67*25da2beaSAndroid Build Coastguard Worker{
68*25da2beaSAndroid Build Coastguard Worker	local test_name="$1"
69*25da2beaSAndroid Build Coastguard Worker	local dev="$2"
70*25da2beaSAndroid Build Coastguard Worker	local test_exec=("./$test_name")
71*25da2beaSAndroid Build Coastguard Worker	local test_string="$test_name"
72*25da2beaSAndroid Build Coastguard Worker	local out_name="$test_name"
73*25da2beaSAndroid Build Coastguard Worker
74*25da2beaSAndroid Build Coastguard Worker	# Specify test string to print
75*25da2beaSAndroid Build Coastguard Worker	if [ -n "$dev" ]; then
76*25da2beaSAndroid Build Coastguard Worker		test_exec+=("$dev")
77*25da2beaSAndroid Build Coastguard Worker		test_string="$test_name $dev"
78*25da2beaSAndroid Build Coastguard Worker		local suffix
79*25da2beaSAndroid Build Coastguard Worker		suffix=$(basename "$dev")
80*25da2beaSAndroid Build Coastguard Worker		out_name="$out_name.$suffix"
81*25da2beaSAndroid Build Coastguard Worker	fi
82*25da2beaSAndroid Build Coastguard Worker
83*25da2beaSAndroid Build Coastguard Worker	# Log start of the test
84*25da2beaSAndroid Build Coastguard Worker	if [ "$DO_KMSG" -eq 1 ]; then
85*25da2beaSAndroid Build Coastguard Worker		local dmesg_marker="Running test $test_string:"
86*25da2beaSAndroid Build Coastguard Worker		echo "$dmesg_marker" > /dev/kmsg
87*25da2beaSAndroid Build Coastguard Worker	else
88*25da2beaSAndroid Build Coastguard Worker		local dmesg_marker=""
89*25da2beaSAndroid Build Coastguard Worker	fi
90*25da2beaSAndroid Build Coastguard Worker	printf "Running test %-55s" "$test_string"
91*25da2beaSAndroid Build Coastguard Worker
92*25da2beaSAndroid Build Coastguard Worker	# Do we have to exclude the test ?
93*25da2beaSAndroid Build Coastguard Worker	echo "$TEST_EXCLUDE" | grep -w "$test_name" > /dev/null 2>&1
94*25da2beaSAndroid Build Coastguard Worker	# shellcheck disable=SC2181
95*25da2beaSAndroid Build Coastguard Worker	if [ $? -eq 0 ]; then
96*25da2beaSAndroid Build Coastguard Worker		echo "Test skipped"
97*25da2beaSAndroid Build Coastguard Worker		SKIPPED="$SKIPPED <$test_string>"
98*25da2beaSAndroid Build Coastguard Worker		return
99*25da2beaSAndroid Build Coastguard Worker	fi
100*25da2beaSAndroid Build Coastguard Worker
101*25da2beaSAndroid Build Coastguard Worker	# Run the test
102*25da2beaSAndroid Build Coastguard Worker	T_START=$(date +%s)
103*25da2beaSAndroid Build Coastguard Worker	timeout -s INT -k $TIMEOUT $TIMEOUT "${test_exec[@]}"
104*25da2beaSAndroid Build Coastguard Worker	local status=$?
105*25da2beaSAndroid Build Coastguard Worker	T_END=$(date +%s)
106*25da2beaSAndroid Build Coastguard Worker
107*25da2beaSAndroid Build Coastguard Worker	if [ -e ./core ]; then
108*25da2beaSAndroid Build Coastguard Worker		mv core "core-$test_name"
109*25da2beaSAndroid Build Coastguard Worker	fi
110*25da2beaSAndroid Build Coastguard Worker
111*25da2beaSAndroid Build Coastguard Worker	# Check test status
112*25da2beaSAndroid Build Coastguard Worker	if [ "$status" -eq 124 ]; then
113*25da2beaSAndroid Build Coastguard Worker		echo "Test $test_name timed out (may not be a failure)"
114*25da2beaSAndroid Build Coastguard Worker		TIMED_OUT="$TIMED_OUT <$test_string>"
115*25da2beaSAndroid Build Coastguard Worker	elif [ "$status" -ne 0 ]; then
116*25da2beaSAndroid Build Coastguard Worker		echo "Test $test_name failed with ret $status"
117*25da2beaSAndroid Build Coastguard Worker		FAILED="$FAILED <$test_string>"
118*25da2beaSAndroid Build Coastguard Worker		RET=1
119*25da2beaSAndroid Build Coastguard Worker	elif ! _check_dmesg "$dmesg_marker" "$test_name"; then
120*25da2beaSAndroid Build Coastguard Worker		echo "Test $test_name failed dmesg check"
121*25da2beaSAndroid Build Coastguard Worker		FAILED="$FAILED <$test_string>"
122*25da2beaSAndroid Build Coastguard Worker		RET=1
123*25da2beaSAndroid Build Coastguard Worker	else
124*25da2beaSAndroid Build Coastguard Worker		if [ -f "output/$out_name" ]; then
125*25da2beaSAndroid Build Coastguard Worker			T_PREV=$(cat "output/$out_name")
126*25da2beaSAndroid Build Coastguard Worker		else
127*25da2beaSAndroid Build Coastguard Worker			T_PREV=""
128*25da2beaSAndroid Build Coastguard Worker		fi
129*25da2beaSAndroid Build Coastguard Worker		T_DIFF=$((T_END-T_START))
130*25da2beaSAndroid Build Coastguard Worker		if [ -n "$T_PREV" ]; then
131*25da2beaSAndroid Build Coastguard Worker			echo "$T_DIFF sec [$T_PREV]"
132*25da2beaSAndroid Build Coastguard Worker		else
133*25da2beaSAndroid Build Coastguard Worker			echo "$T_DIFF sec"
134*25da2beaSAndroid Build Coastguard Worker		fi
135*25da2beaSAndroid Build Coastguard Worker		echo $T_DIFF > "output/$out_name"
136*25da2beaSAndroid Build Coastguard Worker	fi
137*25da2beaSAndroid Build Coastguard Worker}
138*25da2beaSAndroid Build Coastguard Worker
139*25da2beaSAndroid Build Coastguard Worker# Run all specified tests
140*25da2beaSAndroid Build Coastguard Workerfor tst in "${TESTS[@]}"; do
141*25da2beaSAndroid Build Coastguard Worker	if [ ! -d output ]; then
142*25da2beaSAndroid Build Coastguard Worker		mkdir -p output
143*25da2beaSAndroid Build Coastguard Worker	fi
144*25da2beaSAndroid Build Coastguard Worker	if [ -z "${TEST_MAP[$tst]}" ]; then
145*25da2beaSAndroid Build Coastguard Worker		run_test "$tst"
146*25da2beaSAndroid Build Coastguard Worker		if [ -n "$TEST_FILES" ]; then
147*25da2beaSAndroid Build Coastguard Worker			for dev in $TEST_FILES; do
148*25da2beaSAndroid Build Coastguard Worker				run_test "$tst" "$dev"
149*25da2beaSAndroid Build Coastguard Worker			done
150*25da2beaSAndroid Build Coastguard Worker		fi
151*25da2beaSAndroid Build Coastguard Worker	else
152*25da2beaSAndroid Build Coastguard Worker		run_test "$tst" "${TEST_MAP[$tst]}"
153*25da2beaSAndroid Build Coastguard Worker	fi
154*25da2beaSAndroid Build Coastguard Workerdone
155*25da2beaSAndroid Build Coastguard Worker
156*25da2beaSAndroid Build Coastguard Workerif [ -n "$SKIPPED" ]; then
157*25da2beaSAndroid Build Coastguard Worker	echo "Tests skipped: $SKIPPED"
158*25da2beaSAndroid Build Coastguard Workerfi
159*25da2beaSAndroid Build Coastguard Worker
160*25da2beaSAndroid Build Coastguard Workerif [ -n "$TIMED_OUT" ]; then
161*25da2beaSAndroid Build Coastguard Worker	echo "Tests timed out: $TIMED_OUT"
162*25da2beaSAndroid Build Coastguard Workerfi
163*25da2beaSAndroid Build Coastguard Worker
164*25da2beaSAndroid Build Coastguard Workerif [ "${RET}" -ne 0 ]; then
165*25da2beaSAndroid Build Coastguard Worker	echo "Tests failed: $FAILED"
166*25da2beaSAndroid Build Coastguard Worker	exit $RET
167*25da2beaSAndroid Build Coastguard Workerelse
168*25da2beaSAndroid Build Coastguard Worker	echo "All tests passed"
169*25da2beaSAndroid Build Coastguard Worker	exit 0
170*25da2beaSAndroid Build Coastguard Workerfi
171