• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2
3TESTS="$@"
4RET=0
5TIMEOUT=60
6DMESG_FILTER="cat"
7TEST_DIR=$(dirname $0)
8FAILED=""
9SKIPPED=""
10MAYBE_FAILED=""
11TEST_FILES=""
12declare -A TEST_MAP
13
14# Only use /dev/kmsg if running as root
15DO_KMSG="1"
16[ "$(id -u)" != "0" ] && DO_KMSG="0"
17
18# Include config.local if exists and check TEST_FILES for valid devices
19if [ -f "$TEST_DIR/config.local" ]; then
20	. $TEST_DIR/config.local
21	for dev in $TEST_FILES; do
22		if [ ! -e "$dev" ]; then
23			echo "Test file $dev not valid"
24			exit 1
25		fi
26	done
27	for dev in ${TEST_MAP[@]}; do
28		if [ ! -e "$dev" ]; then
29			echo "Test file in map $dev not valid"
30			exit 1
31		fi
32	done
33fi
34
35_check_dmesg()
36{
37	local dmesg_marker="$1"
38	local seqres="$2.seqres"
39
40	if [ $DO_KMSG -eq 0 ]; then
41		return 0
42	fi
43
44	dmesg | bash -c "$DMESG_FILTER" | grep -A 9999 "$dmesg_marker" >"${seqres}.dmesg"
45	grep -q -e "kernel BUG at" \
46	     -e "WARNING:" \
47	     -e "BUG:" \
48	     -e "Oops:" \
49	     -e "possible recursive locking detected" \
50	     -e "Internal error" \
51	     -e "INFO: suspicious RCU usage" \
52	     -e "INFO: possible circular locking dependency detected" \
53	     -e "general protection fault:" \
54	     -e "blktests failure" \
55	     "${seqres}.dmesg"
56	# shellcheck disable=SC2181
57	if [[ $? -eq 0 ]]; then
58		return 1
59	else
60		rm -f "${seqres}.dmesg"
61		return 0
62	fi
63}
64
65run_test()
66{
67	local test_name="$1"
68	local dev="$2"
69	local test_string=$test_name
70
71	# Specify test string to print
72	if [ -n "$dev" ]; then
73		test_string="$test_name $dev"
74	fi
75
76	# Log start of the test
77	if [ "$DO_KMSG" -eq 1 ]; then
78		local dmesg_marker="Running test $test_string:"
79		echo $dmesg_marker | tee /dev/kmsg
80	else
81		local dmesg_marker=""
82		echo Running test $test_name $dev
83	fi
84
85	# Do we have to exclude the test ?
86	echo $TEST_EXCLUDE | grep -w "$test_name" > /dev/null 2>&1
87	if [ $? -eq 0 ]; then
88		echo "Test skipped"
89		SKIPPED="$SKIPPED <$test_string>"
90		return
91	fi
92
93	# Run the test
94	timeout -s INT -k $TIMEOUT $TIMEOUT ./$test_name $dev
95	local status=$?
96
97	# Check test status
98	if [ "$status" -eq 124 ]; then
99		echo "Test $test_name timed out (may not be a failure)"
100	elif [ "$status" -ne 0 ]; then
101		echo "Test $test_name failed with ret $status"
102		FAILED="$FAILED <$test_string>"
103		RET=1
104	elif ! _check_dmesg "$dmesg_marker" "$test_name"; then
105		echo "Test $test_name failed dmesg check"
106		FAILED="$FAILED <$test_string>"
107		RET=1
108	elif [ -n "$dev" ]; then
109		sleep .1
110		ps aux | grep "\[io_wq_manager\]" > /dev/null
111		if [ $? -eq 0 ]; then
112			MAYBE_FAILED="$MAYBE_FAILED $test_string"
113		fi
114	fi
115}
116
117# Run all specified tests
118for tst in $TESTS; do
119	if [ ! -n "${TEST_MAP[$tst]}" ]; then
120		run_test $tst
121		if [ ! -z "$TEST_FILES" ]; then
122			for dev in $TEST_FILES; do
123				run_test $tst $dev
124			done
125		fi
126	else
127		run_test $tst ${TEST_MAP[$tst]}
128	fi
129done
130
131if [ -n "$SKIPPED" ]; then
132	echo "Tests skipped: $SKIPPED"
133fi
134
135if [ "${RET}" -ne 0 ]; then
136	echo "Tests failed: $FAILED"
137	exit $RET
138else
139	sleep 1
140	ps aux | grep "\[io_wq_manager\]" > /dev/null
141	if [ $? -ne 0 ]; then
142		MAYBE_FAILED=""
143	fi
144	if [ ! -z "$MAYBE_FAILED" ]; then
145		echo "Tests _maybe_ failed: $MAYBE_FAILED"
146	fi
147	echo "All tests passed"
148	exit 0
149fi
150