summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/integration/eval_tests.rs24
-rw-r--r--core/runtime.rs18
2 files changed, 39 insertions, 3 deletions
diff --git a/cli/tests/integration/eval_tests.rs b/cli/tests/integration/eval_tests.rs
index d7586e919..d7503ca80 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 f8afeb76c..476267a94 100644
--- a/core/runtime.rs
+++ b/core/runtime.rs
@@ -204,7 +204,10 @@ impl Drop for JsRuntime {
}
}
-fn v8_init(v8_platform: Option<v8::SharedRef<v8::Platform>>) {
+fn v8_init(
+ v8_platform: Option<v8::SharedRef<v8::Platform>>,
+ 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<v8::SharedRef<v8::Platform>>) {
" --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<Snapshot>,
/// 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();