@@ -28,8 +28,12 @@ class TestConsistentSnapshot(unittest.TestCase):
28
28
'prefix_targets_with_hash' and verify that the correct URLs
29
29
are formed for each combination"""
30
30
31
+ # set dump_dir to trigger repository state dumps
32
+ dump_dir : Optional [str ] = None
33
+
31
34
def setUp (self ) -> None :
32
35
# pylint: disable=consider-using-with
36
+ self .subtest_count = 0
33
37
self .temp_dir = tempfile .TemporaryDirectory ()
34
38
self .metadata_dir = os .path .join (self .temp_dir .name , "metadata" )
35
39
self .targets_dir = os .path .join (self .temp_dir .name , "targets" )
@@ -39,6 +43,24 @@ def setUp(self) -> None:
39
43
def tearDown (self ) -> None :
40
44
self .temp_dir .cleanup ()
41
45
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
+
42
64
def _init_repo (
43
65
self , consistent_snapshot : bool , prefix_targets : bool = True
44
66
) -> RepositorySimulator :
@@ -55,14 +77,14 @@ def _init_repo(
55
77
56
78
return sim
57
79
58
- def _init_updater (self , sim : RepositorySimulator ) -> Updater :
80
+ def _init_updater (self ) -> Updater :
59
81
"""Create a new Updater instance"""
60
82
return Updater (
61
83
self .metadata_dir ,
62
84
"https://example.com/metadata/" ,
63
85
self .targets_dir ,
64
86
"https://example.com/targets/" ,
65
- sim ,
87
+ self . sim ,
66
88
)
67
89
68
90
def _assert_metadata_files_exist (self , roles : Iterable [str ]) -> None :
@@ -106,21 +128,21 @@ def test_top_level_roles_update(
106
128
# correct version prefix, depending on 'consistent_snapshot' config
107
129
try :
108
130
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" ]
110
132
111
- sim = self ._init_repo (consistent_snapshot )
112
- updater = self ._init_updater (sim )
133
+ self .setup_subtest (consistent_snapshot )
134
+ updater = self ._init_updater ()
113
135
114
136
# cleanup fetch tracker metadata
115
- sim .fetch_tracker .metadata .clear ()
137
+ self . sim .fetch_tracker .metadata .clear ()
116
138
updater .refresh ()
117
139
118
140
# 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 )
120
142
# metadata files are always persisted without a version prefix
121
143
self ._assert_metadata_files_exist (TOP_LEVEL_ROLE_NAMES )
122
144
finally :
123
- utils . cleanup_dir ( self .metadata_dir )
145
+ self .teardown_subtest ( )
124
146
125
147
delegated_roles_data : utils .DataSet = {
126
148
"consistent_snaphot disabled" : {
@@ -145,27 +167,29 @@ def test_delegated_roles_update(
145
167
rolenames = ["role1" , ".." , "." ]
146
168
exp_calls = [(role , exp_version ) for role in rolenames ]
147
169
148
- sim = self ._init_repo (consistent_snapshot )
170
+ self .setup_subtest (consistent_snapshot )
149
171
# Add new delegated targets
150
172
spec_version = "." .join (SPECIFICATION_VERSION )
151
173
for role in rolenames :
152
174
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 ()
157
181
updater .refresh ()
158
182
159
183
# cleanup fetch tracker metadata
160
- sim .fetch_tracker .metadata .clear ()
184
+ self . sim .fetch_tracker .metadata .clear ()
161
185
# trigger updater to fetch the delegated metadata
162
186
updater .get_targetinfo ("anything" )
163
187
# 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 )
165
189
# metadata files are always persisted without a version prefix
166
190
self ._assert_metadata_files_exist (rolenames )
167
191
finally :
168
- utils . cleanup_dir ( self .metadata_dir )
192
+ self .teardown_subtest ( )
169
193
170
194
targets_download_data : utils .DataSet = {
171
195
"consistent_snaphot disabled" : {
@@ -199,14 +223,14 @@ def test_download_targets(self, test_case_data: Dict[str, Any]) -> None:
199
223
hash_algo : Optional [str ] = test_case_data ["hash_algo" ]
200
224
targetpaths : List [str ] = test_case_data ["targetpaths" ]
201
225
202
- sim = self ._init_repo (consistent_snapshot , prefix_targets_with_hash )
226
+ self .setup_subtest (consistent_snapshot , prefix_targets_with_hash )
203
227
# Add targets to repository
204
228
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 ()
208
232
209
- updater = self ._init_updater (sim )
233
+ updater = self ._init_updater ()
210
234
updater .config .prefix_targets_with_hash = prefix_targets_with_hash
211
235
updater .refresh ()
212
236
@@ -219,17 +243,23 @@ def test_download_targets(self, test_case_data: Dict[str, Any]) -> None:
219
243
self ._assert_targets_files_exist ([info .path ])
220
244
221
245
# files are fetched with the expected hash prefix (or None)
222
- exp_fetches = [
246
+ exp_calls = [
223
247
(path , None if not hash_algo else info .hashes [hash_algo ])
224
248
]
225
249
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 ()
228
252
finally :
229
- utils . cleanup_dir ( self .targets_dir )
253
+ self .teardown_subtest ( )
230
254
231
255
232
256
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" )
233
263
234
264
utils .configure_test_logging (sys .argv )
235
265
unittest .main ()
0 commit comments