diff --git a/Changelog.md b/Changelog.md index e863cd72..b55cc89a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,7 @@ All notable changes to this project will be documented here. ## [unreleased] - Remove support for python3.6 and add support for python3.10 (#399) +- Fix a bug in the java tester where errors were not reported (#401) - Add explicit namespaces to R test runner script so that test code will not interfere with result reporting (#407) ## [v2.2.1] diff --git a/server/autotest_server/testers/java/java_tester.py b/server/autotest_server/testers/java/java_tester.py index 5e5697e7..9222dff8 100644 --- a/server/autotest_server/testers/java/java_tester.py +++ b/server/autotest_server/testers/java/java_tester.py @@ -64,6 +64,25 @@ def _get_sources(self) -> Set: scripts = ":".join(self.specs["test_data", "script_files"] + [sources]) return {path for path in self._parse_file_paths(scripts) if os.path.splitext(path)[1] == ".java"} + def _parse_failure_error(self, failure, error): + """ + Return a dictionary containing a status and message for either a failure, error, or both. If both + an error and failure are present, the message includes information for both. + """ + result = {} + if failure and error: + failure_message = self._parse_failure_error(failure, None)["message"] + error_message = self._parse_failure_error(None, error)["message"] + result["status"] = "error" + result["message"] = "\n\n".join([error_message, failure_message]) + elif failure: + result["status"] = "failure" + result["message"] = f'{failure.attrib.get("type", "")}: {failure.attrib.get("message", "")}' + elif error: + result["status"] = "error" + result["message"] = f'{error.attrib.get("type", "")}: {error.attrib.get("message", "")}' + return result + def _parse_junitxml(self): """ Parse junit results and yield a hash containing result data for each testcase. @@ -78,11 +97,10 @@ def _parse_junitxml(self): result["name"] = "{}.{}".format(classname, testname) result["time"] = float(testcase.attrib.get("time", 0)) failure = testcase.find("failure") - if failure is not None: - result["status"] = "failure" - failure_type = failure.attrib.get("type", "") - failure_message = failure.attrib.get("message", "") - result["message"] = f"{failure_type}: {failure_message}" + error = testcase.find("error") + fe_result = self._parse_failure_error(failure, error) + if fe_result: + result.update(fe_result) else: result["status"] = "success" result["message"] = ""