Merge topic 'trace_json_timestamp'

c829f0cfca trace: Add time and stack level to JSON output format

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Volo Zyko <volo.zyko@gmail.com>
Merge-request: !4242
This commit is contained in:
Brad King
2020-01-24 14:19:46 +00:00
committed by Kitware Robot
3 changed files with 22 additions and 7 deletions

View File

@@ -279,7 +279,9 @@ Options
"file": "/full/path/to/the/CMake/file.txt",
"line": 0,
"cmd": "add_executable",
"args": ["foo", "bar"]
"args": ["foo", "bar"],
"time": 1579512535.9687231,
"frame": 2
}
The members are:
@@ -288,8 +290,8 @@ Options
The full path to the CMake source file where the function
was called.
``line``
The line in `file` of the function call.
``line``
The line in ``file`` of the function call.
``cmd``
The name of the function that was called.
@@ -297,6 +299,12 @@ Options
``args``
A string list of all function parameters.
``time``
Timestamp (seconds since epoch) of the function call.
``frame``
Stack frame depth of the function that was called.
Additionally, the first JSON document outputted contains the
``version`` key for the current major and minor version of the

View File

@@ -340,6 +340,9 @@ void cmMakefile::PrintCommandTrace(const cmListFileFunction& lff) const
for (std::string const& arg : args) {
val["args"].append(arg);
}
val["time"] = cmSystemTools::GetTime();
val["frame"] =
static_cast<std::uint64_t>(this->ExecutionStatusStack.size());
msg << Json::writeString(builder, val);
#endif
break;

View File

@@ -46,6 +46,7 @@ required_traces = [
{
'args': msg_args,
'cmd': 'message',
'frame': 3 if expand else 2
},
]
@@ -59,14 +60,17 @@ with open(trace_file, 'r') as fp:
for i in fp.readlines():
line = json.loads(i)
assert sorted(line.keys()) == ['args', 'cmd', 'file', 'line']
assert sorted(line.keys()) == ['args', 'cmd', 'file', 'frame', 'line', 'time']
assert isinstance(line['args'], list)
assert isinstance(line['cmd'], unicode)
assert isinstance(line['file'], unicode)
assert isinstance(line['frame'], int)
assert isinstance(line['line'], int)
assert isinstance(line['time'], float)
for j in required_traces:
if j['cmd'] == line['cmd'] and j['args'] == line['args']:
j['found'] = True
# Compare the subset of required keys with line
if {k: line[k] for k in j} == j:
required_traces.remove(j)
assert all([x.get('found', False) == True for x in required_traces])
assert not required_traces