1
2usage()
3{
4    cat <<__EOF__ >&2
5Generate ATF test cases from a set of DTrace tests.
6
7usage: sh $(basename $0) [-e <excludes>] <category> [<testfiles>]
8
9  excludes:     A shell script which defines test cases that are to be skipped,
10                or aren't expected to pass.
11  category:     The test category, in the form of <arch>/<feature>. For example,
12                "common/aggs" is the test category for D aggregations.
13  testfiles:    The test files for the tests in the specified category.
14__EOF__
15    exit 1
16}
17
18gentestcase()
19{
20    local mod tcase tfile
21
22    tfile=$1
23    tcase=$2
24    mod=$3
25
26    cat <<__EOF__
27atf_test_case $tcase
28${tcase}_head()
29{
30    atf_set 'descr' 'DTrace test ${CATEGORY}/${tfile}'
31}
32${tcase}_body()
33{
34    $mod
35    atf_check -s exit:0 -o empty -e empty \\
36        "\$(atf_get_srcdir)/../../dtest" "\$(atf_get_srcdir)/${tfile}"
37}
38__EOF__
39}
40
41gentestcases()
42{
43    local mod tcase tfile tfiles
44
45    eval tfiles=\$$1
46    mod=$2
47
48    for tfile in ${tfiles}; do
49        case $tfile in
50        drp.*.d|err.*.d|tst.*.d|*.ksh)
51            # Test names need to be mangled for ATF.
52            tcase=$(echo "$tfile" | tr '.-' '_')
53            gentestcase "$tfile" "$tcase" "$mod"
54            TCASES="$TCASES $tcase"
55            ;;
56        esac
57    done
58}
59
60set -e
61
62#
63# Parse arguments.
64#
65case $1 in
66-e)
67    shift; EXCLUDES=$1; shift
68    ;;
69esac
70
71CATEGORY=$1
72shift
73if ! expr "$CATEGORY" : '[^/]*/[^/]*' >/dev/null 2>&1; then
74    usage
75fi
76FEATURE=$(basename ${CATEGORY})
77ARCH=$(dirname ${CATEGORY})
78
79#
80# Remove skipped tests and expected failures from the main test list.
81#
82. $EXCLUDES
83EXFAILS=$(echo -e "$EXFAIL" | grep "^${CATEGORY}/" | xargs basename -a)
84SKIPS=$(echo -e "$SKIP" | grep "^${CATEGORY}/" | xargs basename -a)
85SKIPCIS=$(echo -e "$SKIPCI" | grep "^${CATEGORY}/" | xargs basename -a)
86
87FILELIST=$(mktemp)
88trap 'rm -f $FILELIST' EXIT
89
90echo "$@" | tr ' ' '\n' | xargs basename -a | sort > ${FILELIST}
91TFILES=$(printf '%s\n%s' "$EXFAILS" "$SKIPS" "$SKIPCIS" | sort | comm -13 /dev/stdin $FILELIST)
92
93#
94# Generate test cases.
95#
96gentestcases SKIPS "atf_skip \"test may hang or cause system instability\""
97gentestcases EXFAILS "atf_expect_fail \"test is known to fail\""
98gentestcases SKIPCIS "if [ \"\$(atf_config_get ci false)\" = \"true\" ]; then atf_skip \"see cddl/usr.sbin/dtrace/tests/tools/exclude.sh\"; fi"
99gentestcases TFILES
100
101#
102# Generate the test init function.
103#
104cat <<__EOF__
105atf_init_test_cases()
106{
107$(for tcase in ${TCASES}; do echo "    atf_add_test_case $tcase"; done)
108}
109__EOF__
110
111rm -f $FILELIST
112