예제 #1
0
 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)
예제 #2
0
 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)))
예제 #3
0
 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)))
예제 #4
0
 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)
예제 #5
0
 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
예제 #6
0
    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/*'
                    ])
예제 #7
0
 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)))
예제 #8
0
 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)))
예제 #9
0
  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'))
예제 #10
0
 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)