~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/kunit/kunit.py

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /tools/testing/kunit/kunit.py (Version linux-6.12-rc7) and /tools/testing/kunit/kunit.py (Version linux-5.12.19)


  1 #!/usr/bin/env python3                              1 #!/usr/bin/env python3
  2 # SPDX-License-Identifier: GPL-2.0                  2 # SPDX-License-Identifier: GPL-2.0
  3 #                                                   3 #
  4 # A thin wrapper on top of the KUnit Kernel         4 # A thin wrapper on top of the KUnit Kernel
  5 #                                                   5 #
  6 # Copyright (C) 2019, Google LLC.                   6 # Copyright (C) 2019, Google LLC.
  7 # Author: Felix Guo <felixguoxiuping@gmail.com>      7 # Author: Felix Guo <felixguoxiuping@gmail.com>
  8 # Author: Brendan Higgins <brendanhiggins@googl      8 # Author: Brendan Higgins <brendanhiggins@google.com>
  9                                                     9 
 10 import argparse                                    10 import argparse
 11 import os                                      << 
 12 import re                                      << 
 13 import shlex                                   << 
 14 import sys                                         11 import sys
                                                   >>  12 import os
 15 import time                                        13 import time
 16                                                    14 
 17 assert sys.version_info >= (3, 7), "Python ver !!  15 from collections import namedtuple
 18                                                << 
 19 from dataclasses import dataclass              << 
 20 from enum import Enum, auto                        16 from enum import Enum, auto
 21 from typing import Iterable, List, Optional, S << 
 22                                                    17 
                                                   >>  18 import kunit_config
 23 import kunit_json                                  19 import kunit_json
 24 import kunit_kernel                                20 import kunit_kernel
 25 import kunit_parser                                21 import kunit_parser
 26 from kunit_printer import stdout               !!  22 
                                                   >>  23 KunitResult = namedtuple('KunitResult', ['status','result','elapsed_time'])
                                                   >>  24 
                                                   >>  25 KunitConfigRequest = namedtuple('KunitConfigRequest',
                                                   >>  26                                 ['build_dir', 'make_options'])
                                                   >>  27 KunitBuildRequest = namedtuple('KunitBuildRequest',
                                                   >>  28                                ['jobs', 'build_dir', 'alltests',
                                                   >>  29                                 'make_options'])
                                                   >>  30 KunitExecRequest = namedtuple('KunitExecRequest',
                                                   >>  31                               ['timeout', 'build_dir', 'alltests', 'filter_glob'])
                                                   >>  32 KunitParseRequest = namedtuple('KunitParseRequest',
                                                   >>  33                                ['raw_output', 'input_data', 'build_dir', 'json'])
                                                   >>  34 KunitRequest = namedtuple('KunitRequest', ['raw_output','timeout', 'jobs',
                                                   >>  35                                            'build_dir', 'alltests', 'filter_glob',
                                                   >>  36                                            'json', 'make_options'])
                                                   >>  37 
                                                   >>  38 KernelDirectoryPath = sys.argv[0].split('tools/testing/kunit/')[0]
 27                                                    39 
 28 class KunitStatus(Enum):                           40 class KunitStatus(Enum):
 29         SUCCESS = auto()                           41         SUCCESS = auto()
 30         CONFIG_FAILURE = auto()                    42         CONFIG_FAILURE = auto()
 31         BUILD_FAILURE = auto()                     43         BUILD_FAILURE = auto()
 32         TEST_FAILURE = auto()                      44         TEST_FAILURE = auto()
 33                                                    45 
 34 @dataclass                                     << 
 35 class KunitResult:                             << 
 36         status: KunitStatus                    << 
 37         elapsed_time: float                    << 
 38                                                << 
 39 @dataclass                                     << 
 40 class KunitConfigRequest:                      << 
 41         build_dir: str                         << 
 42         make_options: Optional[List[str]]      << 
 43                                                << 
 44 @dataclass                                     << 
 45 class KunitBuildRequest(KunitConfigRequest):   << 
 46         jobs: int                              << 
 47                                                << 
 48 @dataclass                                     << 
 49 class KunitParseRequest:                       << 
 50         raw_output: Optional[str]              << 
 51         json: Optional[str]                    << 
 52                                                << 
 53 @dataclass                                     << 
 54 class KunitExecRequest(KunitParseRequest):     << 
 55         build_dir: str                         << 
 56         timeout: int                           << 
 57         filter_glob: str                       << 
 58         filter: str                            << 
 59         filter_action: Optional[str]           << 
 60         kernel_args: Optional[List[str]]       << 
 61         run_isolated: Optional[str]            << 
 62         list_tests: bool                       << 
 63         list_tests_attr: bool                  << 
 64                                                << 
 65 @dataclass                                     << 
 66 class KunitRequest(KunitExecRequest, KunitBuil << 
 67         pass                                   << 
 68                                                << 
 69                                                << 
 70 def get_kernel_root_path() -> str:                 46 def get_kernel_root_path() -> str:
 71         path = sys.argv[0] if not __file__ els     47         path = sys.argv[0] if not __file__ else __file__
 72         parts = os.path.realpath(path).split('     48         parts = os.path.realpath(path).split('tools/testing/kunit')
 73         if len(parts) != 2:                        49         if len(parts) != 2:
 74                 sys.exit(1)                        50                 sys.exit(1)
 75         return parts[0]                            51         return parts[0]
 76                                                    52 
 77 def config_tests(linux: kunit_kernel.LinuxSour     53 def config_tests(linux: kunit_kernel.LinuxSourceTree,
 78                  request: KunitConfigRequest)      54                  request: KunitConfigRequest) -> KunitResult:
 79         stdout.print_with_timestamp('Configuri !!  55         kunit_parser.print_with_timestamp('Configuring KUnit Kernel ...')
 80                                                    56 
 81         config_start = time.time()                 57         config_start = time.time()
 82         success = linux.build_reconfig(request     58         success = linux.build_reconfig(request.build_dir, request.make_options)
 83         config_end = time.time()                   59         config_end = time.time()
 84         status = KunitStatus.SUCCESS if succes !!  60         if not success:
 85         return KunitResult(status, config_end  !!  61                 return KunitResult(KunitStatus.CONFIG_FAILURE,
                                                   >>  62                                    'could not configure kernel',
                                                   >>  63                                    config_end - config_start)
                                                   >>  64         return KunitResult(KunitStatus.SUCCESS,
                                                   >>  65                            'configured kernel successfully',
                                                   >>  66                            config_end - config_start)
 86                                                    67 
 87 def build_tests(linux: kunit_kernel.LinuxSourc     68 def build_tests(linux: kunit_kernel.LinuxSourceTree,
 88                 request: KunitBuildRequest) ->     69                 request: KunitBuildRequest) -> KunitResult:
 89         stdout.print_with_timestamp('Building  !!  70         kunit_parser.print_with_timestamp('Building KUnit Kernel ...')
 90                                                    71 
 91         build_start = time.time()                  72         build_start = time.time()
 92         success = linux.build_kernel(request.j !!  73         success = linux.build_um_kernel(request.alltests,
 93                                      request.b !!  74                                         request.jobs,
 94                                      request.m !!  75                                         request.build_dir,
                                                   >>  76                                         request.make_options)
 95         build_end = time.time()                    77         build_end = time.time()
 96         status = KunitStatus.SUCCESS if succes !!  78         if not success:
 97         return KunitResult(status, build_end - !!  79                 return KunitResult(KunitStatus.BUILD_FAILURE,
 98                                                !!  80                                    'could not build kernel',
 99 def config_and_build_tests(linux: kunit_kernel !!  81                                    build_end - build_start)
100                            request: KunitBuild !!  82         if not success:
101         config_result = config_tests(linux, re !!  83                 return KunitResult(KunitStatus.BUILD_FAILURE,
102         if config_result.status != KunitStatus !!  84                                    'could not build kernel',
103                 return config_result           !!  85                                    build_end - build_start)
104                                                !!  86         return KunitResult(KunitStatus.SUCCESS,
105         return build_tests(linux, request)     !!  87                            'built kernel successfully',
106                                                !!  88                            build_end - build_start)
107 def _list_tests(linux: kunit_kernel.LinuxSourc !!  89 
108         args = ['kunit.action=list']           !!  90 def exec_tests(linux: kunit_kernel.LinuxSourceTree,
109                                                !!  91                request: KunitExecRequest) -> KunitResult:
110         if request.kernel_args:                !!  92         kunit_parser.print_with_timestamp('Starting KUnit Kernel ...')
111                 args.extend(request.kernel_arg !!  93         test_start = time.time()
                                                   >>  94         result = linux.run_kernel(
                                                   >>  95                 timeout=None if request.alltests else request.timeout,
                                                   >>  96                 filter_glob=request.filter_glob,
                                                   >>  97                 build_dir=request.build_dir)
                                                   >>  98 
                                                   >>  99         test_end = time.time()
                                                   >> 100 
                                                   >> 101         return KunitResult(KunitStatus.SUCCESS,
                                                   >> 102                            result,
                                                   >> 103                            test_end - test_start)
112                                                   104 
113         output = linux.run_kernel(args=args,   !! 105 def parse_tests(request: KunitParseRequest) -> KunitResult:
114                            timeout=request.tim << 
115                            filter_glob=request << 
116                            filter=request.filt << 
117                            filter_action=reque << 
118                            build_dir=request.b << 
119         lines = kunit_parser.extract_tap_lines << 
120         # Hack! Drop the dummy TAP version hea << 
121         lines.pop()                            << 
122                                                << 
123         # Filter out any extraneous non-test o << 
124         return [l for l in output if re.match( << 
125                                                << 
126 def _list_tests_attr(linux: kunit_kernel.Linux << 
127         args = ['kunit.action=list_attr']      << 
128                                                << 
129         if request.kernel_args:                << 
130                 args.extend(request.kernel_arg << 
131                                                << 
132         output = linux.run_kernel(args=args,   << 
133                            timeout=request.tim << 
134                            filter_glob=request << 
135                            filter=request.filt << 
136                            filter_action=reque << 
137                            build_dir=request.b << 
138         lines = kunit_parser.extract_tap_lines << 
139         # Hack! Drop the dummy TAP version hea << 
140         lines.pop()                            << 
141                                                << 
142         # Filter out any extraneous non-test o << 
143         return lines                           << 
144                                                << 
145 def _suites_from_test_list(tests: List[str]) - << 
146         """Extracts all the suites from an ord << 
147         suites = []  # type: List[str]         << 
148         for t in tests:                        << 
149                 parts = t.split('.', maxsplit= << 
150                 if len(parts) != 2:            << 
151                         raise ValueError(f'int << 
152                 suite, _ = parts               << 
153                 if not suites or suites[-1] != << 
154                         suites.append(suite)   << 
155         return suites                          << 
156                                                << 
157 def exec_tests(linux: kunit_kernel.LinuxSource << 
158         filter_globs = [request.filter_glob]   << 
159         if request.list_tests:                 << 
160                 output = _list_tests(linux, re << 
161                 for line in output:            << 
162                         print(line.rstrip())   << 
163                 return KunitResult(status=Kuni << 
164         if request.list_tests_attr:            << 
165                 attr_output = _list_tests_attr << 
166                 for line in attr_output:       << 
167                         print(line.rstrip())   << 
168                 return KunitResult(status=Kuni << 
169         if request.run_isolated:               << 
170                 tests = _list_tests(linux, req << 
171                 if request.run_isolated == 'te << 
172                         filter_globs = tests   << 
173                 elif request.run_isolated == ' << 
174                         filter_globs = _suites << 
175                         # Apply the test-part  << 
176                         if '.' in request.filt << 
177                                 test_glob = re << 
178                                 filter_globs = << 
179                                                << 
180         metadata = kunit_json.Metadata(arch=li << 
181                                                << 
182         test_counts = kunit_parser.TestCounts( << 
183         exec_time = 0.0                        << 
184         for i, filter_glob in enumerate(filter << 
185                 stdout.print_with_timestamp('S << 
186                                                << 
187                 test_start = time.time()       << 
188                 run_result = linux.run_kernel( << 
189                         args=request.kernel_ar << 
190                         timeout=request.timeou << 
191                         filter_glob=filter_glo << 
192                         filter=request.filter, << 
193                         filter_action=request. << 
194                         build_dir=request.buil << 
195                                                << 
196                 _, test_result = parse_tests(r << 
197                 # run_kernel() doesn't block o << 
198                 # That only happens after we g << 
199                 # So exec_time here actually c << 
200                 test_end = time.time()         << 
201                 exec_time += test_end - test_s << 
202                                                << 
203                 test_counts.add_subtest_counts << 
204                                                << 
205         if len(filter_globs) == 1 and test_cou << 
206                 bd = request.build_dir         << 
207                 print('The kernel seems to hav << 
208                 print('$ scripts/decode_stackt << 
209                                 bd, bd, kunit_ << 
210                                                << 
211         kunit_status = _map_to_overall_status( << 
212         return KunitResult(status=kunit_status << 
213                                                << 
214 def _map_to_overall_status(test_status: kunit_ << 
215         if test_status in (kunit_parser.TestSt << 
216                 return KunitStatus.SUCCESS     << 
217         return KunitStatus.TEST_FAILURE        << 
218                                                << 
219 def parse_tests(request: KunitParseRequest, me << 
220         parse_start = time.time()                 106         parse_start = time.time()
221                                                   107 
                                                   >> 108         test_result = kunit_parser.TestResult(kunit_parser.TestStatus.SUCCESS,
                                                   >> 109                                               [],
                                                   >> 110                                               'Tests not Parsed.')
                                                   >> 111 
222         if request.raw_output:                    112         if request.raw_output:
223                 # Treat unparsed results as on !! 113                 kunit_parser.raw_output(request.input_data)
224                 fake_test = kunit_parser.Test( !! 114         else:
225                 fake_test.status = kunit_parse !! 115                 test_result = kunit_parser.parse_run_tests(request.input_data)
226                 fake_test.counts.passed = 1    !! 116         parse_end = time.time()
227                                                << 
228                 output: Iterable[str] = input_ << 
229                 if request.raw_output == 'all' << 
230                         pass                   << 
231                 elif request.raw_output == 'ku << 
232                         output = kunit_parser. << 
233                 for line in output:            << 
234                         print(line.rstrip())   << 
235                 parse_time = time.time() - par << 
236                 return KunitResult(KunitStatus << 
237                                                << 
238                                                << 
239         # Actually parse the test results.     << 
240         test = kunit_parser.parse_run_tests(in << 
241         parse_time = time.time() - parse_start << 
242                                                   117 
243         if request.json:                          118         if request.json:
244                 json_str = kunit_json.get_json !! 119                 json_obj = kunit_json.get_json_result(
245                                         test=t !! 120                                         test_result=test_result,
246                                         metada !! 121                                         def_config='kunit_defconfig',
                                                   >> 122                                         build_dir=request.build_dir,
                                                   >> 123                                         json_path=request.json)
247                 if request.json == 'stdout':      124                 if request.json == 'stdout':
248                         print(json_str)        !! 125                         print(json_obj)
249                 else:                          << 
250                         with open(request.json << 
251                                 f.write(json_s << 
252                         stdout.print_with_time << 
253                                 os.path.abspat << 
254                                                   126 
255         if test.status != kunit_parser.TestSta !! 127         if test_result.status != kunit_parser.TestStatus.SUCCESS:
256                 return KunitResult(KunitStatus !! 128                 return KunitResult(KunitStatus.TEST_FAILURE, test_result,
                                                   >> 129                                    parse_end - parse_start)
                                                   >> 130 
                                                   >> 131         return KunitResult(KunitStatus.SUCCESS, test_result,
                                                   >> 132                                 parse_end - parse_start)
257                                                   133 
258         return KunitResult(KunitStatus.SUCCESS << 
259                                                   134 
260 def run_tests(linux: kunit_kernel.LinuxSourceT    135 def run_tests(linux: kunit_kernel.LinuxSourceTree,
261               request: KunitRequest) -> KunitR    136               request: KunitRequest) -> KunitResult:
262         run_start = time.time()                   137         run_start = time.time()
263                                                   138 
264         config_result = config_tests(linux, re !! 139         config_request = KunitConfigRequest(request.build_dir,
                                                   >> 140                                             request.make_options)
                                                   >> 141         config_result = config_tests(linux, config_request)
265         if config_result.status != KunitStatus    142         if config_result.status != KunitStatus.SUCCESS:
266                 return config_result              143                 return config_result
267                                                   144 
268         build_result = build_tests(linux, requ !! 145         build_request = KunitBuildRequest(request.jobs, request.build_dir,
                                                   >> 146                                           request.alltests,
                                                   >> 147                                           request.make_options)
                                                   >> 148         build_result = build_tests(linux, build_request)
269         if build_result.status != KunitStatus.    149         if build_result.status != KunitStatus.SUCCESS:
270                 return build_result               150                 return build_result
271                                                   151 
272         exec_result = exec_tests(linux, reques !! 152         exec_request = KunitExecRequest(request.timeout, request.build_dir,
                                                   >> 153                                         request.alltests, request.filter_glob)
                                                   >> 154         exec_result = exec_tests(linux, exec_request)
                                                   >> 155         if exec_result.status != KunitStatus.SUCCESS:
                                                   >> 156                 return exec_result
                                                   >> 157 
                                                   >> 158         parse_request = KunitParseRequest(request.raw_output,
                                                   >> 159                                           exec_result.result,
                                                   >> 160                                           request.build_dir,
                                                   >> 161                                           request.json)
                                                   >> 162         parse_result = parse_tests(parse_request)
273                                                   163 
274         run_end = time.time()                     164         run_end = time.time()
275                                                   165 
276         stdout.print_with_timestamp((          !! 166         kunit_parser.print_with_timestamp((
277                 'Elapsed time: %.3fs total, %.    167                 'Elapsed time: %.3fs total, %.3fs configuring, %.3fs ' +
278                 'building, %.3fs running\n') %    168                 'building, %.3fs running\n') % (
279                                 run_end - run_    169                                 run_end - run_start,
280                                 config_result.    170                                 config_result.elapsed_time,
281                                 build_result.e    171                                 build_result.elapsed_time,
282                                 exec_result.el    172                                 exec_result.elapsed_time))
283         return exec_result                     !! 173         return parse_result
284                                                << 
285 # Problem:                                     << 
286 # $ kunit.py run --json                        << 
287 # works as one would expect and prints the par << 
288 # $ kunit.py run --json suite_name             << 
289 # would *not* pass suite_name as the filter_gl << 
290 # argparse will consider it to be another way  << 
291 # $ kunit.py run --json=suite_name             << 
292 # i.e. it would run all tests, and dump the js << 
293 # So we hackily automatically rewrite --json = << 
294 pseudo_bool_flag_defaults = {                  << 
295                 '--json': 'stdout',            << 
296                 '--raw_output': 'kunit',       << 
297 }                                              << 
298 def massage_argv(argv: Sequence[str]) -> Seque << 
299         def massage_arg(arg: str) -> str:      << 
300                 if arg not in pseudo_bool_flag << 
301                         return arg             << 
302                 return  f'{arg}={pseudo_bool_f << 
303         return list(map(massage_arg, argv))    << 
304                                                << 
305 def get_default_jobs() -> int:                 << 
306         return len(os.sched_getaffinity(0))    << 
307                                                   174 
308 def add_common_opts(parser: argparse.ArgumentP !! 175 def add_common_opts(parser) -> None:
309         parser.add_argument('--build_dir',        176         parser.add_argument('--build_dir',
310                             help='As in the ma    177                             help='As in the make command, it specifies the build '
311                             'directory.',         178                             'directory.',
312                             type=str, default= !! 179                             type=str, default='.kunit', metavar='build_dir')
313         parser.add_argument('--make_options',     180         parser.add_argument('--make_options',
314                             help='X=Y make opt    181                             help='X=Y make option, can be repeated.',
315                             action='append', m !! 182                             action='append')
316         parser.add_argument('--alltests',         183         parser.add_argument('--alltests',
317                             help='Run all KUni !! 184                             help='Run all KUnit tests through allyesconfig',
318                             action='store_true    185                             action='store_true')
319         parser.add_argument('--kunitconfig',      186         parser.add_argument('--kunitconfig',
320                              help='Path to Kco !! 187                              help='Path to Kconfig fragment that enables KUnit tests',
321                              ' If given a dire !! 188                              metavar='kunitconfig')
322                              'will get  automa << 
323                              'blindly concaten << 
324                              action='append',  << 
325         parser.add_argument('--kconfig_add',   << 
326                              help='Additional  << 
327                              '.kunitconfig, e. << 
328                             action='append', m << 
329                                                << 
330         parser.add_argument('--arch',          << 
331                             help=('Specifies t << 
332                                   'The archite << 
333                                   'string pass << 
334                                   'e.g. i386,  << 
335                                   'architectur << 
336                             type=str, default= << 
337                                                << 
338         parser.add_argument('--cross_compile', << 
339                             help=('Sets make\' << 
340                                   'be set to a << 
341                                   'of gcc and  << 
342                                   'example `sp << 
343                                   'sparc toolc << 
344                                   '`$HOME/tool << 
345                                   'if you have << 
346                                   'from the 0- << 
347                                   'home direct << 
348                             metavar='PREFIX')  << 
349                                                << 
350         parser.add_argument('--qemu_config',   << 
351                             help=('Takes a pat << 
352                                   'a QemuArchP << 
353                             type=str, metavar= << 
354                                                << 
355         parser.add_argument('--qemu_args',     << 
356                             help='Additional Q << 
357                             action='append', m << 
358                                                   189 
359 def add_build_opts(parser: argparse.ArgumentPa !! 190 def add_build_opts(parser) -> None:
360         parser.add_argument('--jobs',             191         parser.add_argument('--jobs',
361                             help='As in the ma    192                             help='As in the make command, "Specifies  the number of '
362                             'jobs (commands) t    193                             'jobs (commands) to run simultaneously."',
363                             type=int, default= !! 194                             type=int, default=8, metavar='jobs')
364                                                   195 
365 def add_exec_opts(parser: argparse.ArgumentPar !! 196 def add_exec_opts(parser) -> None:
366         parser.add_argument('--timeout',          197         parser.add_argument('--timeout',
367                             help='maximum numb    198                             help='maximum number of seconds to allow for all tests '
368                             'to run. This does    199                             'to run. This does not include time taken to build the '
369                             'tests.',             200                             'tests.',
370                             type=int,             201                             type=int,
371                             default=300,          202                             default=300,
372                             metavar='SECONDS') !! 203                             metavar='timeout')
373         parser.add_argument('filter_glob',        204         parser.add_argument('filter_glob',
374                             help='Filter which !! 205                             help='maximum number of seconds to allow for all tests '
375                             'boot-time, e.g. l !! 206                             'to run. This does not include time taken to build the '
                                                   >> 207                             'tests.',
376                             type=str,             208                             type=str,
377                             nargs='?',            209                             nargs='?',
378                             default='',           210                             default='',
379                             metavar='filter_gl    211                             metavar='filter_glob')
380         parser.add_argument('--filter',        << 
381                             help='Filter KUnit << 
382                             'e.g. module=examp << 
383                             type=str,          << 
384                                 default='')    << 
385         parser.add_argument('--filter_action', << 
386                             help='If set to sk << 
387                                 'e.g. --filter << 
388                             type=str,          << 
389                                 choices=['skip << 
390         parser.add_argument('--kernel_args',   << 
391                             help='Kernel comma << 
392                              action='append',  << 
393         parser.add_argument('--run_isolated',  << 
394                             'individual suite/ << 
395                             'a non-hermetic te << 
396                             'what ran before i << 
397                             type=str,          << 
398                             choices=['suite',  << 
399         parser.add_argument('--list_tests', he << 
400                             'run.',            << 
401                             action='store_true << 
402         parser.add_argument('--list_tests_attr << 
403                             'attributes.',     << 
404                             action='store_true << 
405                                                   212 
406 def add_parse_opts(parser: argparse.ArgumentPa !! 213 def add_parse_opts(parser) -> None:
407         parser.add_argument('--raw_output', he !! 214         parser.add_argument('--raw_output', help='don\'t format output from kernel',
408                             'By default, filte !! 215                             action='store_true')
409                             '--raw_output=all  << 
410                              type=str, nargs=' << 
411         parser.add_argument('--json',             216         parser.add_argument('--json',
412                             nargs='?',            217                             nargs='?',
413                             help='Prints parse !! 218                             help='Stores test results in a JSON, and either '
414                             'a filename is spe !! 219                             'prints to stdout or saves to file if a '
415                             type=str, const='s !! 220                             'filename is specified',
416                                                !! 221                             type=str, const='stdout', default=None)
417                                                << 
418 def tree_from_args(cli_args: argparse.Namespac << 
419         """Returns a LinuxSourceTree based on  << 
420         # Allow users to specify multiple argu << 
421         qemu_args: List[str] = []              << 
422         if cli_args.qemu_args:                 << 
423                 for arg in cli_args.qemu_args: << 
424                         qemu_args.extend(shlex << 
425                                                << 
426         kunitconfigs = cli_args.kunitconfig if << 
427         if cli_args.alltests:                  << 
428                 # Prepend so user-specified op << 
429                 # --kunitconfig options to hav << 
430                 kunitconfigs = [kunit_kernel.A << 
431                                                << 
432         return kunit_kernel.LinuxSourceTree(cl << 
433                         kunitconfig_paths=kuni << 
434                         kconfig_add=cli_args.k << 
435                         arch=cli_args.arch,    << 
436                         cross_compile=cli_args << 
437                         qemu_config_path=cli_a << 
438                         extra_qemu_args=qemu_a << 
439                                                << 
440                                                << 
441 def run_handler(cli_args: argparse.Namespace)  << 
442         if not os.path.exists(cli_args.build_d << 
443                 os.mkdir(cli_args.build_dir)   << 
444                                                << 
445         linux = tree_from_args(cli_args)       << 
446         request = KunitRequest(build_dir=cli_a << 
447                                         make_o << 
448                                         jobs=c << 
449                                         raw_ou << 
450                                         json=c << 
451                                         timeou << 
452                                         filter << 
453                                         filter << 
454                                         filter << 
455                                         kernel << 
456                                         run_is << 
457                                         list_t << 
458                                         list_t << 
459         result = run_tests(linux, request)     << 
460         if result.status != KunitStatus.SUCCES << 
461                 sys.exit(1)                    << 
462                                                << 
463                                                << 
464 def config_handler(cli_args: argparse.Namespac << 
465         if cli_args.build_dir and (            << 
466                         not os.path.exists(cli << 
467                 os.mkdir(cli_args.build_dir)   << 
468                                                << 
469         linux = tree_from_args(cli_args)       << 
470         request = KunitConfigRequest(build_dir << 
471                                                << 
472         result = config_tests(linux, request)  << 
473         stdout.print_with_timestamp((          << 
474                 'Elapsed time: %.3fs\n') % (   << 
475                         result.elapsed_time))  << 
476         if result.status != KunitStatus.SUCCES << 
477                 sys.exit(1)                    << 
478                                                << 
479                                                << 
480 def build_handler(cli_args: argparse.Namespace << 
481         linux = tree_from_args(cli_args)       << 
482         request = KunitBuildRequest(build_dir= << 
483                                         make_o << 
484                                         jobs=c << 
485         result = config_and_build_tests(linux, << 
486         stdout.print_with_timestamp((          << 
487                 'Elapsed time: %.3fs\n') % (   << 
488                         result.elapsed_time))  << 
489         if result.status != KunitStatus.SUCCES << 
490                 sys.exit(1)                    << 
491                                                << 
492                                                << 
493 def exec_handler(cli_args: argparse.Namespace) << 
494         linux = tree_from_args(cli_args)       << 
495         exec_request = KunitExecRequest(raw_ou << 
496                                         build_ << 
497                                         json=c << 
498                                         timeou << 
499                                         filter << 
500                                         filter << 
501                                         filter << 
502                                         kernel << 
503                                         run_is << 
504                                         list_t << 
505                                         list_t << 
506         result = exec_tests(linux, exec_reques << 
507         stdout.print_with_timestamp((          << 
508                 'Elapsed time: %.3fs\n') % (re << 
509         if result.status != KunitStatus.SUCCES << 
510                 sys.exit(1)                    << 
511                                                   222 
512                                                !! 223 def main(argv, linux=None):
513 def parse_handler(cli_args: argparse.Namespace << 
514         if cli_args.file is None:              << 
515                 sys.stdin.reconfigure(errors=' << 
516                 kunit_output = sys.stdin  # ty << 
517         else:                                  << 
518                 with open(cli_args.file, 'r',  << 
519                         kunit_output = f.read( << 
520         # We know nothing about how the result << 
521         metadata = kunit_json.Metadata()       << 
522         request = KunitParseRequest(raw_output << 
523                                         json=c << 
524         result, _ = parse_tests(request, metad << 
525         if result.status != KunitStatus.SUCCES << 
526                 sys.exit(1)                    << 
527                                                << 
528                                                << 
529 subcommand_handlers_map = {                    << 
530         'run': run_handler,                    << 
531         'config': config_handler,              << 
532         'build': build_handler,                << 
533         'exec': exec_handler,                  << 
534         'parse': parse_handler                 << 
535 }                                              << 
536                                                << 
537                                                << 
538 def main(argv: Sequence[str]) -> None:         << 
539         parser = argparse.ArgumentParser(         224         parser = argparse.ArgumentParser(
540                         description='Helps wri    225                         description='Helps writing and running KUnit tests.')
541         subparser = parser.add_subparsers(dest    226         subparser = parser.add_subparsers(dest='subcommand')
542                                                   227 
543         # The 'run' command will config, build    228         # The 'run' command will config, build, exec, and parse in one go.
544         run_parser = subparser.add_parser('run    229         run_parser = subparser.add_parser('run', help='Runs KUnit tests.')
545         add_common_opts(run_parser)               230         add_common_opts(run_parser)
546         add_build_opts(run_parser)                231         add_build_opts(run_parser)
547         add_exec_opts(run_parser)                 232         add_exec_opts(run_parser)
548         add_parse_opts(run_parser)                233         add_parse_opts(run_parser)
549                                                   234 
550         config_parser = subparser.add_parser('    235         config_parser = subparser.add_parser('config',
551                                                   236                                                 help='Ensures that .config contains all of '
552                                                   237                                                 'the options in .kunitconfig')
553         add_common_opts(config_parser)            238         add_common_opts(config_parser)
554                                                   239 
555         build_parser = subparser.add_parser('b    240         build_parser = subparser.add_parser('build', help='Builds a kernel with KUnit tests')
556         add_common_opts(build_parser)             241         add_common_opts(build_parser)
557         add_build_opts(build_parser)              242         add_build_opts(build_parser)
558                                                   243 
559         exec_parser = subparser.add_parser('ex    244         exec_parser = subparser.add_parser('exec', help='Run a kernel with KUnit tests')
560         add_common_opts(exec_parser)              245         add_common_opts(exec_parser)
561         add_exec_opts(exec_parser)                246         add_exec_opts(exec_parser)
562         add_parse_opts(exec_parser)               247         add_parse_opts(exec_parser)
563                                                   248 
564         # The 'parse' option is special, as it    249         # The 'parse' option is special, as it doesn't need the kernel source
565         # (therefore there is no need for a bu    250         # (therefore there is no need for a build_dir, hence no add_common_opts)
566         # and the '--file' argument is not rel    251         # and the '--file' argument is not relevant to 'run', so isn't in
567         # add_parse_opts()                        252         # add_parse_opts()
568         parse_parser = subparser.add_parser('p    253         parse_parser = subparser.add_parser('parse',
569                                             he    254                                             help='Parses KUnit results from a file, '
570                                             'a    255                                             'and parses formatted results.')
571         add_parse_opts(parse_parser)              256         add_parse_opts(parse_parser)
572         parse_parser.add_argument('file',         257         parse_parser.add_argument('file',
573                                   help='Specif    258                                   help='Specifies the file to read results from.',
574                                   type=str, na    259                                   type=str, nargs='?', metavar='input_file')
575                                                   260 
576         cli_args = parser.parse_args(massage_a !! 261         cli_args = parser.parse_args(argv)
577                                                   262 
578         if get_kernel_root_path():                263         if get_kernel_root_path():
579                 os.chdir(get_kernel_root_path(    264                 os.chdir(get_kernel_root_path())
580                                                   265 
581         subcomand_handler = subcommand_handler !! 266         if cli_args.subcommand == 'run':
582                                                !! 267                 if not os.path.exists(cli_args.build_dir):
583         if subcomand_handler is None:          !! 268                         os.mkdir(cli_args.build_dir)
                                                   >> 269 
                                                   >> 270                 if not linux:
                                                   >> 271                         linux = kunit_kernel.LinuxSourceTree(cli_args.build_dir, kunitconfig_path=cli_args.kunitconfig)
                                                   >> 272 
                                                   >> 273                 request = KunitRequest(cli_args.raw_output,
                                                   >> 274                                        cli_args.timeout,
                                                   >> 275                                        cli_args.jobs,
                                                   >> 276                                        cli_args.build_dir,
                                                   >> 277                                        cli_args.alltests,
                                                   >> 278                                        cli_args.filter_glob,
                                                   >> 279                                        cli_args.json,
                                                   >> 280                                        cli_args.make_options)
                                                   >> 281                 result = run_tests(linux, request)
                                                   >> 282                 if result.status != KunitStatus.SUCCESS:
                                                   >> 283                         sys.exit(1)
                                                   >> 284         elif cli_args.subcommand == 'config':
                                                   >> 285                 if cli_args.build_dir and (
                                                   >> 286                                 not os.path.exists(cli_args.build_dir)):
                                                   >> 287                         os.mkdir(cli_args.build_dir)
                                                   >> 288 
                                                   >> 289                 if not linux:
                                                   >> 290                         linux = kunit_kernel.LinuxSourceTree(cli_args.build_dir, kunitconfig_path=cli_args.kunitconfig)
                                                   >> 291 
                                                   >> 292                 request = KunitConfigRequest(cli_args.build_dir,
                                                   >> 293                                              cli_args.make_options)
                                                   >> 294                 result = config_tests(linux, request)
                                                   >> 295                 kunit_parser.print_with_timestamp((
                                                   >> 296                         'Elapsed time: %.3fs\n') % (
                                                   >> 297                                 result.elapsed_time))
                                                   >> 298                 if result.status != KunitStatus.SUCCESS:
                                                   >> 299                         sys.exit(1)
                                                   >> 300         elif cli_args.subcommand == 'build':
                                                   >> 301                 if not linux:
                                                   >> 302                         linux = kunit_kernel.LinuxSourceTree(cli_args.build_dir, kunitconfig_path=cli_args.kunitconfig)
                                                   >> 303 
                                                   >> 304                 request = KunitBuildRequest(cli_args.jobs,
                                                   >> 305                                             cli_args.build_dir,
                                                   >> 306                                             cli_args.alltests,
                                                   >> 307                                             cli_args.make_options)
                                                   >> 308                 result = build_tests(linux, request)
                                                   >> 309                 kunit_parser.print_with_timestamp((
                                                   >> 310                         'Elapsed time: %.3fs\n') % (
                                                   >> 311                                 result.elapsed_time))
                                                   >> 312                 if result.status != KunitStatus.SUCCESS:
                                                   >> 313                         sys.exit(1)
                                                   >> 314         elif cli_args.subcommand == 'exec':
                                                   >> 315                 if not linux:
                                                   >> 316                         linux = kunit_kernel.LinuxSourceTree(cli_args.build_dir)
                                                   >> 317 
                                                   >> 318                 exec_request = KunitExecRequest(cli_args.timeout,
                                                   >> 319                                                 cli_args.build_dir,
                                                   >> 320                                                 cli_args.alltests,
                                                   >> 321                                                 cli_args.filter_glob)
                                                   >> 322                 exec_result = exec_tests(linux, exec_request)
                                                   >> 323                 parse_request = KunitParseRequest(cli_args.raw_output,
                                                   >> 324                                                   exec_result.result,
                                                   >> 325                                                   cli_args.build_dir,
                                                   >> 326                                                   cli_args.json)
                                                   >> 327                 result = parse_tests(parse_request)
                                                   >> 328                 kunit_parser.print_with_timestamp((
                                                   >> 329                         'Elapsed time: %.3fs\n') % (
                                                   >> 330                                 exec_result.elapsed_time))
                                                   >> 331                 if result.status != KunitStatus.SUCCESS:
                                                   >> 332                         sys.exit(1)
                                                   >> 333         elif cli_args.subcommand == 'parse':
                                                   >> 334                 if cli_args.file == None:
                                                   >> 335                         kunit_output = sys.stdin
                                                   >> 336                 else:
                                                   >> 337                         with open(cli_args.file, 'r') as f:
                                                   >> 338                                 kunit_output = f.read().splitlines()
                                                   >> 339                 request = KunitParseRequest(cli_args.raw_output,
                                                   >> 340                                             kunit_output,
                                                   >> 341                                             None,
                                                   >> 342                                             cli_args.json)
                                                   >> 343                 result = parse_tests(request)
                                                   >> 344                 if result.status != KunitStatus.SUCCESS:
                                                   >> 345                         sys.exit(1)
                                                   >> 346         else:
584                 parser.print_help()               347                 parser.print_help()
585                 return                         << 
586                                                << 
587         subcomand_handler(cli_args)            << 
588                                                << 
589                                                   348 
590 if __name__ == '__main__':                        349 if __name__ == '__main__':
591         main(sys.argv[1:])                        350         main(sys.argv[1:])
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php