def run_for_one_project(params): try: module, dataset_path, graphs_path, extra_requirements, use_fixed_version = params manager = RepositoryManager(module.repo.url, module.repo.fixed_commit, module.path) fixed_root = manager.clone_to(dataset_path, overwrite_if_exists=True) fixed_project = Project(fixed_root) logger.info(f"Fixed commit path {fixed_project.path}") fixed_project.create_venv(force_remove_previous=True) logger.info("Venv created") project = fixed_project if not use_fixed_version: buggy_root, buggy_hash = manager.clone_parent_to( dataset_path, overwrite_if_exists=True) buggy_project = Project(buggy_root) logger.info(f"Buggy commit path {buggy_project.path}") buggy_project.create_venv(force_remove_previous=True) merger = Merger(fixed_project, buggy_project) logger.info("Moving tests...") merger.move_test_from_fixed_to_buggy() project = buggy_project module_under_test = module.path revealing_test_cases = module.test_cases.where( TestCase.result == "revealed") revealing_node_ids = list( map(operator.attrgetter("node_id"), revealing_test_cases)) # revealing_node_ids = [] # for tc in module.test_cases.where(TestCase.result == "revealed"): # revealing_node_ids.append(tc.node_id) print("*" * 100) revealing_node_ids = " ".join(revealing_node_ids) test_suite_sizes = np.arange( start=1, stop=int(module.total_cases), step=2) + 1 test_suite_sizes = " ".join(map(str, test_suite_sizes)) code = project.run_command( f"python3 {combined_experiment_cli_path} --module={module_under_test} --revealing_node_ids {revealing_node_ids} --out={graphs_path} --test_suite_sizes {test_suite_sizes} --test_suite_coverages_count=20 --max_trace_size=10 ", extra_requirements=extra_requirements) except Exception as e: print(e)
try: fixed_root = manager.clone_to(dataset_path, overwrite_if_exists=False) buggy_root, buggy_hash = manager.clone_parent_to( dataset_path, overwrite_if_exists=True) except Exception as e: logger.log(e) continue repo.buggy_commit = buggy_hash fixed_project = Project(fixed_root, silence_output=silent) buggy_project = Project(buggy_root, silence_output=silent) logger.info(f"Fixed commit path {fixed_project.path}") logger.info(f"Buggy commit path {buggy_project.path}") fixed_project.create_venv(force_remove_previous=True) buggy_project.create_venv(force_remove_previous=True) logger.info("Venv created") fixed_failed_node_ids = fixed_project.run_tests_get_failed_node_ids( ) buggy_failed_node_ids_before_merge = buggy_project.run_tests_get_failed_node_ids( ) logger.info("Fixed commit failed node ids {node_ids}", node_ids=fixed_failed_node_ids) logger.info("Buggy commit failed node ids {node_ids}", node_ids=buggy_failed_node_ids_before_merge) logger.info("Moving tests...") merger = Merger(fixed_project, buggy_project)
extra_requirements = [ r.strip() for r in open("../requirements.txt").readlines() ] for manager in repo_managers: if repo_stats.is_repo_bad(manager) or repo_stats.is_repo_suspicious( manager): continue logger.info(manager) try: logger.info("Downloading...") repo_root = manager.clone_to(dataset_path, overwrite_if_exists=False) project = Project(repo_root) logger.info(f"Downloaded project to {project.path}") logger.info("Creating venv...") project.create_venv(force_remove_previous=False) if project.tests_fail(): logger.warning("Tests fail, marking repo as bad") repo_stats.mark_repo_as_bad(manager) elif project.tracing_fails(): logger.error( "Tests don't fail, but tracing does, marking repo as suspicious" ) repo_stats.mark_repo_as_suspicious(manager) # project.delete_from_disk() else: graphs_path = graphs_path_parent # / project.project_name project.run_command( f"python3 {mutation_experiment_path} --max_select=5 --min_pairs=5 --graphs_folder={graphs_path} --test_suite_sizes_count=20 --test_suite_coverages_count=20 --max_trace_size=10 --timeout={max_mutation_run_time}", extra_requirements=extra_requirements)