From 61acfbda98e2d350c4516f2dae616b436d46c8b3 Mon Sep 17 00:00:00 2001 From: James Westman Date: Sat, 5 Jul 2025 16:26:26 -0500 Subject: [PATCH] fuzz: Add option for more complete testing Add a FUZZ_LEVEL environment variable that can be used to test the language server features under the fuzzer in addition to the compiler. It's not enabled by default, but can be useful to run locally. --- tests/fuzz.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/tests/fuzz.py b/tests/fuzz.py index 81a9058..6f1fb06 100644 --- a/tests/fuzz.py +++ b/tests/fuzz.py @@ -7,25 +7,28 @@ from blueprintcompiler.outputs.xml import XmlOutput sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) -from blueprintcompiler import decompiler, gir, parser, tokenizer, utils +from blueprintcompiler import gir, parser, tokenizer from blueprintcompiler.completions import complete from blueprintcompiler.errors import ( - CompileError, CompilerBugError, - MultipleErrors, PrintableError, ) -from blueprintcompiler.tokenizer import Token, TokenType, tokenize +from blueprintcompiler.lsp import LanguageServer + +fuzz_level = int(os.getenv("FUZZ_LEVEL") or "0") @PythonFuzz -def fuzz(buf): +def fuzz(buf: bytes): try: blueprint = buf.decode("ascii") tokens = tokenizer.tokenize(blueprint) ast, errors, warnings = parser.parse(tokens) + if fuzz_level >= 1: + assert_ast_doesnt_crash(blueprint, tokens, ast) + xml = XmlOutput() if errors is None and ast is not None: xml.emit(ast) @@ -37,6 +40,17 @@ def fuzz(buf): pass +def assert_ast_doesnt_crash(text, tokens, ast): + lsp = LanguageServer() + for i in range(len(text) + 1): + ast.get_docs(i) + for i in range(len(text) + 1): + list(complete(lsp, ast, tokens, i)) + for i in range(len(text) + 1): + ast.get_reference(i) + ast.get_document_symbols() + + if __name__ == "__main__": # Make sure Gtk 4.0 is accessible, otherwise every test will fail on that # and nothing interesting will be tested