#!/usr/bin/env python3 import os import sys import common import example_properties from thread_pool import ThreadPool class Main(common.TestCliFunction): def __init__(self, *args, **kwargs): if not 'description' in kwargs: kwargs['description'] = '''\ https://github.com/cirosantilli/linux-kernel-module-cheat#user-mode-tests TODO: expose all userland relevant ./run args here as well somehow. ''' if not 'defaults' in kwargs: kwargs['defaults'] = {} if not 'userland' in kwargs['defaults']: kwargs['defaults']['userland'] = '' super().__init__(*args, **kwargs) self.add_argument( 'tests', nargs='*', help='''\ If given, run only the given tests. Otherwise, run all tests. ''' ) def timed_main(self): run_args = self.get_common_args() run_args['ctrl_c_host'] = True run_args['show_stdout'] = False run_args['show_time'] = False if self.env['emulator'] == 'gem5': run_args['userland_build_id'] = 'static' had_failure = False rootdir_abs_len = len(self.env['userland_source_dir']) with ThreadPool( self.run_test, nthreads=self.env['nproc'], thread_id_arg='thread_id', ) as thread_pool: try: for path, in_dirnames, in_filenames in self.walk_source_targets( self.env['tests'], self.env['userland_in_exts'] ): path_abs = os.path.abspath(path) dirpath_relative_root = path_abs[rootdir_abs_len + 1:] for in_filename in in_filenames: path_relative_root = os.path.join(dirpath_relative_root, in_filename) test = example_properties.get(path_relative_root) if test.should_be_tested(): cur_run_args = run_args.copy() cur_run_args.update({ 'background': True, 'userland': path_relative_root, }) error = thread_pool.submit({ 'expected_exit_status': test.exit_status, 'run_args': cur_run_args, 'run_obj': self.import_path_main('run'), 'test_id': path_relative_root, }) if error is not None: if self.env['quit_on_fail']: raise common.ExitLoop() except common.ExitLoop: pass error = thread_pool.get_error() if error is not None: print(error) return 1 else: return 0 if __name__ == '__main__': Main().cli()