From 989ae1ac03e25a5ce51d4c615128dcf75b9e24f5 Mon Sep 17 00:00:00 2001 From: David Lakin Date: Wed, 8 May 2024 19:28:29 -0400 Subject: [PATCH] Read class properties & call methods to cover more features Property access and private methods on the `Diff` class are complex and involve encoding and decoding operations that warrant being tested. This test borrows its design from the `test_diff.py` unit test file. --- fuzzing/fuzz-targets/fuzz_diff.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/fuzzing/fuzz-targets/fuzz_diff.py b/fuzzing/fuzz-targets/fuzz_diff.py index cf01e7ffa..ba44995f2 100644 --- a/fuzzing/fuzz-targets/fuzz_diff.py +++ b/fuzzing/fuzz-targets/fuzz_diff.py @@ -1,5 +1,6 @@ import sys import os +import io import tempfile from binascii import Error as BinasciiError @@ -13,13 +14,26 @@ from git import Repo, Diff +class BytesProcessAdapter: + """Allows bytes to be used as process objects returned by subprocess.Popen.""" + + def __init__(self, input_string): + self.stdout = io.BytesIO(input_string) + self.stderr = io.BytesIO() + + def wait(self): + return 0 + + poll = wait + + def TestOneInput(data): fdp = atheris.FuzzedDataProvider(data) with tempfile.TemporaryDirectory() as temp_dir: repo = Repo.init(path=temp_dir) try: - Diff( + diff = Diff( repo, a_rawpath=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())), b_rawpath=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())), @@ -44,6 +58,21 @@ def TestOneInput(data): else: raise e + _ = diff.__str__() + _ = diff.a_path + _ = diff.b_path + _ = diff.rename_from + _ = diff.rename_to + _ = diff.renamed_file + + diff_index = diff._index_from_patch_format( + repo, proc=BytesProcessAdapter(fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes()))) + ) + + diff._handle_diff_line( + lines_bytes=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())), repo=repo, index=diff_index + ) + def main(): atheris.Setup(sys.argv, TestOneInput)