1717from enum import Enum , auto
1818
1919import kunit_config
20+ import kunit_json
2021import kunit_kernel
2122import kunit_parser
2223
3031KunitExecRequest = namedtuple ('KunitExecRequest' ,
3132 ['timeout' , 'build_dir' , 'alltests' ])
3233KunitParseRequest = namedtuple ('KunitParseRequest' ,
33- ['raw_output' , 'input_data' ])
34+ ['raw_output' , 'input_data' , 'build_dir' , 'json' ])
3435KunitRequest = namedtuple ('KunitRequest' , ['raw_output' ,'timeout' , 'jobs' ,
35- 'build_dir' , 'alltests' ,
36+ 'build_dir' , 'alltests' , 'json' ,
3637 'make_options' ])
3738
3839KernelDirectoryPath = sys .argv [0 ].split ('tools/testing/kunit/' )[0 ]
@@ -113,12 +114,22 @@ def parse_tests(request: KunitParseRequest) -> KunitResult:
113114 test_result = kunit_parser .TestResult (kunit_parser .TestStatus .SUCCESS ,
114115 [],
115116 'Tests not Parsed.' )
117+
116118 if request .raw_output :
117119 kunit_parser .raw_output (request .input_data )
118120 else :
119121 test_result = kunit_parser .parse_run_tests (request .input_data )
120122 parse_end = time .time ()
121123
124+ if request .json :
125+ json_obj = kunit_json .get_json_result (
126+ test_result = test_result ,
127+ def_config = 'kunit_defconfig' ,
128+ build_dir = request .build_dir ,
129+ json_path = request .json )
130+ if request .json == 'stdout' :
131+ print (json_obj )
132+
122133 if test_result .status != kunit_parser .TestStatus .SUCCESS :
123134 return KunitResult (KunitStatus .TEST_FAILURE , test_result ,
124135 parse_end - parse_start )
@@ -151,7 +162,9 @@ def run_tests(linux: kunit_kernel.LinuxSourceTree,
151162 return exec_result
152163
153164 parse_request = KunitParseRequest (request .raw_output ,
154- exec_result .result )
165+ exec_result .result ,
166+ request .build_dir ,
167+ request .json )
155168 parse_result = parse_tests (parse_request )
156169
157170 run_end = time .time ()
@@ -195,7 +208,12 @@ def add_exec_opts(parser):
195208def add_parse_opts (parser ):
196209 parser .add_argument ('--raw_output' , help = 'don\' t format output from kernel' ,
197210 action = 'store_true' )
198-
211+ parser .add_argument ('--json' ,
212+ nargs = '?' ,
213+ help = 'Stores test results in a JSON, and either '
214+ 'prints to stdout or saves to file if a '
215+ 'filename is specified' ,
216+ type = str , const = 'stdout' , default = None )
199217
200218def main (argv , linux = None ):
201219 parser = argparse .ArgumentParser (
@@ -237,10 +255,16 @@ def main(argv, linux=None):
237255
238256 cli_args = parser .parse_args (argv )
239257
258+ if get_kernel_root_path ():
259+ os .chdir (get_kernel_root_path ())
260+
240261 if cli_args .subcommand == 'run' :
241262 if not os .path .exists (cli_args .build_dir ):
242263 os .mkdir (cli_args .build_dir )
243264
265+ if not os .path .exists (kunit_kernel .kunitconfig_path ):
266+ create_default_kunitconfig ()
267+
244268 if not linux :
245269 linux = kunit_kernel .LinuxSourceTree ()
246270
@@ -249,14 +273,18 @@ def main(argv, linux=None):
249273 cli_args .jobs ,
250274 cli_args .build_dir ,
251275 cli_args .alltests ,
276+ cli_args .json ,
252277 cli_args .make_options )
253278 result = run_tests (linux , request )
254279 if result .status != KunitStatus .SUCCESS :
255280 sys .exit (1 )
256281 elif cli_args .subcommand == 'config' :
257- if cli_args .build_dir :
258- if not os .path .exists (cli_args .build_dir ):
259- os .mkdir (cli_args .build_dir )
282+ if cli_args .build_dir and (
283+ not os .path .exists (cli_args .build_dir )):
284+ os .mkdir (cli_args .build_dir )
285+
286+ if not os .path .exists (kunit_kernel .kunitconfig_path ):
287+ create_default_kunitconfig ()
260288
261289 if not linux :
262290 linux = kunit_kernel .LinuxSourceTree ()
@@ -270,10 +298,6 @@ def main(argv, linux=None):
270298 if result .status != KunitStatus .SUCCESS :
271299 sys .exit (1 )
272300 elif cli_args .subcommand == 'build' :
273- if cli_args .build_dir :
274- if not os .path .exists (cli_args .build_dir ):
275- os .mkdir (cli_args .build_dir )
276-
277301 if not linux :
278302 linux = kunit_kernel .LinuxSourceTree ()
279303
@@ -288,10 +312,6 @@ def main(argv, linux=None):
288312 if result .status != KunitStatus .SUCCESS :
289313 sys .exit (1 )
290314 elif cli_args .subcommand == 'exec' :
291- if cli_args .build_dir :
292- if not os .path .exists (cli_args .build_dir ):
293- os .mkdir (cli_args .build_dir )
294-
295315 if not linux :
296316 linux = kunit_kernel .LinuxSourceTree ()
297317
@@ -300,7 +320,9 @@ def main(argv, linux=None):
300320 cli_args .alltests )
301321 exec_result = exec_tests (linux , exec_request )
302322 parse_request = KunitParseRequest (cli_args .raw_output ,
303- exec_result .result )
323+ exec_result .result ,
324+ cli_args .build_dir ,
325+ cli_args .json )
304326 result = parse_tests (parse_request )
305327 kunit_parser .print_with_timestamp ((
306328 'Elapsed time: %.3fs\n ' ) % (
@@ -314,7 +336,9 @@ def main(argv, linux=None):
314336 with open (cli_args .file , 'r' ) as f :
315337 kunit_output = f .read ().splitlines ()
316338 request = KunitParseRequest (cli_args .raw_output ,
317- kunit_output )
339+ kunit_output ,
340+ cli_args .build_dir ,
341+ cli_args .json )
318342 result = parse_tests (request )
319343 if result .status != KunitStatus .SUCCESS :
320344 sys .exit (1 )
0 commit comments