diff options
Diffstat (limited to 'tools/testing/kunit/kunit_kernel.py')
| -rw-r--r-- | tools/testing/kunit/kunit_kernel.py | 66 | 
1 files changed, 38 insertions, 28 deletions
diff --git a/tools/testing/kunit/kunit_kernel.py b/tools/testing/kunit/kunit_kernel.py index 57c1724b7e5d..f309a33256cd 100644 --- a/tools/testing/kunit/kunit_kernel.py +++ b/tools/testing/kunit/kunit_kernel.py @@ -11,6 +11,7 @@ import subprocess  import os  import shutil  import signal +from typing import Iterator  from contextlib import ExitStack @@ -39,7 +40,7 @@ class BuildError(Exception):  class LinuxSourceTreeOperations(object):  	"""An abstraction over command line operations performed on a source tree.""" -	def make_mrproper(self): +	def make_mrproper(self) -> None:  		try:  			subprocess.check_output(['make', 'mrproper'], stderr=subprocess.STDOUT)  		except OSError as e: @@ -47,7 +48,7 @@ class LinuxSourceTreeOperations(object):  		except subprocess.CalledProcessError as e:  			raise ConfigError(e.output.decode()) -	def make_olddefconfig(self, build_dir, make_options): +	def make_olddefconfig(self, build_dir, make_options) -> None:  		command = ['make', 'ARCH=um', 'olddefconfig']  		if make_options:  			command.extend(make_options) @@ -60,7 +61,7 @@ class LinuxSourceTreeOperations(object):  		except subprocess.CalledProcessError as e:  			raise ConfigError(e.output.decode()) -	def make_allyesconfig(self, build_dir, make_options): +	def make_allyesconfig(self, build_dir, make_options) -> None:  		kunit_parser.print_with_timestamp(  			'Enabling all CONFIGs for UML...')  		command = ['make', 'ARCH=um', 'allyesconfig'] @@ -82,7 +83,7 @@ class LinuxSourceTreeOperations(object):  		kunit_parser.print_with_timestamp(  			'Starting Kernel with all configs takes a few minutes...') -	def make(self, jobs, build_dir, make_options): +	def make(self, jobs, build_dir, make_options) -> None:  		command = ['make', 'ARCH=um', '--jobs=' + str(jobs)]  		if make_options:  			command.extend(make_options) @@ -100,7 +101,7 @@ class LinuxSourceTreeOperations(object):  		if stderr:  # likely only due to build warnings  			print(stderr.decode()) -	def linux_bin(self, params, timeout, build_dir): +	def linux_bin(self, params, timeout, build_dir) -> None:  		"""Runs the Linux UML binary. Must be named 'linux'."""  		linux_bin = get_file_path(build_dir, 'linux')  		outfile = get_outfile_path(build_dir) @@ -110,23 +111,38 @@ class LinuxSourceTreeOperations(object):  						   stderr=subprocess.STDOUT)  			process.wait(timeout) -def get_kconfig_path(build_dir): +def get_kconfig_path(build_dir) -> str:  	return get_file_path(build_dir, KCONFIG_PATH) -def get_kunitconfig_path(build_dir): +def get_kunitconfig_path(build_dir) -> str:  	return get_file_path(build_dir, KUNITCONFIG_PATH) -def get_outfile_path(build_dir): +def get_outfile_path(build_dir) -> str:  	return get_file_path(build_dir, OUTFILE_PATH)  class LinuxSourceTree(object):  	"""Represents a Linux kernel source tree with KUnit tests.""" -	def __init__(self): -		self._ops = LinuxSourceTreeOperations() +	def __init__(self, build_dir: str, load_config=True, kunitconfig_path='') -> None:  		signal.signal(signal.SIGINT, self.signal_handler) -	def clean(self): +		self._ops = LinuxSourceTreeOperations() + +		if not load_config: +			return + +		if kunitconfig_path: +			if not os.path.exists(kunitconfig_path): +				raise ConfigError(f'Specified kunitconfig ({kunitconfig_path}) does not exist') +		else: +			kunitconfig_path = get_kunitconfig_path(build_dir) +			if not os.path.exists(kunitconfig_path): +				shutil.copyfile(DEFAULT_KUNITCONFIG_PATH, kunitconfig_path) + +		self._kconfig = kunit_config.Kconfig() +		self._kconfig.read_from_file(kunitconfig_path) + +	def clean(self) -> bool:  		try:  			self._ops.make_mrproper()  		except ConfigError as e: @@ -134,17 +150,7 @@ class LinuxSourceTree(object):  			return False  		return True -	def create_kunitconfig(self, build_dir, defconfig=DEFAULT_KUNITCONFIG_PATH): -		kunitconfig_path = get_kunitconfig_path(build_dir) -		if not os.path.exists(kunitconfig_path): -			shutil.copyfile(defconfig, kunitconfig_path) - -	def read_kunitconfig(self, build_dir): -		kunitconfig_path = get_kunitconfig_path(build_dir) -		self._kconfig = kunit_config.Kconfig() -		self._kconfig.read_from_file(kunitconfig_path) - -	def validate_config(self, build_dir): +	def validate_config(self, build_dir) -> bool:  		kconfig_path = get_kconfig_path(build_dir)  		validated_kconfig = kunit_config.Kconfig()  		validated_kconfig.read_from_file(kconfig_path) @@ -158,7 +164,7 @@ class LinuxSourceTree(object):  			return False  		return True -	def build_config(self, build_dir, make_options): +	def build_config(self, build_dir, make_options) -> bool:  		kconfig_path = get_kconfig_path(build_dir)  		if build_dir and not os.path.exists(build_dir):  			os.mkdir(build_dir) @@ -170,7 +176,7 @@ class LinuxSourceTree(object):  			return False  		return self.validate_config(build_dir) -	def build_reconfig(self, build_dir, make_options): +	def build_reconfig(self, build_dir, make_options) -> bool:  		"""Creates a new .config if it is not a subset of the .kunitconfig."""  		kconfig_path = get_kconfig_path(build_dir)  		if os.path.exists(kconfig_path): @@ -186,7 +192,7 @@ class LinuxSourceTree(object):  			print('Generating .config ...')  			return self.build_config(build_dir, make_options) -	def build_um_kernel(self, alltests, jobs, build_dir, make_options): +	def build_um_kernel(self, alltests, jobs, build_dir, make_options) -> bool:  		try:  			if alltests:  				self._ops.make_allyesconfig(build_dir, make_options) @@ -197,8 +203,12 @@ class LinuxSourceTree(object):  			return False  		return self.validate_config(build_dir) -	def run_kernel(self, args=[], build_dir='', timeout=None): -		args.extend(['mem=1G']) +	def run_kernel(self, args=None, build_dir='', filter_glob='', timeout=None) -> Iterator[str]: +		if not args: +			args = [] +		args.extend(['mem=1G', 'console=tty']) +		if filter_glob: +			args.append('kunit.filter_glob='+filter_glob)  		self._ops.linux_bin(args, timeout, build_dir)  		outfile = get_outfile_path(build_dir)  		subprocess.call(['stty', 'sane']) @@ -206,6 +216,6 @@ class LinuxSourceTree(object):  			for line in file:  				yield line -	def signal_handler(self, sig, frame): +	def signal_handler(self, sig, frame) -> None:  		logging.error('Build interruption occurred. Cleaning console.')  		subprocess.call(['stty', 'sane'])  | 
