Esempio n. 1
0
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)