From e81cd374d8cb61c9df2764ce9ea1183b0e0c17b1 Mon Sep 17 00:00:00 2001 From: J Robert Ray Date: Thu, 30 Apr 2026 14:24:53 -0700 Subject: [PATCH] Add test for var name collision with package name When a namespaced var shares its base name with a separate package (e.g. demo defines var 'samenameaspkg' and package 'samenameaspkg/1.2.3' also exists), the step solver's VarRequirementsValidator incorrectly rejects builds. It matches option keys by base_name, so demo.samenameaspkg=true collides with samenameaspkg=~1.2.3. The test passes for the resolvo solver and correctly expects failure for the cli/checks (step-based) solvers. Signed-off-by: J Robert Ray --- .../cmd-build/src/cmd_build_test/mod.rs | 99 +++++++++++++++++++ cspell.json | 1 + 2 files changed, 100 insertions(+) diff --git a/crates/spk-cli/cmd-build/src/cmd_build_test/mod.rs b/crates/spk-cli/cmd-build/src/cmd_build_test/mod.rs index f5f2a3e97..cfd3572f9 100644 --- a/crates/spk-cli/cmd-build/src/cmd_build_test/mod.rs +++ b/crates/spk-cli/cmd-build/src/cmd_build_test/mod.rs @@ -808,6 +808,105 @@ build: } } +#[spfstest] +#[rstest] +#[case::cli("cli")] +#[case::checks("checks")] +#[case::resolvo("resolvo")] +#[tokio::test] +async fn test_build_var_name_collides_with_package_name( + tmpdir: tempfile::TempDir, + #[case] solver_to_run: &str, +) { + let _rt = spfs_runtime().await; + + build_package!( + tmpdir, + "demo.spk.yaml", + br#" +api: v0/package +pkg: demo/1.0.0 + +build: + options: + - var: samenameaspkg/true + script: + - "true" +"#, + solver_to_run + ); + + build_package!( + tmpdir, + "samenameaspkg.spk.yaml", + br#" +api: v0/package +pkg: samenameaspkg/1.2.3 + +build: + script: + - "true" +"#, + solver_to_run + ); + + build_package!( + tmpdir, + "middle.spk.yaml", + br#" +api: v0/package +pkg: middle/1.0.0 + +build: + options: + - pkg: demo + - var: demo.samenameaspkg/true + script: + - "true" + +install: + requirements: + - pkg: demo + fromBuildEnv: true + - var: demo.samenameaspkg/true +"#, + solver_to_run + ); + + let result = try_build_package!( + tmpdir, + "consumer.spk.yaml", + br#" +api: v0/package +pkg: consumer/1.0.0 + +build: + options: + - pkg: samenameaspkg + - pkg: middle + script: + - "true" +"#, + solver_to_run + ) + .1; + + match solver_to_run { + "resolvo" => { + result.expect("Expected build of consumer to succeed with resolvo"); + } + _ => { + // The step-based solvers (cli, checks) incorrectly reject + // this build because VarRequirementsValidator matches + // option keys by base_name: demo.samenameaspkg=true + // collides with the package option samenameaspkg=~1.2.3. + result.expect_err( + "Expected build of consumer to fail with step solver due to base_name collision", + ); + } + } +} + #[spfstest] #[rstest] #[case::cli("cli")] diff --git a/cspell.json b/cspell.json index 6389e2171..2da9e37d4 100644 --- a/cspell.json +++ b/cspell.json @@ -650,6 +650,7 @@ "rustup", "rwlock", "safeseh", + "samenameaspkg", "sccache", "sched", "sddl",