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