char/avril
(wip) why'd you have to go and make things so complicaaaaated?
git clone https://git.t4t.associates/char/avril
bce30ee
main
1# [ path = "common/registry.rs" ] 2mod fixture; 3 4use avril_runtime:: registry::{ Options , PackageStore , artifact_key}; 5use fixture:: Registry ; 6use futures:: executor:: block_on; 7 8fn warm_package ( registry : & Registry , options : & Options ) ->( PackageStore , String ) { 9 registry. package ( 10"@test/pkg" , 11"1.0.0" , 12& [( "mod.ts" , "export const value = 42;" )], 13& [( "." , "./mod.ts" )], 14); 15let store =PackageStore :: new ( fixture:: runtime_handle (), options. clone ()). unwrap (); 16let module =block_on ( store. resolve ( "jsr:@test/pkg@1" )). unwrap (); 17assert_eq! ( 18block_on ( store. source ( & module)). unwrap (), 19"export const value = 42;" 20); 21 store. save (). unwrap (); 22( store, module) 23} 24 25# [ test ] 26fn verified_warm_artifacts_do_not_require_writable_lock_directory () { 27let registry =Registry :: new (); 28let dir = tempfile:: tempdir (). unwrap (); 29let mut options = registry. options ( dir. path ()); 30let ( store, module) =warm_package ( & registry, & options); 31drop ( store); 32 33let locks = options. cache . join ( "locks" ); 34 std:: fs:: remove_dir_all ( & locks). unwrap (); 35 std:: fs:: write ( & locks, "not a directory" ). unwrap (); 36let warm_requests = registry. requests . lock (). unwrap (). len (); 37 38let store =PackageStore :: new ( fixture:: runtime_handle (), options. clone ()). unwrap (); 39assert_eq! ( block_on ( store. resolve ( "jsr:@test/pkg@1" )). unwrap (), module); 40assert_eq! ( 41block_on ( store. source ( & module)). unwrap (), 42"export const value = 42;" 43); 44drop ( store); 45assert_eq! ( registry. requests . lock (). unwrap (). len (), warm_requests); 46 47 options. offline =true ; 48 options. frozen =true ; 49let store =PackageStore :: new ( fixture:: runtime_handle (), options. clone ()). unwrap (); 50assert_eq! ( block_on ( store. resolve ( "jsr:@test/pkg@1" )). unwrap (), module); 51assert_eq! ( 52block_on ( store. source ( & module)). unwrap (), 53"export const value = 42;" 54); 55drop ( store); 56assert_eq! ( registry. requests . lock (). unwrap (). len (), warm_requests); 57 58let cache_source = options. cache . join ( "files" ). join ( artifact_key ( & module)); 59 std:: fs:: write ( & cache_source, "corrupt" ). unwrap (); 60let store =PackageStore :: new ( fixture:: runtime_handle (), options. clone ()). unwrap (); 61let error =block_on ( store. source ( & module)). unwrap_err (); 62assert! ( error. to_string (). contains ( "integrity mismatch" ), "{error}" ); 63drop ( store); 64 65 std:: fs:: remove_file ( & cache_source). unwrap (); 66 options. offline =false ; 67let store =PackageStore :: new ( fixture:: runtime_handle (), options. clone ()). unwrap (); 68assert! ( block_on ( store. source ( & module)). is_err ()); 69assert_eq! ( registry. requests . lock (). unwrap (). len (), warm_requests); 70drop ( store); 71 72 options. frozen =false ; 73 options. update =true ; 74let store =PackageStore :: new ( fixture:: runtime_handle (), options). unwrap (); 75assert! ( block_on ( store. resolve ( "jsr:@test/pkg@1" )). is_err ()); 76assert_eq! ( registry. requests . lock (). unwrap (). len (), warm_requests); 77} 78 79# [ test ] 80fn vendored_frozen_offline_artifacts_need_no_cache_directory () { 81let registry =Registry :: new (); 82let dir = tempfile:: tempdir (). unwrap (); 83let options = registry. options ( dir. path ()); 84let ( store, module) =warm_package ( & registry, & options); 85let vendor = dir. path (). join ( "vendor" ); 86 store. vendor ( & vendor). unwrap (); 87drop ( store); 88 89let mut options = options; 90 options. cache = dir. path (). join ( "missing-cache" ); 91 options. vendor =Some ( vendor); 92 options. offline =true ; 93 options. frozen =true ; 94let store =PackageStore :: new ( fixture:: runtime_handle (), options. clone ()). unwrap (); 95assert_eq! ( block_on ( store. resolve ( "jsr:@test/pkg@1" )). unwrap (), module); 96assert_eq! ( 97block_on ( store. source ( & module)). unwrap (), 98"export const value = 42;" 99); 100assert! ( !options. cache . exists ()); 101} 102 103# [ test ] 104fn corrupt_vendor_artifact_fails_instead_of_falling_back_to_valid_cache () { 105let registry =Registry :: new (); 106let dir = tempfile:: tempdir (). unwrap (); 107let mut options = registry. options ( dir. path ()); 108let ( store, module) =warm_package ( & registry, & options); 109let vendor = dir. path (). join ( "vendor" ); 110 store. vendor ( & vendor). unwrap (); 111drop ( store); 112 113let vendor_source = vendor. join ( "@test/pkg/1.0.0/mod.ts" ); 114 std:: fs:: write ( & vendor_source, "export const value = 0;" ). unwrap (); 115let locks = options. cache . join ( "locks" ); 116 std:: fs:: remove_dir_all ( & locks). unwrap (); 117 std:: fs:: write ( & locks, "not a directory" ). unwrap (); 118 options. vendor =Some ( vendor); 119 options. offline =true ; 120 options. frozen =true ; 121let store =PackageStore :: new ( fixture:: runtime_handle (), options). unwrap (); 122let error =block_on ( store. source ( & module)). unwrap_err (); 123assert! ( error. to_string (). contains ( "integrity mismatch" ), "{error}" ); 124 125let cache_source = store 126. options () 127. cache 128. join ( "files" ) 129. join ( artifact_key ( & module)); 130assert_eq! ( 131 std:: fs:: read ( cache_source). unwrap (), 132b"export const value = 42;" 133); 134}