diff --git a/cli/tests/integration/eval_tests.rs b/cli/tests/integration/eval_tests.rs index d7586e919c..d7503ca807 100644 --- a/cli/tests/integration/eval_tests.rs +++ b/cli/tests/integration/eval_tests.rs @@ -20,6 +20,30 @@ fn eval_p() { assert_eq!("3", stdout_str); } +// Make sure that snapshot flags don't affect runtime. +#[test] +fn eval_randomness() { + let mut numbers = Vec::with_capacity(10); + for _ in 0..10 { + let output = util::deno_cmd() + .arg("eval") + .arg("-p") + .arg("Math.random()") + .stdout(std::process::Stdio::piped()) + .spawn() + .unwrap() + .wait_with_output() + .unwrap(); + assert!(output.status.success()); + let stdout_str = util::strip_ansi_codes( + std::str::from_utf8(&output.stdout).unwrap().trim(), + ); + numbers.push(stdout_str.to_string()); + } + numbers.dedup(); + assert!(numbers.len() > 1); +} + itest!(_029_eval { args: "eval console.log(\"hello\")", output: "029_eval.out", diff --git a/core/runtime.rs b/core/runtime.rs index f8afeb76c5..476267a941 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -204,7 +204,10 @@ impl Drop for JsRuntime { } } -fn v8_init(v8_platform: Option>) { +fn v8_init( + v8_platform: Option>, + predictable: bool, +) { // Include 10MB ICU data file. #[repr(C, align(16))] struct IcuData([u8; 10284336]); @@ -222,7 +225,15 @@ fn v8_init(v8_platform: Option>) { " --harmony-import-assertions", " --no-validate-asm", ); - v8::V8::set_flags_from_string(flags); + + if predictable { + v8::V8::set_flags_from_string(&format!( + "{}{}", + flags, " --predictable --random-seed=42" + )); + } else { + v8::V8::set_flags_from_string(flags); + } } #[derive(Default)] @@ -251,6 +262,7 @@ pub struct RuntimeOptions { pub startup_snapshot: Option, /// Prepare runtime to take snapshot of loaded code. + /// The snapshot is determinstic and uses predictable random numbers. /// /// Currently can't be used with `startup_snapshot`. pub will_snapshot: bool, @@ -284,7 +296,7 @@ impl JsRuntime { let v8_platform = options.v8_platform.take(); static DENO_INIT: Once = Once::new(); - DENO_INIT.call_once(move || v8_init(v8_platform)); + DENO_INIT.call_once(move || v8_init(v8_platform, options.will_snapshot)); let has_startup_snapshot = options.startup_snapshot.is_some();