From 71842231bb13da5ceebb679d088ba493d72689bb Mon Sep 17 00:00:00 2001 From: Konstantin Goncharik Date: Thu, 4 Sep 2025 22:57:02 +0700 Subject: [PATCH] fix chaotic: format golden_test/output before comparing Now we run clang-format on both sides of diff Its prevents problems due to clang-format version changes Fixes #1024 --- chaotic/golden_tests/CMakeLists.txt | 9 +++- chaotic/golden_tests/scripts/compare.py | 59 +++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 chaotic/golden_tests/scripts/compare.py diff --git a/chaotic/golden_tests/CMakeLists.txt b/chaotic/golden_tests/CMakeLists.txt index d0146a0205b9..afeb1f73d640 100644 --- a/chaotic/golden_tests/CMakeLists.txt +++ b/chaotic/golden_tests/CMakeLists.txt @@ -19,9 +19,14 @@ userver_target_generate_chaotic( RELATIVE_TO "${CMAKE_CURRENT_SOURCE_DIR}" ) -add_test(NAME chaotic-golden COMMAND # Diff returns 0 if files are the same, 1 if they differ - diff -uNrpB "${CMAKE_CURRENT_SOURCE_DIR}/output" "${CMAKE_CURRENT_BINARY_DIR}/src" +add_test( + NAME chaotic-golden + COMMAND "${USERVER_CHAOTIC_PYTEST_PYTHON_BINARY}" + "${CMAKE_CURRENT_SOURCE_DIR}/scripts/compare.py" + --golden-dir "${CMAKE_CURRENT_SOURCE_DIR}/output" + --generated-dir "${CMAKE_CURRENT_BINARY_DIR}/src" ) + add_custom_target( update-golden-tests DEPENDS ${PROJECT_NAME}-chgen diff --git a/chaotic/golden_tests/scripts/compare.py b/chaotic/golden_tests/scripts/compare.py new file mode 100644 index 000000000000..d33ca567d503 --- /dev/null +++ b/chaotic/golden_tests/scripts/compare.py @@ -0,0 +1,59 @@ +import argparse +import os +import shutil +import subprocess +import sys +import tempfile + + +def check_binary_available(binary_name): + try: # Pass version arg to expect any "wait for input" situations + subprocess.run([binary_name, '--version'], capture_output=True, check=True) + return True + except (subprocess.CalledProcessError, FileNotFoundError): + return False + + +def main(): + parser = argparse.ArgumentParser(description='Compare formatted source files.') + parser.add_argument('--golden-dir', required=True, help='Golden directory (e.g., ${CMAKE_CURRENT_SOURCE_DIR}/output)') + parser.add_argument('--generated-dir', required=True, help='Generated directory (e.g., ${CMAKE_CURRENT_BINARY_DIR}/src)') + args = parser.parse_args() + + if not check_binary_available('clang-format'): + print("Error: clang-format is not available in PATH", file=sys.stderr) + sys.exit(1) + + if not check_binary_available('diff'): + print("Error: diff is not available in PATH", file=sys.stderr) + sys.exit(1) + + # Create temporary directory in /tmp/ + with tempfile.TemporaryDirectory() as tmpdir: + golden_copy = os.path.join(tmpdir, 'golden') + generated_copy = os.path.join(tmpdir, 'generated') + shutil.copytree(args.golden_dir, golden_copy) + shutil.copytree(args.generated_dir, generated_copy) + + extensions = ('.hpp', '.cpp', '.ipp') + for root, _, files in os.walk(tmpdir): + for file in files: + if file.lower().endswith(extensions): + file_path = os.path.join(root, file) + subprocess.run(['clang-format', '-i', file_path], check=True) + + result = subprocess.run([ + 'diff', '-uNrpB', + golden_copy, + generated_copy + ], capture_output=True, text=True) + + if result.returncode != 0: + print(result.stdout) + print(result.stderr, file=sys.stderr) + + sys.exit(result.returncode) # Diff returns 0 if files are the same, 1 if they differ + + +if __name__ == '__main__': + main()