def test_generate_blackbox_fuzzers(self):
        """Test generate_blackbox_fuzzers (success)."""
        output = ('metadata::fuzzer_binary_name: fuzzer_binary_name\n')
        self.mock.run.side_effect = functools.partial(_mock_fuzzer_run, output,
                                                      4, 'corpus_dir')

        self.assertTrue(setup.update_fuzzer_and_data_bundles('libFuzzer'))

        session = fuzz_task.FuzzingSession('libFuzzer', 'job', 1)
        session.testcase_directory = '/output'
        session.data_directory = '/input'

        (error_occurred, testcase_file_paths, sync_corpus_directory,
         fuzzer_metadata) = session.generate_blackbox_testcases(
             self.fuzzer, self.fuzzer_directory, 4)
        self.assertEqual(1, len(self.mock.run.call_args_list))
        self.assertEqual(('/input', '/output', 4),
                         self.mock.run.call_args[0][1:])

        self.assertFalse(error_occurred)
        self.assertItemsEqual([
            '/output/fuzz-0',
            '/output/fuzz-1',
            '/output/fuzz-2',
            '/output/fuzz-3',
        ], testcase_file_paths)

        self.assertEqual('corpus_dir', sync_corpus_directory)
        self.assertDictEqual({'fuzzer_binary_name': 'fuzzer_binary_name'},
                             fuzzer_metadata)
Beispiel #2
0
    def test_generate_blackbox_fuzzers(self):
        """Test generate_blackbox_fuzzers (success)."""
        output = "metadata::fuzzer_binary_name: fuzzer_binary_name\n"
        self.mock.run.side_effect = functools.partial(_mock_fuzzer_run, output,
                                                      4, "corpus_dir")

        self.assertTrue(setup.update_fuzzer_and_data_bundles("libFuzzer"))

        session = fuzz_task.FuzzingSession("libFuzzer", "job", 1)
        session.testcase_directory = "/output"
        session.data_directory = "/input"

        (
            error_occurred,
            testcase_file_paths,
            sync_corpus_directory,
            fuzzer_metadata,
        ) = session.generate_blackbox_testcases(self.fuzzer,
                                                self.fuzzer_directory, 4)
        self.assertEqual(1, len(self.mock.run.call_args_list))
        self.assertEqual(("/input", "/output", 4),
                         self.mock.run.call_args[0][1:])

        self.assertFalse(error_occurred)
        self.assertItemsEqual(
            [
                "/output/fuzz-0", "/output/fuzz-1", "/output/fuzz-2",
                "/output/fuzz-3"
            ],
            testcase_file_paths,
        )

        self.assertEqual("corpus_dir", sync_corpus_directory)
        self.assertDictEqual({"fuzzer_binary_name": "fuzzer_binary_name"},
                             fuzzer_metadata)
Beispiel #3
0
  def test_generate_blackbox_fuzzers_fail(self):
    """Test generate_blackbox_fuzzers (failure)."""
    self.mock.run.side_effect = builtin.BuiltinFuzzerException()
    self.assertTrue(setup.update_fuzzer_and_data_bundles('libFuzzer'))

    session = fuzz_task.FuzzingSession('libFuzzer', 'job', 1)
    session.testcase_directory = '/output'
    session.data_directory = '/input'

    with self.assertRaises(builtin.BuiltinFuzzerException):
      session.generate_blackbox_testcases(self.fuzzer, self.fuzzer_directory, 4)
  def test_basic(self):
    """Test basic fuzzing session."""
    session = fuzz_task.FuzzingSession('libFuzzer', 'libfuzzer_asan_test', 60)
    session.testcase_directory = os.environ['FUZZ_INPUTS']
    session.data_directory = '/data_dir'

    os.environ['FUZZ_TARGET'] = 'test_target'
    os.environ['APP_REVISION'] = '1'

    expected_crashes = [engine.Crash('/input', 'stack', ['args'], 1.0)]

    engine_impl = mock.Mock()
    engine_impl.name = 'libFuzzer'
    engine_impl.prepare.return_value = engine.FuzzOptions(
        '/corpus', ['arg'], ['strategy_1', 'strategy_2'])
    engine_impl.fuzz.return_value = engine.Result(
        'logs', ['cmd'], expected_crashes, {'stat': 1}, 42.0)

    crashes, fuzzer_metadata = session.do_engine_fuzzing(engine_impl)
    self.assertDictEqual({
        'issue_components': 'component1,component2',
        'issue_labels': 'label1,label2',
        'issue_owners': '*****@*****.**',
    }, fuzzer_metadata)

    log_time = datetime.datetime(1970, 1, 1, 0, 0)
    self.mock.upload_log.assert_called_with(
        'Component revisions (build r1):\n'
        'component: rev\n\n'
        'Return code: 1\n\n'
        'Command: cmd\nBot: None\nTime ran: 42.0\n\n'
        'logs\n'
        'cf::fuzzing_strategies: strategy_1,strategy_2', log_time)
    self.mock.upload_testcase.assert_called_with('/input', log_time)

    self.assertEqual(1, len(crashes))
    self.assertEqual('/input', crashes[0].file_path)
    self.assertEqual(1, crashes[0].return_code)
    self.assertEqual('stack', crashes[0].unsymbolized_crash_stacktrace)
    self.assertEqual(1.0, crashes[0].crash_time)
    self.assertListEqual(['test_target', 'args'], crashes[0].arguments)
    upload_args = self.mock.upload_stats.call_args[0][0]
    testcase_run = upload_args[0]
    self.assertDictEqual({
        'build_revision': 1,
        'command': ['cmd'],
        'fuzzer': u'libFuzzer_test_target',
        'job': 'libfuzzer_asan_test',
        'kind': 'TestcaseRun',
        'stat': 1,
        'timestamp': 0.0,
    }, testcase_run.data)