From eec053a58afc0586dde38ec040a25e42d79b076c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Ml=C3=A1dek?= Date: Sun, 24 Oct 2021 13:37:36 +0200 Subject: [PATCH] [db] add basic tests for fs, hierarchies, database --- Cargo.lock | 77 +++++++++++++++++++++++--- Cargo.toml | 5 +- src/database/hierarchies.rs | 1 + src/database/mod.rs | 11 ++++ src/filesystem.rs | 104 ++++++++++++++++++++++++++++++++++++ 5 files changed, 190 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 99b4e55..f6186b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "actix" version = "0.10.0" @@ -117,7 +119,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project 1.0.7", - "rand", + "rand 0.7.3", "regex", "serde", "serde_json", @@ -414,7 +416,7 @@ dependencies = [ "log", "mime", "percent-encoding", - "rand", + "rand 0.7.3", "serde", "serde_json", "serde_urlencoded", @@ -841,6 +843,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 = "fuchsia-zircon" version = "0.3.3" @@ -1649,6 +1657,19 @@ dependencies = [ "scheduled-thread-pool", ] +[[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 0.3.9", +] + [[package]] name = "rand" version = "0.7.3" @@ -1658,7 +1679,7 @@ dependencies = [ "getrandom 0.1.16", "libc", "rand_chacha", - "rand_core", + "rand_core 0.5.1", "rand_hc", ] @@ -1669,9 +1690,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] +[[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.5.1" @@ -1687,7 +1723,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -1715,6 +1751,15 @@ dependencies = [ "num_cpus", ] +[[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.1.57" @@ -1747,6 +1792,15 @@ version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "resolv-conf" version = "0.7.0" @@ -1980,6 +2034,16 @@ dependencies = [ "unicode-xid", ] +[[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 = "termcolor" version = "1.1.2" @@ -2208,7 +2272,7 @@ dependencies = [ "idna", "lazy_static", "log", - "rand", + "rand 0.7.3", "smallvec", "thiserror", "tokio 0.2.25", @@ -2319,6 +2383,7 @@ dependencies = [ "rayon", "serde", "serde_json", + "tempdir", "thiserror", "tiny-keccak", "tree_magic", diff --git a/Cargo.toml b/Cargo.toml index ce962ef..7f189ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,8 +8,6 @@ license = "AGPL-3.0-or-later" edition = "2018" version = "0.0.12-alpha.0" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] clap = "2.33.0" @@ -53,3 +51,6 @@ webbrowser = "0.5.5" xdg = "^2.1" nonempty = "0.6.0" + +[dev-dependencies] +tempdir = "0.3.7" \ No newline at end of file diff --git a/src/database/hierarchies.rs b/src/database/hierarchies.rs index b79f668..e176f63 100644 --- a/src/database/hierarchies.rs +++ b/src/database/hierarchies.rs @@ -306,3 +306,4 @@ mod tests { assert!(invalid_path.is_err()); } } + diff --git a/src/database/mod.rs b/src/database/mod.rs index 8d33d91..a03e187 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -284,3 +284,14 @@ fn initialize_types(pool: &DbPool) -> Result<()> { upend_insert_val!(&pool.get()?, TYPE_ADDR, TYPE_ID_ATTR, TYPE_IS_ATTR); Ok(()) } + +#[cfg(test)] +mod test { + use super::*; + use tempdir::TempDir; + + #[test] + fn test_open() -> Result<(), anyhow::Error> { + open_upend(TempDir::new("upend-test").unwrap(), None, true).map(|_| ()) + } +} diff --git a/src/filesystem.rs b/src/filesystem.rs index 7ddbac3..3d10ca0 100644 --- a/src/filesystem.rs +++ b/src/filesystem.rs @@ -381,3 +381,107 @@ fn _process_directory_entry>( Ok(UpdatePathOutcome::Added(path.clone())) }) } + +#[cfg(test)] +mod test { + use crate::database::open_upend; + use crate::util; + + use super::*; + use std::fs::File; + use std::io::Write; + use tempdir::TempDir; + + #[test] + fn test_rescan() { + // Prepare temporary filesystem structure + let temp_dir = TempDir::new("upend-test").unwrap(); + + let file_path = temp_dir.path().join("my-temporary-note.txt"); + let mut tmp_file = File::create(file_path).unwrap(); + writeln!(tmp_file, "Brian was here. Briefly.").unwrap(); + + let file_path = temp_dir.path().join("hello-world.txt"); + let mut tmp_file = File::create(file_path).unwrap(); + writeln!(tmp_file, "Hello, World!").unwrap(); + + let file_path = temp_dir.path().join("empty"); + File::create(file_path).unwrap(); + + // Initialize database + + let open_result = open_upend(&temp_dir, None, true).unwrap(); + let job_container = Arc::new(RwLock::new(util::jobs::JobContainer::default())); + let job_id = job_container + .write() + .unwrap() + .add_job(util::jobs::Job::new("RESCAN", "TEST JOB")) + .unwrap(); + + // Initial scan + let rescan_result = _rescan_vault( + open_result.pool.clone(), + temp_dir.as_ref().to_path_buf(), + job_container.clone(), + job_id, + ); + + assert!(rescan_result.is_ok()); + let rescan_result = rescan_result.unwrap(); + assert_eq!(rescan_result.len(), 3); + rescan_result.into_iter().for_each(|outcome| { + assert!(outcome.is_ok()); + let outcome = outcome.unwrap(); + assert!(matches!(outcome, UpdatePathOutcome::Added(_))) + }); + + // Modification-less rescan + + let rescan_result = _rescan_vault( + open_result.pool.clone(), + temp_dir.as_ref().to_path_buf(), + job_container.clone(), + job_id, + ); + + assert!(rescan_result.is_ok()); + let rescan_result = rescan_result.unwrap(); + assert_eq!(rescan_result.len(), 3); + rescan_result.into_iter().for_each(|outcome| { + assert!(outcome.is_ok()); + let outcome = outcome.unwrap(); + assert!(matches!(outcome, UpdatePathOutcome::Unchanged(_))) + }); + + // Remove a file + + std::fs::remove_file(temp_dir.path().join("hello-world.txt")).unwrap(); + + let rescan_result = _rescan_vault( + open_result.pool, + temp_dir.as_ref().to_path_buf(), + job_container, + job_id, + ); + + assert!(rescan_result.is_ok()); + let rescan_result = rescan_result.unwrap(); + assert_eq!(rescan_result.len(), 3); + assert_eq!( + 2, + rescan_result + .iter() + .filter(|upo| matches!(upo.as_ref().unwrap(), UpdatePathOutcome::Unchanged(_))) + .collect::>() + .len() + ); + assert_eq!( + 1, + rescan_result + .iter() + .filter(|upo| matches!(upo.as_ref().unwrap(), UpdatePathOutcome::Removed(_))) + .collect::>() + .len() + ); + } +}