tests: use -z / -n to test for string empty / non-empty
[babeltrace.git] / tests / plugins / sink.text.pretty / test_enum
CommitLineData
ed30eb8d
GB
1#!/bin/bash
2#
3# SPDX-License-Identifier: GPL-2.0-only
4#
5# Copyright (C) 2020 Geneviève Bastien <gbastien@versatic.net>
6#
7# This file tests pretty printing in details some event classes that are
8# not all covered by the main babeltrace tests with traces.
9SH_TAP=1
10
75e396f6 11if [ -n "${BT_TESTS_SRCDIR:-}" ]; then
ed30eb8d
GB
12 UTILSSH="$BT_TESTS_SRCDIR/utils/utils.sh"
13else
14 UTILSSH="$(dirname "$0")/../../utils/utils.sh"
15fi
16
17# shellcheck source=../../utils/utils.sh
18source "$UTILSSH"
19
20data_dir="$BT_TESTS_DATADIR/plugins/sink.text.pretty"
21temp_stdout_expected_file=$(mktemp -t test_pretty_expected_stdout.XXXXXX)
22temp_stderr_expected="/dev/null"
23
5288c8ae 24plan_tests 31
ed30eb8d
GB
25
26function compare_enum_sorted
27{
28 local expected_file="$1"
29 local actual_file="$2"
30
31 # The order in which enum labels are printed by a `sink.text.pretty`
32 # component directly depends on the order in which mappings were added
33 # to the enum field class in the source component. This order should
34 # not be relied on when testing. Relying on it caused problems with
35 # Python component classes because different versions of Python sort
36 # data structures differently (e.g. dictionaries are insertion sorted
37 # since Python 3.7).
38
ae5c1a44 39 run_python_bt2 "${BT_TESTS_PYTHON_BIN}" "${BT_TESTS_SRCDIR}/utils/python/split_sort_compare.py" \
ed30eb8d
GB
40 "$(cat $expected_file)" "$(cat $actual_file)"
41}
42
43function run_test
44{
45 local test_name=$1
46 local expected_to_fail="$2"
47 local value="$3"
48 local expected_stdout_file="$4"
49 local test_text=
50 local actual_stdout_file
51 local actual_stderr_file
52 local ret=0
53 local local_args=(
54 "--plugin-path" "$data_dir"
55 "-c" "src.test-pretty.TheSourceOfProblems"
56 "-p" "enum-values=\"$enum_values\""
57 "-p" "value=$value"
58 "-p" "enum-signed=$enum_signed"
59 "-c" "sink.text.pretty"
5288c8ae 60 "-p" "print-enum-flags=true"
ed30eb8d
GB
61 )
62
63 actual_stdout_file="$(mktemp -t actual_pretty_stdout.XXXXXX)"
64 actual_stderr_file="$(mktemp -t actual_pretty_stderr.XXXXXX)"
65
66 bt_cli "$actual_stdout_file" "$actual_stderr_file" "${local_args[@]}"
67
68 compare_enum_sorted "$expected_stdout_file" "$actual_stdout_file"
69 ret_stdout=$?
70
71 bt_diff /dev/null "$actual_stderr_file"
72 ret_stderr=$?
73
74 if ((ret_stdout != 0 || ret_stderr != 0)); then
75 ret=1
76 fi
77
78 rm -f "$actual_stdout_file" "$actual_stderr_file"
79
80 if (($expected_to_fail)); then
81 isnt $ret 0 "$test_name signed=$enum_signed with value=$value doesn't match as expected"
82 else
83 ok $ret "$test_name signed=$enum_signed with value=$value matches"
84 fi
85
86}
87
88function test_normal_enum {
89 test_name="Normal enum"
90 enum_signed="$1"
91 enum_values="single,1,1 single2,2,2 single3,4,4 range,4,8 range2,15,20"
92
93 # Hit a single value
94 cat <<- 'END' > "$temp_stdout_expected_file"
95 with_enum: { enum_field = ( "single" : container = 1 ) }
96 END
97 run_test "$test_name" 0 1 "$temp_stdout_expected_file"
98
99 # Hit a single range
100 cat <<- 'END' > "$temp_stdout_expected_file"
101 with_enum: { enum_field = ( "range" : container = 7 ) }
102 END
103 run_test "$test_name" 0 7 "$temp_stdout_expected_file"
104
5288c8ae
GB
105 # Hit a range and a value
106 cat <<- 'END' > "$temp_stdout_expected_file"
107 with_enum: { enum_field = ( { "single3", "range" } : container = 4 ) }
108 END
109 run_test "$test_name" 0 4 "$temp_stdout_expected_file"
110
111 # Hit a range and a value
112 cat <<- 'END' > "$temp_stdout_expected_file"
113 with_enum: { enum_field = ( { "NOT_A_LABEL", "DOESNT_EXIST" } : container = 4 ) }
114 END
115 run_test "$test_name" 1 4 "$temp_stdout_expected_file"
116
ed30eb8d
GB
117 # Unknown
118 cat <<- 'END' > "$temp_stdout_expected_file"
119 with_enum: { enum_field = ( <unknown> : container = 21 ) }
120 END
121 run_test "$test_name" 0 21 "$temp_stdout_expected_file"
122
123 # Unknown but with bits with a value, but range larger than 1 element
124 cat <<- 'END' > "$temp_stdout_expected_file"
125 with_enum: { enum_field = ( <unknown> : container = 12 ) }
126 END
127 run_test "$test_name" 0 12 "$temp_stdout_expected_file"
128
129 # Unknown value of 0
130 cat <<- 'END' > "$temp_stdout_expected_file"
131 with_enum: { enum_field = ( <unknown> : container = 0 ) }
132 END
133 run_test "$test_name" 0 0 "$temp_stdout_expected_file"
134}
135
136function test_normal_enum_negative {
137 test_name="Normal enum with negative value"
138 enum_signed="true"
139 enum_values="zero,0,0 single,1,1 single2,2,2 single3,4,4 range,4,8 negative,-1,-1 rangeNegative,-6,-2"
140
141 # Hit a single negative value
142 cat <<- 'END' > "$temp_stdout_expected_file"
143 with_enum: { enum_field = ( "negative" : container = -1 ) }
144 END
145 run_test "$test_name" 0 -1 "$temp_stdout_expected_file"
146
147 # Hit a single negative range
148 cat <<- 'END' > "$temp_stdout_expected_file"
149 with_enum: { enum_field = ( "rangeNegative" : container = -6 ) }
150 END
151 run_test "$test_name" 0 -6 "$temp_stdout_expected_file"
152
153 # Unknown
154 cat <<- 'END' > "$temp_stdout_expected_file"
155 with_enum: { enum_field = ( <unknown> : container = -7 ) }
156 END
157 run_test "$test_name" 0 -7 "$temp_stdout_expected_file"
158
159 # value of 0
160 cat <<- 'END' > "$temp_stdout_expected_file"
161 with_enum: { enum_field = ( "zero" : container = 0 ) }
162 END
163 run_test "$test_name" 0 0 "$temp_stdout_expected_file"
164}
165
5288c8ae
GB
166function test_bit_flag_enum {
167 test_name="Bit flag enum"
168 enum_signed="false"
169 enum_values="bit0,1,1 bit0bis,1,1 bit1,2,2 bit3,4,4 bit4,8,8 bit5,16,16 bit5,32,32"
170
171 # Single value hit
172 cat <<- 'END' > "$temp_stdout_expected_file"
173 with_enum: { enum_field = ( "bit1" : container = 2 ) }
174 END
175 run_test "$test_name" 0 2 "$temp_stdout_expected_file"
176
177 # Multiple flags set
178 cat <<- 'END' > "$temp_stdout_expected_file"
179 with_enum: { enum_field = ( "bit3" | "bit4" : container = 12 ) }
180 END
181 run_test "$test_name" 0 12 "$temp_stdout_expected_file"
182
183 # Some unknown bit
184 cat <<- 'END' > "$temp_stdout_expected_file"
185 with_enum: { enum_field = ( <unknown> : container = 68 ) }
186 END
187 run_test "$test_name" 0 68 "$temp_stdout_expected_file"
188
189 # Multiple labels for bit 0
190 cat <<- 'END' > "$temp_stdout_expected_file"
191 with_enum: { enum_field = ( { "bit0", "bit0bis" } : container = 1 ) }
192 END
193 run_test "$test_name" 0 1 "$temp_stdout_expected_file"
194
195 # Two labels for bit 0 and one label for bit 1
196 cat <<- 'END' > "$temp_stdout_expected_file"
197 with_enum: { enum_field = ( { "bit0", "bit0bis" } | "bit1" : container = 3 ) }
198 END
199 run_test "$test_name" 0 3 "$temp_stdout_expected_file"
200
201 # Single label for bit 0
202 cat <<- 'END' > "$temp_stdout_expected_file"
203 with_enum: { enum_field = ( "bit5" | "bit5" : container = 48 ) }
204 END
205 run_test "$test_name" 0 48 "$temp_stdout_expected_file"
206
207 # negative value
208 enum_signed="true"
209 cat <<- 'END' > "$temp_stdout_expected_file"
210 with_enum: { enum_field = ( <unknown> : container = -1 ) }
211 END
212 run_test "$test_name" 0 -1 "$temp_stdout_expected_file"
213}
214
215function test_mixed_enum {
216 test_name="Mixed enum bits at beginning"
217 enum_signed="false"
218 enum_values="bit0,1,1 bit1,2,2 bit2,4,4 bit3,8,8 bit4,16,16 range,32,44 singleValue,45,45"
219
220 # Value with bit fields
221 cat <<- 'END' > "$temp_stdout_expected_file"
222 with_enum: { enum_field = ( "bit0" | "bit1" | "bit2" | "bit3" | "bit4" : container = 31 ) }
223 END
224 run_test "$test_name" 0 31 "$temp_stdout_expected_file"
225
226 # A value with some bit flags set, but within another range
227 cat <<- 'END' > "$temp_stdout_expected_file"
228 with_enum: { enum_field = ( "range" : container = 36 ) }
229 END
230 run_test "$test_name" 0 36 "$temp_stdout_expected_file"
231
232 # A value with some bit flags set, but corresponding to another value
233 cat <<- 'END' > "$temp_stdout_expected_file"
234 with_enum: { enum_field = ( "singleValue" : container = 45 ) }
235 END
236 run_test "$test_name" 0 45 "$temp_stdout_expected_file"
237
238 # Value above the ranges
239 cat <<- 'END' > "$temp_stdout_expected_file"
240 with_enum: { enum_field = ( <unknown> : container = 46 ) }
241 END
242 run_test "$test_name" 0 46 "$temp_stdout_expected_file"
243
244 # Since low values are often powers of 2, they may be considered bit flags too
245 test_name="Mixed enum bits at end"
246 enum_signed="false"
247 enum_values="val1,1,1 val2,2,2 val3,3,3 val4,4,4 val5,5,5 bit3,8,8 bit4,16,16 bit5,32,32"
248
249 # Value with bit fields
250 cat <<- 'END' > "$temp_stdout_expected_file"
251 with_enum: { enum_field = ( "bit4" : container = 16 ) }
252 END
253 run_test "$test_name" 0 16 "$temp_stdout_expected_file"
254
255 # Value with a bit field set both at beginning and end
256 cat <<- 'END' > "$temp_stdout_expected_file"
257 with_enum: { enum_field = ( "val1" | "bit4" : container = 17 ) }
258 END
259 run_test "$test_name" 0 17 "$temp_stdout_expected_file"
260}
261
ed30eb8d
GB
262# Enumerations tests
263test_normal_enum "false"
264test_normal_enum "true"
265test_normal_enum_negative
5288c8ae
GB
266test_bit_flag_enum
267test_mixed_enum
ed30eb8d
GB
268
269# Do not `rm` $temp_stderr_expected because it's set to `/dev/null` right now
270# and that would print an error.
271rm -f "$temp_stdout_expected_file"
This page took 0.037337 seconds and 4 git commands to generate.