74 lines · python
1#!/usr/bin/env python32 3# Automatically formatted with yapf (https://github.com/google/yapf)4 5# Fake 'opt' program that can be made to crash on request. For testing6# the 'reduce_pipeline.py' automatic 'opt' NPM pipeline reducer.7 8import argparse9import os10import shutil11import signal12 13parser = argparse.ArgumentParser()14parser.add_argument("-passes", action="store", dest="passes", required=True)15parser.add_argument(16 "-print-pipeline-passes", dest="print_pipeline_passes", action="store_true"17)18parser.add_argument("-crash-seq", action="store", dest="crash_seq", required=True)19parser.add_argument("-o", action="store", dest="output")20parser.add_argument("input")21[args, unknown_args] = parser.parse_known_args()22 23# Expand pipeline if '-print-pipeline-passes'.24if args.print_pipeline_passes:25 if args.passes == "EXPAND_a_to_f":26 print("a,b,c,d,e,f")27 else:28 print(args.passes)29 exit(0)30 31# Parse '-crash-seq'.32crash_seq = []33tok = ""34for c in args.crash_seq:35 if c == ",":36 if tok != "":37 crash_seq.append(tok)38 tok = ""39 else:40 tok += c41if tok != "":42 crash_seq.append(tok)43print(crash_seq)44 45# Parse '-passes' and see if we need to crash.46tok = ""47for c in args.passes:48 if c == ",":49 if len(crash_seq) > 0 and crash_seq[0] == tok:50 crash_seq.pop(0)51 tok = ""52 elif c == "(":53 tok = ""54 elif c == ")":55 if len(crash_seq) > 0 and crash_seq[0] == tok:56 crash_seq.pop(0)57 tok = ""58 else:59 tok += c60if len(crash_seq) > 0 and crash_seq[0] == tok:61 crash_seq.pop(0)62 63# Copy input to output.64if args.output:65 shutil.copy(args.input, args.output)66 67# Crash if all 'crash_seq' passes occurred in right order.68if len(crash_seq) == 0:69 print("crash")70 os.kill(os.getpid(), signal.SIGKILL)71else:72 print("no crash")73 exit(0)74