#! /usr/bin/env python3 # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 # Set emacs mode to Python # -*- mode: Python;-*- """Compare make-trace output ignoring known variations in cbmc output.""" import json import arguments def parse_arguments(): """Parse command line arguments""" description = 'Compare make-trace output ignoring known variations in cbmc output.' options = [ {'flag': 'TRACE1', 'help': 'make-trace output'}, {'flag': 'TRACE2', 'help': 'make-trace output'}, ] args = arguments.create_parser(options, description).parse_args() arguments.configure_logging(args) return args def clean_step_detail(detail): """Clean up step details.""" for key in ["lhs-lexical-scope", "rhs-binary", "rhs-value"]: if key in detail: del detail[key] return detail def clean_step(step): """Clean up a step.""" step["detail"] = clean_step_detail(step["detail"]) return step def clean_trace(trace): """Clean up a trace.""" return [clean_step(step) for step in trace] def clean_traces(data): """Clean up traces in output of make-traces.""" data["viewer-trace"]["traces"] = { name: clean_trace(trace) for name, trace in data["viewer-trace"]["traces"].items() } return data def main(): """Compare make-trace output.""" args = parse_arguments() with open(args.TRACE1, encoding='utf-8') as handle: trace1 = clean_traces(json.load(handle)) with open(args.TRACE2, encoding='utf-8') as handle: trace2 = clean_traces(json.load(handle)) with open('/tmp/trace1.json', "w", encoding='utf-8') as handle: json.dump(trace1, handle, indent=2) with open('/tmp/trace2.json', "w", encoding='utf-8') as handle: json.dump(trace2, handle, indent=2) if trace1 != trace2: raise UserWarning( f"make-trace output differs: {args.TRACE1} {args.TRACE2}" ) if __name__ == "__main__": main()