def analyse_p4_file(p4_file, pass_dir): p4_dmp_dir = f"dumps" p4_prune_dir = f"{p4_dmp_dir}/pruned" p4_passes = gen_p4_passes(P4C_BIN, p4_dmp_dir, p4_file) prune_files(p4_prune_dir, p4_passes) err = diff_files(p4_passes, pass_dir, p4_file) util.del_dir(p4_dmp_dir) return err
def main(args): # configure logging logging.basicConfig(filename=args.log_file, format="%(levelname)s:%(message)s", level=logging.INFO, filemode='w') stderr_log = logging.StreamHandler() stderr_log.setFormatter(logging.Formatter("%(levelname)s:%(message)s")) logging.getLogger().addHandler(stderr_log) if args.randomize_input: z3.set_param( "smt.phase_selection", 5, "smt.arith.random_initial_value", True, "sat.phase", "random", ) config = {} config["use_tofino"] = args.use_tofino if args.use_tofino: config["pipe_name"] = "Pipeline_ingress" config["ingress_var"] = "ingress" else: config["pipe_name"] = "ig" config["ingress_var"] = "ig" if args.p4_input: p4_input = Path(args.p4_input) out_base_dir = Path(args.out_dir) else: out_base_dir = Path(args.out_dir).joinpath("rnd_test") util.check_dir(out_base_dir) p4_input = out_base_dir.joinpath("rnd_test.p4") # generate a random program from scratch generate_random_prog(P4RANDOM_BIN, p4_input, config) if os.path.isfile(p4_input): out_dir = out_base_dir.joinpath(p4_input.stem) util.del_dir(out_dir) config["out_dir"] = out_dir config["p4_input"] = p4_input result = perform_blackbox_test(config) else: util.check_dir(out_base_dir) for p4_file in list(p4_input.glob("**/*.p4")): out_dir = out_base_dir.joinpath(p4_file.stem) util.del_dir(out_dir) config["out_dir"] = out_dir config["p4_input"] = p4_file result = perform_blackbox_test(config) sys.exit(result)
def main(args): if args.randomize_input: seed = int.from_bytes(os.getrandom(8), "big") z3.set_param( "smt.phase_selection", 5, "smt.random_seed", seed, "smt.arith.random_initial_value", True, "sat.phase", "random", ) config = {} config["arch"] = args.arch if config["arch"] == "tna": config["pipe_name"] = "pipe0_ingress" config["ingress_var"] = "ingress" elif config["arch"] == "v1model": config["pipe_name"] = "ig" config["ingress_var"] = "ig" elif config["arch"] == "psa": config["pipe_name"] = "ingress_ig" config["ingress_var"] = "ig" else: raise RuntimeError("Unsupported test arch \"%s\"!" % config["arch"]) if args.p4_input: p4_input = Path(args.p4_input) out_base_dir = Path(args.out_dir) else: out_base_dir = Path(args.out_dir).joinpath("rnd_test") util.check_dir(out_base_dir) p4_input = out_base_dir.joinpath("rnd_test.p4") # generate a random program from scratch generate_p4_prog(P4RANDOM_BIN, p4_input, config) if os.path.isfile(p4_input): out_dir = out_base_dir.joinpath(p4_input.stem) util.del_dir(out_dir) config["out_dir"] = out_dir config["p4_input"] = p4_input result = perform_blackbox_test(config) else: util.check_dir(out_base_dir) for p4_file in list(p4_input.glob("**/*.p4")): out_dir = out_base_dir.joinpath(p4_file.stem) util.del_dir(out_dir) config["out_dir"] = out_dir config["p4_input"] = p4_file result = perform_blackbox_test(config) sys.exit(result)
def main(args): p4_input = Path(args.p4_input) pass_dir = Path(args.pass_dir) p4c_bin = args.p4c_bin if os.path.isfile(p4_input): pass_dir = pass_dir.joinpath(p4_input.stem) util.del_dir(pass_dir) result = validate_translation(p4_input, pass_dir, p4c_bin) exit(result) else: util.check_dir(pass_dir) for p4_file in list(p4_input.glob("**/*.p4")): output_dir = pass_dir.joinpath(p4_file.stem) util.del_dir(output_dir) result = validate_translation(p4_file, output_dir, p4c_bin) exit(util.EXIT_SUCCESS)
def main(args): p4_input = Path(args.p4_input).resolve() pass_dir = Path(args.pass_dir) p4c_bin = args.p4c_bin allow_undef = args.allow_undef dunp_info = args.dunp_info if os.path.isfile(p4_input): pass_dir = pass_dir.joinpath(p4_input.stem) util.del_dir(pass_dir) result = validate_translation(p4_input, pass_dir, p4c_bin, allow_undef, dunp_info) sys.exit(result) elif os.path.isdir(p4_input): util.check_dir(pass_dir) for p4_file in list(p4_input.glob("**/*.p4")): output_dir = pass_dir.joinpath(p4_file.stem) util.del_dir(output_dir) validate_translation(p4_file, output_dir, p4c_bin, allow_undef) result = util.EXIT_SUCCESS else: log.error("Input file \"%s\" does not exist!", p4_input) result = util.EXIT_SUCCESS sys.exit(result)
def check(idx, config): test_id = generate_id() test_name = f"{test_id}_{idx}" dump_dir = OUTPUT_DIR.joinpath(f"dmp_{test_name}") util.check_dir(dump_dir) log_file = dump_dir.joinpath(f"{test_name}.log") p4_file = dump_dir.joinpath(f"{test_name}.p4") seed = int.from_bytes(os.getrandom(8), "big") log.info("Testing P4 program: %s - Seed: %s", p4_file.name, seed) # generate a random program result, p4_file = generate_p4_prog(P4RANDOM_BIN, p4_file, config, seed) if result.returncode != util.EXIT_SUCCESS: log.error("Failed generate P4 code!") dump_result(result, GENERATOR_BUG_DIR, p4_file) # reset the dump directory util.del_dir(dump_dir) return result.returncode # check compilation result = compile_p4_prog(config["compiler_bin"], p4_file, dump_dir) if result.returncode != util.EXIT_SUCCESS: if not is_known_bug(result): log.error("Failed to compile the P4 code!") log.error("Found a new bug!") dump_result(result, CRASH_BUG_DIR, p4_file) dump_file(CRASH_BUG_DIR, p4_file) if config["do_prune"]: info_file = CRASH_BUG_DIR.joinpath(f"{p4_file.stem}_info.json") info = validation.INFO # customize the main info with the new information info["compiler"] = str(config["compiler_bin"]) info["exit_code"] = result.returncode info["p4z3_bin"] = str(P4Z3_BIN) info["out_dir"] = str(CRASH_BUG_DIR) info["input_file"] = str(p4_file) info["allow_undef"] = False info["err_string"] = result.stderr.decode("utf-8") log.error("Dumping configuration to %s.", info_file) with open(info_file, 'w') as json_file: json.dump(info, json_file, indent=2, sort_keys=True) p4_cmd = f"{PRUNER_BIN} " p4_cmd += f"--config {info_file} " p4_cmd += f" {CRASH_BUG_DIR.joinpath(f'{p4_file.stem}.p4')} " log.error("Pruning P4 file with command %s ", p4_cmd) util.start_process(p4_cmd) # reset the dump directory util.del_dir(dump_dir) return result # check validation if config["do_validate"]: result = validate(dump_dir, p4_file, log_file, config) elif config["use_blackbox"]: result = run_p4_test(dump_dir, p4_file, log_file, config) # reset the dump directory util.del_dir(dump_dir) return result
def check(idx, config): test_id = generate_id() test_name = f"{test_id}_{idx}" dump_dir = OUTPUT_DIR.joinpath(f"dmp_{test_name}") util.check_dir(dump_dir) log_file = dump_dir.joinpath(f"{test_name}.log") p4_file = dump_dir.joinpath(f"{test_name}.p4") log.info("Testing p4 program %s", p4_file) # generate a random program result, p4_file = generate_p4_dump(P4RANDOM_BIN, p4_file, config) if result.returncode != util.EXIT_SUCCESS: log.error("Failed generate P4 code!") dump_result(result, GENERATOR_BUG_DIR, p4_file) # reset the dump directory util.del_dir(dump_dir) return result.returncode # check compilation if config["use_tofino"]: result = compile_p4_prog(TOFINO_BIN, p4_file, dump_dir) elif config["use_blackbox"]: result = compile_p4_prog(BLACKBOX_BIN, p4_file, dump_dir) else: result = compile_p4_prog(WHITEBOX_BIN, p4_file, dump_dir) if result.returncode != util.EXIT_SUCCESS: if not is_known_bug(result): log.error("Failed to compile the P4 code!") log.error("Found a new bug!") dump_result(result, CRASH_BUG_DIR, p4_file) dump_file(CRASH_BUG_DIR, p4_file) # reset the dump directory util.del_dir(dump_dir) return result # check validation if config["do_validate"]: result = validate(dump_dir, p4_file, log_file, config) # reset the dump directory util.del_dir(dump_dir) return result
def main(args): # configure logging logging.basicConfig(filename=args.log_file, format="%(levelname)s:%(message)s", level=logging.INFO, filemode='w') stderr_log = logging.StreamHandler() stderr_log.setFormatter(logging.Formatter("%(levelname)s:%(message)s")) logging.getLogger().addHandler(stderr_log) if args.randomize_input: seed = int.from_bytes(os.getrandom(8), "big") z3.set_param( "smt.phase_selection", 5, "smt.random_seed", seed, "smt.arith.random_initial_value", True, "sat.phase", "random", ) config = {} config["arch"] = args.arch if config["arch"] == "tna": config["pipe_name"] = "pipe0_ingress" config["ingress_var"] = "ingress" elif config["arch"] == "v1model": config["pipe_name"] = "ig" config["ingress_var"] = "ig" elif config["arch"] == "psa": config["pipe_name"] = "ingress_ig" config["ingress_var"] = "ig" else: raise RuntimeError("Unsupported test arch \"%s\"!" % config["arch"]) if args.p4_input: p4_input = Path(args.p4_input) out_base_dir = Path(args.out_dir) else: out_base_dir = Path(args.out_dir).joinpath("rnd_test") util.check_dir(out_base_dir) p4_input = out_base_dir.joinpath("rnd_test.p4") # generate a random program from scratch generate_p4_prog(P4RANDOM_BIN, p4_input, config) if os.path.isfile(p4_input): out_dir = out_base_dir.joinpath(p4_input.stem) util.del_dir(out_dir) config["out_dir"] = out_dir config["p4_input"] = p4_input result = perform_blackbox_test(config) else: util.check_dir(out_base_dir) for p4_file in list(p4_input.glob("**/*.p4")): out_dir = out_base_dir.joinpath(p4_file.stem) util.del_dir(out_dir) config["out_dir"] = out_dir config["p4_input"] = p4_file result = perform_blackbox_test(config) sys.exit(result)
def prep_test(p4_name, p4_dir=P4_DIR): p4_file = p4_dir.joinpath(p4_name) target_dir = TARGET_DIR.joinpath(p4_file.stem) util.del_dir(target_dir) util.check_dir(target_dir) return p4_file, target_dir