def setUp(self): self.temp_dir_obj = tempfile.TemporaryDirectory() workspace_path = os.path.join(self.temp_dir_obj.name, 'workspace') self.config = test_helpers.create_build_config( oss_fuzz_project_name=EXAMPLE_PROJECT, sanitizer=self.SANITIZER, language=self.LANGUAGE, workspace=workspace_path, pr_ref='refs/pull/1757/merge') self.workspace = test_helpers.create_workspace(workspace_path) shutil.copytree(TEST_DATA_PATH, workspace_path) test_helpers.patch_environ(self, runner=True)
def test_valid_commit(self): """Tests building fuzzers with valid inputs.""" config = test_helpers.create_build_config( oss_fuzz_project_name=EXAMPLE_PROJECT, project_repo_name='oss-fuzz', workspace=self.workspace, commit_sha='0b95fe1039ed7c38fea1f97078316bfc1030c523', base_commit='da0746452433dc18bae699e355a9821285d863c8', is_github=True) self.assertTrue(build_fuzzers.build_fuzzers(config)) self.assertTrue( os.path.exists(os.path.join(self.out_dir, EXAMPLE_BUILD_FUZZER)))
def test_valid_pull_request(self): """Tests building fuzzers with valid pull request.""" config = test_helpers.create_build_config( oss_fuzz_project_name=EXAMPLE_PROJECT, project_repo_name='oss-fuzz', workspace=self.workspace, pr_ref='refs/pull/1757/merge', base_ref='master', is_github=True) self.assertTrue(build_fuzzers.build_fuzzers(config)) self.assertTrue( os.path.exists(os.path.join(self.out_dir, EXAMPLE_BUILD_FUZZER)))
def _create_builder(self, tmp_dir): """Creates an InternalGithubBuilder and returns it.""" config = test_helpers.create_build_config( project_name=self.PROJECT_NAME, project_repo_name=self.PROJECT_REPO_NAME, workspace=tmp_dir, sanitizer=self.SANITIZER, commit_sha=self.COMMIT_SHA, pr_ref=self.PR_REF, is_github=True) ci_system = continuous_integration.get_ci(config) return build_fuzzers.Builder(config, ci_system)
def _create_builder(self, tmp_dir, oss_fuzz_project_name='myproject'): """Creates an InternalGithubBuilder and returns it.""" config = test_helpers.create_build_config( oss_fuzz_project_name=oss_fuzz_project_name, project_repo_name=self.PROJECT_REPO_NAME, workspace=tmp_dir, sanitizer=self.SANITIZER, git_sha=self.GIT_SHA, pr_ref=self.PR_REF, cfl_platform='github') cfl_platform = continuous_integration.get_ci(config) builder = build_fuzzers.Builder(config, cfl_platform) builder.repo_manager = repo_manager.RepoManager('/fake') return builder
def test_coverage_report(self, _): """Tests generation of coverage reports end-to-end, from building to generation.""" with tempfile.TemporaryDirectory() as workspace: try: # Do coverage build. build_config = test_helpers.create_build_config( oss_fuzz_project_name=EXAMPLE_PROJECT, project_repo_name='oss-fuzz', workspace=workspace, commit_sha='0b95fe1039ed7c38fea1f97078316bfc1030c523', base_commit='da0746452433dc18bae699e355a9821285d863c8', sanitizer=self.SANITIZER, is_github=True) self.assertTrue(build_fuzzers.build_fuzzers(build_config)) # Generate report. run_config = test_helpers.create_run_config( fuzz_seconds=FUZZ_SECONDS, workspace=workspace, oss_fuzz_project_name=EXAMPLE_PROJECT, sanitizer=self.SANITIZER, run_fuzzers_mode='coverage', is_github=True, # Set build integration path so it's not internal. build_integration_path='/') result = run_fuzzers.run_fuzzers(run_config) self.assertEqual(result, run_fuzzers.RunFuzzersResult.NO_BUG_FOUND) expected_summary_path = os.path.join( TEST_DATA_PATH, 'example_coverage_report_summary.json') with open(expected_summary_path) as file_handle: expected_summary = json.loads(file_handle.read()) actual_summary_path = os.path.join(workspace, 'cifuzz-coverage', 'report', 'linux', 'summary.json') with open(actual_summary_path) as file_handle: actual_summary = json.loads(file_handle.read()) self.assertEqual(expected_summary, actual_summary) finally: # If we don't do this, there will be an exception when the temporary # directory is deleted because there are files there that are only # writeable by root. if os.listdir(workspace): helper.docker_run([ '-v', f'{workspace}:/workspace', '-t', docker.BASE_RUNNER_TAG, '/bin/bash', '-c', 'rm -rf /workspace/*' ])
def test_external_github_project(self): """Tests building fuzzers from an external project on Github.""" project_repo_name = 'external-project' git_url = 'https://github.com/jonathanmetzman/cifuzz-external-example.git' # This test is dependant on the state of # github.com/jonathanmetzman/cifuzz-external-example. config = test_helpers.create_build_config( project_repo_name=project_repo_name, workspace=self.workspace, git_url=git_url, commit_sha='HEAD', is_github=True, base_commit='HEAD^1') self.assertTrue(build_fuzzers.build_fuzzers(config)) self.assertTrue( os.path.exists(os.path.join(self.out_dir, EXAMPLE_BUILD_FUZZER)))
def test_external_generic_project(self): """Tests building fuzzers from an external project not on Github.""" project_repo_name = 'cifuzz-external-example' git_url = 'https://github.com/jonathanmetzman/cifuzz-external-example.git' # This test is dependant on the state of # github.com/jonathanmetzman/cifuzz-external-example. manager = repo_manager.clone_repo_and_get_manager( 'https://github.com/jonathanmetzman/cifuzz-external-example', self.temp_dir_obj.name) project_src_path = manager.repo_dir config = test_helpers.create_build_config( project_repo_name=project_repo_name, workspace=self.workspace, git_url=git_url, commit_sha='HEAD', project_src_path=project_src_path, base_commit='HEAD^1') self.assertTrue(build_fuzzers.build_fuzzers(config)) self.assertTrue( os.path.exists(os.path.join(self.out_dir, EXAMPLE_BUILD_FUZZER)))
def test_cifuzz_env_var(self, mocked_docker_run, _, __, ___): """Tests that the CIFUZZ env var is set.""" with tempfile.TemporaryDirectory() as tmp_dir: build_fuzzers.build_fuzzers( test_helpers.create_build_config(project_name=EXAMPLE_PROJECT, project_repo_name=EXAMPLE_PROJECT, workspace=tmp_dir, pr_ref='refs/pull/1757/merge')) docker_run_command = mocked_docker_run.call_args_list[0][0][0] def command_has_env_var_arg(command, env_var_arg): for idx, element in enumerate(command): if idx == 0: continue if element == env_var_arg and command[idx - 1] == '-e': return True return False self.assertTrue(command_has_env_var_arg(docker_run_command, 'CIFUZZ=True'))
def _create_config(cls, tmp_dir, sanitizer): return test_helpers.create_build_config(project_name=cls.PROJECT_NAME, project_repo_name=cls.PROJECT_NAME, workspace=tmp_dir, pr_ref=cls.PR_REF, sanitizer=sanitizer)