121a6d178SHeidi Fahim# SPDX-License-Identifier: GPL-2.0 221a6d178SHeidi Fahim# 321a6d178SHeidi Fahim# Generates JSON from KUnit results according to 421a6d178SHeidi Fahim# KernelCI spec: https://github.com/kernelci/kernelci-doc/wiki/Test-API 521a6d178SHeidi Fahim# 621a6d178SHeidi Fahim# Copyright (C) 2020, Google LLC. 721a6d178SHeidi Fahim# Author: Heidi Fahim <[email protected]> 821a6d178SHeidi Fahim 9ee96d25fSDaniel Latypovfrom dataclasses import dataclass 1021a6d178SHeidi Fahimimport json 11*0453f984SDaniel Latypovfrom typing import Any, Dict 1221a6d178SHeidi Fahim 13e0cc8c05SDaniel Latypovfrom kunit_parser import Test, TestStatus 1421a6d178SHeidi Fahim 15ee96d25fSDaniel Latypov@dataclass 16ee96d25fSDaniel Latypovclass Metadata: 17ee96d25fSDaniel Latypov """Stores metadata about this run to include in get_json_result().""" 18885210d3SDaniel Latypov arch: str = '' 19885210d3SDaniel Latypov def_config: str = '' 20ee96d25fSDaniel Latypov build_dir: str = '' 21ee96d25fSDaniel Latypov 22d65d07cbSRae MoarJsonObj = Dict[str, Any] 2321a6d178SHeidi Fahim 246bd0f52eSDaniel Latypov_status_map: Dict[TestStatus, str] = { 256bd0f52eSDaniel Latypov TestStatus.SUCCESS: "PASS", 266bd0f52eSDaniel Latypov TestStatus.SKIPPED: "SKIP", 276bd0f52eSDaniel Latypov TestStatus.TEST_CRASHED: "ERROR", 286bd0f52eSDaniel Latypov} 296bd0f52eSDaniel Latypov 30ee96d25fSDaniel Latypovdef _get_group_json(test: Test, common_fields: JsonObj) -> JsonObj: 31d65d07cbSRae Moar sub_groups = [] # List[JsonObj] 32d65d07cbSRae Moar test_cases = [] # List[JsonObj] 33d65d07cbSRae Moar 34d65d07cbSRae Moar for subtest in test.subtests: 356bd0f52eSDaniel Latypov if subtest.subtests: 36ee96d25fSDaniel Latypov sub_group = _get_group_json(subtest, common_fields) 37d65d07cbSRae Moar sub_groups.append(sub_group) 386bd0f52eSDaniel Latypov continue 396bd0f52eSDaniel Latypov status = _status_map.get(subtest.status, "FAIL") 406bd0f52eSDaniel Latypov test_cases.append({"name": subtest.name, "status": status}) 41d65d07cbSRae Moar 4221a6d178SHeidi Fahim test_group = { 43d65d07cbSRae Moar "name": test.name, 4421a6d178SHeidi Fahim "sub_groups": sub_groups, 45d65d07cbSRae Moar "test_cases": test_cases, 46ee96d25fSDaniel Latypov } 47ee96d25fSDaniel Latypov test_group.update(common_fields) 48ee96d25fSDaniel Latypov return test_group 49ee96d25fSDaniel Latypov 50ee96d25fSDaniel Latypovdef get_json_result(test: Test, metadata: Metadata) -> str: 51ee96d25fSDaniel Latypov common_fields = { 52ee96d25fSDaniel Latypov "arch": metadata.arch, 53ee96d25fSDaniel Latypov "defconfig": metadata.def_config, 54ee96d25fSDaniel Latypov "build_environment": metadata.build_dir, 5521a6d178SHeidi Fahim "lab_name": None, 5621a6d178SHeidi Fahim "kernel": None, 5721a6d178SHeidi Fahim "job": None, 5821a6d178SHeidi Fahim "git_branch": "kselftest", 5921a6d178SHeidi Fahim } 60d65d07cbSRae Moar 61ee96d25fSDaniel Latypov test_group = _get_group_json(test, common_fields) 62d65d07cbSRae Moar test_group["name"] = "KUnit Test Group" 6300f75043SDaniel Latypov return json.dumps(test_group, indent=4) 64