Files
Ronald Eytchison 3c3ae36a11 Fix fuzzer-runner missing transitive dependency and add tests (#459)
* 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
2026-01-27 23:13:53 +01:00

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")