#!/usr/bin/env python3 import json import os import sys if sys.version_info[0] >= 3: unicode = str trace_file = None expand = False for i in sys.argv[1:]: if trace_file is None and not i.startswith('-'): trace_file = i continue if i in ['-e', '--expand']: expand = True assert trace_file is not None assert os.path.exists(trace_file) if expand: msg_args = ['STATUS', 'fff', 'fff;sss; SPACES !!! ', ' 42 space in string!', ' SPACES !!! '] else: msg_args = ['STATUS', 'fff', '${ASDF}', ' ${FOO} ${BAR}', ' SPACES !!! '] required_traces = [ { 'args': ['STATUS', 'JSON-V1 str', 'spaces'], 'cmd': 'message', 'line': 1, 'line_end': 5 }, { 'args': ['ASDF', 'fff', 'sss', ' SPACES !!! '], 'cmd': 'set', }, { 'args': ['FOO', '42'], 'cmd': 'set', }, { 'args': ['BAR', ' space in string!'], 'cmd': 'set', }, { 'args': msg_args, 'cmd': 'message', 'frame': 3 if expand else 2, 'global_frame': 3 if expand else 2 }, { 'args': ['STATUS', 'nested global_frame'], 'cmd': 'message', 'frame': 3, 'global_frame': 6 if expand else 5 }, { 'cmd': 'else', 'global_frame': 4 if expand else 3, 'line': 3 } ] def assert_fields_look_good(line): expected_fields = {'args', 'cmd', 'file', 'frame', 'global_frame','line', 'time'} if "line_end" in line: assert isinstance(line['line_end'], int) assert line['line'] != line['line_end'] expected_fields.add("line_end") assert set(line.keys()) == expected_fields assert isinstance(line['args'], list) assert isinstance(line['cmd'], unicode) assert isinstance(line['file'], unicode) assert isinstance(line['frame'], int) assert isinstance(line['global_frame'], int) assert isinstance(line['line'], int) assert isinstance(line['time'], float) with open(trace_file, 'r') as fp: # Check for version (must be the first document) vers = json.loads(fp.readline()) assert sorted(vers.keys()) == ['version'] assert sorted(vers['version'].keys()) == ['major', 'minor'] assert vers['version']['major'] == 1 assert vers['version']['minor'] == 2 for i in fp.readlines(): line = json.loads(i) assert_fields_look_good(line) for j in required_traces: # Compare the subset of required keys with line subset = { k: line[k] for k in j if k in line } if subset == j: required_traces.remove(j) assert not required_traces, ( "The following traces were expected to be part of the " "output but weren't", required_traces )