@@ -20,7 +20,7 @@ limitations under the License.
2020
2121use std:: sync:: Arc ;
2222
23- use hyperlight_testing:: simple_guest_as_pathbuf;
23+ use hyperlight_testing:: { c_simple_guest_as_pathbuf , simple_guest_as_pathbuf} ;
2424use serde_json:: Value ;
2525use sha2:: { Digest as _, Sha256 } ;
2626
@@ -37,6 +37,24 @@ fn create_test_sandbox() -> MultiUseSandbox {
3737 . unwrap ( )
3838}
3939
40+ fn create_c_test_sandbox ( ) -> MultiUseSandbox {
41+ create_c_test_sandbox_with_config ( None )
42+ }
43+
44+ fn create_c_test_sandbox_with_config (
45+ config : Option < crate :: sandbox:: SandboxConfiguration > ,
46+ ) -> MultiUseSandbox {
47+ let path = c_simple_guest_as_pathbuf ( ) ;
48+ UninitializedSandbox :: new ( GuestBinary :: FilePath ( path) , config)
49+ . unwrap ( )
50+ . evolve ( )
51+ . unwrap ( )
52+ }
53+
54+ fn random_sequence ( sandbox : & mut MultiUseSandbox ) -> [ i32 ; 4 ] {
55+ std:: array:: from_fn ( |_| sandbox. call ( "NextRandom" , ( ) ) . unwrap ( ) )
56+ }
57+
4058fn create_snapshot ( ) -> Arc < Snapshot > {
4159 let mut sbox = create_test_sandbox ( ) ;
4260 sbox. snapshot ( ) . unwrap ( )
@@ -3175,6 +3193,62 @@ fn from_snapshot_silently_ignores_layout_overrides() {
31753193 assert_eq ! ( new_snap. layout( ) . get_scratch_size( ) , original_scratch) ;
31763194}
31773195
3196+ #[ test]
3197+ fn from_snapshot_preserves_guest_libc_rng_by_default ( ) {
3198+ let mut sandbox = create_c_test_sandbox ( ) ;
3199+ let snapshot = sandbox. snapshot ( ) . unwrap ( ) ;
3200+
3201+ let mut first =
3202+ MultiUseSandbox :: from_snapshot ( snapshot. clone ( ) , HostFunctions :: default ( ) , None ) . unwrap ( ) ;
3203+ let mut second =
3204+ MultiUseSandbox :: from_snapshot ( snapshot, HostFunctions :: default ( ) , None ) . unwrap ( ) ;
3205+
3206+ assert_eq ! ( random_sequence( & mut first) , random_sequence( & mut second) ) ;
3207+ }
3208+
3209+ #[ test]
3210+ fn from_snapshot_reseeds_guest_libc_rng_when_requested ( ) {
3211+ use crate :: sandbox:: { RngRestorePolicy , SandboxConfiguration } ;
3212+
3213+ let mut sandbox = create_c_test_sandbox ( ) ;
3214+ let snapshot = sandbox. snapshot ( ) . unwrap ( ) ;
3215+ let mut config = SandboxConfiguration :: default ( ) ;
3216+ config. set_rng_restore_policy ( RngRestorePolicy :: Refresh ) ;
3217+ let mut first =
3218+ MultiUseSandbox :: from_snapshot ( snapshot. clone ( ) , HostFunctions :: default ( ) , Some ( config) )
3219+ . unwrap ( ) ;
3220+ let mut second =
3221+ MultiUseSandbox :: from_snapshot ( snapshot, HostFunctions :: default ( ) , Some ( config) ) . unwrap ( ) ;
3222+
3223+ assert_ne ! ( random_sequence( & mut first) , random_sequence( & mut second) ) ;
3224+ }
3225+
3226+ #[ test]
3227+ fn restore_preserves_guest_libc_rng_by_default ( ) {
3228+ let mut sandbox = create_c_test_sandbox ( ) ;
3229+ let snapshot = sandbox. snapshot ( ) . unwrap ( ) ;
3230+ let expected = random_sequence ( & mut sandbox) ;
3231+
3232+ sandbox. restore ( snapshot) . unwrap ( ) ;
3233+
3234+ assert_eq ! ( random_sequence( & mut sandbox) , expected) ;
3235+ }
3236+
3237+ #[ test]
3238+ fn restore_reseeds_guest_libc_rng_when_requested ( ) {
3239+ use crate :: sandbox:: { RngRestorePolicy , SandboxConfiguration } ;
3240+
3241+ let mut config = SandboxConfiguration :: default ( ) ;
3242+ config. set_rng_restore_policy ( RngRestorePolicy :: Refresh ) ;
3243+ let mut sandbox = create_c_test_sandbox_with_config ( Some ( config) ) ;
3244+ let snapshot = sandbox. snapshot ( ) . unwrap ( ) ;
3245+ let captured = random_sequence ( & mut sandbox) ;
3246+
3247+ sandbox. restore ( snapshot) . unwrap ( ) ;
3248+
3249+ assert_ne ! ( random_sequence( & mut sandbox) , captured) ;
3250+ }
3251+
31783252/// `from_snapshot` honors `guest_core_dump=true` so that
31793253/// `generate_crashdump_to_dir` writes a file.
31803254#[ test]
0 commit comments