ATLAS Offline Software
Loading...
Searching...
No Matches
DumpGeoConfig_test.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3"""Unit tests for the DumpGeo ComponentAccumulator configuration."""
4
5import unittest
6from types import SimpleNamespace
7from unittest.mock import patch
8
9from AthenaConfiguration.AthConfigFlags import AthConfigFlags
10from AthenaConfiguration.ComponentAccumulator import ConfigurationError
11
12from DumpGeo.DumpGeoConfig import (
13 DumpGeoCfg,
14 configureDumpGeoInputFlags,
15 dumpGeoHasInputFiles,
16 dumpGeoOutputFileName,
17 logZDCFailureReminder,
18 resolveDumpGeoGeometryTag,
19 validateDumpGeoOutputFile,
20)
21from DumpGeo.DumpGeoConfigFlags import createDumpGeoConfigFlags
22
23
24class DumpGeoConfigTest(unittest.TestCase):
25 """Characterization tests for DumpGeoCfg."""
26
27 @staticmethod
28 def _flags(*, output_file="", filters=None, force_overwrite=False,
29 show_treetops=False,
30 atlas_version="ATLAS-UNIT-TEST-00-00-00"):
31 flags = AthConfigFlags()
32 flags.addFlag("GeoModel.AtlasVersion", atlas_version)
33 createDumpGeoConfigFlags(flags)
34 flags.GeoModel.DumpGeo.OutputFileName = output_file
35 flags.GeoModel.DumpGeo.FilterDetManagers = filters or []
36 flags.GeoModel.DumpGeo.ForceOverwrite = force_overwrite
37 flags.GeoModel.DumpGeo.ShowTreetopContent = show_treetops
38 flags.lock()
39 return flags
40
41 def _algorithm(self, flags, **kwargs):
42 with patch("DumpGeo.DumpGeoConfig.os.path.exists", return_value=False):
43 accumulator = DumpGeoCfg(flags, **kwargs)
44 self.addCleanup(accumulator.wasMerged)
45 return accumulator.getPrimary()
46
48 flags = AthConfigFlags()
49 createDumpGeoConfigFlags(flags)
50 flags.lock()
51
52 self.assertEqual(flags.GeoModel.DumpGeo.OutputFileName, "")
53 self.assertEqual(flags.GeoModel.DumpGeo.FilterDetManagers, [])
54 self.assertFalse(flags.GeoModel.DumpGeo.ForceOverwrite)
55 self.assertFalse(flags.GeoModel.DumpGeo.ShowTreetopContent)
56
58 flags = self._flags()
59
60 with (
61 patch.object(AthConfigFlags, "dump") as dump,
62 patch(
63 "DumpGeo.DumpGeoConfig._logger.isEnabledFor",
64 return_value=False,
65 ),
66 ):
67 accumulator = DumpGeoCfg(flags)
68
69 self.addCleanup(accumulator.wasMerged)
70 dump.assert_not_called()
71
73 flags = self._flags()
74
75 with (
76 patch.object(AthConfigFlags, "dump") as dump,
77 patch(
78 "DumpGeo.DumpGeoConfig._logger.isEnabledFor",
79 return_value=True,
80 ),
81 ):
82 accumulator = DumpGeoCfg(flags)
83
84 self.addCleanup(accumulator.wasMerged)
85 dump.assert_called_once_with("GeoModel.DumpGeo")
86
88 algorithm = self._algorithm(self._flags())
89
90 self.assertEqual(
91 algorithm.OutSQLiteFileName,
92 "geometry-ATLAS-UNIT-TEST-00-00-00.db",
93 )
94
96 algorithm = self._algorithm(
97 self._flags(filters=["Pixel", "Tile"])
98 )
99
100 self.assertEqual(
101 algorithm.OutSQLiteFileName,
102 "geometry-ATLAS-UNIT-TEST-00-00-00-Pixel-Tile.db",
103 )
104 self.assertEqual(algorithm.UserFilterDetManager, ["Pixel", "Tile"])
105
107 algorithm = self._algorithm(
108 self._flags(output_file="custom-geometry.db")
109 )
110
111 self.assertEqual(algorithm.OutSQLiteFileName, "custom-geometry.db")
112
114 algorithm = self._algorithm(self._flags(show_treetops=True))
115
116 self.assertTrue(algorithm.ShowTreetopContent)
117
119 algorithm = self._algorithm(
120 self._flags(show_treetops=True),
121 ShowTreetopContent=False,
122 OutSQLiteFileName="from-kwargs.db",
123 )
124
125 self.assertFalse(algorithm.ShowTreetopContent)
126 self.assertEqual(algorithm.OutSQLiteFileName, "from-kwargs.db")
127
129 flags = self._flags(output_file="from-flags.db")
130
131 with patch(
132 "DumpGeo.DumpGeoConfig.os.path.exists",
133 side_effect=lambda path: path == "from-kwargs.db",
134 ):
135 with self.assertRaisesRegex(ConfigurationError, "from-kwargs.db"):
136 DumpGeoCfg(flags, OutSQLiteFileName="from-kwargs.db")
137
139 flags = self._flags(
140 output_file="from-flags.db",
141 force_overwrite=True,
142 )
143
144 with (
145 patch(
146 "DumpGeo.DumpGeoConfig.os.path.exists",
147 side_effect=lambda path: path == "from-kwargs.db",
148 ),
149 patch("DumpGeo.DumpGeoConfig.os.remove") as remove,
150 ):
151 accumulator = DumpGeoCfg(
152 flags,
153 OutSQLiteFileName="from-kwargs.db",
154 )
155
156 self.addCleanup(accumulator.wasMerged)
157 algorithm = accumulator.getPrimary()
158 self.assertEqual(algorithm.OutSQLiteFileName, "from-kwargs.db")
159 self.assertTrue(algorithm.ForceOverwrite)
160 remove.assert_not_called()
161
163 flags = self._flags(
164 output_file="existing.db",
165 force_overwrite=True,
166 )
167
168 with (
169 patch("DumpGeo.DumpGeoConfig.os.path.exists", return_value=True),
170 patch("DumpGeo.DumpGeoConfig.os.remove") as remove,
171 ):
172 accumulator = DumpGeoCfg(flags)
173
174 self.addCleanup(accumulator.wasMerged)
175 self.assertTrue(accumulator.getPrimary().ForceOverwrite)
176 remove.assert_not_called()
177
179 flags = self._flags(
180 output_file="existing.db",
181 force_overwrite=False,
182 )
183
184 with (
185 patch("DumpGeo.DumpGeoConfig.os.path.exists", return_value=True),
186 patch("DumpGeo.DumpGeoConfig.os.remove") as remove,
187 ):
188 accumulator = DumpGeoCfg(flags, ForceOverwrite=True)
189
190 self.addCleanup(accumulator.wasMerged)
191 self.assertTrue(accumulator.getPrimary().ForceOverwrite)
192 remove.assert_not_called()
193
195 flags = self._flags(output_file="existing.db")
196
197 with (
198 patch("DumpGeo.DumpGeoConfig.os.path.exists", return_value=True),
199 patch("DumpGeo.DumpGeoConfig.os.remove") as remove,
200 ):
201 with self.assertRaisesRegex(ConfigurationError, "existing.db"):
202 DumpGeoCfg(flags)
203
204 remove.assert_not_called()
205
207 with (
208 patch("DumpGeo.DumpGeoConfig.os.path.exists", return_value=True),
209 patch("DumpGeo.DumpGeoConfig.os.remove") as remove,
210 ):
211 validateDumpGeoOutputFile("existing.db", force_overwrite=True)
212
213 remove.assert_not_called()
214
216 flags = self._flags(filters=["Pixel", "Tile"])
217
218 self.assertEqual(
219 dumpGeoOutputFileName(flags),
220 "geometry-ATLAS-UNIT-TEST-00-00-00-Pixel-Tile.db",
221 )
222
224 self.assertEqual(
225 resolveDumpGeoGeometryTag(
226 "ALIAS-TAG",
227 "GENERIC-TAG",
228 "FALLBACK-TAG",
229 ),
230 "ALIAS-TAG",
231 )
232
234 self.assertEqual(
235 resolveDumpGeoGeometryTag(
236 None,
237 "GEOMETRY-TAG",
238 "FALLBACK-TAG",
239 ),
240 "GEOMETRY-TAG",
241 )
242
244 self.assertEqual(
245 resolveDumpGeoGeometryTag(None, None, "FALLBACK-TAG"),
246 "FALLBACK-TAG",
247 )
248
250 """Only actual filenames enable input metadata configuration."""
251 self.assertFalse(dumpGeoHasInputFiles([]))
252 self.assertFalse(
253 dumpGeoHasInputFiles(["_ATHENA_GENERIC_INPUTFILE_NAME_"])
254 )
255 self.assertTrue(dumpGeoHasInputFiles(["events.pool.root"]))
256
258 flags = SimpleNamespace(
259 Input=SimpleNamespace(
260 Files=["_ATHENA_GENERIC_INPUTFILE_NAME_"]
261 ),
262 IOVDb=SimpleNamespace(),
263 )
264
265 self.assertTrue(configureDumpGeoInputFlags(flags))
266 self.assertEqual(flags.Input.Files, [])
267 self.assertEqual(flags.Input.RunNumbers, [330000])
268 self.assertEqual(flags.Input.TimeStamps, [1])
269 self.assertEqual(flags.Input.TypedCollections, [])
270 self.assertTrue(flags.Input.isMC)
271
273 flags = SimpleNamespace(
274 Input=SimpleNamespace(Files=["events.pool.root"]),
275 IOVDb=SimpleNamespace(),
276 )
277
278 self.assertFalse(configureDumpGeoInputFlags(flags))
279 self.assertEqual(flags.Input.Files, ["events.pool.root"])
280
282 geometry_tag = resolveDumpGeoGeometryTag(
283 None,
284 "METADATA-TAG",
285 "FALLBACK-TAG",
286 )
287 flags = self._flags(atlas_version=geometry_tag)
288
289 self.assertEqual(
290 dumpGeoOutputFileName(flags),
291 "geometry-METADATA-TAG.db",
292 )
293
295 with patch("DumpGeo.DumpGeoConfig._logger.error") as logger_error:
296 logZDCFailureReminder(zdc_enabled=True, run_succeeded=False)
297
298 logger_error.assert_called_once()
299 self.assertIn("ZDC geometry was enabled", logger_error.call_args[0][0])
300
302 with patch("DumpGeo.DumpGeoConfig._logger.error") as logger_error:
303 logZDCFailureReminder(zdc_enabled=False, run_succeeded=False)
304 logZDCFailureReminder(zdc_enabled=True, run_succeeded=True)
305
306 logger_error.assert_not_called()
307
309 """A custom filename must not disable DetectorManager filtering."""
310 algorithm = self._algorithm(
311 self._flags(
312 output_file="filtered.db",
313 filters=["Pixel", "Tile"],
314 )
315 )
316
317 self.assertEqual(algorithm.UserFilterDetManager, ["Pixel", "Tile"])
318
320 """DumpGeoCfg passes its name argument to the algorithm."""
321 algorithm = self._algorithm(self._flags(), name="RequestedDumpGeo")
322
323 self.assertEqual(algorithm.name, "RequestedDumpGeo")
324
325
326if __name__ == "__main__":
327 unittest.main()
_flags(*, output_file="", filters=None, force_overwrite=False, show_treetops=False, atlas_version="ATLAS-UNIT-TEST-00-00-00")