mirror of
https://github.com/trailofbits/buttercup
synced 2026-06-21 14:11:39 +00:00
3c3ae36a11
* Use openlit <1.36.6 Openlit >=1.36.6 has a bug with langgraph instrumentation. Also add a test to seed-gen for when openlit is enabled * Link to issue * Fix CoverageBot.run_task and add test cases * Add setuptools as an explicit dependency This is because a transitive dependency via clusterfuzz depends on it * Appease ruff
84 lines
3.3 KiB
Python
84 lines
3.3 KiB
Python
"""Tests for the fuzzer runner module."""
|
|
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from buttercup.fuzzer_runner.runner import Conf, Runner
|
|
|
|
|
|
class TestRunner:
|
|
"""Tests for the Runner class."""
|
|
|
|
@patch("buttercup.fuzzer_runner.runner.patched_temp_dir")
|
|
@patch("buttercup.fuzzer_runner.runner.scratch_cwd")
|
|
@patch("os.makedirs")
|
|
def test_run_fuzzer_initializes_engine(self, mock_makedirs, mock_scratch_cwd, mock_patched_temp_dir):
|
|
"""Test run_fuzzer"""
|
|
from buttercup.common.types import FuzzConfiguration
|
|
from clusterfuzz._internal.bot.fuzzers.libFuzzer import engine as libfuzzer_engine
|
|
|
|
mock_patched_temp_dir.return_value.__enter__ = MagicMock()
|
|
mock_patched_temp_dir.return_value.__exit__ = MagicMock(return_value=False)
|
|
mock_scratch_cwd.return_value.__enter__ = MagicMock()
|
|
mock_scratch_cwd.return_value.__exit__ = MagicMock(return_value=False)
|
|
|
|
# Mock the engine methods that would fail without a real fuzzer binary
|
|
mock_opts = MagicMock()
|
|
mock_opts.corpus_dir = "/corpus"
|
|
mock_opts.arguments = []
|
|
mock_opts.strategies = []
|
|
|
|
mock_result = MagicMock()
|
|
mock_result.crashes = []
|
|
mock_result.logs = "test"
|
|
mock_result.stats = {}
|
|
mock_result.time_executed = 1.0
|
|
mock_result.timed_out = False
|
|
|
|
with (
|
|
patch.object(libfuzzer_engine.Engine, "prepare", return_value=mock_opts),
|
|
patch.object(libfuzzer_engine.Engine, "fuzz", return_value=mock_result),
|
|
):
|
|
conf = Conf(timeout=60)
|
|
runner = Runner(conf)
|
|
fuzzconf = FuzzConfiguration(
|
|
corpus_dir="/corpus",
|
|
target_path="/target",
|
|
engine="libfuzzer",
|
|
sanitizer="address",
|
|
)
|
|
|
|
result = runner.run_fuzzer(fuzzconf)
|
|
|
|
assert result.crashes == []
|
|
assert result.timed_out is False
|
|
|
|
@patch("buttercup.fuzzer_runner.runner.scratch_dir")
|
|
@patch("buttercup.fuzzer_runner.runner.patched_temp_dir")
|
|
@patch("buttercup.fuzzer_runner.runner.scratch_cwd")
|
|
def test_merge_corpus_initializes_engine(self, mock_scratch_cwd, mock_patched_temp_dir, mock_scratch_dir):
|
|
"""Test merge_corpus."""
|
|
from buttercup.common.types import FuzzConfiguration
|
|
from clusterfuzz._internal.bot.fuzzers.libFuzzer import engine as libfuzzer_engine
|
|
|
|
mock_patched_temp_dir.return_value.__enter__ = MagicMock()
|
|
mock_patched_temp_dir.return_value.__exit__ = MagicMock(return_value=False)
|
|
mock_scratch_cwd.return_value.__enter__ = MagicMock()
|
|
mock_scratch_cwd.return_value.__exit__ = MagicMock(return_value=False)
|
|
|
|
mock_td = MagicMock()
|
|
mock_td.path = "/tmp/scratch"
|
|
mock_scratch_dir.return_value.__enter__ = MagicMock(return_value=mock_td)
|
|
mock_scratch_dir.return_value.__exit__ = MagicMock(return_value=False)
|
|
|
|
with patch.object(libfuzzer_engine.Engine, "minimize_corpus"):
|
|
conf = Conf(timeout=60)
|
|
runner = Runner(conf)
|
|
fuzzconf = FuzzConfiguration(
|
|
corpus_dir="/corpus",
|
|
target_path="/target",
|
|
engine="libfuzzer",
|
|
sanitizer="address",
|
|
)
|
|
|
|
runner.merge_corpus(fuzzconf, "/output")
|