xref: /aosp_15_r20/external/pigweed/pw_trace/py/trace_test.py (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*61c4878aSAndroid Build Coastguard Worker# Copyright 2020 The Pigweed Authors
3*61c4878aSAndroid Build Coastguard Worker#
4*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
5*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
6*61c4878aSAndroid Build Coastguard Worker# the License at
7*61c4878aSAndroid Build Coastguard Worker#
8*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
9*61c4878aSAndroid Build Coastguard Worker#
10*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
14*61c4878aSAndroid Build Coastguard Worker# the License.
15*61c4878aSAndroid Build Coastguard Worker"""Tests the trace module."""
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerimport json
18*61c4878aSAndroid Build Coastguard Workerimport struct
19*61c4878aSAndroid Build Coastguard Workerimport unittest
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Workerfrom pw_trace import trace
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Workertest_events = [
24*61c4878aSAndroid Build Coastguard Worker    trace.TraceEvent(trace.TraceType.INSTANTANEOUS, "m1", "L1", 1),
25*61c4878aSAndroid Build Coastguard Worker    trace.TraceEvent(trace.TraceType.INSTANTANEOUS_GROUP, "m2", "L2", 2, "G2"),
26*61c4878aSAndroid Build Coastguard Worker    trace.TraceEvent(trace.TraceType.ASYNC_STEP, "m3", "L3", 3, "G3", 103),
27*61c4878aSAndroid Build Coastguard Worker    trace.TraceEvent(trace.TraceType.DURATION_START, "m4", "L4", 4),
28*61c4878aSAndroid Build Coastguard Worker    trace.TraceEvent(trace.TraceType.DURATION_GROUP_START, "m5", "L5", 5, "G5"),
29*61c4878aSAndroid Build Coastguard Worker    trace.TraceEvent(trace.TraceType.ASYNC_START, "m6", "L6", 6, "G6", 106),
30*61c4878aSAndroid Build Coastguard Worker    trace.TraceEvent(trace.TraceType.DURATION_END, "m7", "L7", 7),
31*61c4878aSAndroid Build Coastguard Worker    trace.TraceEvent(trace.TraceType.DURATION_GROUP_END, "m8", "L8", 8, "G8"),
32*61c4878aSAndroid Build Coastguard Worker    trace.TraceEvent(trace.TraceType.ASYNC_END, "m9", "L9", 9, "G9", 109),
33*61c4878aSAndroid Build Coastguard Worker]
34*61c4878aSAndroid Build Coastguard Worker
35*61c4878aSAndroid Build Coastguard Workertest_json = [
36*61c4878aSAndroid Build Coastguard Worker    {"ph": "I", "pid": "m1", "name": "L1", "ts": 1, "s": "p"},
37*61c4878aSAndroid Build Coastguard Worker    {"ph": "I", "pid": "m2", "tid": "G2", "name": "L2", "ts": 2, "s": "t"},
38*61c4878aSAndroid Build Coastguard Worker    {
39*61c4878aSAndroid Build Coastguard Worker        "ph": "n",
40*61c4878aSAndroid Build Coastguard Worker        "pid": "m3",
41*61c4878aSAndroid Build Coastguard Worker        "tid": "G3",
42*61c4878aSAndroid Build Coastguard Worker        "name": "L3",
43*61c4878aSAndroid Build Coastguard Worker        "ts": 3,
44*61c4878aSAndroid Build Coastguard Worker        "scope": "G3",
45*61c4878aSAndroid Build Coastguard Worker        "cat": "m3",
46*61c4878aSAndroid Build Coastguard Worker        "id": 103,
47*61c4878aSAndroid Build Coastguard Worker        "args": {"id": 103},
48*61c4878aSAndroid Build Coastguard Worker    },
49*61c4878aSAndroid Build Coastguard Worker    {"ph": "B", "pid": "m4", "tid": "L4", "name": "L4", "ts": 4},
50*61c4878aSAndroid Build Coastguard Worker    {"ph": "B", "pid": "m5", "tid": "G5", "name": "L5", "ts": 5},
51*61c4878aSAndroid Build Coastguard Worker    {
52*61c4878aSAndroid Build Coastguard Worker        "ph": "b",
53*61c4878aSAndroid Build Coastguard Worker        "pid": "m6",
54*61c4878aSAndroid Build Coastguard Worker        "tid": "G6",
55*61c4878aSAndroid Build Coastguard Worker        "name": "L6",
56*61c4878aSAndroid Build Coastguard Worker        "ts": 6,
57*61c4878aSAndroid Build Coastguard Worker        "scope": "G6",
58*61c4878aSAndroid Build Coastguard Worker        "cat": "m6",
59*61c4878aSAndroid Build Coastguard Worker        "id": 106,
60*61c4878aSAndroid Build Coastguard Worker        "args": {"id": 106},
61*61c4878aSAndroid Build Coastguard Worker    },
62*61c4878aSAndroid Build Coastguard Worker    {"ph": "E", "pid": "m7", "tid": "L7", "name": "L7", "ts": 7},
63*61c4878aSAndroid Build Coastguard Worker    {"ph": "E", "pid": "m8", "tid": "G8", "name": "L8", "ts": 8},
64*61c4878aSAndroid Build Coastguard Worker    {
65*61c4878aSAndroid Build Coastguard Worker        "ph": "e",
66*61c4878aSAndroid Build Coastguard Worker        "pid": "m9",
67*61c4878aSAndroid Build Coastguard Worker        "tid": "G9",
68*61c4878aSAndroid Build Coastguard Worker        "name": "L9",
69*61c4878aSAndroid Build Coastguard Worker        "ts": 9,
70*61c4878aSAndroid Build Coastguard Worker        "scope": "G9",
71*61c4878aSAndroid Build Coastguard Worker        "cat": "m9",
72*61c4878aSAndroid Build Coastguard Worker        "id": 109,
73*61c4878aSAndroid Build Coastguard Worker        "args": {"id": 109},
74*61c4878aSAndroid Build Coastguard Worker    },
75*61c4878aSAndroid Build Coastguard Worker]
76*61c4878aSAndroid Build Coastguard Worker
77*61c4878aSAndroid Build Coastguard Worker
78*61c4878aSAndroid Build Coastguard Workerclass TestTraceGenerateJson(unittest.TestCase):
79*61c4878aSAndroid Build Coastguard Worker    """Tests generate json with various events."""
80*61c4878aSAndroid Build Coastguard Worker
81*61c4878aSAndroid Build Coastguard Worker    def test_generate_single_json_event(self):
82*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
83*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
84*61c4878aSAndroid Build Coastguard Worker            module="module",
85*61c4878aSAndroid Build Coastguard Worker            label="label",
86*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
87*61c4878aSAndroid Build Coastguard Worker        )
88*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
89*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
90*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
91*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
92*61c4878aSAndroid Build Coastguard Worker            {"ph": "I", "pid": "module", "name": "label", "ts": 10, "s": "p"},
93*61c4878aSAndroid Build Coastguard Worker        )
94*61c4878aSAndroid Build Coastguard Worker
95*61c4878aSAndroid Build Coastguard Worker    def test_generate_multiple_json_events(self):
96*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json(test_events)
97*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(len(test_json), len(json_lines))
98*61c4878aSAndroid Build Coastguard Worker        for actual, expected in zip(json_lines, test_json):
99*61c4878aSAndroid Build Coastguard Worker            self.assertEqual(expected, json.loads(actual))
100*61c4878aSAndroid Build Coastguard Worker
101*61c4878aSAndroid Build Coastguard Worker    def test_generate_json_data_arg_label(self):
102*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
103*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
104*61c4878aSAndroid Build Coastguard Worker            module="module",
105*61c4878aSAndroid Build Coastguard Worker            label="",  # Is replaced by data string
106*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
107*61c4878aSAndroid Build Coastguard Worker            has_data=True,
108*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_arg_label",
109*61c4878aSAndroid Build Coastguard Worker            data=bytes("arg", "utf-8"),
110*61c4878aSAndroid Build Coastguard Worker        )
111*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
112*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
113*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
114*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
115*61c4878aSAndroid Build Coastguard Worker            {"ph": "I", "pid": "module", "name": "arg", "ts": 10, "s": "p"},
116*61c4878aSAndroid Build Coastguard Worker        )
117*61c4878aSAndroid Build Coastguard Worker
118*61c4878aSAndroid Build Coastguard Worker    def test_generate_json_data_arg_group(self):
119*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
120*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS_GROUP,
121*61c4878aSAndroid Build Coastguard Worker            module="module",
122*61c4878aSAndroid Build Coastguard Worker            label="label",
123*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
124*61c4878aSAndroid Build Coastguard Worker            has_data=True,
125*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_arg_group",
126*61c4878aSAndroid Build Coastguard Worker            data=bytes("arg", "utf-8"),
127*61c4878aSAndroid Build Coastguard Worker        )
128*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
129*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
130*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
131*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
132*61c4878aSAndroid Build Coastguard Worker            {
133*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
134*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
135*61c4878aSAndroid Build Coastguard Worker                "name": "label",
136*61c4878aSAndroid Build Coastguard Worker                "tid": "arg",
137*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
138*61c4878aSAndroid Build Coastguard Worker                "s": "t",
139*61c4878aSAndroid Build Coastguard Worker            },
140*61c4878aSAndroid Build Coastguard Worker        )
141*61c4878aSAndroid Build Coastguard Worker
142*61c4878aSAndroid Build Coastguard Worker    def test_generate_json_data_counter(self):
143*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
144*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
145*61c4878aSAndroid Build Coastguard Worker            module="module",
146*61c4878aSAndroid Build Coastguard Worker            label="counter",
147*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
148*61c4878aSAndroid Build Coastguard Worker            has_data=True,
149*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_arg_counter",
150*61c4878aSAndroid Build Coastguard Worker            data=(5).to_bytes(4, byteorder="little"),
151*61c4878aSAndroid Build Coastguard Worker        )
152*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
153*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
154*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
155*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
156*61c4878aSAndroid Build Coastguard Worker            {
157*61c4878aSAndroid Build Coastguard Worker                "ph": "C",
158*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
159*61c4878aSAndroid Build Coastguard Worker                "name": "counter",
160*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
161*61c4878aSAndroid Build Coastguard Worker                "s": "p",
162*61c4878aSAndroid Build Coastguard Worker                "args": {"counter": 5},
163*61c4878aSAndroid Build Coastguard Worker            },
164*61c4878aSAndroid Build Coastguard Worker        )
165*61c4878aSAndroid Build Coastguard Worker
166*61c4878aSAndroid Build Coastguard Worker    def test_generate_json_data_struct_fmt_single(self):
167*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
168*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
169*61c4878aSAndroid Build Coastguard Worker            module="module",
170*61c4878aSAndroid Build Coastguard Worker            label="counter",
171*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
172*61c4878aSAndroid Build Coastguard Worker            has_data=True,
173*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_py_struct_fmt:H",
174*61c4878aSAndroid Build Coastguard Worker            data=(5).to_bytes(2, byteorder="little"),
175*61c4878aSAndroid Build Coastguard Worker        )
176*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
177*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
178*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
179*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
180*61c4878aSAndroid Build Coastguard Worker            {
181*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
182*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
183*61c4878aSAndroid Build Coastguard Worker                "name": "counter",
184*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
185*61c4878aSAndroid Build Coastguard Worker                "s": "p",
186*61c4878aSAndroid Build Coastguard Worker                "args": {"data_0": 5},
187*61c4878aSAndroid Build Coastguard Worker            },
188*61c4878aSAndroid Build Coastguard Worker        )
189*61c4878aSAndroid Build Coastguard Worker
190*61c4878aSAndroid Build Coastguard Worker    def test_generate_json_data_struct_fmt_multi(self):
191*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
192*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
193*61c4878aSAndroid Build Coastguard Worker            module="module",
194*61c4878aSAndroid Build Coastguard Worker            label="counter",
195*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
196*61c4878aSAndroid Build Coastguard Worker            has_data=True,
197*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_py_struct_fmt:Hl3s",
198*61c4878aSAndroid Build Coastguard Worker            data=struct.pack("<Hl3s", 5, 2, b'abc'),
199*61c4878aSAndroid Build Coastguard Worker        )
200*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
201*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
202*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
203*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
204*61c4878aSAndroid Build Coastguard Worker            {
205*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
206*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
207*61c4878aSAndroid Build Coastguard Worker                "name": "counter",
208*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
209*61c4878aSAndroid Build Coastguard Worker                "s": "p",
210*61c4878aSAndroid Build Coastguard Worker                "args": {"data_0": 5, "data_1": 2, "data_2": 'abc'},
211*61c4878aSAndroid Build Coastguard Worker            },
212*61c4878aSAndroid Build Coastguard Worker        )
213*61c4878aSAndroid Build Coastguard Worker
214*61c4878aSAndroid Build Coastguard Worker    def test_generate_error_json_data_struct_invalid_small_buffer(self):
215*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
216*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
217*61c4878aSAndroid Build Coastguard Worker            module="module",
218*61c4878aSAndroid Build Coastguard Worker            label="counter",
219*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
220*61c4878aSAndroid Build Coastguard Worker            has_data=True,
221*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_py_struct_fmt:Hl",
222*61c4878aSAndroid Build Coastguard Worker            data=struct.pack("<H", 5),
223*61c4878aSAndroid Build Coastguard Worker        )
224*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
225*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
226*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
227*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
228*61c4878aSAndroid Build Coastguard Worker            {
229*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
230*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
231*61c4878aSAndroid Build Coastguard Worker                "name": "counter",
232*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
233*61c4878aSAndroid Build Coastguard Worker                "s": "p",
234*61c4878aSAndroid Build Coastguard Worker                "args": {
235*61c4878aSAndroid Build Coastguard Worker                    "error": f"Mismatched struct/data format {event.data_fmt} "
236*61c4878aSAndroid Build Coastguard Worker                    f"expected data len {struct.calcsize('<Hl')} data "
237*61c4878aSAndroid Build Coastguard Worker                    f"{event.data.hex()} data len {len(event.data)}"
238*61c4878aSAndroid Build Coastguard Worker                },
239*61c4878aSAndroid Build Coastguard Worker            },
240*61c4878aSAndroid Build Coastguard Worker        )
241*61c4878aSAndroid Build Coastguard Worker
242*61c4878aSAndroid Build Coastguard Worker    def test_generate_error_json_data_struct_invalid_large_buffer(self):
243*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
244*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
245*61c4878aSAndroid Build Coastguard Worker            module="module",
246*61c4878aSAndroid Build Coastguard Worker            label="counter",
247*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
248*61c4878aSAndroid Build Coastguard Worker            has_data=True,
249*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_py_struct_fmt:Hl",
250*61c4878aSAndroid Build Coastguard Worker            data=struct.pack("<Hll", 5, 2, 5),
251*61c4878aSAndroid Build Coastguard Worker        )
252*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
253*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
254*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
255*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
256*61c4878aSAndroid Build Coastguard Worker            {
257*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
258*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
259*61c4878aSAndroid Build Coastguard Worker                "name": "counter",
260*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
261*61c4878aSAndroid Build Coastguard Worker                "s": "p",
262*61c4878aSAndroid Build Coastguard Worker                "args": {
263*61c4878aSAndroid Build Coastguard Worker                    "error": f"Mismatched struct/data format {event.data_fmt} "
264*61c4878aSAndroid Build Coastguard Worker                    f"expected data len {struct.calcsize('<Hl')} data "
265*61c4878aSAndroid Build Coastguard Worker                    f"{event.data.hex()} data len {len(event.data)}"
266*61c4878aSAndroid Build Coastguard Worker                },
267*61c4878aSAndroid Build Coastguard Worker            },
268*61c4878aSAndroid Build Coastguard Worker        )
269*61c4878aSAndroid Build Coastguard Worker
270*61c4878aSAndroid Build Coastguard Worker    def test_generate_json_data_map_fmt_single(self):
271*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
272*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
273*61c4878aSAndroid Build Coastguard Worker            module="module",
274*61c4878aSAndroid Build Coastguard Worker            label="label",
275*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
276*61c4878aSAndroid Build Coastguard Worker            has_data=True,
277*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_py_map_fmt:{Field:l}",
278*61c4878aSAndroid Build Coastguard Worker            data=struct.pack("<l", 20),
279*61c4878aSAndroid Build Coastguard Worker        )
280*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
281*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
282*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
283*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
284*61c4878aSAndroid Build Coastguard Worker            {
285*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
286*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
287*61c4878aSAndroid Build Coastguard Worker                "name": "label",
288*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
289*61c4878aSAndroid Build Coastguard Worker                "s": "p",
290*61c4878aSAndroid Build Coastguard Worker                "args": {"Field": 20},
291*61c4878aSAndroid Build Coastguard Worker            },
292*61c4878aSAndroid Build Coastguard Worker        )
293*61c4878aSAndroid Build Coastguard Worker
294*61c4878aSAndroid Build Coastguard Worker    def test_generate_json_data_map_fmt_multi(self):
295*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
296*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
297*61c4878aSAndroid Build Coastguard Worker            module="module",
298*61c4878aSAndroid Build Coastguard Worker            label="label",
299*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
300*61c4878aSAndroid Build Coastguard Worker            has_data=True,
301*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_py_map_fmt:{Field: l, Field2: l , Field3: 3s}",
302*61c4878aSAndroid Build Coastguard Worker            data=struct.pack("<ll3s", 20, 40, b'abc'),
303*61c4878aSAndroid Build Coastguard Worker        )
304*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
305*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
306*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
307*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
308*61c4878aSAndroid Build Coastguard Worker            {
309*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
310*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
311*61c4878aSAndroid Build Coastguard Worker                "name": "label",
312*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
313*61c4878aSAndroid Build Coastguard Worker                "s": "p",
314*61c4878aSAndroid Build Coastguard Worker                "args": {"Field": 20, "Field2": 40, "Field3": 'abc'},
315*61c4878aSAndroid Build Coastguard Worker            },
316*61c4878aSAndroid Build Coastguard Worker        )
317*61c4878aSAndroid Build Coastguard Worker
318*61c4878aSAndroid Build Coastguard Worker    def test_generate_error_json_data_map_bad_fmt(self):
319*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
320*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
321*61c4878aSAndroid Build Coastguard Worker            module="module",
322*61c4878aSAndroid Build Coastguard Worker            label="label",
323*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
324*61c4878aSAndroid Build Coastguard Worker            has_data=True,
325*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_py_map_fmt:{Field;l,Field2;l}",
326*61c4878aSAndroid Build Coastguard Worker            data=struct.pack("<ll", 20, 40),
327*61c4878aSAndroid Build Coastguard Worker        )
328*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
329*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
330*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
331*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
332*61c4878aSAndroid Build Coastguard Worker            {
333*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
334*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
335*61c4878aSAndroid Build Coastguard Worker                "name": "label",
336*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
337*61c4878aSAndroid Build Coastguard Worker                "s": "p",
338*61c4878aSAndroid Build Coastguard Worker                "args": {"error": f"Invalid map format {event.data_fmt}"},
339*61c4878aSAndroid Build Coastguard Worker            },
340*61c4878aSAndroid Build Coastguard Worker        )
341*61c4878aSAndroid Build Coastguard Worker
342*61c4878aSAndroid Build Coastguard Worker    def test_generate_error_json_data_map_invalid_small_buffer(self):
343*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
344*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
345*61c4878aSAndroid Build Coastguard Worker            module="module",
346*61c4878aSAndroid Build Coastguard Worker            label="label",
347*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
348*61c4878aSAndroid Build Coastguard Worker            has_data=True,
349*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_py_map_fmt:{Field:l,Field2:l}",
350*61c4878aSAndroid Build Coastguard Worker            data=struct.pack("<l", 20),
351*61c4878aSAndroid Build Coastguard Worker        )
352*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
353*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
354*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
355*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
356*61c4878aSAndroid Build Coastguard Worker            {
357*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
358*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
359*61c4878aSAndroid Build Coastguard Worker                "name": "label",
360*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
361*61c4878aSAndroid Build Coastguard Worker                "s": "p",
362*61c4878aSAndroid Build Coastguard Worker                "args": {
363*61c4878aSAndroid Build Coastguard Worker                    "error": f"Mismatched map/data format {event.data_fmt} "
364*61c4878aSAndroid Build Coastguard Worker                    f"expected data len {struct.calcsize('<ll')} data "
365*61c4878aSAndroid Build Coastguard Worker                    f"{event.data.hex()} data len {len(event.data)}"
366*61c4878aSAndroid Build Coastguard Worker                },
367*61c4878aSAndroid Build Coastguard Worker            },
368*61c4878aSAndroid Build Coastguard Worker        )
369*61c4878aSAndroid Build Coastguard Worker
370*61c4878aSAndroid Build Coastguard Worker    def test_generate_error_json_data_map_invalid_large_buffer(self):
371*61c4878aSAndroid Build Coastguard Worker        event = trace.TraceEvent(
372*61c4878aSAndroid Build Coastguard Worker            event_type=trace.TraceType.INSTANTANEOUS,
373*61c4878aSAndroid Build Coastguard Worker            module="module",
374*61c4878aSAndroid Build Coastguard Worker            label="label",
375*61c4878aSAndroid Build Coastguard Worker            timestamp_us=10,
376*61c4878aSAndroid Build Coastguard Worker            has_data=True,
377*61c4878aSAndroid Build Coastguard Worker            data_fmt="@pw_py_map_fmt:{Field:H,Field2:H}",
378*61c4878aSAndroid Build Coastguard Worker            data=struct.pack("<ll", 20, 40),
379*61c4878aSAndroid Build Coastguard Worker        )
380*61c4878aSAndroid Build Coastguard Worker        json_lines = trace.generate_trace_json([event])
381*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(1, len(json_lines))
382*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
383*61c4878aSAndroid Build Coastguard Worker            json.loads(json_lines[0]),
384*61c4878aSAndroid Build Coastguard Worker            {
385*61c4878aSAndroid Build Coastguard Worker                "ph": "I",
386*61c4878aSAndroid Build Coastguard Worker                "pid": "module",
387*61c4878aSAndroid Build Coastguard Worker                "name": "label",
388*61c4878aSAndroid Build Coastguard Worker                "ts": 10,
389*61c4878aSAndroid Build Coastguard Worker                "s": "p",
390*61c4878aSAndroid Build Coastguard Worker                "args": {
391*61c4878aSAndroid Build Coastguard Worker                    "error": f"Mismatched map/data format {event.data_fmt} "
392*61c4878aSAndroid Build Coastguard Worker                    f"expected data len {struct.calcsize('<HH')} data "
393*61c4878aSAndroid Build Coastguard Worker                    f"{event.data.hex()} data len {len(event.data)}"
394*61c4878aSAndroid Build Coastguard Worker                },
395*61c4878aSAndroid Build Coastguard Worker            },
396*61c4878aSAndroid Build Coastguard Worker        )
397*61c4878aSAndroid Build Coastguard Worker
398*61c4878aSAndroid Build Coastguard Worker
399*61c4878aSAndroid Build Coastguard Workerif __name__ == '__main__':
400*61c4878aSAndroid Build Coastguard Worker    unittest.main()
401