X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/0c6d4ca0c33aa97202e0e94a4a2389cc432597bc..2116eca51f1108ebc924185c87bc363d8e0329b3:/fuzz.py

diff --git a/fuzz.py b/fuzz.py
index 604e6ce..a9ca8ef 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
@@ -46,6 +49,16 @@ def test_idempotent_any_syntatically_valid_python(
         # able to cope with it.  See issues #970, #1012, #1358, and #1557.
         # 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 +69,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()