#!/bin/bash # # SPDX-License-Identifier: GPL-2.0-only # # Copyright (C) 2020 Geneviève Bastien # # This file tests pretty printing in details some event classes that are # not all covered by the main babeltrace tests with traces. SH_TAP=1 if [ "x${BT_TESTS_SRCDIR:-}" != "x" ]; then UTILSSH="$BT_TESTS_SRCDIR/utils/utils.sh" else UTILSSH="$(dirname "$0")/../../utils/utils.sh" fi # shellcheck source=../../utils/utils.sh source "$UTILSSH" data_dir="$BT_TESTS_DATADIR/plugins/sink.text.pretty" temp_stdout_expected_file=$(mktemp -t test_pretty_expected_stdout.XXXXXX) temp_stderr_expected="/dev/null" plan_tests 14 function compare_enum_sorted { local expected_file="$1" local actual_file="$2" # The order in which enum labels are printed by a `sink.text.pretty` # component directly depends on the order in which mappings were added # to the enum field class in the source component. This order should # not be relied on when testing. Relying on it caused problems with # Python component classes because different versions of Python sort # data structures differently (e.g. dictionaries are insertion sorted # since Python 3.7). run_python_bt2 python3 "${BT_TESTS_SRCDIR}/utils/python/split_sort_compare.py" \ "$(cat $expected_file)" "$(cat $actual_file)" } function run_test { local test_name=$1 local expected_to_fail="$2" local value="$3" local expected_stdout_file="$4" local test_text= local actual_stdout_file local actual_stderr_file local ret=0 local local_args=( "--plugin-path" "$data_dir" "-c" "src.test-pretty.TheSourceOfProblems" "-p" "enum-values=\"$enum_values\"" "-p" "value=$value" "-p" "enum-signed=$enum_signed" "-c" "sink.text.pretty" ) actual_stdout_file="$(mktemp -t actual_pretty_stdout.XXXXXX)" actual_stderr_file="$(mktemp -t actual_pretty_stderr.XXXXXX)" bt_cli "$actual_stdout_file" "$actual_stderr_file" "${local_args[@]}" compare_enum_sorted "$expected_stdout_file" "$actual_stdout_file" ret_stdout=$? bt_diff /dev/null "$actual_stderr_file" ret_stderr=$? if ((ret_stdout != 0 || ret_stderr != 0)); then ret=1 fi rm -f "$actual_stdout_file" "$actual_stderr_file" if (($expected_to_fail)); then isnt $ret 0 "$test_name signed=$enum_signed with value=$value doesn't match as expected" else ok $ret "$test_name signed=$enum_signed with value=$value matches" fi } function test_normal_enum { test_name="Normal enum" enum_signed="$1" enum_values="single,1,1 single2,2,2 single3,4,4 range,4,8 range2,15,20" # Hit a single value cat <<- 'END' > "$temp_stdout_expected_file" with_enum: { enum_field = ( "single" : container = 1 ) } END run_test "$test_name" 0 1 "$temp_stdout_expected_file" # Hit a single range cat <<- 'END' > "$temp_stdout_expected_file" with_enum: { enum_field = ( "range" : container = 7 ) } END run_test "$test_name" 0 7 "$temp_stdout_expected_file" # Unknown cat <<- 'END' > "$temp_stdout_expected_file" with_enum: { enum_field = ( : container = 21 ) } END run_test "$test_name" 0 21 "$temp_stdout_expected_file" # Unknown but with bits with a value, but range larger than 1 element cat <<- 'END' > "$temp_stdout_expected_file" with_enum: { enum_field = ( : container = 12 ) } END run_test "$test_name" 0 12 "$temp_stdout_expected_file" # Unknown value of 0 cat <<- 'END' > "$temp_stdout_expected_file" with_enum: { enum_field = ( : container = 0 ) } END run_test "$test_name" 0 0 "$temp_stdout_expected_file" } function test_normal_enum_negative { test_name="Normal enum with negative value" enum_signed="true" enum_values="zero,0,0 single,1,1 single2,2,2 single3,4,4 range,4,8 negative,-1,-1 rangeNegative,-6,-2" # Hit a single negative value cat <<- 'END' > "$temp_stdout_expected_file" with_enum: { enum_field = ( "negative" : container = -1 ) } END run_test "$test_name" 0 -1 "$temp_stdout_expected_file" # Hit a single negative range cat <<- 'END' > "$temp_stdout_expected_file" with_enum: { enum_field = ( "rangeNegative" : container = -6 ) } END run_test "$test_name" 0 -6 "$temp_stdout_expected_file" # Unknown cat <<- 'END' > "$temp_stdout_expected_file" with_enum: { enum_field = ( : container = -7 ) } END run_test "$test_name" 0 -7 "$temp_stdout_expected_file" # value of 0 cat <<- 'END' > "$temp_stdout_expected_file" with_enum: { enum_field = ( "zero" : container = 0 ) } END run_test "$test_name" 0 0 "$temp_stdout_expected_file" } # Enumerations tests test_normal_enum "false" test_normal_enum "true" test_normal_enum_negative # Do not `rm` $temp_stderr_expected because it's set to `/dev/null` right now # and that would print an error. rm -f "$temp_stdout_expected_file"