refactor(tvix/eval/nix_oracle): allow specifying eval strictness

This will be useful for comparing thunking behavior to C++ Nix. I
considered adding this capability to the tvix_tests/nix_tests
infrastructure, but as it would require changing the test file naming
scheme to do it in a clean way, I've postponed it–it's nice that our
tests are compatible with C++ Nix's test suite.

Change-Id: I60bcdd98ed25140e716f0858f8dc28f21ab957aa
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8657
Autosubmit: sterni <sternenseemann@systemli.org>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
sterni 2023-05-27 21:26:38 +02:00 committed by clbot
parent d09f333d0e
commit 0ab6494286

View file

@ -11,11 +11,23 @@ fn nix_binary_path() -> PathBuf {
.into() .into()
} }
fn nix_eval(expr: &str) -> String { #[derive(Clone, Copy)]
enum Strictness {
Lazy,
Strict,
}
fn nix_eval(expr: &str, strictness: Strictness) -> String {
let store_dir = TempDir::new("store-dir").unwrap(); let store_dir = TempDir::new("store-dir").unwrap();
let mut args = match strictness {
Strictness::Lazy => vec![],
Strictness::Strict => vec!["--strict"],
};
args.extend_from_slice(&["--eval", "-E"]);
let output = Command::new(nix_binary_path()) let output = Command::new(nix_binary_path())
.args(["--eval", "--strict", "-E"]) .args(&args[..])
.arg(format!("({expr})")) .arg(format!("({expr})"))
.env( .env(
"NIX_REMOTE", "NIX_REMOTE",
@ -38,10 +50,10 @@ fn nix_eval(expr: &str) -> String {
/// `NIX_INSTANTIATE_BINARY_PATH` env var to resolve the `nix-instantiate` binary) and tvix, and /// `NIX_INSTANTIATE_BINARY_PATH` env var to resolve the `nix-instantiate` binary) and tvix, and
/// assert that the result is identical /// assert that the result is identical
#[track_caller] #[track_caller]
fn compare_eval(expr: &str) { fn compare_eval(expr: &str, strictness: Strictness) {
let nix_result = nix_eval(expr); let nix_result = nix_eval(expr, strictness);
let mut eval = tvix_eval::Evaluation::new(expr, None); let mut eval = tvix_eval::Evaluation::new(expr, None);
eval.strict = true; eval.strict = matches!(strictness, Strictness::Strict);
eval.io_handle = Box::new(tvix_eval::StdIO); eval.io_handle = Box::new(tvix_eval::StdIO);
let tvix_result = eval let tvix_result = eval
@ -56,19 +68,25 @@ fn compare_eval(expr: &str) {
/// Generate a suite of tests which call [`compare_eval`] on expressions, checking that nix and tvix /// Generate a suite of tests which call [`compare_eval`] on expressions, checking that nix and tvix
/// return identical results. /// return identical results.
macro_rules! compare_eval_tests { macro_rules! compare_eval_tests {
() => {}; ($strictness:expr, {}) => {};
($(#[$meta:meta])* $test_name: ident($expr: expr); $($rest:tt)*) => { ($strictness:expr, {$(#[$meta:meta])* $test_name: ident($expr: expr); $($rest:tt)*}) => {
#[test] #[test]
$(#[$meta])* $(#[$meta])*
fn $test_name() { fn $test_name() {
compare_eval($expr); compare_eval($expr, $strictness);
} }
compare_eval_tests!($($rest)*); compare_eval_tests!($strictness, { $($rest)* });
} }
} }
compare_eval_tests! { macro_rules! compare_strict_eval_tests {
($($tests:tt)*) => {
compare_eval_tests!(Strictness::Lazy, { $($tests)* });
}
}
compare_strict_eval_tests! {
literal_int("1"); literal_int("1");
add_ints("1 + 1"); add_ints("1 + 1");
add_lists("[1 2] ++ [3 4]"); add_lists("[1 2] ++ [3 4]");