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