diff --git a/main.py b/main.py index a4c4977..25c91e1 100644 --- a/main.py +++ b/main.py @@ -19,19 +19,21 @@ def main(cpp_driver_dir: str, scylla_install_dir: str, driver_type: str, version for version in versions: logging.info(f'=== {driver_type.upper()} CPP DRIVER VERSION {version} ===') + test_run = run.Run(cpp_driver_git=cpp_driver_dir, + scylla_install_dir=scylla_install_dir, + driver_type=driver_type, + driver_version=version, + scylla_version=scylla_version, + cql_cassandra_version=cql_cassandra_version) try: - test_run = run.Run(cpp_driver_git=cpp_driver_dir, - scylla_install_dir=scylla_install_dir, - driver_type=driver_type, - driver_version=version, - scylla_version=scylla_version, - cql_cassandra_version=cql_cassandra_version) results[version] = test_run.run() except Exception: logging.exception(f"{version} failed") status = 1 exc_type, exc_value, exc_traceback = sys.exc_info() - results[version] = dict(exception=traceback.format_exception(exc_type, exc_value, exc_traceback)) + failure_reason = traceback.format_exception(exc_type, exc_value, exc_traceback) + results[version] = dict(exception=failure_reason) + test_run.create_metadata_for_failure(reason="\n".join(failure_reason)) logging.info(f'=== {driver_type.upper()} CPP DRIVER MATRIX RESULTS ===') for version, result in results.items(): diff --git a/run.py b/run.py index 4fdea58..a9ac214 100644 --- a/run.py +++ b/run.py @@ -1,3 +1,4 @@ +import json import re import os import yaml @@ -41,6 +42,10 @@ def version_folder(self): self._version_folder = Path(self.__version_folder(self.driver_type, self._driver_version)) return self._version_folder + @property + def metadata_file_name(self) -> str: + return f'metadata_{self.driver_type}-{self._driver_version}.json' + @staticmethod def __version_folder(cpp_driver_type, target_tag): target_version_folder = os.path.join(os.path.dirname(__file__), 'versions', cpp_driver_type) @@ -129,6 +134,18 @@ def _publish_fake_result(self): return TestResults(running_tests=0, ran_tests=0, failed=0, passed=0, returncode=0, error='error', failed_tests=[]) + def create_metadata_for_failure(self, reason: str) -> None: + log_path = Path(f"{self._cpp_driver_git}/log") + metadata_file = log_path / self.metadata_file_name + if not log_path.exists(): + log_path.mkdir(exist_ok=True) + metadata = { + "driver_name": f"TEST-{self.driver_type}-{self._driver_version}", + "driver_type": "cpp", + "failure_reason": reason, + } + metadata_file.write_text(json.dumps(metadata)) + def run(self) -> TestResults: if not self._checkout_tag(): return self._publish_fake_result() @@ -138,7 +155,12 @@ def run(self) -> TestResults: if self.run_compile_after_patch: self.compile_tests() - + metadata_file = Path(f"{self._cpp_driver_git}/log") / self.metadata_file_name + metadata = { + "driver_name": f"TEST-{self.driver_type}-{self._driver_version}", + "driver_type": "cpp", + "junit_result": f"./TEST-{self.driver_type}-{self._driver_version}.xml", + } # To filter out the test add "minus" before the list of ignored tests # gtest_filter = "BasicsTests*" gtest_filter = f"-{':'.join(self._testsList())}" if self._testsList() else '*' @@ -164,7 +186,7 @@ def run(self) -> TestResults: for line in process.stderr: print(line, end='') stderr += line - + metadata_file.write_text(json.dumps(metadata)) return self.analyze_results(stdout, stderr, process.returncode) def analyze_results(self, stdout: str, stderr: str, returncode: int) -> TestResults: