aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJoel Challis <[email protected]>2024-03-05 16:59:30 +0000
committerGitHub <[email protected]>2024-03-05 16:59:30 +0000
commita2c23e9419478cc49d06634732e626a55eec6d66 (patch)
tree352ee29d9adecd14784230948a9f315cfe178fb7 /lib
parentbbeb9c1ccd74140dde3bf51adeb3eca70463d22f (diff)
downloadqmk_firmware-a2c23e9419478cc49d06634732e626a55eec6d66.tar.gz
qmk_firmware-a2c23e9419478cc49d06634732e626a55eec6d66.zip
Initial 'qmk test-c' functionality (#23038)
Diffstat (limited to 'lib')
-rw-r--r--lib/python/qmk/cli/__init__.py1
-rw-r--r--lib/python/qmk/cli/test/__init__.py0
-rw-r--r--lib/python/qmk/cli/test/c.py47
3 files changed, 48 insertions, 0 deletions
diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py
index e4a8166349..6d05a5fc21 100644
--- a/lib/python/qmk/cli/__init__.py
+++ b/lib/python/qmk/cli/__init__.py
@@ -81,6 +81,7 @@ subcommands = [
'qmk.cli.new.keymap',
'qmk.cli.painter',
'qmk.cli.pytest',
+ 'qmk.cli.test.c',
'qmk.cli.userspace.add',
'qmk.cli.userspace.compile',
'qmk.cli.userspace.doctor',
diff --git a/lib/python/qmk/cli/test/__init__.py b/lib/python/qmk/cli/test/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/python/qmk/cli/test/__init__.py
diff --git a/lib/python/qmk/cli/test/c.py b/lib/python/qmk/cli/test/c.py
new file mode 100644
index 0000000000..7a4e20d5e6
--- /dev/null
+++ b/lib/python/qmk/cli/test/c.py
@@ -0,0 +1,47 @@
+import fnmatch
+import re
+from subprocess import DEVNULL
+
+from milc import cli
+
+from qmk.commands import find_make, get_make_parallel_args, build_environment
+
+
[email protected]('-j', '--parallel', type=int, default=1, help="Set the number of parallel make jobs; 0 means unlimited.")
[email protected]('-e', '--env', arg_only=True, action='append', default=[], help="Set a variable to be passed to make. May be passed multiple times.")
[email protected]('-c', '--clean', arg_only=True, action='store_true', help="Remove object files before compiling.")
[email protected]('-l', '--list', arg_only=True, action='store_true', help='List available tests.')
[email protected]('-t', '--test', arg_only=True, action='append', default=[], help="Test to run from the available list. Supports wildcard globs. May be passed multiple times.")
[email protected]("QMK C Unit Tests.", hidden=False if cli.config.user.developer else True)
+def test_c(cli):
+ """Run native unit tests.
+ """
+ list_tests = cli.run([find_make(), 'list-tests', 'SILENT=true'])
+ available_tests = sorted(list_tests.stdout.strip().split())
+
+ if cli.args.list:
+ return print("\n".join(available_tests))
+
+ # expand any wildcards
+ filtered_tests = set()
+ for test in cli.args.test:
+ regex = re.compile(fnmatch.translate(test))
+ filtered_tests |= set(filter(regex.match, available_tests))
+
+ for invalid in filtered_tests - set(available_tests):
+ cli.log.warning(f'Invalid test provided: {invalid}')
+
+ # convert test names to build targets
+ targets = list(map(lambda x: f'test:{x}', filtered_tests or ['all']))
+
+ if cli.args.clean:
+ targets.insert(0, 'clean')
+
+ # Add in the environment vars
+ for key, value in build_environment(cli.args.env).items():
+ targets.append(f'{key}={value}')
+
+ command = [find_make(), *get_make_parallel_args(cli.config.test_c.parallel), *targets]
+
+ cli.log.info('Compiling tests with {fg_cyan}%s', ' '.join(command))
+ return cli.run(command, capture_output=False, stdin=DEVNULL).returncode