tests/utils/python/mctf.py: convert JSON array → JSON text seq.
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Mon, 13 May 2024 09:00:43 +0000 (05:00 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Wed, 4 Sep 2024 19:05:14 +0000 (15:05 -0400)
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 <eeppeliteloop@gmail.com>
Change-Id: Ic1d6fb1644870f3b951d26238f82c79d7f3cf25a
Reviewed-on: https://review.lttng.org/c/babeltrace/+/12772

tests/utils/python/mctf.py

index bd8cc0f2a296894cc5af1a342a0606b2d132faf3..a8c0b6633ff21bae0ecb3c134a3f507d150193d3 100644 (file)
@@ -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
This page took 0.027184 seconds and 4 git commands to generate.