90 if not session.ctest_args.get(
"output_file"):
94 session.ctest_files = set(item.path
for item
in items)
95 session.ctest_fixture_setup = defaultdict(set)
96 session.ctest_fixture_required = defaultdict(set)
98 for marker
in (
"ctest_fixture_setup",
"ctest_fixture_required"):
99 for mark
in item.iter_markers(name=marker):
100 getattr(session, marker)[item.path].update(mark.args)
139 args = session.ctest_args
140 output_filename = args.get(
"output_file")
142 if not output_filename:
146 output = open(output_filename,
"w")
147 output_rootdir = Path(output_filename).parent
149 coverage = args[
"coverage"].split(
",")
if args[
"coverage"]
else []
151 args[
"pytest_command"] +=
" --cov-report= --cov-reset " +
" ".join(
152 f
"--cov={module}" for module
in coverage
155 properties =
'LABELS "{}" '.
format(
";".join(args[
"label"]))
157 if args.get(
"binary_dir"):
158 env_entries.append(f
"CMAKE_CURRENT_BINARY_DIR={args['binary_dir']}")
159 preload_sanitizer_lib = os.environ.get(
"PRELOAD_SANITIZER_LIB")
160 if preload_sanitizer_lib:
163 for name
in preload_sanitizer_lib.split(
":")
166 env_entries.append(f
"LD_PRELOAD={resolved}")
168 properties +=
'ENVIRONMENT "{}" '.
format(
";".join(env_entries))
169 properties +=
" ".join(args[
"properties"])
171 producers = defaultdict(list)
172 consumers = defaultdict(list)
173 fixtures = defaultdict(list)
175 for path
in sorted(session.ctest_files):
176 name = os.path.relpath(path, args[
"pytest_root_dir"]).replace(
"/",
".")
177 if name.endswith(
".py"):
183 name = args[
"prefix"][:-1]
185 name = args[
"prefix"] + name
186 pytest_cmd = args[
"pytest_command"]
189 TEST_DESC_TEMPLATE.format(
192 pytest_cmd=pytest_cmd,
193 properties=properties,
197 if session.ctest_fixture_setup.get(path):
198 for fixture
in session.ctest_fixture_setup[path]:
199 producers[name].append(fixture)
200 fixtures[fixture].append(name)
202 if session.ctest_fixture_required.get(path):
203 for fixture
in session.ctest_fixture_required[path]:
204 consumers[name].append(fixture)
209 if name
in producers:
211 'set_tests_properties('
212 f
'{name} PROPERTIES FIXTURES_SETUP "{";".join(producers[name])}")\n'
215 if name
in consumers:
216 producer_test_names = []
217 for fixture
in consumers[name]:
218 producer_test_names.extend(fixtures[fixture])
220 'if (DEFINED ENV{PYTEST_DISABLE_FIXTURES_REQUIRED})\n'
221 f
' set_tests_properties({name} PROPERTIES DEPENDS "{";".join(producer_test_names)}")\n'
223 f
' set_tests_properties({name} PROPERTIES FIXTURES_REQUIRED "{";".join(consumers[name])}")\n'
231 f
"set_tests_properties({name} PROPERTIES ENVIRONMENT COVERAGE_FILE={output_rootdir}/.coverage.{name})\n"
232 f
"set_tests_properties({name} PROPERTIES FIXTURES_SETUP {name})\n"
235 if coverage
and names:
236 combine_test = (args[
"prefix"] +
"coverage_combine").replace(
"/",
".")
237 combine_command = re.sub(
239 f
" combine {' '.join(f'{output_rootdir}/.coverage.{n}' for n in names)}",
240 args[
"coverage_command"],
243 TEST_DESC_TEMPLATE.format(
246 pytest_cmd=combine_command,
247 properties=properties,
251 f
"set_tests_properties({combine_test} PROPERTIES ENVIRONMENT COVERAGE_FILE={output_rootdir}/.coverage)\n"
252 f
"set_tests_properties({combine_test} PROPERTIES FIXTURES_REQUIRED \"{';'.join(names)}\")\n"
253 f
"set_tests_properties({combine_test} PROPERTIES FIXTURES_SETUP {combine_test})\n"
256 name = (args[
"prefix"] +
"coverage_report").replace(
"/",
".")
258 TEST_DESC_TEMPLATE.format(
261 pytest_cmd=f
"{args['coverage_command']}",
262 properties=properties +
" LABELS coverage",
267 f
"set_tests_properties({name} PROPERTIES ENVIRONMENT COVERAGE_FILE={output_rootdir}/.coverage)\n"
268 f
"set_tests_properties({name} PROPERTIES FIXTURES_REQUIRED {combine_test})\n"