109def pytest_collection_finish(session):
110 args = session.ctest_args
111 output_filename = args.get("output_file")
112
113 if not output_filename:
114
115 return
116
117 output = open(output_filename, "w")
118 output_rootdir = Path(output_filename).parent
119
120 coverage = args["coverage"].split(",") if args["coverage"] else []
121 if coverage:
122 args["pytest_command"] += " --cov-report= --cov-reset " + " ".join(
123 f"--cov={module}" for module in coverage
124 )
125
126 properties =
'LABELS "{}" '.
format(
";".join(args[
"label"]))
127 if args.get("binary_dir"):
128 properties += f'ENVIRONMENT "CMAKE_CURRENT_BINARY_DIR={args["binary_dir"]}" '
129 properties += " ".join(args["properties"])
130
131 producers = defaultdict(list)
132 consumers = defaultdict(list)
133 fixtures = defaultdict(list)
134 names = []
135 for path in sorted(session.ctest_files):
136 name = os.path.relpath(path, args["pytest_root_dir"]).replace("/", ".")
137 if name.endswith(".py"):
138 name = name[:-3]
139 if name == ".":
140
141
142
143 name = args["prefix"][:-1]
144 else:
145 name = args["prefix"] + name
146 pytest_cmd = args["pytest_command"]
147
148 output.write(
149 TEST_DESC_TEMPLATE.format(
150 name=name,
151 path=path,
152 pytest_cmd=pytest_cmd,
153 properties=properties,
154 )
155 )
156
157 if session.ctest_fixture_setup.get(path):
158 for fixture in session.ctest_fixture_setup[path]:
159 producers[name].append(fixture)
160 fixtures[fixture].append(name)
161
162 if session.ctest_fixture_required.get(path):
163 for fixture in session.ctest_fixture_required[path]:
164 consumers[name].append(fixture)
165
166 names.append(name)
167
168 for name in names:
169 if name in producers:
170 output.write(
171 'set_tests_properties('
172 f'{name} PROPERTIES FIXTURES_SETUP "{";".join(producers[name])}")\n'
173 )
174
175 if name in consumers:
176 producer_test_names = []
177 for fixture in consumers[name]:
178 producer_test_names.extend(fixtures[fixture])
179 output.write(
180 'if (DEFINED ENV{PYTEST_DISABLE_FIXTURES_REQUIRED})\n'
181 f' set_tests_properties({name} PROPERTIES DEPENDS "{";".join(producer_test_names)}")\n'
182 'else()\n'
183 f' set_tests_properties({name} PROPERTIES FIXTURES_REQUIRED "{";".join(consumers[name])}")\n'
184 'endif()\n'
185 )
186
187
188 if coverage:
189
190 output.write(
191 f"set_tests_properties({name} PROPERTIES ENVIRONMENT COVERAGE_FILE={output_rootdir}/.coverage.{name})\n"
192 f"set_tests_properties({name} PROPERTIES FIXTURES_SETUP {name})\n"
193 )
194
195 if coverage and names:
196 combine_test = (args["prefix"] + "coverage_combine").replace("/", ".")
197 combine_command = re.sub(
198 r" report .*",
199 f" combine {' '.join(f'{output_rootdir}/.coverage.{n}' for n in names)}",
200 args["coverage_command"],
201 )
202 output.write(
203 TEST_DESC_TEMPLATE.format(
204 name=combine_test,
205 path="",
206 pytest_cmd=combine_command,
207 properties=properties,
208 )
209 )
210 output.write(
211 f"set_tests_properties({combine_test} PROPERTIES ENVIRONMENT COVERAGE_FILE={output_rootdir}/.coverage)\n"
212 f"set_tests_properties({combine_test} PROPERTIES FIXTURES_REQUIRED \"{';'.join(names)}\")\n"
213 f"set_tests_properties({combine_test} PROPERTIES FIXTURES_SETUP {combine_test})\n"
214 )
215
216 name = (args["prefix"] + "coverage_report").replace("/", ".")
217 output.write(
218 TEST_DESC_TEMPLATE.format(
219 name=name,
220 path="",
221 pytest_cmd=f"{args['coverage_command']}",
222 properties=properties + " LABELS coverage",
223 )
224 )
225
226 output.write(
227 f"set_tests_properties({name} PROPERTIES ENVIRONMENT COVERAGE_FILE={output_rootdir}/.coverage)\n"
228 f"set_tests_properties({name} PROPERTIES FIXTURES_REQUIRED {combine_test})\n"
229 )
230
231 output.close()
232
233
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".