| #!/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 |
| ) |