@@ -927,3 +927,107 @@ fn nuget_vendored_dotnet_restore_then_manifestless_vex() {
927927 None ,
928928 ) ;
929929}
930+
931+ #[ test]
932+ #[ ignore = "bughunt scratch" ]
933+ fn bughunt_hosted_warm_cache ( ) {
934+ let sb = Sandbox :: new ( ) ;
935+ let Some ( dn) = Dotnet :: probe ( "hosted" , & sb) else { return ; } ;
936+ let fixture = sb. dir ( "fixture" ) ;
937+ let store_fx = sb. dir ( "store-fixture" ) ;
938+ let _registry = restore_fixture ( & dn, & sb, & fixture, & store_fx) ;
939+ let pristine = std:: fs:: read ( pkg_dir ( & store_fx) . join ( FILE_KEY ) ) . unwrap ( ) ;
940+ let mut patched = pristine. clone ( ) ;
941+ patched. extend_from_slice ( MARKER ) ;
942+ let upstream = std:: fs:: read ( pkg_dir ( & store_fx) . join ( NUPKG_NAME ) ) . unwrap ( ) ;
943+ let nupkg = patched_nupkg ( & upstream, & patched) ;
944+ let backend = Backend :: start ( HOSTED_UUID , & pristine, & patched, Some ( & nupkg) ) ;
945+ let uri = backend. uri ( ) ;
946+ let ( code, env, stderr) = socket_patch ( & fixture, & store_fx, & [ "scan" , "--mode" , "hosted" , "--json" , "--yes" , "--api-url" , & uri, "--org" , ORG , "--api-token" , "fake-token" , "--patch-server-url" , & uri] ) ;
947+ eprintln ! ( "BH scan code={code:?} warnings={:#}\n {stderr}" , env[ "redirect" ] ) ;
948+ if dn. major >= 9 { allow_http_source ( & fixture. join ( "nuget.config" ) , HOSTED_UUID ) ; }
949+ // Warm cache, locked restore on the same machine.
950+ std:: fs:: remove_dir_all ( fixture. join ( "obj" ) ) . ok ( ) ;
951+ let out = dn. restore ( & sb, & fixture, & store_fx, & [ "--locked-mode" ] ) ;
952+ eprintln ! ( "BH warm locked: status={:?}\n {}" , out. status, String :: from_utf8_lossy( & out. stdout) ) ;
953+ // Warm cache, no lockfile.
954+ std:: fs:: remove_file ( fixture. join ( "packages.lock.json" ) ) . ok ( ) ;
955+ std:: fs:: remove_dir_all ( fixture. join ( "obj" ) ) . ok ( ) ;
956+ let out = dn. restore ( & sb, & fixture, & store_fx, & [ "-p:RestorePackagesWithLockFile=false" ] ) ;
957+ eprintln ! ( "BH warm nolock: status={:?}\n {}" , out. status, String :: from_utf8_lossy( & out. stdout) ) ;
958+ let now = std:: fs:: read ( pkg_dir ( & store_fx) . join ( FILE_KEY ) ) . unwrap ( ) ;
959+ eprintln ! ( "BH warm nolock installed patched? {} ; socket feed nupkg hits={}" , now == patched, backend. hits( & format!( "/{NUPKG_NAME}" ) ) ) ;
960+ let assets = std:: fs:: read_to_string ( fixture. join ( "obj/project.assets.json" ) ) . unwrap_or_default ( ) ;
961+ eprintln ! ( "BH assets mentions packageFolders: {}" , assets. contains( "store-fixture" ) ) ;
962+ }
963+
964+ #[ test]
965+ #[ ignore = "bughunt scratch" ]
966+ fn bughunt_hosted_subdir_lock ( ) {
967+ let sb = Sandbox :: new ( ) ;
968+ let Some ( dn) = Dotnet :: probe ( "hosted" , & sb) else { return ; } ;
969+ let fixture = sb. dir ( "fixture" ) ;
970+ let store_fx = sb. dir ( "store-fixture" ) ;
971+ let _registry = restore_fixture ( & dn, & sb, & fixture, & store_fx) ;
972+ let sub = fixture. join ( "src/App" ) ;
973+ std:: fs:: create_dir_all ( & sub) . unwrap ( ) ;
974+ for f in [ "app.csproj" , "packages.lock.json" ] { std:: fs:: rename ( fixture. join ( f) , sub. join ( f) ) . unwrap ( ) ; }
975+ std:: fs:: rename ( fixture. join ( "obj" ) , sub. join ( "obj" ) ) . unwrap ( ) ;
976+ let before = std:: fs:: read_to_string ( sub. join ( "packages.lock.json" ) ) . unwrap ( ) ;
977+ let pristine = std:: fs:: read ( pkg_dir ( & store_fx) . join ( FILE_KEY ) ) . unwrap ( ) ;
978+ let mut patched = pristine. clone ( ) ;
979+ patched. extend_from_slice ( MARKER ) ;
980+ let upstream = std:: fs:: read ( pkg_dir ( & store_fx) . join ( NUPKG_NAME ) ) . unwrap ( ) ;
981+ let nupkg = patched_nupkg ( & upstream, & patched) ;
982+ let backend = Backend :: start ( HOSTED_UUID , & pristine, & patched, Some ( & nupkg) ) ;
983+ let uri = backend. uri ( ) ;
984+ let ( code, env, stderr) = socket_patch ( & fixture, & store_fx, & [ "scan" , "--mode" , "hosted" , "--json" , "--yes" , "--api-url" , & uri, "--org" , ORG , "--api-token" , "fake-token" , "--patch-server-url" , & uri] ) ;
985+ eprintln ! ( "BH scan code={code:?} redirect={:#}\n {stderr}" , env[ "redirect" ] ) ;
986+ let after = std:: fs:: read_to_string ( sub. join ( "packages.lock.json" ) ) . unwrap ( ) ;
987+ eprintln ! ( "BH sub lock changed? {}" , before != after) ;
988+ let co = sb. dir ( "checkout" ) ;
989+ copy_tree ( & fixture, & co) ;
990+ std:: fs:: remove_dir_all ( co. join ( "src/App/obj" ) ) . ok ( ) ;
991+ if dn. major >= 9 { allow_http_source ( & co. join ( "nuget.config" ) , HOSTED_UUID ) ; }
992+ let store_co = sb. dir ( "store-co" ) ;
993+ let out = dn. restore ( & sb, & co. join ( "src/App" ) , & store_co, & [ "--locked-mode" ] ) ;
994+ eprintln ! ( "BH cold locked restore: {:?}\n {}" , out. status, String :: from_utf8_lossy( & out. stdout) ) ;
995+ }
996+
997+ #[ test]
998+ #[ ignore = "bughunt scratch" ]
999+ fn bughunt_hosted_user_level_source ( ) {
1000+ let sb = Sandbox :: new ( ) ;
1001+ let Some ( dn) = Dotnet :: probe ( "hosted" , & sb) else { return ; } ;
1002+ let fixture = sb. dir ( "fixture" ) ;
1003+ let store_fx = sb. dir ( "store-fixture" ) ;
1004+ let _registry = restore_fixture ( & dn, & sb, & fixture, & store_fx) ;
1005+ // user-level config with a corp folder feed
1006+ let feed = sb. dir ( "corpfeed" ) ;
1007+ std:: fs:: copy ( "/tmp/claude-0/Corp.Lib.1.0.0.nupkg" , feed. join ( "Corp.Lib.1.0.0.nupkg" ) ) . unwrap ( ) ;
1008+ let ucfg = sb. root ( ) . join ( "home/.nuget/NuGet" ) ;
1009+ std:: fs:: create_dir_all ( & ucfg) . unwrap ( ) ;
1010+ std:: fs:: write ( ucfg. join ( "NuGet.Config" ) , format ! ( "<?xml version=\" 1.0\" encoding=\" utf-8\" ?>\n <configuration><packageSources><add key=\" nuget.org\" value=\" https://api.nuget.org/v3/index.json\" /><add key=\" corp\" value=\" {}\" /></packageSources></configuration>\n " , feed. display( ) ) ) . unwrap ( ) ;
1011+ std:: fs:: remove_file ( fixture. join ( "nuget.config" ) ) . unwrap ( ) ;
1012+ let cs = std:: fs:: read_to_string ( fixture. join ( "app.csproj" ) ) . unwrap ( ) ;
1013+ let cs = cs. replacen ( "<PackageReference " , "<PackageReference Include=\" Corp.Lib\" Version=\" 1.0.0\" /><PackageReference " , 1 ) ;
1014+ std:: fs:: write ( fixture. join ( "app.csproj" ) , cs) . unwrap ( ) ;
1015+ std:: fs:: remove_file ( fixture. join ( "packages.lock.json" ) ) . unwrap ( ) ;
1016+ dn. restore_ok ( & sb, & fixture, & store_fx, & [ ] , "re-restore with corp" ) ;
1017+ let pristine = std:: fs:: read ( pkg_dir ( & store_fx) . join ( FILE_KEY ) ) . unwrap ( ) ;
1018+ let mut patched = pristine. clone ( ) ;
1019+ patched. extend_from_slice ( MARKER ) ;
1020+ let upstream = std:: fs:: read ( pkg_dir ( & store_fx) . join ( NUPKG_NAME ) ) . unwrap ( ) ;
1021+ let nupkg = patched_nupkg ( & upstream, & patched) ;
1022+ let backend = Backend :: start ( HOSTED_UUID , & pristine, & patched, Some ( & nupkg) ) ;
1023+ let uri = backend. uri ( ) ;
1024+ let ( code, env, _stderr) = socket_patch ( & fixture, & store_fx, & [ "scan" , "--mode" , "hosted" , "--json" , "--yes" , "--api-url" , & uri, "--org" , ORG , "--api-token" , "fake-token" , "--patch-server-url" , & uri] ) ;
1025+ eprintln ! ( "BH scan code={code:?} redirect={}" , env[ "redirect" ] ) ;
1026+ eprintln ! ( "BH config:\n {}" , std:: fs:: read_to_string( fixture. join( "nuget.config" ) ) . unwrap_or_default( ) ) ;
1027+ let co = sb. dir ( "checkout" ) ;
1028+ fresh_checkout ( & fixture, & co) ;
1029+ if dn. major >= 9 { allow_http_source ( & co. join ( "nuget.config" ) , HOSTED_UUID ) ; }
1030+ let store_co = sb. dir ( "store-co" ) ;
1031+ let out = dn. restore ( & sb, & co, & store_co, & [ "--locked-mode" ] ) ;
1032+ eprintln ! ( "BH cold locked restore: {:?}\n {}" , out. status, String :: from_utf8_lossy( & out. stdout) ) ;
1033+ }
0 commit comments