@@ -363,6 +363,120 @@ def test_safely_encoded_rolenames(self) -> None:
363
363
self .assertListEqual (self .sim .fetch_tracker .metadata , exp_calls )
364
364
365
365
366
+ hash_bins_metadata : utils .DataSet = {
367
+ "delegated hash bins" : DelegationsTestCase (
368
+ delegations = [
369
+ TestDelegation ("targets" , "f8-ff" , paths = None , path_hash_prefixes = [
370
+ "f8" ,
371
+ "f9" ,
372
+ "fa" ,
373
+ "fb" ,
374
+ "fc" ,
375
+ "fd" ,
376
+ "fe" ,
377
+ "ff" ,
378
+ ]),
379
+ TestDelegation ("targets" , "20-27" , paths = None , path_hash_prefixes = [
380
+ "20" ,
381
+ "21" ,
382
+ "22" ,
383
+ "23" ,
384
+ "24" ,
385
+ "25" ,
386
+ "26" ,
387
+ "27" ,
388
+ ]),
389
+ ],
390
+ target_files = [
391
+ TestTarget (
392
+ "f8-ff" ,
393
+ b"fff0838676c1dacb8827b02511e89f85b43814a74dd2c3ffb31d952a1db94311" ,
394
+ "non_matching_path_to_prefix.ext" ,
395
+ ),
396
+ TestTarget (
397
+ "20-27" ,
398
+ b"22992ae806e6d652835f3c84e169f05127da69e599f902e4dbdc6ff27ce46d01" ,
399
+ "delegate_1.ext" ,
400
+ ),
401
+ ],
402
+ visited_order = ["f8-ff" , "20-27" ],
403
+ ),
404
+ }
405
+
406
+ @utils .run_sub_tests_with_dataset (hash_bins_metadata )
407
+ def test_delegated_hash_bins (self , test_data : DelegationsTestCase ) -> None :
408
+ try :
409
+ self ._init_repo (test_data )
410
+ self .setup_subtest ()
411
+
412
+ updater = self ._init_updater ()
413
+ # Call explicitly refresh to simplify the expected_calls list
414
+ updater .refresh ()
415
+ self .sim .fetch_tracker .metadata .clear ()
416
+
417
+ roles_pref_map = [
418
+ (
419
+ "f8-ff" ,
420
+ [
421
+ "f8" ,
422
+ "f9" ,
423
+ "fa" ,
424
+ "fb" ,
425
+ "fc" ,
426
+ "fd" ,
427
+ "fe" ,
428
+ "ff" ,
429
+ ],
430
+ ),
431
+ (
432
+ "20-27" ,
433
+ [
434
+ "20" ,
435
+ "21" ,
436
+ "22" ,
437
+ "23" ,
438
+ "24" ,
439
+ "25" ,
440
+ "26" ,
441
+ "27" ,
442
+ ],
443
+ ),
444
+ ]
445
+
446
+ delegated_role1 = DelegatedRole (
447
+ roles_pref_map [0 ][0 ], [], 1 , False , roles_pref_map [0 ][1 ]
448
+ )
449
+ delegated_role1 .path_hash_prefixes = roles_pref_map [0 ][1 ]
450
+
451
+ delegated_role2 = DelegatedRole (
452
+ roles_pref_map [1 ][0 ], [], 1 , False , roles_pref_map [1 ][1 ]
453
+ )
454
+ delegated_role2 .path_hash_prefixes = roles_pref_map [1 ][1 ]
455
+
456
+ spec_version = "." .join (SPECIFICATION_VERSION )
457
+ targets = Targets (1 , spec_version , self .sim .safe_expiry , {}, None )
458
+ self .sim .add_delegation ("targets" , delegated_role1 , targets )
459
+ self .sim .add_delegation ("f8-ff" , delegated_role2 , targets )
460
+
461
+ # verify that no metadata file was downloaded as expected
462
+ # for non-existing path
463
+ target_info = updater .get_targetinfo ("missingpath" )
464
+ self .assertIsNone (target_info )
465
+
466
+ # verify that no metadata file was downloaded for existing
467
+ # path that doesn't match correct prefix
468
+ target_info = updater .get_targetinfo ("non_matching_path_to_prefix.ext" )
469
+ self .assertIsNone (target_info )
470
+
471
+ # verify that the target info was successfully found
472
+ # and the correct delegated metadata file was downloaded
473
+ target_info = updater .get_targetinfo ("delegate_1.ext" )
474
+ assert target_info is not None
475
+ self .assertEqual (target_info .path , "delegate_1.ext" )
476
+
477
+ finally :
478
+ self .teardown_subtest ()
479
+
366
480
class TestTargetFileSearch (TestDelegations ):
367
481
r"""
368
482
Create a single repository with the following delegations:
0 commit comments