Skip to content

Commit 9954a35

Browse files
test: serialize test execution to prevent non-deterministic failures due to expectation overrides
1 parent b285c05 commit 9954a35

2 files changed

Lines changed: 38 additions & 2 deletions

File tree

crates/cargo-wdk/src/actions/build/package_task.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,7 @@ mod tests {
677677
os::windows::process::ExitStatusExt,
678678
path::PathBuf,
679679
process::{ExitStatus, Output},
680+
sync::Mutex,
680681
};
681682

682683
use mockall::predicate::eq;
@@ -690,6 +691,14 @@ mod tests {
690691
wdk_build::MockWdkBuild,
691692
};
692693

694+
// Serializes test execution within this module. The
695+
// `stampinf_version_overrides_with_env_var` test mutates the
696+
// `STAMPINF_VERSION` env var via `with_env`, which is process-global state.
697+
// Other tests that call `run_stampinf()` read the same env var, so parallel
698+
// execution causes non-deterministic failures when the env var is
699+
// unexpectedly set.
700+
static TEST_MUTEX: Mutex<()> = Mutex::new(());
701+
693702
#[test]
694703
fn new_succeeds_for_valid_args() {
695704
let package_name = "test_package";
@@ -816,6 +825,7 @@ mod tests {
816825

817826
#[test]
818827
fn run_packages_driver_with_expected_operations() {
828+
let _lock = TEST_MUTEX.lock().unwrap();
819829
let mut harness = PackageTaskHarness::new();
820830
let paths = harness.paths();
821831

@@ -866,6 +876,7 @@ mod tests {
866876

867877
#[test]
868878
fn run_verifies_signatures_when_enabled() {
879+
let _lock = TEST_MUTEX.lock().unwrap();
869880
let mut harness = PackageTaskHarness::new().with_sign_mode(SignMode::Test {
870881
verify_signature: true,
871882
});
@@ -887,6 +898,7 @@ mod tests {
887898

888899
#[test]
889900
fn run_exports_certificate_from_store_when_it_already_exists() {
901+
let _lock = TEST_MUTEX.lock().unwrap();
890902
let mut harness = PackageTaskHarness::new();
891903
let paths = harness.paths();
892904

@@ -935,6 +947,7 @@ mod tests {
935947

936948
#[test]
937949
fn run_returns_error_when_inx_file_is_missing() {
950+
let _lock = TEST_MUTEX.lock().unwrap();
938951
let mut harness = PackageTaskHarness::new();
939952
let paths = harness.paths();
940953
harness.expect_exists(paths.src_inx_file_path.clone(), false);
@@ -951,6 +964,7 @@ mod tests {
951964

952965
#[test]
953966
fn run_returns_error_when_copying_driver_binary_fails() {
967+
let _lock = TEST_MUTEX.lock().unwrap();
954968
let mut harness = PackageTaskHarness::new();
955969
let paths = harness.paths();
956970

@@ -985,6 +999,7 @@ mod tests {
985999

9861000
#[test]
9871001
fn run_returns_error_when_stampinf_fails() {
1002+
let _lock = TEST_MUTEX.lock().unwrap();
9881003
let mut harness = PackageTaskHarness::new();
9891004
let paths = harness.paths();
9901005

@@ -1022,6 +1037,7 @@ mod tests {
10221037

10231038
#[test]
10241039
fn run_returns_error_when_inf2cat_fails() {
1040+
let _lock = TEST_MUTEX.lock().unwrap();
10251041
let mut harness = PackageTaskHarness::new();
10261042
let paths = harness.paths();
10271043

@@ -1060,6 +1076,7 @@ mod tests {
10601076

10611077
#[test]
10621078
fn run_skips_infverif_for_samples_when_wdk_build_is_in_bugged_range() {
1079+
let _lock = TEST_MUTEX.lock().unwrap();
10631080
let mut harness = PackageTaskHarness::new().with_sample_class(true);
10641081
let paths = harness.paths();
10651082

@@ -1109,6 +1126,7 @@ mod tests {
11091126

11101127
#[test]
11111128
fn stampinf_version_overrides_with_env_var() {
1129+
let _lock = TEST_MUTEX.lock().unwrap();
11121130
// verify both with and without the env var set scenarios
11131131
let scenarios = [
11141132
("env_set", Some("1.2.3.4"), true),

crates/cargo-wdk/src/actions/build/tests.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -857,15 +857,23 @@ impl TestBuildAction {
857857
CpuArchitecture::Amd64 => "x86_64",
858858
CpuArchitecture::Arm64 => "aarch64",
859859
};
860+
let mut expected_args: Vec<String> = vec!["rustc".to_string()];
861+
if self.locked {
862+
expected_args.push("--locked".to_string());
863+
}
864+
expected_args.extend(super::features_to_cargo_args(&self.features));
865+
expected_args.extend(["--".to_string(), "--print".to_string(), "cfg".to_string()]);
860866
self.mock_run_command
861867
.expect_run()
862868
.withf(
863869
move |command: &str,
864870
args: &[&str],
865871
_env_vars: &Option<&HashMap<&str, &str>>,
866872
working_dir: &Option<&Path>| {
873+
let expected_refs: Vec<&str> =
874+
expected_args.iter().map(String::as_str).collect();
867875
command == "cargo"
868-
&& args == ["rustc", "--", "--print", "cfg"]
876+
&& args == expected_refs.as_slice()
869877
&& working_dir.is_some_and(|dir| dir == expected_working_dir.as_path())
870878
},
871879
)
@@ -1484,6 +1492,14 @@ mod get_target_arch_from_cargo_rustc {
14841492
cwd: PathBuf,
14851493
stdout: Vec<u8>,
14861494
) {
1495+
let mut expected_args: Vec<String> = vec!["rustc".to_string()];
1496+
if test_build_action.locked {
1497+
expected_args.push("--locked".to_string());
1498+
}
1499+
expected_args.extend(super::super::features_to_cargo_args(
1500+
&test_build_action.features,
1501+
));
1502+
expected_args.extend(["--".to_string(), "--print".to_string(), "cfg".to_string()]);
14871503
test_build_action
14881504
.mock_run_command
14891505
.expect_run()
@@ -1492,8 +1508,10 @@ mod get_target_arch_from_cargo_rustc {
14921508
args: &[&str],
14931509
_env_vars: &Option<&HashMap<&str, &str>>,
14941510
working_dir: &Option<&Path>| {
1511+
let expected_refs: Vec<&str> =
1512+
expected_args.iter().map(String::as_str).collect();
14951513
command == "cargo"
1496-
&& args == ["rustc", "--", "--print", "cfg"]
1514+
&& args == expected_refs.as_slice()
14971515
&& matches!(working_dir, Some(dir) if *dir == cwd.as_path())
14981516
},
14991517
)

0 commit comments

Comments
 (0)