138def pytest_collection_finish(session):
139 args = session.ctest_args
140 output_filename = args.get("output_file")
141
142 if not output_filename:
143
144 return
145
146 output = open(output_filename, "w")
147 output_rootdir = Path(output_filename).parent
148
149 coverage = args["coverage"].split(",") if args["coverage"] else []
150 if coverage:
151 args["pytest_command"] += " --cov-report= --cov-reset " + " ".join(
152 f"--cov={module}" for module in coverage
153 )
154
155 properties =
'LABELS "{}" '.
format(
";".join(args[
"label"]))
156 env_entries = []
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:
161 resolved = ":".join(
162 _resolve_sanitizer_lib(name)
163 for name in preload_sanitizer_lib.split(":")
164 if name
165 )
166 env_entries.append(f"LD_PRELOAD={resolved}")
167 if env_entries:
168 properties +=
'ENVIRONMENT "{}" '.
format(
";".join(env_entries))
169 properties += " ".join(args["properties"])
170
171 producers = defaultdict(list)
172 consumers = defaultdict(list)
173 fixtures = defaultdict(list)
174 names = []
175 for path in sorted(session.ctest_files):
176 name = os.path.relpath(path, args["pytest_root_dir"]).replace("/", ".")
177 if name.endswith(".py"):
178 name = name[:-3]
179 if name == ".":
180
181
182
183 name = args["prefix"][:-1]
184 else:
185 name = args["prefix"] + name
186 pytest_cmd = args["pytest_command"]
187
188 output.write(
189 TEST_DESC_TEMPLATE.format(
190 name=name,
191 path=path,
192 pytest_cmd=pytest_cmd,
193 properties=properties,
194 )
195 )
196
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)
201
202 if session.ctest_fixture_required.get(path):
203 for fixture in session.ctest_fixture_required[path]:
204 consumers[name].append(fixture)
205
206 names.append(name)
207
208 for name in names:
209 if name in producers:
210 output.write(
211 'set_tests_properties('
212 f'{name} PROPERTIES FIXTURES_SETUP "{";".join(producers[name])}")\n'
213 )
214
215 if name in consumers:
216 producer_test_names = []
217 for fixture in consumers[name]:
218 producer_test_names.extend(fixtures[fixture])
219 output.write(
220 'if (DEFINED ENV{PYTEST_DISABLE_FIXTURES_REQUIRED})\n'
221 f' set_tests_properties({name} PROPERTIES DEPENDS "{";".join(producer_test_names)}")\n'
222 'else()\n'
223 f' set_tests_properties({name} PROPERTIES FIXTURES_REQUIRED "{";".join(consumers[name])}")\n'
224 'endif()\n'
225 )
226
227
228 if coverage:
229
230 output.write(
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"
233 )
234
235 if coverage and names:
236 combine_test = (args["prefix"] + "coverage_combine").replace("/", ".")
237 combine_command = re.sub(
238 r" report .*",
239 f" combine {' '.join(f'{output_rootdir}/.coverage.{n}' for n in names)}",
240 args["coverage_command"],
241 )
242 output.write(
243 TEST_DESC_TEMPLATE.format(
244 name=combine_test,
245 path="",
246 pytest_cmd=combine_command,
247 properties=properties,
248 )
249 )
250 output.write(
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"
254 )
255
256 name = (args["prefix"] + "coverage_report").replace("/", ".")
257 output.write(
258 TEST_DESC_TEMPLATE.format(
259 name=name,
260 path="",
261 pytest_cmd=f"{args['coverage_command']}",
262 properties=properties + " LABELS coverage",
263 )
264 )
265
266 output.write(
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"
269 )
270
271 output.close()
272
273
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".