Commit b98cce1e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'linux-kselftest-kunit-5.6-rc4' of...

Merge tag 'linux-kselftest-kunit-5.6-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull Kunit fixes from Shuah Khan:
 "This Kselftest kunit update consists of fixes to documentation and
  the run-time tool from Brendan Higgins and Heidi Fahim"

* tag 'linux-kselftest-kunit-5.6-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  kunit: run kunit_tool from any directory
  kunit: test: Improve error messages for kunit_tool when kunitconfig is invalid
  Documentation: kunit: fixed sphinx error in code block
parents 2fcc7417 be886ba9
...@@ -551,6 +551,7 @@ options to your ``.config``: ...@@ -551,6 +551,7 @@ options to your ``.config``:
Once the kernel is built and installed, a simple Once the kernel is built and installed, a simple
.. code-block:: bash .. code-block:: bash
modprobe example-test modprobe example-test
...will run the tests. ...will run the tests.
......
...@@ -24,6 +24,8 @@ KunitResult = namedtuple('KunitResult', ['status','result']) ...@@ -24,6 +24,8 @@ KunitResult = namedtuple('KunitResult', ['status','result'])
KunitRequest = namedtuple('KunitRequest', ['raw_output','timeout', 'jobs', 'build_dir', 'defconfig']) KunitRequest = namedtuple('KunitRequest', ['raw_output','timeout', 'jobs', 'build_dir', 'defconfig'])
KernelDirectoryPath = sys.argv[0].split('tools/testing/kunit/')[0]
class KunitStatus(Enum): class KunitStatus(Enum):
SUCCESS = auto() SUCCESS = auto()
CONFIG_FAILURE = auto() CONFIG_FAILURE = auto()
...@@ -35,6 +37,13 @@ def create_default_kunitconfig(): ...@@ -35,6 +37,13 @@ def create_default_kunitconfig():
shutil.copyfile('arch/um/configs/kunit_defconfig', shutil.copyfile('arch/um/configs/kunit_defconfig',
kunit_kernel.kunitconfig_path) kunit_kernel.kunitconfig_path)
def get_kernel_root_path():
parts = sys.argv[0] if not __file__ else __file__
parts = os.path.realpath(parts).split('tools/testing/kunit')
if len(parts) != 2:
sys.exit(1)
return parts[0]
def run_tests(linux: kunit_kernel.LinuxSourceTree, def run_tests(linux: kunit_kernel.LinuxSourceTree,
request: KunitRequest) -> KunitResult: request: KunitRequest) -> KunitResult:
config_start = time.time() config_start = time.time()
...@@ -114,6 +123,9 @@ def main(argv, linux=None): ...@@ -114,6 +123,9 @@ def main(argv, linux=None):
cli_args = parser.parse_args(argv) cli_args = parser.parse_args(argv)
if cli_args.subcommand == 'run': if cli_args.subcommand == 'run':
if get_kernel_root_path():
os.chdir(get_kernel_root_path())
if cli_args.build_dir: if cli_args.build_dir:
if not os.path.exists(cli_args.build_dir): if not os.path.exists(cli_args.build_dir):
os.mkdir(cli_args.build_dir) os.mkdir(cli_args.build_dir)
......
...@@ -93,6 +93,20 @@ class LinuxSourceTree(object): ...@@ -93,6 +93,20 @@ class LinuxSourceTree(object):
return False return False
return True return True
def validate_config(self, build_dir):
kconfig_path = get_kconfig_path(build_dir)
validated_kconfig = kunit_config.Kconfig()
validated_kconfig.read_from_file(kconfig_path)
if not self._kconfig.is_subset_of(validated_kconfig):
invalid = self._kconfig.entries() - validated_kconfig.entries()
message = 'Provided Kconfig is not contained in validated .config. Following fields found in kunitconfig, ' \
'but not in .config: %s' % (
', '.join([str(e) for e in invalid])
)
logging.error(message)
return False
return True
def build_config(self, build_dir): def build_config(self, build_dir):
kconfig_path = get_kconfig_path(build_dir) kconfig_path = get_kconfig_path(build_dir)
if build_dir and not os.path.exists(build_dir): if build_dir and not os.path.exists(build_dir):
...@@ -103,12 +117,7 @@ class LinuxSourceTree(object): ...@@ -103,12 +117,7 @@ class LinuxSourceTree(object):
except ConfigError as e: except ConfigError as e:
logging.error(e) logging.error(e)
return False return False
validated_kconfig = kunit_config.Kconfig() return self.validate_config(build_dir)
validated_kconfig.read_from_file(kconfig_path)
if not self._kconfig.is_subset_of(validated_kconfig):
logging.error('Provided Kconfig is not contained in validated .config!')
return False
return True
def build_reconfig(self, build_dir): def build_reconfig(self, build_dir):
"""Creates a new .config if it is not a subset of the .kunitconfig.""" """Creates a new .config if it is not a subset of the .kunitconfig."""
...@@ -133,12 +142,7 @@ class LinuxSourceTree(object): ...@@ -133,12 +142,7 @@ class LinuxSourceTree(object):
except (ConfigError, BuildError) as e: except (ConfigError, BuildError) as e:
logging.error(e) logging.error(e)
return False return False
used_kconfig = kunit_config.Kconfig() return self.validate_config(build_dir)
used_kconfig.read_from_file(get_kconfig_path(build_dir))
if not self._kconfig.is_subset_of(used_kconfig):
logging.error('Provided Kconfig is not contained in final config!')
return False
return True
def run_kernel(self, args=[], timeout=None, build_dir=''): def run_kernel(self, args=[], timeout=None, build_dir=''):
args.extend(['mem=256M']) args.extend(['mem=256M'])
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment