diff --git a/Cargo.lock b/Cargo.lock index 64054e8..37fb8ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -429,6 +429,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + [[package]] name = "futures" version = "0.1.31" @@ -895,7 +901,7 @@ dependencies = [ "nix", "owo-colors", "plist", - "rand", + "rand 0.8.5", "reqwest", "semver", "serde", @@ -903,6 +909,7 @@ dependencies = [ "serde_with", "tar", "target-lexicon", + "tempdir", "term", "thiserror", "tokio", @@ -1098,6 +1105,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + [[package]] name = "rand" version = "0.8.5" @@ -1106,7 +1126,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -1116,9 +1136,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", ] +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + [[package]] name = "rand_core" version = "0.6.4" @@ -1128,6 +1163,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -1172,6 +1216,15 @@ version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + [[package]] name = "reqwest" version = "0.11.13" @@ -1487,6 +1540,16 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9410d0f6853b1d94f0e519fb95df60f29d2c1eff2d921ffdf01a4c8a3b54f12d" +[[package]] +name = "tempdir" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" +dependencies = [ + "rand 0.4.6", + "remove_dir_all", +] + [[package]] name = "term" version = "0.7.0" diff --git a/Cargo.toml b/Cargo.toml index ddfdd0b..6f5f681 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ build-inputs = ["darwin.apple_sdk.frameworks.Security"] [features] default = ["cli"] -cli = [ "eyre", "color-eyre", "clap", "tracing-subscriber", "tracing-error", "atty" ] +cli = ["eyre", "color-eyre", "clap", "tracing-subscriber", "tracing-error", "atty"] [[bin]] name = "nix-installer" @@ -55,6 +55,7 @@ term = { version = "0.7.0", default-features = false } [dev-dependencies] eyre = { version = "0.6.8", default-features = false, features = [ "track-caller" ] } +tempdir = "0.3.7" [profile.release] strip = true # Automatically strip symbols from the binary. diff --git a/src/action/base/create_file.rs b/src/action/base/create_file.rs index 6c56337..5bc433a 100644 --- a/src/action/base/create_file.rs +++ b/src/action/base/create_file.rs @@ -174,3 +174,44 @@ impl Action for CreateFile { Ok(()) } } + +#[cfg(test)] +mod test { + use super::*; + + #[tokio::test] + async fn creates_and_deletes_file() -> eyre::Result<()> { + let temp_dir = tempdir::TempDir::new("nix_installer_tests_create_file")?; + let test_file = temp_dir.path().join("creates_and_deletes_file"); + let mut action = + CreateFile::plan(test_file.clone(), None, None, None, "Test".into(), false).await?; + + action.try_execute().await?; + + action.try_revert().await?; + + assert!(!test_file.exists(), "File should have been deleted"); + + Ok(()) + } + + #[tokio::test] + async fn creates_and_deletes_file_even_if_edited() -> eyre::Result<()> { + let temp_dir = tempdir::TempDir::new("nix_installer_tests_create_file")?; + let test_file = temp_dir + .path() + .join("creates_and_deletes_file_even_if_edited"); + let mut action = + CreateFile::plan(test_file.clone(), None, None, None, "Test".into(), false).await?; + + action.try_execute().await?; + + tokio::fs::write(test_file.as_path(), "More content").await?; + + action.try_revert().await?; + + assert!(!test_file.exists(), "File should have been deleted"); + + Ok(()) + } +}