1#!/usr/bin/env python3
2
3import json
4import os
5import sys
6
7if sys.version_info[0] >= 3:
8    unicode = str
9
10trace_file = None
11expand = False
12
13for i in sys.argv[1:]:
14    if trace_file is None and not i.startswith('-'):
15        trace_file = i
16        continue
17
18    if i in ['-e', '--expand']:
19        expand = True
20
21assert trace_file is not None
22assert os.path.exists(trace_file)
23
24if expand:
25    msg_args = ['STATUS', 'fff', 'fff;sss;  SPACES !!!  ', ' 42  space in string!', '  SPACES !!!  ']
26else:
27    msg_args = ['STATUS', 'fff', '${ASDF}', ' ${FOO} ${BAR}', '  SPACES !!!  ']
28
29required_traces = [
30    {
31        'args': ['STATUS', 'JSON-V1 str', 'spaces'],
32        'cmd': 'message',
33    },
34    {
35        'args': ['ASDF', 'fff', 'sss', '  SPACES !!!  '],
36        'cmd': 'set',
37    },
38    {
39        'args': ['FOO', '42'],
40        'cmd': 'set',
41    },
42    {
43        'args': ['BAR', ' space in string!'],
44        'cmd': 'set',
45    },
46    {
47        'args': msg_args,
48        'cmd': 'message',
49        'frame': 3 if expand else 2
50    },
51]
52
53with open(trace_file, 'r') as fp:
54    # Check for version (must be the first document)
55    vers = json.loads(fp.readline())
56    assert sorted(vers.keys()) == ['version']
57    assert sorted(vers['version'].keys()) == ['major', 'minor']
58    assert vers['version']['major'] == 1
59    assert vers['version']['minor'] == 1
60
61    for i in fp.readlines():
62        line = json.loads(i)
63        assert sorted(line.keys()) == ['args', 'cmd', 'file', 'frame', 'line', 'time']
64        assert isinstance(line['args'], list)
65        assert isinstance(line['cmd'], unicode)
66        assert isinstance(line['file'], unicode)
67        assert isinstance(line['frame'], int)
68        assert isinstance(line['line'], int)
69        assert isinstance(line['time'], float)
70
71        for j in required_traces:
72            # Compare the subset of required keys with line
73            if {k: line[k] for k in j} == j:
74                required_traces.remove(j)
75
76assert not required_traces
77