X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/0c6d4ca0c33aa97202e0e94a4a2389cc432597bc..9ce100ba61b6738298d86818a3d0eee7b18bfed7:/fuzz.py diff --git a/fuzz.py b/fuzz.py index 604e6ce..f5f655e 100644 --- a/fuzz.py +++ b/fuzz.py @@ -5,10 +5,13 @@ generation. You can run this file with `python`, `pytest`, or (soon) a coverage-guided fuzzer I'm working on. """ +import re + import hypothesmith from hypothesis import HealthCheck, given, settings, strategies as st import black +from blib2to3.pgen2.tokenize import TokenError # This test uses the Hypothesis and Hypothesmith libraries to generate random @@ -29,7 +32,9 @@ import black black.FileMode, line_length=st.just(88) | st.integers(0, 200), string_normalization=st.booleans(), + preview=st.booleans(), is_pyi=st.booleans(), + magic_trailing_comma=st.booleans(), ), ) def test_idempotent_any_syntatically_valid_python( @@ -43,9 +48,19 @@ def test_idempotent_any_syntatically_valid_python( dst_contents = black.format_str(src_contents, mode=mode) except black.InvalidInput: # This is a bug - if it's valid Python code, as above, Black should be - # able to cope with it. See issues #970, #1012, #1358, and #1557. + # able to cope with it. See issues #970, #1012 # TODO: remove this try-except block when issues are resolved. return + except TokenError as e: + if ( # Special-case logic for backslashes followed by newlines or end-of-input + e.args[0] == "EOF in multi-line statement" + and re.search(r"\\($|\r?\n)", src_contents) is not None + ): + # This is a bug - if it's valid Python code, as above, Black should be + # able to cope with it. See issue #1012. + # TODO: remove this block when the issue is resolved. + return + raise # And check that we got equivalent and stable output. black.assert_equivalent(src_contents, dst_contents) @@ -56,4 +71,17 @@ def test_idempotent_any_syntatically_valid_python( if __name__ == "__main__": + # Run tests, including shrinking and reporting any known failures. test_idempotent_any_syntatically_valid_python() + + # If Atheris is available, run coverage-guided fuzzing. + # (if you want only bounded fuzzing, just use `pytest fuzz.py`) + try: + import sys + import atheris + except ImportError: + pass + else: + test = test_idempotent_any_syntatically_valid_python + atheris.Setup(sys.argv, test.hypothesis.fuzz_one_input) + atheris.Fuzz()