From 4cdcc3834954797762af83bcc34b922564ece7d5 Mon Sep 17 00:00:00 2001 From: DecDuck Date: Mon, 2 Mar 2026 22:09:22 +1100 Subject: [PATCH] feat: add tests --- libraries/droplet/.github/workflows/test.yml | 42 ++++++ libraries/droplet/Cargo.lock | 124 +++++++++++++----- libraries/droplet/Cargo.toml | 1 + libraries/droplet/src/lib.rs | 2 +- libraries/droplet/src/ssl.rs | 6 +- libraries/droplet/src/tests.rs | 50 +++++-- .../droplet/src/versions/archive_backend.rs | 2 +- libraries/droplet/src/versions/mod.rs | 5 +- .../droplet/src/versions/path_backend.rs | 15 ++- libraries/droplet/src/versions/types.rs | 1 - libraries/droplet/src/vm/mod.rs | 1 + .../droplet/testfiles/bare_files/dotfile.7z | Bin 0 -> 339 bytes .../testfiles/bare_files/emoji_filename.7z | Bin 0 -> 347 bytes .../testfiles/bare_files/empty_file.7z | Bin 0 -> 98 bytes .../file and archive with spaces.7z | Bin 0 -> 371 bytes .../file_with_space_in_extension.7z | Bin 0 -> 363 bytes .../testfiles/bare_files/file_with_spaces.7z | Bin 0 -> 371 bytes .../bare_files/file_without_extension.7z | Bin 0 -> 379 bytes ...filename_only_environment_variable_name.7z | Bin 0 -> 82 bytes .../bare_files/filename_with_asterisk.7z | Bin 0 -> 98 bytes .../bare_files/filename_with_backslashes.7z | Bin 0 -> 379 bytes .../bare_files/filename_with_colon.7z | Bin 0 -> 98 bytes .../bare_files/filename_with_dollar.7z | Bin 0 -> 98 bytes ...filename_with_environment_variable_name.7z | Bin 0 -> 106 bytes .../filename_with_full_windows_path_name.7z | Bin 0 -> 122 bytes .../bare_files/filename_with_lessthan.7z | Bin 0 -> 98 bytes .../bare_files/filename_with_newline.7z | Bin 0 -> 98 bytes .../filename_with_spaces_and_backslashes.7z | Bin 0 -> 419 bytes .../testfiles/bare_files/filename_with_tab.7z | Bin 0 -> 98 bytes ..._with_windows_environment_variable_name.7z | Bin 0 -> 90 bytes .../testfiles/bare_files/standard_archive.7z | Bin 0 -> 347 bytes .../testfiles/bare_files/unicode_filename.7z | Bin 0 -> 347 bytes .../bare_files/windows_reserved_file_name.7z | Bin 0 -> 82 bytes .../subdirectories/dotsubdirectory.7z | Bin 0 -> 413 bytes .../subdirectories/empty_dotsubdirectory.7z | Bin 0 -> 106 bytes .../subdirectories/empty_subdirectory.7z | Bin 0 -> 98 bytes ...ectory_and_file_with_double_backslashes.7z | Bin 0 -> 449 bytes .../subdirectory_and_file_with_spaces.7z | Bin 0 -> 435 bytes ...bdirectory_file_with_double_backslashes.7z | Bin 0 -> 414 bytes .../subdirectory_with_backslashes.7z | Bin 0 -> 130 bytes .../subdirectory_with_double_backslashes.7z | Bin 0 -> 138 bytes .../subdirectory_with_single_backslashes.7z | Bin 0 -> 438 bytes .../subdirectory_with_symlink_to_self.7z | Bin 0 -> 263 bytes 43 files changed, 190 insertions(+), 59 deletions(-) create mode 100644 libraries/droplet/.github/workflows/test.yml create mode 100644 libraries/droplet/testfiles/bare_files/dotfile.7z create mode 100644 libraries/droplet/testfiles/bare_files/emoji_filename.7z create mode 100644 libraries/droplet/testfiles/bare_files/empty_file.7z create mode 100644 libraries/droplet/testfiles/bare_files/file and archive with spaces.7z create mode 100644 libraries/droplet/testfiles/bare_files/file_with_space_in_extension.7z create mode 100644 libraries/droplet/testfiles/bare_files/file_with_spaces.7z create mode 100644 libraries/droplet/testfiles/bare_files/file_without_extension.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_only_environment_variable_name.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_asterisk.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_backslashes.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_colon.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_dollar.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_environment_variable_name.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_full_windows_path_name.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_lessthan.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_newline.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_spaces_and_backslashes.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_tab.7z create mode 100644 libraries/droplet/testfiles/bare_files/filename_with_windows_environment_variable_name.7z create mode 100644 libraries/droplet/testfiles/bare_files/standard_archive.7z create mode 100644 libraries/droplet/testfiles/bare_files/unicode_filename.7z create mode 100644 libraries/droplet/testfiles/bare_files/windows_reserved_file_name.7z create mode 100644 libraries/droplet/testfiles/subdirectories/dotsubdirectory.7z create mode 100644 libraries/droplet/testfiles/subdirectories/empty_dotsubdirectory.7z create mode 100644 libraries/droplet/testfiles/subdirectories/empty_subdirectory.7z create mode 100644 libraries/droplet/testfiles/subdirectories/subdirectory_and_file_with_double_backslashes.7z create mode 100644 libraries/droplet/testfiles/subdirectories/subdirectory_and_file_with_spaces.7z create mode 100644 libraries/droplet/testfiles/subdirectories/subdirectory_file_with_double_backslashes.7z create mode 100644 libraries/droplet/testfiles/subdirectories/subdirectory_with_backslashes.7z create mode 100644 libraries/droplet/testfiles/subdirectories/subdirectory_with_double_backslashes.7z create mode 100644 libraries/droplet/testfiles/subdirectories/subdirectory_with_single_backslashes.7z create mode 100644 libraries/droplet/testfiles/subdirectories/subdirectory_with_symlink_to_self.7z diff --git a/libraries/droplet/.github/workflows/test.yml b/libraries/droplet/.github/workflows/test.yml new file mode 100644 index 00000000..049d389f --- /dev/null +++ b/libraries/droplet/.github/workflows/test.yml @@ -0,0 +1,42 @@ +name: Rust CI + +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] + +env: + CARGO_TERM_COLOR: always + +jobs: + ci: + name: Build, Test, Lint + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + + - name: Cache cargo registry + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Run Clippy (lint) + run: cargo clippy --all-targets --all-features -- -D warnings + + - name: Run tests + run: cargo test --all-features --all --verbose \ No newline at end of file diff --git a/libraries/droplet/Cargo.lock b/libraries/droplet/Cargo.lock index 02718197..cf7b8dac 100644 --- a/libraries/droplet/Cargo.lock +++ b/libraries/droplet/Cargo.lock @@ -61,8 +61,8 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", "synstructure 0.13.1", ] @@ -73,8 +73,8 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", "synstructure 0.13.1", ] @@ -85,8 +85,8 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", ] @@ -96,8 +96,8 @@ version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", ] @@ -242,8 +242,8 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", ] @@ -265,6 +265,7 @@ dependencies = [ "serde_json", "sha2", "speedometer", + "test-generator", "time", "tokio", "uuid", @@ -293,8 +294,8 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 1.0.109", "synstructure 0.12.6", ] @@ -353,8 +354,8 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", ] @@ -427,6 +428,12 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "hex" version = "0.4.3" @@ -637,6 +644,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid 0.1.0", +] + [[package]] name = "proc-macro2" version = "1.0.94" @@ -646,13 +662,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + [[package]] name = "quote" version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.94", ] [[package]] @@ -747,8 +772,8 @@ version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", ] @@ -806,14 +831,25 @@ dependencies = [ "failure", ] +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", +] + [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "unicode-ident", ] @@ -823,8 +859,8 @@ version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "unicode-ident", ] @@ -834,10 +870,10 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 1.0.109", - "unicode-xid", + "unicode-xid 0.2.6", ] [[package]] @@ -846,11 +882,23 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", ] +[[package]] +name = "test-generator" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b23be2add79223226e1cb6446cb3e37506a5927089870687a0f1149bb7a073a" +dependencies = [ + "glob", + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -875,8 +923,8 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", ] @@ -886,8 +934,8 @@ version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", ] @@ -943,8 +991,8 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", ] @@ -960,6 +1008,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -1023,7 +1077,7 @@ version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ - "quote", + "quote 1.0.40", "wasm-bindgen-macro-support", ] @@ -1034,8 +1088,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ "bumpalo", - "proc-macro2", - "quote", + "proc-macro2 1.0.94", + "quote 1.0.40", "syn 2.0.117", "wasm-bindgen-shared", ] diff --git a/libraries/droplet/Cargo.toml b/libraries/droplet/Cargo.toml index 1497a77d..0417f24b 100644 --- a/libraries/droplet/Cargo.toml +++ b/libraries/droplet/Cargo.toml @@ -31,6 +31,7 @@ futures = "0.3.31" getrandom = "0.3.4" libarchive-drop = { version = "*", path = "./libarchive-rust" } speedometer = "0.2.2" +test-generator = "0.3.1" [dependencies.x509-parser] version = "0.17.0" diff --git a/libraries/droplet/src/lib.rs b/libraries/droplet/src/lib.rs index 3459ecf0..666a17bc 100644 --- a/libraries/droplet/src/lib.rs +++ b/libraries/droplet/src/lib.rs @@ -2,9 +2,9 @@ #![feature(impl_trait_in_bindings)] pub mod file_utils; +pub mod manifest; pub mod ssl; pub mod versions; -pub mod manifest; pub mod vm; extern crate libarchive_drop; diff --git a/libraries/droplet/src/ssl.rs b/libraries/droplet/src/ssl.rs index 6f59e984..3a596497 100644 --- a/libraries/droplet/src/ssl.rs +++ b/libraries/droplet/src/ssl.rs @@ -1,5 +1,6 @@ use rcgen::{ - CertificateParams, DistinguishedName, Error, IsCa, KeyPair, KeyUsagePurpose, PublicKeyData, SubjectPublicKeyInfo + CertificateParams, DistinguishedName, Error, IsCa, KeyPair, KeyUsagePurpose, PublicKeyData, + SubjectPublicKeyInfo, }; use ring::rand::SystemRandom; use ring::signature::{EcdsaKeyPair, VerificationAlgorithm}; @@ -42,8 +43,7 @@ pub fn generate_client_certificate( root_ca: String, root_ca_private: String, ) -> Result, rcgen::Error> { - let root_key_pair = - KeyPair::from_pem(&root_ca_private)?; + let root_key_pair = KeyPair::from_pem(&root_ca_private)?; let certificate_params = CertificateParams::from_ca_cert_pem(&root_ca)?; let root_ca = CertificateParams::self_signed(certificate_params, &root_key_pair)?; diff --git a/libraries/droplet/src/tests.rs b/libraries/droplet/src/tests.rs index 99edf35b..d8d097f4 100644 --- a/libraries/droplet/src/tests.rs +++ b/libraries/droplet/src/tests.rs @@ -1,11 +1,45 @@ -use std::path::PathBuf; +#![cfg(test)] +extern crate test_generator; -use crate::versions::create_backend_constructor; +use std::path::Path; -#[tokio::test] -pub async fn test_7z_list() { - let zip_path = "/home/decduck/Dev/droplet/assets/TheGame.zip"; - let mut backend = create_backend_constructor(&PathBuf::from(zip_path)).unwrap()().unwrap(); - let files = backend.list_files().await.unwrap(); - tokio::fs::write("./test.txt", format!("{:?}", files)).await.unwrap(); +use serde_json::json; +use test_generator::test_resources; +use tokio::{fs::File, io::AsyncWriteExt}; + +use crate::manifest::generate_manifest_rusty; + +#[test_resources("testfiles/**/*.7z")] +fn manifest_gen(resource: &str) { + let runtime = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .expect("failed to create tokio runtime"); + + runtime.block_on(async move { + let filepath = Path::new(resource); + let manifest = generate_manifest_rusty( + &filepath, + |_| {}, + |message| { + println!("({}) {}", filepath.display(), message); + }, + None, + ) + .await + .expect(&format!( + "failed to generate manifest for {}", + filepath.display() + )); + + let mut output_path = filepath.to_path_buf(); + output_path.set_extension("json"); + + let mut file = File::create(output_path) + .await + .expect("failed to open output path"); + file.write_all(json!(manifest).to_string().as_bytes()) + .await + .expect("failed to write output"); + }); } diff --git a/libraries/droplet/src/versions/archive_backend.rs b/libraries/droplet/src/versions/archive_backend.rs index 36890a86..bf1604fa 100644 --- a/libraries/droplet/src/versions/archive_backend.rs +++ b/libraries/droplet/src/versions/archive_backend.rs @@ -1,6 +1,6 @@ use std::{path::PathBuf, task::Poll}; -use anyhow::{anyhow}; +use anyhow::anyhow; use async_trait::async_trait; use libarchive_drop::{ archive::{Entry, FileType, ReadCompression, ReadFormat}, diff --git a/libraries/droplet/src/versions/mod.rs b/libraries/droplet/src/versions/mod.rs index 5549ff7c..e73be877 100644 --- a/libraries/droplet/src/versions/mod.rs +++ b/libraries/droplet/src/versions/mod.rs @@ -48,10 +48,7 @@ pub fn create_backend_constructor<'a>( })); }; - let file_extension = path - .extension() - .map(|v| v.to_str()) - .flatten()?; + let file_extension = path.extension().map(|v| v.to_str()).flatten()?; if SUPPORTED_FILE_EXTENSIONS .iter() diff --git a/libraries/droplet/src/versions/path_backend.rs b/libraries/droplet/src/versions/path_backend.rs index 5a0247fa..e3b70570 100644 --- a/libraries/droplet/src/versions/path_backend.rs +++ b/libraries/droplet/src/versions/path_backend.rs @@ -1,9 +1,6 @@ #[cfg(unix)] use std::os::unix::fs::PermissionsExt; -use std::{ - io::SeekFrom, - path::PathBuf, -}; +use std::{io::SeekFrom, path::PathBuf}; use anyhow::anyhow; use async_trait::async_trait; @@ -17,7 +14,10 @@ pub struct PathVersionBackend { pub base_dir: PathBuf, } -use crate::versions::{_list_files, types::{MinimumFileObject, VersionBackend, VersionFile}}; +use crate::versions::{ + _list_files, + types::{MinimumFileObject, VersionBackend, VersionFile}, +}; #[async_trait] impl VersionBackend for PathVersionBackend { @@ -34,7 +34,10 @@ impl VersionBackend for PathVersionBackend { self.peek_file( relative .to_str() - .ok_or(anyhow!("Could not parse path: {}", relative.to_string_lossy()))? + .ok_or(anyhow!( + "Could not parse path: {}", + relative.to_string_lossy() + ))? .to_owned(), ) .await?, diff --git a/libraries/droplet/src/versions/types.rs b/libraries/droplet/src/versions/types.rs index 317408da..d80c1b36 100644 --- a/libraries/droplet/src/versions/types.rs +++ b/libraries/droplet/src/versions/types.rs @@ -13,7 +13,6 @@ pub struct VersionFile { pub trait MinimumFileObject: AsyncRead + Send + Unpin {} impl MinimumFileObject for T {} - #[async_trait] pub trait VersionBackend { fn require_whole_files(&self) -> bool; diff --git a/libraries/droplet/src/vm/mod.rs b/libraries/droplet/src/vm/mod.rs index e69de29b..8b137891 100644 --- a/libraries/droplet/src/vm/mod.rs +++ b/libraries/droplet/src/vm/mod.rs @@ -0,0 +1 @@ + diff --git a/libraries/droplet/testfiles/bare_files/dotfile.7z b/libraries/droplet/testfiles/bare_files/dotfile.7z new file mode 100644 index 0000000000000000000000000000000000000000..9c278ed2c4022b2b142c33416a7c403283cd7167 GIT binary patch literal 339 zcmXr7+Ou9=hJmGf%lyWN3=j|mrEB7%Jl_BR&u}xAfg%6z|No1(|97|Z5G}Gy4BRnE z5+V!aX$F?c;JXr_s zm3XE+dKnYEiRH$37oOGeyt!^KpB^sj*gh?M%{JeMnX>u6y*mVQoKAPx$1wC?@LR8@ zF{M!6wqNC8!Mx?l@ozLvw_cn&qpMD9;wSae?~(`DX86wddt?383H(P?gMWOTXlBT| zbi=#+g9X0sJQpVlu3DQQyX)LWb%~hBwwGx^5&K@2t%-c{G@6y;=kZ%>|NIWp`u=39 zDgy%}3mXF?XTw7Vc5X%nMny$N0iFv$|8sCL%Dl2z&cMLRD9H&84+aK7ZU#MuRE7$M g5}=SIg9sNRgUIYzA*WW}VH9O!WKd{W(#XI70HF_tdH?_b literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/emoji_filename.7z b/libraries/droplet/testfiles/bare_files/emoji_filename.7z new file mode 100644 index 0000000000000000000000000000000000000000..f65e7d1e5a5471455caa6c0423532b2028b932a1 GIT binary patch literal 347 zcmXr7+Ou9=hJi)qOvaao3=j|nr7aF$W_bVqKf}#f28R5<|Nk%E{@>lsL$t^;F>uEu zjc1G7*nhrzBG+_T|EQG>qxZ(TlU-fD`ipsQ)-QY9qbwNwAX4IJY1gCjAKRwX^JE>k zSK^uS=w(dsCYBrDU3gZ<^X9s}e0sR7WBau5HQRh2X3FOO_U;hKaXQ^$AH&dp!Ee2q z#*{*N+kTaY1@o3G$G_1y-Fk8AjIKJZiJ#OJ?5=Yg)g@vg+g_#xMeKW7wkGn)(`Z(XpT}>l{qs9W>-&?b zstgQ_ENl#noDB~d*tr=Q7!?&61$Zt1{m;S0DD%otY#Lc@|q1_l655Q#JZ literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/empty_file.7z b/libraries/droplet/testfiles/bare_files/empty_file.7z new file mode 100644 index 0000000000000000000000000000000000000000..0e4fa0bc39524c572980cea39585896e93e9e398 GIT binary patch literal 98 zcmXr7+Ou9=hJmHokoOz|6gWZY#Mgft8CelsL$t^;F>uEu zjc1G7*nhrzBG+_T|EQG>qxZ(TlU-fD`ipsQ)-QY9qbwNwAX4IJY1gCjAKRwX^JE>k zSK^uS=w(dsCYBrDU3gZ<^X9s}e0sR7WBau5HQRh2X3FOO_U;hKaXQ^$AH&dp!Ee2q z#*{*N+kTaY1@o3G$G_1y-Fk8AjIKJZiJ#OJ?5=Yg)g@vg+g_#xMeKW7wkGn)(`Z(XpT}>l{qs9W>-&?b zstgQ_ENl#noDB~d*tr=Q7!?&61$Zt1{m;S0DD%oKf}#f28R5<|Nk%E{@>lsL$t^;F>uEu zjc1G7*nhrzBG+_T|EQG>qxZ(TlU-fD`ipsQ)-QY9qbwNwAX4IJY1gCjAKRwX^JE>k zSK^uS=w(dsCYBrDU3gZ<^X9s}e0sR7WBau5HQRh2X3FOO_U;hKaXQ^$AH&dp!Ee2q z#*{*N+kTaY1@o3G$G_1y-Fk8AjIKJZiJ#OJ?5=Yg)g@vg+g_#xMeKW7wkGn)(`Z(XpT}>l{qs9W>-&?b zstgQ_ENl#noDB~d*tr=Q7!?&61$Zt1{m;S0DD%olsL$t^;F>uEu zjc1G7*nhrzBG+_T|EQG>qxZ(TlU-fD`ipsQ)-QY9qbwNwAX4IJY1gCjAKRwX^JE>k zSK^uS=w(dsCYBrDU3gZ<^X9s}e0sR7WBau5HQRh2X3FOO_U;hKaXQ^$AH&dp!Ee2q z#*{*N+kTaY1@o3G$G_1y-Fk8AjIKJZiJ#OJ?5=Yg)g@vg+g_#xMeKW7wkGn)(`Z(XpT}>l{qs9W>-&?b zstgQ_ENl#noDB~d*tr=Q7!?&61$Zt1{m;S0DD%oW?iCoiV{i9YkjNTjTPIh(q>M!QKS-jI4}&j1ByZ4U$X@41&B2DhwVB{tUhhu0S;+ aT#O8if4v>fuDru2%Eri`(6FSDfdK$1y$&A$ literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/filename_with_asterisk.7z b/libraries/droplet/testfiles/bare_files/filename_with_asterisk.7z new file mode 100644 index 0000000000000000000000000000000000000000..9435c06c1cee49f64721514af94ae5ba1606bcfa GIT binary patch literal 98 zcmXr7+Ou9=hJocdqwf<2C~$((Ec?%WXJlpMV{G7OY>;GPU=WmLNMp!k$YDrj&|=7A oNMy(bvh;wsf}sScM}&)!VTxYD`LiqUFp9DSvC%d|Q^%wKrtY7xHM_DlVL8Qdd(ymA4KekP&=gB&7 zuf#Lu(aV_NO)NLQyYQ@z=goC{`SfsE$M$LAYqt45%#_Xl?cE`e<8->iK8B(Hg5P>I zjVXolw*4v(3+63Xj(?+Zy7l7J8C`W+6F;e!ewRGJHp6$u-y7?%PT)VH8vNtyL^DIy zr5oPmA1v^7=eamhaMjub*iRH5;GPU=WmLNMp!k$YDrjuwuw# oNMy(bvh;wsf}sScM}&)!;R>T&^4XPl7)99_85A0pG%_#%0KY5~jsO4v literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/filename_with_dollar.7z b/libraries/droplet/testfiles/bare_files/filename_with_dollar.7z new file mode 100644 index 0000000000000000000000000000000000000000..7d63273ddad953335070fdcf4e7786c0443133fc GIT binary patch literal 98 zcmXr7+Ou9=hJoeER>c?wC~$((rmsyGGqN)BF*fisHb^otFbK*rq%mYNR2V!M v{26>1Tp98h5*c!VB6>hv!B7I!E5gOda7M41`|Qd)jG}Ce37`7BC literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/filename_with_full_windows_path_name.7z b/libraries/droplet/testfiles/bare_files/filename_with_full_windows_path_name.7z new file mode 100644 index 0000000000000000000000000000000000000000..9a81afaa9945c8493fb4d839301bf66fb304a36c GIT binary patch literal 122 zcmXr7+Ou9=hJocw977xf6huL3O|dUJjI4}&j1ByZ4U$X@41$IX&J0!zF%01hnGAUh zDGd1xY#8zw n5*c!VEIlBuU?>6V5#eHF2&h@N{Orm*jG}Ce3qstTB literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/filename_with_newline.7z b/libraries/droplet/testfiles/bare_files/filename_with_newline.7z new file mode 100644 index 0000000000000000000000000000000000000000..8bda74eaa0cdb9fc39dc4a4bc25185a26165edac GIT binary patch literal 98 zcmXr7+Ou9=hJocr|3y&-C~$((50~zm%*e{f$JoHn*dWQoz#u5gkj9Y7ki(G5z{QZq okjRh=Wa$BM1w#o?j|dkdLqyo#)n``TVH9O!WKd{W(#XI70Or~hhX4Qo literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/filename_with_spaces_and_backslashes.7z b/libraries/droplet/testfiles/bare_files/filename_with_spaces_and_backslashes.7z new file mode 100644 index 0000000000000000000000000000000000000000..0d970e530590c7aca7fedafc2d6421b6d715e935 GIT binary patch literal 419 zcmXr7+Ou9=hJj^blY+xT1_)RLr7f=nynFxuKf}#f28R5<|Nk%E{@>lsL$t^;F>uEu zjc1G7*nhrzBG+_T|EQG>qxZ(TlU-fD`ipsQ)-QY9qbwNwAX4IJY1gCjAKRwX^JE>k zSK^uS=w(dsCYBrDU3gZ<^X9s}e0sR7WBau5HQRh2X3FOO_U;hKaXQ^$AH&dp!Ee2q z#*{*N+kTaY1@o3G$G_1y-Fk8AjIKJZiJ#OJ?5=Yg)g@vg+g_#xMeKW7wkGn)(`Z(XpT}>l{qs9W>-&?b zstgQ_ENl#noDB~d*tr=Q7!?&61$Zt1{m;S0DD%o;GPU=WmLNMp!k$YDrj;AF^S oNMy(bvh;wsf}sScM}&)!Vfv2?=g+LX!zjwe$e_@$q>+IE0Oko5Qvd(} literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/filename_with_windows_environment_variable_name.7z b/libraries/droplet/testfiles/bare_files/filename_with_windows_environment_variable_name.7z new file mode 100644 index 0000000000000000000000000000000000000000..2f2c2612cc5f6ad3fed0538adfd69c4dc08fa75d GIT binary patch literal 90 zcmXr7+Ou9=hJi(G!lkneP+$e6cT@{pWn^XKV{G7OY>;GPU=ZYIP-O^Z2xf3)2m-Pg g7$jLhN=3LB8S2(ZHlAI1hf$P`kwKwhNh1RT0OSr3DF6Tf literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/standard_archive.7z b/libraries/droplet/testfiles/bare_files/standard_archive.7z new file mode 100644 index 0000000000000000000000000000000000000000..8d0c97cf1e61735bbaaf9b148c637abe5f4700d3 GIT binary patch literal 347 zcmXr7+Ou9=hJoea`y=cR86Y4EN;_G8xcL76e}SvC%d|Q^%wKrtY7xHM_DlVL8Qdd(ymA4KekP&=gB&7 zuf#Lu(aV_NO)NLQyYQ@z=goC{`SfsE$M$LAYqt45%#_Xl?cE`e<8->iK8B(Hg5P>I zjVXolw*4v(3+63Xj(?+Zy7l7J8C`W+6F;e!ewRGJHp6$u-y7?%PT)VH8vNtyL^DIy zr5oPmA1v^7=eamhaMjub*C^Rf-WMBXQ_LYeS literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/bare_files/unicode_filename.7z b/libraries/droplet/testfiles/bare_files/unicode_filename.7z new file mode 100644 index 0000000000000000000000000000000000000000..57999040802b169095d4a739ebd27391bddfdc91 GIT binary patch literal 347 zcmXr7+Ou9=hJoeugU=TpGC)8Sl%61bYr^~g{~2z^GBD)-{r`XQ_W$m79->8-iGe#N zX*^rp#{To&6S=0#`bVv77`->vo$TuJ)nCkevwqp*9%aGc2ays-OS>MG|JXLAo+s zG^P~F+xDwGESR@kIsT2t>DG%=XLQwRP5h)@`d#t>+YH|se{Zb6I)VR)YVeP*6U_`+ zmu`5Mf3U#Uo#*02!BuM$WOtq0s4fu`+4eFmC}Q8svNe%Uo<_5B{5*bZ?VsO4THl{c zRb^mcWMN}qplg_TZ!zjwe$e_@$q>+IE0A)T8&j0`b literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/subdirectories/dotsubdirectory.7z b/libraries/droplet/testfiles/subdirectories/dotsubdirectory.7z new file mode 100644 index 0000000000000000000000000000000000000000..44e6e5fc54e3f226ea7bb47c11b8e3d658db9105 GIT binary patch literal 413 zcmV;O0b>3)dc3bE8~_Bcy|UO_0RR910000Y000000001vY#+?;|Nj8lT>t=Y{r~@? zxBo{zNELE9VNtk}DCVPv2l?*g9)i;^#X39zOR;{*ii%AyqYc@ArsIqw5mVq<7{zsp z;&=GAlz$9rz}|F8Wa8;uQ?dlu_e2bE*+Ah_{wkthP?q5H(Uq8rekzgjCw2E3zy_F2nElwV)sPRwB~$qI zkv1^}rLgXA!EjAS4AGGhs;yuhy3VmD7+hI~>1I+`zUg+XS>)wg1qk`a+O7QiQY!c4 zl_dZG004nA2d)p*G0nASB}Z2U(;Cx-G1j(uSVWaH-MzKf8G#FprhuiT8uto))tznT zg6G45JsESjN29KDuPPVbhE3cpJ@WHo4+dmA>FpzH_Tze%nrq*t;dL);UNEfZ+iNdH@Ft0RRCb0|5aAT>uaO01SYp3IW6r Hev$wHyehiG literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/subdirectories/empty_dotsubdirectory.7z b/libraries/droplet/testfiles/subdirectories/empty_dotsubdirectory.7z new file mode 100644 index 0000000000000000000000000000000000000000..40cfafe9410d3a32e3352fc67567c29d4b435131 GIT binary patch literal 106 zcmXr7+Ou9=hJoeiqWMpOJV{DLQ1q%r(Gw3m-Fyu3oFcdSCG9&@n rnG8h?sSL?Lk$fPl5~xg)L4=EuLC-eV^YqF)jG}Ce3<3>r9T^w^Nk9~K literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/subdirectories/empty_subdirectory.7z b/libraries/droplet/testfiles/subdirectories/empty_subdirectory.7z new file mode 100644 index 0000000000000000000000000000000000000000..c58de4c1a472735a5e8f020fd824eafa3a6aeb87 GIT binary patch literal 98 zcmXr7+Ou9=hJhvWoAgu$C~$((Ps~=-FtRf8F*ZoDf`tU78HyQ78Il-M7%~}(7*ZLM m8A=%PfvifPv?PNF7bAmR(o50PEAKFhvN19UG`w|WU;qGx6cXbA literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/subdirectories/subdirectory_and_file_with_double_backslashes.7z b/libraries/droplet/testfiles/subdirectories/subdirectory_and_file_with_double_backslashes.7z new file mode 100644 index 0000000000000000000000000000000000000000..344b401016f912d50f11ab8cd56e6775aaa047f5 GIT binary patch literal 449 zcmV;y0Y3gWdc3bE8~_CQSHxs~0RR910000Z000000002kV3i~9|Nj8lT>t=Y{r~@? zxBo{zNELE9VNtk}DCVPv2l?*g9)i;^#X39zOR;{*ii%AyqYc@ArsIqw5mVq<7{zsp z;&=GAlz$9rz}|F8Wa8;uQ?dlu_e2bE*+Ah_{wkthP?q5H(Uq8rekzgjCw2E3zy_F2nElwV)sPRwB~$qI zkv1^}rLgXA!EjAS4AGGhs;yuhy3VmD7+hI~>1I+`zUg+XS>)wg1qk`a+O7QiQY!c4 zl_dZG004nA2d)p*G0nASB}Z2U(;Cx-G1j(uSVWaH-MzKf8G#FprhuiH;?yR!_}wtp ze0WwoY+(1A1B6M^noTk&fI2yBwwPM1akE8^WszPsW;f4_6D#*hds8PY%G1(Tbp$&0 z-?RQJV`s!OD+!Q8XzbI(0ZNt?{d2G~M!AYSHrA4DwrYeMHGqSVV}fQs!~zV)vluQI rpveFL02c;;;QuaO01SZ+3IPY^IQ9Sl&t=B& literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/subdirectories/subdirectory_and_file_with_spaces.7z b/libraries/droplet/testfiles/subdirectories/subdirectory_and_file_with_spaces.7z new file mode 100644 index 0000000000000000000000000000000000000000..99db08e731f8fbefdc22eef8f8a5f0b244a23862 GIT binary patch literal 435 zcmV;k0Zjfkdc3bE8~_ApSoH>Q0RR910000Z000000002_>@|_^|Nj8lT>t=Y{r~@? zxBo{zNELE9VNtk}DCVPv2l?*g9)i;^#X39zOR;{*ii%AyqYc@ArsIqw5mVq<7{zsp z;&=GAlz$9rz}|F8Wa8;uQ?dlu_e2bE*+Ah_{wkthP?q5H(Uq8rekzgjCw2E3zy_F2nElwV)sPRwB~$qI zkv1^}rLgXA!EjAS4AGGhs;yuhy3VmD7+hI~>1I+`zUg+XS>)wg1qk`a+O7QiQY!c4 zl_dZG004nA2d)p*G0nASB}Z2U(;Cx-G1j(uSVWaH-MzKf8G#FprhuiH;?yR!kR>#> zW$>ce@m#!d_PYzmJ&mo_s$=|k@}T5Z6mt*L&5!r^Dhh;-=SDwdj3E{JP)(N|Kd!^8 zQWBrt=~!9Q%hBGg=f$N>WWoY>^hKLSY61!!tA-(1Yx$yuO27uuK34o6P d2MYlJ0V4we0R>$E5C8xSfaVGTqD1mP004^*$P54g literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/subdirectories/subdirectory_file_with_double_backslashes.7z b/libraries/droplet/testfiles/subdirectories/subdirectory_file_with_double_backslashes.7z new file mode 100644 index 0000000000000000000000000000000000000000..a04225ecb6fd14003b28b81604cc5af71a9423d1 GIT binary patch literal 414 zcmV;P0b%|(dc3bE8~_CG$xsel0RR910000Y000000002C&%4y`|Nj8lT>t=Y{r~@? zxBo{zNELE9VNtk}DCVPv2l?*g9)i;^#X39zOR;{*ii%AyqYc@ArsIqw5mVq<7{zsp z;&=GAlz$9rz}|F8Wa8;uQ?dlu_e2bE*+Ah_{wkthP?q5H(Uq8rekzgjCw2E3zy_F2nElwV)sPRwB~$qI zkv1^}rLgXA!EjAS4AGGhs;yuhy3VmD7+hI~>1I+`zUg+XS>)wg1qk`a+O7QiQY!c4 zl_dZG004nA2d)p*G0nASB}Z2U(;Cx-G1j(uSVWaH-MzKf8G#FprhuiT8utoWF4ssb zBw-T3AA3?9qFLZuy+LtS6FEnsKu**G=*(fMmq88)l&R7k4J0Tu7 zqUkr$;>eU-aRPFkO8%CnlIW)ijH-AS27uuK33~ts3jqKDBLe{e1zi9T000bto(cgt I2vsQn01dac!T=+rZ@*g7$;isc$Jijr3KkNyWhiDSWk_O3VaQ}CVn}63 zW+-9E2eK*|Vi?MSVkHb2Kvoh%B2Xq9s5S@4Dh7(B0!ao25iUjsJ=Vin1{> L2sFHPWMBXQu^t+1 literal 0 HcmV?d00001 diff --git a/libraries/droplet/testfiles/subdirectories/subdirectory_with_double_backslashes.7z b/libraries/droplet/testfiles/subdirectories/subdirectory_with_double_backslashes.7z new file mode 100644 index 0000000000000000000000000000000000000000..a0ee82a6b7f69ade57d7e275eeb85a42336e9494 GIT binary patch literal 138 zcmXr7+Ou9=hJnS&u*Zb~3bLT|D&c?27+D$l7#k#6!9s$L48;tk3`qt=Y{r~@? zxBo{zNELE9VNtk}DCVPv2l?*g9)i;^#X39zOR;{*ii%AyqYc@ArsIqw5mVq<7{zsp z;&=GAlz$9rz}|F8Wa8;uQ?dlu_e2bE*+Ah_{wkthP?q5H(Uq8rekzgjCw2E3zy_F2nElwV)sPRwB~$qI zkv1^}rLgXA!EjAS4AGGhs;yuhy3VmD7+hI~>1I+`zUg+XS>)wg1qk`a+O7QiQY!c4 zl_dZG004nA2d)p*G0nASB}Z2U(;Cx-G1j(uSVWaH-MzKf8G#FprhuiH;?yR!hAa@a zW$>ce@m#!d_PYzmJ&mo_s$=|k^UHx$+niSWiG}EVqGF=JWfoY;XIn@FZp=Gb6E_u6 zJlF&@@4eZtNZKDkCM1xZbWwFq^qUtjJ^QPBYnn8y#*sOZa| z_a@cf;^1gdI{anN!H{K6iSwQ)7@yCZbLD5>BBn^~t5+BwPZPe(bLl|OmA#Xib0ad^ zk~d4N%V)4H4RA0FH2ePci=a@h-upF9Or;#s3HMcH4j$a$SF=cLvh38~GVkN1FSQ-$ zd(ZcHPuk6V+jj1x+x54f)_?Klbd-F5uG^kPDf7DepA6fnG1}lSU;nk?M z3$|6g`)nBJxvb)eHg|c^g4X%Zg%TJT#Mu}aIU9~LuyZpqFe)=MGP1@pI505qY@Wo$ LXm{YlaRvqeEl+G^ literal 0 HcmV?d00001