-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Sort input paths to make the behavior of the component more deterministic. For example, when there are duplicated packets in the trace and we pick one copy, this will ensure that we always process the data stream files in the same order, and that we always pick the same copy of the packet. In practice, this will reduce the chances of observing different behaviors on different platforms where glib reports the files of a trace in different orders. A test is added to verify that the choice of which copy of a packet to choose, in case a packet is present in multiple copies, is independent from the order of the inputs paths passed to the component. Change-Id: I034ba8c909e76a1e89589e1f0e0f37512c9d88bf Signed-off-by: Simon Marchi <simon.marchi@efficios.com> Reviewed-on: https://review.lttng.org/c/babeltrace/+/2396
- Loading branch information
Showing
11 changed files
with
267 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
31 changes: 31 additions & 0 deletions
31
tests/data/ctf-traces/deterministic-ordering/a-corrupted/metadata
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* CTF 1.8 */ | ||
|
||
typealias integer { size = 8; align = 8; signed = false; } := uint8_t; | ||
|
||
trace { | ||
major = 1; | ||
minor = 8; | ||
byte_order = be; | ||
uuid = "c6e53ddd-925c-4b8f-bd19-acd28af9c4f2"; | ||
|
||
packet.header := struct { | ||
uint8_t stream_id; | ||
uint8_t stream_instance_id; | ||
}; | ||
}; | ||
|
||
stream { | ||
id = 0; | ||
event.header := struct { | ||
uint8_t id; | ||
}; | ||
|
||
packet.context := struct { | ||
uint8_t timestamp_begin; | ||
}; | ||
}; | ||
|
||
event { | ||
name = gadoua; | ||
id = 1; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
[Unknown] {0 0 0} Stream beginning | ||
[0 0] {0 0 0} Packet beginning | ||
[0 0] {0 0 0} Event `gadoua` (1) | ||
[0 0] {0 0 0} Event `gadoua` (1) | ||
[0 0] {0 0 0} Event `gadoua` (1) | ||
{0 0 0} Packet end | ||
[Unknown] {0 0 0} Stream end |
Binary file added
BIN
+6 Bytes
tests/data/ctf-traces/deterministic-ordering/b-not-corrupted/dummystream
Binary file not shown.
31 changes: 31 additions & 0 deletions
31
tests/data/ctf-traces/deterministic-ordering/b-not-corrupted/metadata
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* CTF 1.8 */ | ||
|
||
typealias integer { size = 8; align = 8; signed = false; } := uint8_t; | ||
|
||
trace { | ||
major = 1; | ||
minor = 8; | ||
byte_order = be; | ||
uuid = "c6e53ddd-925c-4b8f-bd19-acd28af9c4f2"; | ||
|
||
packet.header := struct { | ||
uint8_t stream_id; | ||
uint8_t stream_instance_id; | ||
}; | ||
}; | ||
|
||
stream { | ||
id = 0; | ||
event.header := struct { | ||
uint8_t id; | ||
}; | ||
|
||
packet.context := struct { | ||
uint8_t timestamp_begin; | ||
}; | ||
}; | ||
|
||
event { | ||
name = gadoua; | ||
id = 1; | ||
}; |
Binary file not shown.
31 changes: 31 additions & 0 deletions
31
tests/data/ctf-traces/deterministic-ordering/c-corrupted/metadata
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* CTF 1.8 */ | ||
|
||
typealias integer { size = 8; align = 8; signed = false; } := uint8_t; | ||
|
||
trace { | ||
major = 1; | ||
minor = 8; | ||
byte_order = be; | ||
uuid = "c6e53ddd-925c-4b8f-bd19-acd28af9c4f2"; | ||
|
||
packet.header := struct { | ||
uint8_t stream_id; | ||
uint8_t stream_instance_id; | ||
}; | ||
}; | ||
|
||
stream { | ||
id = 0; | ||
event.header := struct { | ||
uint8_t id; | ||
}; | ||
|
||
packet.context := struct { | ||
uint8_t timestamp_begin; | ||
}; | ||
}; | ||
|
||
event { | ||
name = gadoua; | ||
id = 1; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
#!/bin/bash | ||
# | ||
# Copyright (C) 2019 Efficios, Inc. | ||
# | ||
# This program is free software; you can redistribute it and/or | ||
# modify it under the terms of the GNU General Public License | ||
# as published by the Free Software Foundation; only version 2 | ||
# of the License. | ||
# | ||
# This program is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
# GNU General Public License for more details. | ||
# | ||
# You should have received a copy of the GNU General Public License | ||
# along with this program; if not, write to the Free Software | ||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
|
||
# Test the deterministic behavior of the src.ctf.fs component versus the | ||
# ordering of the given input paths. | ||
# | ||
# In presence of multiple copies of the same packet, we want it to pick the | ||
# copy of the packet to read in a deterministic fashion. | ||
# | ||
# This test is written assuming the specific implementation of the src.ctf.fs | ||
# component class, which sorts its input paths lexicographically. | ||
# | ||
# There are three traces (a-corrupted, b-not-corrupted and c-corrupted) with the | ||
# same UUID and the same packet, except that this packet is corrupted in | ||
# a-corrupted and c-corrupted. In these cases, there is an event with an | ||
# invalid id. When reading these corrupted packets, we expect babeltrace to | ||
# emit an error. | ||
# | ||
# When reading a-corrupted and b-not-corrupted together, the copy of the packet | ||
# from a-corrupted is read, and babeltrace exits with an error. | ||
# | ||
# When reading b-not-corrupted and c-corrupted together, the copy of the packet | ||
# from b-not-corrupted is read, and babeltrace executes successfully. | ||
|
||
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" | ||
|
||
traces_dir="${BT_CTF_TRACES_PATH}/deterministic-ordering" | ||
trace_a_corrupted="${traces_dir}/a-corrupted" | ||
trace_b_not_corrupted="${traces_dir}/b-not-corrupted" | ||
trace_c_corrupted="${traces_dir}/c-corrupted" | ||
|
||
if [ "$BT_OS_TYPE" = "mingw" ]; then | ||
# The MSYS2 shell makes a mess trying to convert the Unix-like paths | ||
# to Windows-like paths, so just disable the automatic conversion and | ||
# do it by hand. | ||
export MSYS2_ARG_CONV_EXCL="*" | ||
trace_a_corrupted=$(cygpath -m "${trace_a_corrupted}") | ||
trace_b_not_corrupted=$(cygpath -m "${trace_b_not_corrupted}") | ||
trace_c_corrupted=$(cygpath -m "${trace_c_corrupted}") | ||
fi | ||
|
||
stdout_file=$(mktemp -t test_deterministic_ordering_stdout.XXXXXX) | ||
stderr_file=$(mktemp -t test_deterministic_ordering_stderr.XXXXXX) | ||
|
||
expect_failure() { | ||
local test_name | ||
local inputs | ||
|
||
test_name="$1" | ||
inputs="$2" | ||
|
||
bt_cli "${stdout_file}" "${stderr_file}" \ | ||
-c src.ctf.fs -p "inputs=[${inputs}]" | ||
isnt 0 "$?" "${test_name}: exit status is not 0" | ||
|
||
grep --silent "^ERROR: " "${stderr_file}" | ||
ok "$?" "${test_name}: error stack is produced" | ||
|
||
grep --silent "No event class with ID of event class ID to use in stream class" "${stderr_file}" | ||
ok "$?" "${test_name}: expected error message is present" | ||
} | ||
|
||
expect_success() { | ||
local test_name | ||
local inputs | ||
|
||
test_name="$1" | ||
inputs="$2" | ||
|
||
bt_cli "${stdout_file}" "${stderr_file}" \ | ||
-c src.ctf.fs -p "inputs=[${inputs}]" \ | ||
-c sink.text.details -p 'with-trace-name=no,with-stream-name=no,with-metadata=no,compact=yes' | ||
ok "$?" "${test_name}: exit status is 0" | ||
|
||
bt_diff "${traces_dir}/b-c.expect" "${stdout_file}" | ||
ok "$?" "${test_name}: expected output is produced" | ||
} | ||
|
||
plan_tests 10 | ||
|
||
# Trace with corrupted packet comes first lexicographically, expect a failure. | ||
|
||
expect_failure "ab" "\"${trace_a_corrupted}\",\"${trace_b_not_corrupted}\"" | ||
expect_failure "ba" "\"${trace_b_not_corrupted}\",\"${trace_a_corrupted}\"" | ||
|
||
# Trace with non-corrupted packet comes first lexicographically, expect a success. | ||
|
||
expect_success "bc" "\"${trace_b_not_corrupted}\",\"${trace_c_corrupted}\"" | ||
expect_success "cb" "\"${trace_c_corrupted}\",\"${trace_b_not_corrupted}\"" | ||
|
||
rm -f "${stdout_file}" "${stderr_file}" |