| 1 | #!/bin/bash |
| 2 | # |
| 3 | # Copyright (C) 2019 Efficios, Inc. |
| 4 | # |
| 5 | # This program is free software; you can redistribute it and/or |
| 6 | # modify it under the terms of the GNU General Public License |
| 7 | # as published by the Free Software Foundation; only version 2 |
| 8 | # of the License. |
| 9 | # |
| 10 | # This program is distributed in the hope that it will be useful, |
| 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | # GNU General Public License for more details. |
| 14 | # |
| 15 | # You should have received a copy of the GNU General Public License |
| 16 | # along with this program; if not, write to the Free Software |
| 17 | # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 18 | |
| 19 | # Test the deterministic behavior of the src.ctf.fs component versus the |
| 20 | # ordering of the given input paths. |
| 21 | # |
| 22 | # In presence of multiple copies of the same packet, we want it to pick the |
| 23 | # copy of the packet to read in a deterministic fashion. |
| 24 | # |
| 25 | # This test is written assuming the specific implementation of the src.ctf.fs |
| 26 | # component class, which sorts its input paths lexicographically. |
| 27 | # |
| 28 | # There are three traces (a-corrupted, b-not-corrupted and c-corrupted) with the |
| 29 | # same UUID and the same packet, except that this packet is corrupted in |
| 30 | # a-corrupted and c-corrupted. In these cases, there is an event with an |
| 31 | # invalid id. When reading these corrupted packets, we expect babeltrace to |
| 32 | # emit an error. |
| 33 | # |
| 34 | # When reading a-corrupted and b-not-corrupted together, the copy of the packet |
| 35 | # from a-corrupted is read, and babeltrace exits with an error. |
| 36 | # |
| 37 | # When reading b-not-corrupted and c-corrupted together, the copy of the packet |
| 38 | # from b-not-corrupted is read, and babeltrace executes successfully. |
| 39 | |
| 40 | SH_TAP=1 |
| 41 | |
| 42 | if [ "x${BT_TESTS_SRCDIR:-}" != "x" ]; then |
| 43 | UTILSSH="$BT_TESTS_SRCDIR/utils/utils.sh" |
| 44 | else |
| 45 | UTILSSH="$(dirname "$0")/../../utils/utils.sh" |
| 46 | fi |
| 47 | |
| 48 | # shellcheck source=../../../utils/utils.sh |
| 49 | source "$UTILSSH" |
| 50 | |
| 51 | traces_dir="${BT_CTF_TRACES_PATH}/deterministic-ordering" |
| 52 | trace_a_corrupted="${traces_dir}/a-corrupted" |
| 53 | trace_b_not_corrupted="${traces_dir}/b-not-corrupted" |
| 54 | trace_c_corrupted="${traces_dir}/c-corrupted" |
| 55 | |
| 56 | if [ "$BT_OS_TYPE" = "mingw" ]; then |
| 57 | # The MSYS2 shell makes a mess trying to convert the Unix-like paths |
| 58 | # to Windows-like paths, so just disable the automatic conversion and |
| 59 | # do it by hand. |
| 60 | export MSYS2_ARG_CONV_EXCL="*" |
| 61 | trace_a_corrupted=$(cygpath -m "${trace_a_corrupted}") |
| 62 | trace_b_not_corrupted=$(cygpath -m "${trace_b_not_corrupted}") |
| 63 | trace_c_corrupted=$(cygpath -m "${trace_c_corrupted}") |
| 64 | fi |
| 65 | |
| 66 | stdout_file=$(mktemp -t test_deterministic_ordering_stdout.XXXXXX) |
| 67 | stderr_file=$(mktemp -t test_deterministic_ordering_stderr.XXXXXX) |
| 68 | |
| 69 | expect_failure() { |
| 70 | local test_name |
| 71 | local inputs |
| 72 | |
| 73 | test_name="$1" |
| 74 | inputs="$2" |
| 75 | |
| 76 | bt_cli "${stdout_file}" "${stderr_file}" \ |
| 77 | -c src.ctf.fs -p "inputs=[${inputs}]" |
| 78 | isnt 0 "$?" "${test_name}: exit status is not 0" |
| 79 | |
| 80 | grep --silent "^ERROR: " "${stderr_file}" |
| 81 | ok "$?" "${test_name}: error stack is produced" |
| 82 | |
| 83 | grep --silent "No event class with ID of event class ID to use in stream class" "${stderr_file}" |
| 84 | ok "$?" "${test_name}: expected error message is present" |
| 85 | } |
| 86 | |
| 87 | expect_success() { |
| 88 | local test_name |
| 89 | local inputs |
| 90 | |
| 91 | test_name="$1" |
| 92 | inputs="$2" |
| 93 | |
| 94 | bt_cli "${stdout_file}" "${stderr_file}" \ |
| 95 | -c src.ctf.fs -p "inputs=[${inputs}]" \ |
| 96 | -c sink.text.details -p 'with-trace-name=no,with-stream-name=no,with-metadata=no,compact=yes' |
| 97 | ok "$?" "${test_name}: exit status is 0" |
| 98 | |
| 99 | bt_diff "${traces_dir}/b-c.expect" "${stdout_file}" |
| 100 | ok "$?" "${test_name}: expected output is produced" |
| 101 | } |
| 102 | |
| 103 | plan_tests 10 |
| 104 | |
| 105 | # Trace with corrupted packet comes first lexicographically, expect a failure. |
| 106 | |
| 107 | expect_failure "ab" "\"${trace_a_corrupted}\",\"${trace_b_not_corrupted}\"" |
| 108 | expect_failure "ba" "\"${trace_b_not_corrupted}\",\"${trace_a_corrupted}\"" |
| 109 | |
| 110 | # Trace with non-corrupted packet comes first lexicographically, expect a success. |
| 111 | |
| 112 | expect_success "bc" "\"${trace_b_not_corrupted}\",\"${trace_c_corrupted}\"" |
| 113 | expect_success "cb" "\"${trace_c_corrupted}\",\"${trace_b_not_corrupted}\"" |
| 114 | |
| 115 | rm -f "${stdout_file}" "${stderr_file}" |