tests: Add support for specifying tool requirements
Adds the `tools` section to `tests.json` to specify requirements for the tools in the environment. All tests that fail at least one tool requirements check are skipped.
This commit is contained in:
parent
20bacf82ee
commit
4a1f197743
|
@ -209,6 +209,9 @@ Exanple `test.json`:
|
|||
{ "opt1": "qwert", "opt2": "false" },
|
||||
{ "opt1": "bad" }
|
||||
]
|
||||
},
|
||||
"tools": {
|
||||
"cmake": ">=3.11"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
@ -324,6 +327,13 @@ Currently supported values are:
|
|||
- `prefix`
|
||||
- `libdir`
|
||||
|
||||
#### tools
|
||||
|
||||
This section specifies a list of tool requirements in a simple key-value format.
|
||||
If a tool is specified, it has to be present in the environment, and the version
|
||||
requirement must be fulfilled match. Otherwise, the entire test is skipped
|
||||
(including every element in the test matrix).
|
||||
|
||||
### Skipping integration tests
|
||||
|
||||
Meson uses several continuous integration testing systems that have slightly
|
||||
|
|
|
@ -190,7 +190,7 @@ class TestDef:
|
|||
self.skip = skip
|
||||
self.env = os.environ.copy()
|
||||
self.installed_files = [] # type: T.List[InstalledFile]
|
||||
self.do_not_set_opts = [] # type: T.List[str]
|
||||
self.do_not_set_opts = [] # type: T.List[str]
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return '<{}: {:<48} [{}: {}] -- {}>'.format(type(self).__name__, str(self.path), self.name, self.args, self.skip)
|
||||
|
@ -233,6 +233,7 @@ no_meson_log_msg = 'No meson-log.txt found.'
|
|||
|
||||
system_compiler = None
|
||||
compiler_id_map = {} # type: T.Dict[str, str]
|
||||
tool_vers_map = {} # type: T.Dict[str, str]
|
||||
|
||||
class StopException(Exception):
|
||||
def __init__(self):
|
||||
|
@ -568,6 +569,15 @@ def gather_tests(testdir: Path) -> T.List[TestDef]:
|
|||
# Handle the do_not_set_opts list
|
||||
do_not_set_opts = test_def.get('do_not_set_opts', []) # type: T.List[str]
|
||||
|
||||
# Skip tests if the tool requirements are not met
|
||||
if 'tools' in test_def:
|
||||
assert isinstance(test_def['tools'], dict)
|
||||
for tool, vers_req in test_def['tools'].items():
|
||||
if tool not in tool_vers_map:
|
||||
t.skip = True
|
||||
elif not mesonlib.version_compare(tool_vers_map[tool], vers_req):
|
||||
t.skip = True
|
||||
|
||||
# Skip the matrix code and just update the existing test
|
||||
if 'matrix' not in test_def:
|
||||
t.env.update(env)
|
||||
|
@ -639,7 +649,7 @@ def gather_tests(testdir: Path) -> T.List[TestDef]:
|
|||
name = ' '.join([x[0] for x in i if x[0] is not None])
|
||||
opts = ['-D' + x[0] for x in i if x[0] is not None]
|
||||
skip = any([x[1] for x in i])
|
||||
test = TestDef(t.path, name, opts, skip)
|
||||
test = TestDef(t.path, name, opts, skip or t.skip)
|
||||
test.env.update(env)
|
||||
test.installed_files = installed
|
||||
test.do_not_set_opts = do_not_set_opts
|
||||
|
@ -1123,6 +1133,7 @@ def print_tool_versions():
|
|||
i = i.strip('\n\r\t ')
|
||||
m = t['regex'].match(i)
|
||||
if m is not None:
|
||||
tool_vers_map[t['tool']] = m.group(t['match_group'])
|
||||
return '{} ({})'.format(exe, m.group(t['match_group']))
|
||||
|
||||
return '{} (unknown)'.format(exe)
|
||||
|
|
|
@ -4,5 +4,8 @@
|
|||
{"type": "implib", "platform": "cygwin", "file": "usr/lib/libcm_cmModLib"},
|
||||
{"type": "implib", "platform": "!cygwin", "file": "usr/bin/libcm_cmModLib"},
|
||||
{"type": "exe", "file": "usr/bin/cm_testEXE"}
|
||||
]
|
||||
],
|
||||
"tools": {
|
||||
"cmake": ">=3.11"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,5 +8,8 @@
|
|||
{"type": "exe", "file": "usr/bin/cm_testEXE"},
|
||||
{"type": "pdb", "file": "usr/bin/cm_testEXE2"},
|
||||
{"type": "exe", "file": "usr/bin/cm_testEXE2"}
|
||||
]
|
||||
],
|
||||
"tools": {
|
||||
"cmake": ">=3.11"
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue