From 8a0fedb22bad576ea11017777f476947f366e5f5 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 4 Jul 2024 09:15:55 +0200 Subject: [PATCH 1/2] fix: assure archives are unique if their generator-scripts are called with arguments. (#1440) Previously there was a race condition that would cause archives to be created either with or without arguments, depending on which test was run first. After its creation, they wouldn't be looked at again as on disk they would already be available in their usable form. --- tests/tools/src/lib.rs | 119 ++++++++++++++++++++++++++++++++++------- 1 file changed, 101 insertions(+), 18 deletions(-) diff --git a/tests/tools/src/lib.rs b/tests/tools/src/lib.rs index 51d83faa0c9..95b61596106 100644 --- a/tests/tools/src/lib.rs +++ b/tests/tools/src/lib.rs @@ -224,6 +224,15 @@ enum DirectoryRoot { StandaloneTest, } +/// Don't add a suffix to the archive name as `args` are platform dependent, none-deterministic, +/// or otherwise don't influence the content of the archive. +/// Note that this also means that `args` won't be used to control the hash of the archive itself. +#[derive(Copy, Clone)] +enum ArgsInHash { + Yes, + No, +} + /// Return the path to the `/tests/fixtures/` directory. pub fn fixture_path(path: impl AsRef) -> PathBuf { fixture_path_inner(path, DirectoryRoot::IntegrationTest) @@ -309,7 +318,19 @@ pub fn scripted_fixture_writable_with_args( args: impl IntoIterator>, mode: Creation, ) -> Result { - scripted_fixture_writable_with_args_inner(script_name, args, mode, DirectoryRoot::IntegrationTest) + scripted_fixture_writable_with_args_inner(script_name, args, mode, DirectoryRoot::IntegrationTest, ArgsInHash::Yes) +} + +/// Like [`scripted_fixture_writable()`], but passes `args` to `script_name` while providing control over +/// the way files are created with `mode`. +/// +/// See [`scripted_fixture_read_only_with_args_single_archive()`] for important details on what `single_archive` means. +pub fn scripted_fixture_writable_with_args_single_archive( + script_name: impl AsRef, + args: impl IntoIterator>, + mode: Creation, +) -> Result { + scripted_fixture_writable_with_args_inner(script_name, args, mode, DirectoryRoot::IntegrationTest, ArgsInHash::No) } /// Like [`scripted_fixture_writable_with_args`], but does not prefix the fixture directory with `tests` @@ -318,7 +339,18 @@ pub fn scripted_fixture_writable_with_args_standalone( args: impl IntoIterator>, mode: Creation, ) -> Result { - scripted_fixture_writable_with_args_inner(script_name, args, mode, DirectoryRoot::StandaloneTest) + scripted_fixture_writable_with_args_inner(script_name, args, mode, DirectoryRoot::StandaloneTest, ArgsInHash::Yes) +} + +/// Like [`scripted_fixture_writable_with_args`], but does not prefix the fixture directory with `tests` +/// +/// See [`scripted_fixture_read_only_with_args_single_archive()`] for important details on what `single_archive` means. +pub fn scripted_fixture_writable_with_args_standalone_single_archive( + script_name: &str, + args: impl IntoIterator>, + mode: Creation, +) -> Result { + scripted_fixture_writable_with_args_inner(script_name, args, mode, DirectoryRoot::StandaloneTest, ArgsInHash::No) } fn scripted_fixture_writable_with_args_inner( @@ -326,16 +358,17 @@ fn scripted_fixture_writable_with_args_inner( args: impl IntoIterator>, mode: Creation, root: DirectoryRoot, + args_in_hash: ArgsInHash, ) -> Result { let dst = tempfile::TempDir::new()?; Ok(match mode { Creation::CopyFromReadOnly => { - let ro_dir = scripted_fixture_read_only_with_args_inner(script_name, args, None, root)?; + let ro_dir = scripted_fixture_read_only_with_args_inner(script_name, args, None, root, args_in_hash)?; copy_recursively_into_existing_dir(ro_dir, dst.path())?; dst } Creation::ExecuteScript => { - scripted_fixture_read_only_with_args_inner(script_name, args, dst.path().into(), root)?; + scripted_fixture_read_only_with_args_inner(script_name, args, dst.path().into(), root, args_in_hash)?; dst } }) @@ -365,7 +398,25 @@ pub fn scripted_fixture_read_only_with_args( script_name: impl AsRef, args: impl IntoIterator>, ) -> Result { - scripted_fixture_read_only_with_args_inner(script_name, args, None, DirectoryRoot::IntegrationTest) + scripted_fixture_read_only_with_args_inner(script_name, args, None, DirectoryRoot::IntegrationTest, ArgsInHash::Yes) +} + +/// Like `scripted_fixture_read_only()`], but passes `args` to `script_name`. +/// +/// Also, don't add a suffix to the archive name as `args` are platform dependent, none-deterministic, +/// or otherwise don't influence the content of the archive. +/// Note that this also means that `args` won't be used to control the hash of the archive itself. +/// +/// Sometimes, this should be combined with adding the archive name to `.gitignore` to prevent its creation +/// in the first place. +/// +/// Note that suffixing archives by default helps to learn what calls are made, and forces the author to +/// think about what should be done to get it right. +pub fn scripted_fixture_read_only_with_args_single_archive( + script_name: impl AsRef, + args: impl IntoIterator>, +) -> Result { + scripted_fixture_read_only_with_args_inner(script_name, args, None, DirectoryRoot::IntegrationTest, ArgsInHash::No) } /// Like [`scripted_fixture_read_only_with_args()`], but does not prefix the fixture directory with `tests` @@ -373,7 +424,15 @@ pub fn scripted_fixture_read_only_with_args_standalone( script_name: impl AsRef, args: impl IntoIterator>, ) -> Result { - scripted_fixture_read_only_with_args_inner(script_name, args, None, DirectoryRoot::StandaloneTest) + scripted_fixture_read_only_with_args_inner(script_name, args, None, DirectoryRoot::StandaloneTest, ArgsInHash::Yes) +} + +/// Like [`scripted_fixture_read_only_with_args_standalone()`], only has a single archive. +pub fn scripted_fixture_read_only_with_args_standalone_single_archive( + script_name: impl AsRef, + args: impl IntoIterator>, +) -> Result { + scripted_fixture_read_only_with_args_inner(script_name, args, None, DirectoryRoot::StandaloneTest, ArgsInHash::No) } fn scripted_fixture_read_only_with_args_inner( @@ -381,6 +440,7 @@ fn scripted_fixture_read_only_with_args_inner( args: impl IntoIterator>, destination_dir: Option<&Path>, root: DirectoryRoot, + args_in_hash: ArgsInHash, ) -> Result { // Assure tempfiles get removed when aborting the test. gix_tempfile::signal::setup( @@ -414,11 +474,23 @@ fn scripted_fixture_read_only_with_args_inner( let script_basename = script_location.file_stem().unwrap_or(script_location.as_os_str()); let archive_file_path = fixture_path_inner( - Path::new("generated-archives").join(format!( - "{}.tar{}", - script_basename.to_str().expect("valid UTF-8"), - if cfg!(feature = "xz") { ".xz" } else { "" } - )), + { + let suffix = match args_in_hash { + ArgsInHash::Yes => { + let mut suffix = args.join("_"); + if !suffix.is_empty() { + suffix.insert(0, '_'); + } + suffix.replace(['\\', '/', ' ', '.'], "_") + } + ArgsInHash::No => "".into(), + }; + Path::new("generated-archives").join(format!( + "{}{suffix}.tar{}", + script_basename.to_str().expect("valid UTF-8"), + if cfg!(feature = "xz") { ".xz" } else { "" } + )) + }, root, ); let (force_run, script_result_directory) = destination_dir.map_or_else( @@ -447,7 +519,15 @@ fn scripted_fixture_read_only_with_args_inner( std::fs::remove_dir_all(&script_result_directory).map_err(|err| format!("Failed to remove '{script_result_directory:?}', please try to do that by hand. Original error: {err}"))? } std::fs::create_dir_all(&script_result_directory)?; - match extract_archive(&archive_file_path, &script_result_directory, script_identity) { + let script_identity_for_archive = match args_in_hash { + ArgsInHash::Yes => script_identity, + ArgsInHash::No => 0, + }; + match extract_archive( + &archive_file_path, + &script_result_directory, + script_identity_for_archive, + ) { Ok((archive_id, platform)) => { eprintln!( "Extracted fixture from archive '{}' ({}, {:?})", @@ -489,12 +569,15 @@ fn scripted_fixture_read_only_with_args_inner( output.stdout.as_bstr(), output.stderr.as_bstr() ); - create_archive_if_not_on_ci(&script_result_directory, &archive_file_path, script_identity).map_err( - |err| { - write_failure_marker(&failure_marker); - err - }, - )?; + create_archive_if_not_on_ci( + &script_result_directory, + &archive_file_path, + script_identity_for_archive, + ) + .map_err(|err| { + write_failure_marker(&failure_marker); + err + })?; } } } From f5a9884006b0ea8d22cc51a119ae87ce10cd3484 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 4 Jul 2024 10:20:24 +0200 Subject: [PATCH 2/2] adapt to changes in `gix-testtools` --- .../generated-archives/make_diff_repo.tar | Bin 169984 -> 140288 bytes .../generated-archives/make_diff_repo_a.tar | Bin 0 -> 169984 bytes gix-diff/tests/tree/mod.rs | 9 --------- gix-filter/tests/driver/mod.rs | 2 +- .../fixtures/generated-archives/.gitignore | 1 + .../connection/fetch/update_refs/tests.rs | 11 +++++++---- .../fixtures/generated-archives/.gitignore | 1 + gix/tests/remote/fetch.rs | 2 +- gix/tests/repository/shallow.rs | 2 +- 9 files changed, 12 insertions(+), 16 deletions(-) create mode 100644 gix-diff/tests/fixtures/generated-archives/make_diff_repo_a.tar diff --git a/gix-diff/tests/fixtures/generated-archives/make_diff_repo.tar b/gix-diff/tests/fixtures/generated-archives/make_diff_repo.tar index 1be3f74ada3739e89df088b006d678f31f4f844a..9327d317f3a0460f04a3aafe8eabbc9beebf92a7 100644 GIT binary patch delta 10516 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 diff --git a/gix-diff/tests/fixtures/generated-archives/make_diff_repo_a.tar b/gix-diff/tests/fixtures/generated-archives/make_diff_repo_a.tar new file mode 100644 index 0000000000000000000000000000000000000000..0a6bbf5031bf87081f4059b9045735e6d17e3830 GIT binary patch literal 169984 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 z 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 gix::Repository { - let dir = - gix_testtools::scripted_fixture_read_only_with_args("make_fetch_repos.sh", [base_repo_path()]).unwrap(); + let dir = gix_testtools::scripted_fixture_read_only_with_args_single_archive( + "make_fetch_repos.sh", + [base_repo_path()], + ) + .unwrap(); gix::open_opts(dir.join(name), restricted()).unwrap() } fn named_repo(name: &str) -> gix::Repository { @@ -34,7 +37,7 @@ mod update { gix::open_opts(dir.join(name), restricted()).unwrap() } fn repo_rw(name: &str) -> (gix::Repository, gix_testtools::tempfile::TempDir) { - let dir = gix_testtools::scripted_fixture_writable_with_args( + let dir = gix_testtools::scripted_fixture_writable_with_args_single_archive( "make_fetch_repos.sh", [base_repo_path()], gix_testtools::Creation::ExecuteScript, @@ -189,7 +192,7 @@ mod update { #[test] fn checked_out_branches_in_worktrees_are_rejected_with_additional_information() -> Result { - let root = gix_path::realpath(gix_testtools::scripted_fixture_read_only_with_args( + let root = gix_path::realpath(gix_testtools::scripted_fixture_read_only_with_args_single_archive( "make_fetch_repos.sh", [base_repo_path()], )?)?; diff --git a/gix/tests/fixtures/generated-archives/.gitignore b/gix/tests/fixtures/generated-archives/.gitignore index ba11709c21a..6a88c9317bd 100644 --- a/gix/tests/fixtures/generated-archives/.gitignore +++ b/gix/tests/fixtures/generated-archives/.gitignore @@ -1,4 +1,5 @@ /make_worktree_repo.tar +/make_worktree_repo_bare.tar /make_worktree_repo_with_configs.tar /make_remote_repos.tar /make_complex_shallow_repo.tar diff --git a/gix/tests/remote/fetch.rs b/gix/tests/remote/fetch.rs index 301c31f0f81..6a5a5eb72ae 100644 --- a/gix/tests/remote/fetch.rs +++ b/gix/tests/remote/fetch.rs @@ -63,7 +63,7 @@ mod blocking_and_async_io { args: impl IntoIterator, mode: Mode, ) -> Result<(gix::Repository, gix_testtools::tempfile::TempDir), gix::open::Error> { - let dir = gix_testtools::scripted_fixture_writable_with_args( + let dir = gix_testtools::scripted_fixture_writable_with_args_single_archive( "make_fetch_repos.sh", [{ let mut url = base_repo_path(); diff --git a/gix/tests/repository/shallow.rs b/gix/tests/repository/shallow.rs index 8e5c2bd0a66..1a27753fdde 100644 --- a/gix/tests/repository/shallow.rs +++ b/gix/tests/repository/shallow.rs @@ -72,7 +72,7 @@ mod traverse { #[parallel] fn complex_graphs_can_be_iterated_despite_multiple_shallow_boundaries() -> crate::Result { let base = gix_path::realpath(gix_testtools::scripted_fixture_read_only("make_remote_repos.sh")?.join("base"))?; - let shallow_base = gix_testtools::scripted_fixture_read_only_with_args( + let shallow_base = gix_testtools::scripted_fixture_read_only_with_args_single_archive( "make_complex_shallow_repo.sh", Some(base.to_string_lossy()), )?;