1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- # Lint as: python3
- # Copyright 2022 The Chromium Authors. All rights reserved.
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
- import json
- import logging
- import pathlib
- import sys
- from typing import Dict, List, Union
- from java_test_utils import JavaTestHealth
- from test_health_extractor import TestHealthInfo, GitRepoInfo
- JsonSafeDict = Dict[str, Union[str, int]]
- def to_json_file(test_health_list: List[TestHealthInfo],
- output_path: pathlib.Path) -> None:
- """Exports test health information to a newline-delimited JSON file.
- Each line of the output file is an independent JSON object. This format is
- suitable for importing into BigQuery and is also known as JSON Lines
- (http://jsonlines.org/).
- Args:
- test_health_list:
- The list of `TestHealthInfo` objects to write as JSON.
- output_path:
- The path at which to create or overwrite the JSON output.
- """
- test_health_dicts = _to_test_health_dicts(test_health_list)
- with open(output_path, 'w') as json_file:
- for test_health in test_health_dicts:
- json.dump(test_health, json_file, allow_nan=False)
- json_file.write('\n')
- def _to_test_health_dicts(test_health_list: List[TestHealthInfo]
- ) -> List[JsonSafeDict]:
- """Transforms a list of `TestHealthInfo` into dicts of JSON-safe data."""
- java_test_health_list = []
- for test_health in test_health_list:
- if test_health.java_test_health:
- java_test_health_list.append(_to_test_health_dict(test_health))
- else:
- logging.warning(
- f'Skipped non-Java test "{test_health.test_name}"; currently'
- 'only Java tests are supported.')
- return java_test_health_list
- def _to_test_health_dict(test_health_info: TestHealthInfo) -> JsonSafeDict:
- """Transforms a `TestHealthInfo` into a dict of JSON-safe data."""
- test_health_dict: JsonSafeDict = dict(
- test_name=test_health_info.test_name,
- test_path=str(test_health_info.test_dir),
- test_filename=test_health_info.test_filename,
- )
- if test_health_info.java_test_health:
- test_health_dict.update(
- _to_java_test_health_dict(test_health_info.java_test_health))
- else:
- test_health_dict.update(test_type='UNKNOWN')
- test_health_dict.update(
- _to_git_repo_info_dict(test_health_info.git_repo_info))
- return test_health_dict
- def _to_java_test_health_dict(java_test_health: JavaTestHealth
- ) -> JsonSafeDict:
- """Transforms a `JavaTestHealth` into a dict of JSON-safe data."""
- test_dict: JsonSafeDict = dict(test_type='JAVA')
- if java_test_health.java_package:
- test_dict.update(dict(java_package=java_test_health.java_package))
- test_dict.update(
- dict(disabled_tests_count=java_test_health.disabled_tests_count,
- disable_if_tests_count=java_test_health.disable_if_tests_count,
- flaky_tests_count=java_test_health.flaky_tests_count))
- return test_dict
- def _to_git_repo_info_dict(git_repo_info: GitRepoInfo) -> JsonSafeDict:
- """Transforms a `GitRepoInfo` into a dict of JSON-safe data."""
- return dict(git_head_hash=git_repo_info.git_head,
- git_head_timestamp=git_repo_info.git_head_time.isoformat(
- timespec='microseconds'))
|