Commit | Line | Data |
---|---|---|
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. | |
9 | SH_TAP=1 | |
10 | ||
11 | if [ "x${BT_TESTS_SRCDIR:-}" != "x" ]; then | |
12 | UTILSSH="$BT_TESTS_SRCDIR/utils/utils.sh" | |
13 | else | |
14 | UTILSSH="$(dirname "$0")/../../utils/utils.sh" | |
15 | fi | |
16 | ||
17 | # shellcheck source=../../utils/utils.sh | |
18 | source "$UTILSSH" | |
19 | ||
20 | data_dir="$BT_TESTS_DATADIR/plugins/sink.text.pretty" | |
21 | temp_stdout_expected_file=$(mktemp -t test_pretty_expected_stdout.XXXXXX) | |
22 | temp_stderr_expected="/dev/null" | |
23 | ||
5288c8ae | 24 | plan_tests 31 |
ed30eb8d GB |
25 | |
26 | function 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 | ||
39 | run_python_bt2 python3 "${BT_TESTS_SRCDIR}/utils/python/split_sort_compare.py" \ | |
40 | "$(cat $expected_file)" "$(cat $actual_file)" | |
41 | } | |
42 | ||
43 | function 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 | ||
88 | function 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 | ||
136 | function 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 |
166 | function 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 | ||
215 | function 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 |
263 | test_normal_enum "false" | |
264 | test_normal_enum "true" | |
265 | test_normal_enum_negative | |
5288c8ae GB |
266 | test_bit_flag_enum |
267 | test_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. | |
271 | rm -f "$temp_stdout_expected_file" |