From decb27b9192a7bbcd7ea80c9d0b659b8c9d6526a Mon Sep 17 00:00:00 2001 From: aseembits93 Date: Fri, 6 Feb 2026 14:25:16 -0800 Subject: [PATCH] fix: correct return value order in Java test_runner for coverage The Java test_runner was returning (result_xml_path, result, sqlite_db_path, coverage_xml_path) but the caller expected coverage_database_file to be the JaCoCo XML path, not the SQLite path. This caused the XML parser to fail with "syntax error: line 1, column 0" when trying to parse a SQLite database as XML. Also added improved logging and error handling for JaCoCo coverage parsing. Co-Authored-By: Claude Opus 4.5 --- codeflash/languages/java/test_runner.py | 29 ++++++++++++++++++++++-- codeflash/verification/coverage_utils.py | 22 ++++++++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/codeflash/languages/java/test_runner.py b/codeflash/languages/java/test_runner.py index 56f2e9d40..f7a097721 100644 --- a/codeflash/languages/java/test_runner.py +++ b/codeflash/languages/java/test_runner.py @@ -309,8 +309,33 @@ def run_behavioral_tests( surefire_dir = target_dir / "surefire-reports" result_xml_path = _get_combined_junit_xml(surefire_dir, candidate_index) - # Return coverage_xml_path as the fourth element when coverage is enabled - return result_xml_path, result, sqlite_db_path, coverage_xml_path + # Debug: Log Maven result and coverage file status + if enable_coverage: + logger.info(f"Maven verify completed with return code: {result.returncode}") + if result.returncode != 0: + logger.warning(f"Maven verify had non-zero return code: {result.returncode}. Coverage data may be incomplete.") + + # Log coverage file status after Maven verify + if enable_coverage and coverage_xml_path: + jacoco_exec_path = target_dir / "jacoco.exec" + logger.info(f"Coverage paths - target_dir: {target_dir}, coverage_xml_path: {coverage_xml_path}") + if jacoco_exec_path.exists(): + logger.info(f"JaCoCo exec file exists: {jacoco_exec_path} ({jacoco_exec_path.stat().st_size} bytes)") + else: + logger.warning(f"JaCoCo exec file not found: {jacoco_exec_path} - JaCoCo agent may not have run") + if coverage_xml_path.exists(): + file_size = coverage_xml_path.stat().st_size + logger.info(f"JaCoCo XML report exists: {coverage_xml_path} ({file_size} bytes)") + if file_size == 0: + logger.warning(f"JaCoCo XML report is empty - report generation may have failed") + else: + logger.warning(f"JaCoCo XML report not found: {coverage_xml_path} - verify phase may not have completed") + + # Return tuple matching the expected signature: + # (result_xml_path, run_result, coverage_database_file, coverage_config_file) + # For Java: coverage_database_file is the jacoco.xml path, coverage_config_file is not used (None) + # The sqlite_db_path is used internally for behavior capture but doesn't need to be returned + return result_xml_path, result, coverage_xml_path, None def _compile_tests( diff --git a/codeflash/verification/coverage_utils.py b/codeflash/verification/coverage_utils.py index 4025a0452..c73c7982f 100644 --- a/codeflash/verification/coverage_utils.py +++ b/codeflash/verification/coverage_utils.py @@ -206,14 +206,32 @@ def load_from_jacoco_xml( """ if not jacoco_xml_path or not jacoco_xml_path.exists(): - logger.debug(f"JaCoCo XML file not found: {jacoco_xml_path}") + logger.warning(f"JaCoCo XML file not found at path: {jacoco_xml_path}") + return CoverageData.create_empty(source_code_path, function_name, code_context) + + # Log file info for debugging + file_size = jacoco_xml_path.stat().st_size + logger.info(f"Parsing JaCoCo XML file: {jacoco_xml_path} (size: {file_size} bytes)") + + if file_size == 0: + logger.warning(f"JaCoCo XML file is empty: {jacoco_xml_path}") return CoverageData.create_empty(source_code_path, function_name, code_context) try: tree = ET.parse(jacoco_xml_path) root = tree.getroot() except ET.ParseError as e: - logger.warning(f"Failed to parse JaCoCo XML file: {e}") + # Log detailed debugging info + try: + with jacoco_xml_path.open(encoding="utf-8") as f: + content_preview = f.read(500) + logger.warning( + f"Failed to parse JaCoCo XML file at '{jacoco_xml_path}' " + f"(size: {file_size} bytes, exists: {jacoco_xml_path.exists()}): {e}. " + f"File preview: {content_preview!r}" + ) + except Exception as read_err: + logger.warning(f"Failed to parse JaCoCo XML file at '{jacoco_xml_path}': {e}. Could not read file: {read_err}") return CoverageData.create_empty(source_code_path, function_name, code_context) # Determine expected source file name from path