summaryrefslogtreecommitdiffstats
path: root/ctdb/tests/scripts/unit.sh
blob: afa0c1f538d5cc785824a4ef73f06961d377ff73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# Hey Emacs, this is a -*- shell-script -*- !!!  :-)

. "${TEST_SCRIPTS_DIR}/common.sh"

# Common variables and functions for CTDB unit tests.

trap -- '' PIPE

# Set the required result for a test.
# - Argument 1 is exit code.
# - Argument 2, if present is the required test output but "--"
#   indicates empty output.
# If argument 2 is not present or null then read required test output
# from stdin.
required_result ()
{
    required_rc="${1:-0}"
    if [ -n "$2" ] ; then
	if [ "$2" = "--" ] ; then
	    required_output=""
	else
	    required_output="$2"
	fi
    else
	if ! tty -s ; then
	    required_output=$(cat)
	else
	    required_output=""
	fi
    fi
}

ok ()
{
    required_result 0 "$@"
}

ok_null ()
{
    ok --
}

result_print ()
{
    _passed="$1"
    _out="$2"
    _rc="$3"
    _extra_header="$4"

    if "$TEST_VERBOSE" || ! $_passed ; then
	if [ -n "$_extra_header" ] ; then
	    cat <<EOF

##################################################
$_extra_header
EOF
	fi

cat <<EOF
--------------------------------------------------
Output (Exit status: ${_rc}):
--------------------------------------------------
EOF
	echo "$_out" | cat $TEST_CAT_RESULTS_OPTS
    fi

    if ! $_passed ; then
	cat <<EOF
--------------------------------------------------
Required output (Exit status: ${required_rc}):
--------------------------------------------------
EOF
	echo "$required_output" | cat $TEST_CAT_RESULTS_OPTS

	if $TEST_DIFF_RESULTS ; then
	    _outr=$(mktemp)
	    echo "$required_output" >"$_outr"

	    _outf=$(mktemp)
	    echo "$_fout" >"$_outf"

	    cat <<EOF
--------------------------------------------------
Diff:
--------------------------------------------------
EOF
	    diff -u "$_outr" "$_outf" | cat -A
	    rm "$_outr" "$_outf"
	fi
    fi
}

result_footer ()
{
    _passed="$1"
    _extra_footer="$2"

    if "$TEST_VERBOSE" || ! $_passed ; then
	if [ -n "$_extra_footer" ] ; then
	    cat <<EOF
--------------------------------------------------
$_extra_footer
--------------------------------------------------
EOF
	fi
    fi

    if $_passed ; then
	echo "PASSED"
	return 0
    else
	echo
	echo "FAILED"
	return 1
    fi
}

# Result filtering is (usually) used to replace the date/time/PID
# prefix on some CTDB tool/client log messages with the literal string
# "DATE TIME [PID]".  This allows tests to loosely match this output,
# since it can't otherwise be matched.
result_filter_default ()
{
    _date_time_pid='[0-9/][0-9/]*\ [0-9:\.][0-9:\.]*\ \[[\ 0-9][\ 0-9]*\]'
    sed -e "s@^${_date_time_pid}:@DATE\ TIME\ \[PID\]:@"
}

# Override this function to customise output filtering.
result_filter ()
{
    result_filter_default
}

result_check ()
{
    _rc=$?

    _extra_header="$1"

    _fout=$(echo "$_out" | result_filter)

    if [ "$_fout" = "$required_output" -a $_rc = $required_rc ] ; then
	_passed=true
    else
	_passed=false
    fi

    result_print "$_passed" "$_out" "$_rc" "$_extra_header"
    result_footer "$_passed"
}

local="${TEST_SUBDIR}/scripts/local.sh"
if [ -r "$local" ] ; then
    . "$local"
fi