From: Philippe Proulx Date: Mon, 13 May 2024 09:00:43 +0000 (-0400) Subject: tests/utils/python/mctf.py: convert JSON array → JSON text seq. X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=e596a1f652845fdeb1cece2cb8e5c9e924a7297e;p=babeltrace.git tests/utils/python/mctf.py: convert JSON array → JSON text seq. This patch updates `mctf.py` so that it converts a JSON array found in the part named `metadata` to a JSON text sequence. This makes it possible to write a CTF 2 metadata part without the odd RS characters, for example: --- metadata [ { "type": "preamble", "version": 2 }, { "type": "trace-class" }, { "type": "data-stream-class" }, { "name": "test", "payload-field-class": { "member-classes": [ { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu1a" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu1b" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu2" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu3" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu4" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu5" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu6" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu7" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu8" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu9" }, { "field-class": { "type": "variable-length-unsigned-integer" }, "name": "vu10" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi1a" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi1b" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi1c" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi2" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi3" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi4" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi5" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi6" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi7" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi8" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi9" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi10a" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi10b" }, { "field-class": { "type": "variable-length-signed-integer" }, "name": "vi10c" } ], "type": "structure" }, "type": "event-record-class" } ] --- my-stream [0 : uleb128] # `vu1a` [77 : uleb128] # `vu1b` [177 : uleb128] # `vu2` [43123 : uleb128] # `vu3` [21829382 : uleb128] # `vu4` [5121829382 : uleb128] # `vu5` [95121829382 : uleb128] # `vu6` [13895121829382 : uleb128] # `vu7` [913895121855555 : uleb128] # `vu8` [333333333333333333 : uleb128] # `vu9` [18446744073709551615 : uleb128] # `vu10` [0 : sleb128] # `vi1a` [-1 : sleb128] # `vi1b` [23 : sleb128] # `vi1c` [-156 : sleb128] # `vi2` [8556 : sleb128] # `vi3` [-100101001 : sleb128] # `vi4` [8288491823 : sleb128] # `vi5` [-171717171717 : sleb128] # `vi6` [123456787654321 : sleb128] # `vi7` [-1121231234123450 : sleb128] # `vi8` [99999999999999999 : sleb128] # `vi9` [9223372036853775807 : sleb128] # `vi10a` [9223372036854775807 : sleb128] # `vi10b` [-9223372036854775808 : sleb128] # `vi10c` Detecting `[` as the first character of the part is enough because a CTF 1.8 TSDL metadata text never starts with `[`. Signed-off-by: Philippe Proulx Change-Id: Ic1d6fb1644870f3b951d26238f82c79d7f3cf25a Reviewed-on: https://review.lttng.org/c/babeltrace/+/12772 --- diff --git a/tests/utils/python/mctf.py b/tests/utils/python/mctf.py index bd8cc0f2..a8c0b663 100644 --- a/tests/utils/python/mctf.py +++ b/tests/utils/python/mctf.py @@ -76,6 +76,27 @@ def _normand_parse( ) from e +def _reformat_ctf_2_metadata(content: str): + import json + + json_seq_fragments = [] # type: list[str] + + for fragment in json.loads(content): + json_seq_fragments.append("\x1e{}".format(json.dumps(fragment, indent=2))) + + return "\n".join(json_seq_fragments) + + +def _reformat_metadata(content: str): + content = content.strip() + "\n" + + if content.startswith("["): + # CTF 2: JSON array to JSON text sequence + return _reformat_ctf_2_metadata(content) + + return content + + def _generate_from_part( part: moultipart.Part, base_dir: str, @@ -85,7 +106,9 @@ def _generate_from_part( ): content = part.content - if part.header_info != "metadata": + if part.header_info == "metadata": + content = _reformat_metadata(content) + else: res = _normand_parse(part, normand_vars, normand_labels) content = res.data normand_vars = res.variables