#!/usr/bin/env python3 # Automatically formatted with yapf (https://github.com/google/yapf) # Fake 'opt' program that can be made to crash on request. For testing # the 'reduce_pipeline.py' automatic 'opt' NPM pipeline reducer. import argparse import os import shutil import signal parser = argparse.ArgumentParser() parser.add_argument("-passes", action="store", dest="passes", required=True) parser.add_argument( "-print-pipeline-passes", dest="print_pipeline_passes", action="store_true" ) parser.add_argument("-crash-seq", action="store", dest="crash_seq", required=True) parser.add_argument("-o", action="store", dest="output") parser.add_argument("input") [args, unknown_args] = parser.parse_known_args() # Expand pipeline if '-print-pipeline-passes'. if args.print_pipeline_passes: if args.passes == "EXPAND_a_to_f": print("a,b,c,d,e,f") else: print(args.passes) exit(0) # Parse '-crash-seq'. crash_seq = [] tok = "" for c in args.crash_seq: if c == ",": if tok != "": crash_seq.append(tok) tok = "" else: tok += c if tok != "": crash_seq.append(tok) print(crash_seq) # Parse '-passes' and see if we need to crash. tok = "" for c in args.passes: if c == ",": if len(crash_seq) > 0 and crash_seq[0] == tok: crash_seq.pop(0) tok = "" elif c == "(": tok = "" elif c == ")": if len(crash_seq) > 0 and crash_seq[0] == tok: crash_seq.pop(0) tok = "" else: tok += c if len(crash_seq) > 0 and crash_seq[0] == tok: crash_seq.pop(0) # Copy input to output. if args.output: shutil.copy(args.input, args.output) # Crash if all 'crash_seq' passes occurred in right order. if len(crash_seq) == 0: print("crash") os.kill(os.getpid(), signal.SIGKILL) else: print("no crash") exit(0)