Skip to content

Commit a58a931

Browse files
committed
Add --dump option to tests
Extend updater tests with the option to dump repository metadata locally. Signed-off-by: Teodora Sechkova <[email protected]>
1 parent 4059214 commit a58a931

3 files changed

+101
-28
lines changed

tests/test_updater_consistent_snapshot.py

+55-25
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ class TestConsistentSnapshot(unittest.TestCase):
2828
'prefix_targets_with_hash' and verify that the correct URLs
2929
are formed for each combination"""
3030

31+
# set dump_dir to trigger repository state dumps
32+
dump_dir: Optional[str] = None
33+
3134
def setUp(self) -> None:
3235
# pylint: disable=consider-using-with
36+
self.subtest_count = 0
3337
self.temp_dir = tempfile.TemporaryDirectory()
3438
self.metadata_dir = os.path.join(self.temp_dir.name, "metadata")
3539
self.targets_dir = os.path.join(self.temp_dir.name, "targets")
@@ -39,6 +43,24 @@ def setUp(self) -> None:
3943
def tearDown(self) -> None:
4044
self.temp_dir.cleanup()
4145

46+
def setup_subtest(
47+
self, consistent_snapshot: bool, prefix_targets: bool = True
48+
) -> None:
49+
self.sim = self._init_repo(consistent_snapshot, prefix_targets)
50+
51+
self.subtest_count += 1
52+
if self.dump_dir is not None:
53+
# create subtest dumpdir
54+
name = f"{self.id().split('.')[-1]}-{self.subtest_count}"
55+
self.sim.dump_dir = os.path.join(self.dump_dir, name)
56+
os.mkdir(self.sim.dump_dir)
57+
58+
def teardown_subtest(self):
59+
if self.dump_dir is not None:
60+
self.sim.write()
61+
62+
utils.cleanup_dir(self.metadata_dir)
63+
4264
def _init_repo(
4365
self, consistent_snapshot: bool, prefix_targets: bool = True
4466
) -> RepositorySimulator:
@@ -55,14 +77,14 @@ def _init_repo(
5577

5678
return sim
5779

58-
def _init_updater(self, sim: RepositorySimulator) -> Updater:
80+
def _init_updater(self) -> Updater:
5981
"""Create a new Updater instance"""
6082
return Updater(
6183
self.metadata_dir,
6284
"https://example.com/metadata/",
6385
self.targets_dir,
6486
"https://example.com/targets/",
65-
sim,
87+
self.sim,
6688
)
6789

6890
def _assert_metadata_files_exist(self, roles: Iterable[str]) -> None:
@@ -106,21 +128,21 @@ def test_top_level_roles_update(
106128
# correct version prefix, depending on 'consistent_snapshot' config
107129
try:
108130
consistent_snapshot: bool = test_case_data["consistent_snapshot"]
109-
expected_calls: List[Any] = test_case_data["calls"]
131+
exp_calls: List[Any] = test_case_data["calls"]
110132

111-
sim = self._init_repo(consistent_snapshot)
112-
updater = self._init_updater(sim)
133+
self.setup_subtest(consistent_snapshot)
134+
updater = self._init_updater()
113135

114136
# cleanup fetch tracker metadata
115-
sim.fetch_tracker.metadata.clear()
137+
self.sim.fetch_tracker.metadata.clear()
116138
updater.refresh()
117139

118140
# metadata files are fetched with the expected version (or None)
119-
self.assertListEqual(sim.fetch_tracker.metadata, expected_calls)
141+
self.assertListEqual(self.sim.fetch_tracker.metadata, exp_calls)
120142
# metadata files are always persisted without a version prefix
121143
self._assert_metadata_files_exist(TOP_LEVEL_ROLE_NAMES)
122144
finally:
123-
utils.cleanup_dir(self.metadata_dir)
145+
self.teardown_subtest()
124146

125147
delegated_roles_data: utils.DataSet = {
126148
"consistent_snaphot disabled": {
@@ -145,27 +167,29 @@ def test_delegated_roles_update(
145167
rolenames = ["role1", "..", "."]
146168
exp_calls = [(role, exp_version) for role in rolenames]
147169

148-
sim = self._init_repo(consistent_snapshot)
170+
self.setup_subtest(consistent_snapshot)
149171
# Add new delegated targets
150172
spec_version = ".".join(SPECIFICATION_VERSION)
151173
for role in rolenames:
152174
delegated_role = DelegatedRole(role, [], 1, False, ["*"], None)
153-
targets = Targets(1, spec_version, sim.safe_expiry, {}, None)
154-
sim.add_delegation("targets", delegated_role, targets)
155-
sim.update_snapshot()
156-
updater = self._init_updater(sim)
175+
targets = Targets(
176+
1, spec_version, self.sim.safe_expiry, {}, None
177+
)
178+
self.sim.add_delegation("targets", delegated_role, targets)
179+
self.sim.update_snapshot()
180+
updater = self._init_updater()
157181
updater.refresh()
158182

159183
# cleanup fetch tracker metadata
160-
sim.fetch_tracker.metadata.clear()
184+
self.sim.fetch_tracker.metadata.clear()
161185
# trigger updater to fetch the delegated metadata
162186
updater.get_targetinfo("anything")
163187
# metadata files are fetched with the expected version (or None)
164-
self.assertListEqual(sim.fetch_tracker.metadata, exp_calls)
188+
self.assertListEqual(self.sim.fetch_tracker.metadata, exp_calls)
165189
# metadata files are always persisted without a version prefix
166190
self._assert_metadata_files_exist(rolenames)
167191
finally:
168-
utils.cleanup_dir(self.metadata_dir)
192+
self.teardown_subtest()
169193

170194
targets_download_data: utils.DataSet = {
171195
"consistent_snaphot disabled": {
@@ -199,14 +223,14 @@ def test_download_targets(self, test_case_data: Dict[str, Any]) -> None:
199223
hash_algo: Optional[str] = test_case_data["hash_algo"]
200224
targetpaths: List[str] = test_case_data["targetpaths"]
201225

202-
sim = self._init_repo(consistent_snapshot, prefix_targets_with_hash)
226+
self.setup_subtest(consistent_snapshot, prefix_targets_with_hash)
203227
# Add targets to repository
204228
for targetpath in targetpaths:
205-
sim.targets.version += 1
206-
sim.add_target("targets", b"content", targetpath)
207-
sim.update_snapshot()
229+
self.sim.targets.version += 1
230+
self.sim.add_target("targets", b"content", targetpath)
231+
self.sim.update_snapshot()
208232

209-
updater = self._init_updater(sim)
233+
updater = self._init_updater()
210234
updater.config.prefix_targets_with_hash = prefix_targets_with_hash
211235
updater.refresh()
212236

@@ -219,17 +243,23 @@ def test_download_targets(self, test_case_data: Dict[str, Any]) -> None:
219243
self._assert_targets_files_exist([info.path])
220244

221245
# files are fetched with the expected hash prefix (or None)
222-
exp_fetches = [
246+
exp_calls = [
223247
(path, None if not hash_algo else info.hashes[hash_algo])
224248
]
225249

226-
self.assertListEqual(sim.fetch_tracker.targets, exp_fetches)
227-
sim.fetch_tracker.targets.clear()
250+
self.assertListEqual(self.sim.fetch_tracker.targets, exp_calls)
251+
self.sim.fetch_tracker.targets.clear()
228252
finally:
229-
utils.cleanup_dir(self.targets_dir)
253+
self.teardown_subtest()
230254

231255

232256
if __name__ == "__main__":
257+
if "--dump" in sys.argv:
258+
TestConsistentSnapshot.dump_dir = tempfile.mkdtemp()
259+
print(
260+
f"Repository Simulator dumps in {TestConsistentSnapshot.dump_dir}"
261+
)
262+
sys.argv.remove("--dump")
233263

234264
utils.configure_test_logging(sys.argv)
235265
unittest.main()

tests/test_updater_delegation_graphs.py

+30-3
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ class TestDelegationsGraphs(unittest.TestCase):
4949
"""Test creating delegations graphs with different complexity
5050
and successfully updating the delegated roles metadata"""
5151

52+
# set dump_dir to trigger repository state dumps
53+
dump_dir: Optional[str] = None
54+
5255
def setUp(self) -> None:
56+
self.subtest_count = 0
5357
self.temp_dir = tempfile.TemporaryDirectory()
5458
self.metadata_dir = os.path.join(self.temp_dir.name, "metadata")
5559
self.targets_dir = os.path.join(self.temp_dir.name, "targets")
@@ -59,6 +63,26 @@ def setUp(self) -> None:
5963
def tearDown(self) -> None:
6064
self.temp_dir.cleanup()
6165

66+
def setup_subtest(
67+
self, delegations: List[TestDelegation]
68+
) -> RepositorySimulator:
69+
sim = self._init_repo(delegations)
70+
71+
self.subtest_count += 1
72+
if self.dump_dir is not None:
73+
# create subtest dumpdir
74+
name = f"{self.id().split('.')[-1]}-{self.subtest_count}"
75+
sim.dump_dir = os.path.join(self.dump_dir, name)
76+
os.mkdir(sim.dump_dir)
77+
# dump the repo simulator metadata
78+
sim.write()
79+
80+
return sim
81+
82+
def teardown_subtest(self) -> None:
83+
# clean up after each subtest
84+
utils.cleanup_dir(self.metadata_dir)
85+
6286
def _init_updater(self, sim: RepositorySimulator) -> Updater:
6387
"""Create a new Updater instance"""
6488
return Updater(
@@ -213,7 +237,7 @@ def test_graph_traversal(self, test_data: DelegationsTestCase) -> None:
213237
exp_files = [*TOP_LEVEL_ROLE_NAMES, *test_data.visited_order]
214238
exp_calls = [call(role, 1) for role in test_data.visited_order]
215239

216-
sim = self._init_repo(test_data.delegations)
240+
sim = self.setup_subtest(test_data.delegations)
217241
updater = self._init_updater(sim)
218242
# Call explicitly refresh to simplify the expected_calls list
219243
updater.refresh()
@@ -233,11 +257,14 @@ def test_graph_traversal(self, test_data: DelegationsTestCase) -> None:
233257
self.assertListEqual(wrapped_fetch.call_args_list, exp_calls)
234258
self._assert_files_exist(exp_files)
235259
finally:
236-
# clean up after each subtest
237-
utils.cleanup_dir(self.metadata_dir)
260+
self.teardown_subtest()
238261

239262

240263
if __name__ == "__main__":
264+
if "--dump" in sys.argv:
265+
TestDelegationsGraphs.dump_dir = tempfile.mkdtemp()
266+
print(f"Repository Simulator dumps in {TestDelegationsGraphs.dump_dir}")
267+
sys.argv.remove("--dump")
241268

242269
utils.configure_test_logging(sys.argv)
243270
unittest.main()

tests/test_updater_top_level_update.py

+16
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ class TestRefresh(unittest.TestCase):
3737
"""Test update of top-level metadata following
3838
'Detailed client workflow' in the specification."""
3939

40+
# set dump_dir to trigger repository state dumps
41+
dump_dir: Optional[str] = None
42+
4043
past_datetime = datetime.utcnow().replace(microsecond=0) - timedelta(days=5)
4144

4245
def setUp(self) -> None:
@@ -53,7 +56,16 @@ def setUp(self) -> None:
5356
with open(os.path.join(self.metadata_dir, "root.json"), "bw") as f:
5457
f.write(self.sim.signed_roots[0])
5558

59+
if self.dump_dir is not None:
60+
# create test specific dump directory
61+
name = self.id().split(".")[-1]
62+
self.sim.dump_dir = os.path.join(self.dump_dir, name)
63+
os.mkdir(self.sim.dump_dir)
64+
5665
def tearDown(self) -> None:
66+
if self.dump_dir is not None:
67+
self.sim.write()
68+
5769
self.temp_dir.cleanup()
5870

5971
def _run_refresh(self) -> Updater:
@@ -455,6 +467,10 @@ def test_compute_metafile_hashes_length(self) -> None:
455467

456468

457469
if __name__ == "__main__":
470+
if "--dump" in sys.argv:
471+
TestRefresh.dump_dir = tempfile.mkdtemp()
472+
print(f"Repository Simulator dumps in {TestRefresh.dump_dir}")
473+
sys.argv.remove("--dump")
458474

459475
utils.configure_test_logging(sys.argv)
460476
unittest.main()

0 commit comments

Comments
 (0)