From 6bb407fe2bdc98a3a34172932642f1eff8c4c576 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 5 Jan 2024 11:03:09 +0100 Subject: [PATCH] add test for memory usage in worse-case scenario --- Cargo.lock | 8 +++++ gix-config/tests/Cargo.toml | 7 ++++ gix-config/tests/config.rs | 1 + .../tests/fixtures/fuzzed/.gitattributes | 1 + .../fixtures/fuzzed/mem-amplification.config | Bin 0 -> 977438 bytes gix-config/tests/mem.rs | 33 ++++++++++++++++++ 6 files changed, 50 insertions(+) create mode 100644 gix-config/tests/fixtures/fuzzed/.gitattributes create mode 100644 gix-config/tests/fixtures/fuzzed/mem-amplification.config create mode 100644 gix-config/tests/mem.rs diff --git a/Cargo.lock b/Cargo.lock index 5916f7b02e..7f1d63f7e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -481,6 +481,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7534301c0ea17abb4db06d75efc7b4b0fa360fce8e175a4330d721c71c942ff" +[[package]] +name = "cap" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f125eb85b84a24c36b02ed1d22c9dd8632f53b3cde6e4d23512f94021030003" + [[package]] name = "cassowary" version = "0.3.0" @@ -1596,6 +1602,8 @@ name = "gix-config-tests" version = "0.0.0" dependencies = [ "bstr", + "bytesize", + "cap", "gix", "gix-config", "gix-path 0.10.3", diff --git a/gix-config/tests/Cargo.toml b/gix-config/tests/Cargo.toml index 8fc8775d23..992589ad82 100644 --- a/gix-config/tests/Cargo.toml +++ b/gix-config/tests/Cargo.toml @@ -14,6 +14,10 @@ publish = false name = "config" path = "config.rs" +[[test]] +name = "mem" +path = "mem.rs" + [dev-dependencies] gix-config = { path = ".."} gix-testtools = { path = "../../tests/tools"} @@ -23,3 +27,6 @@ gix-path = { path = "../../gix-path" } gix-sec = { path = "../../gix-sec" } serial_test = { version = "2.0.0", default-features = false } bstr = { version = "1.3.0", default-features = false, features = ["std"] } + +bytesize = "1.3.0" +cap = { version = "0.1.2", features = ["stats"] } \ No newline at end of file diff --git a/gix-config/tests/config.rs b/gix-config/tests/config.rs index fe1b3dec06..604f06000c 100644 --- a/gix-config/tests/config.rs +++ b/gix-config/tests/config.rs @@ -1,6 +1,7 @@ pub use gix_testtools::Result; mod file; +mod mem; mod parse; mod source; mod value; diff --git a/gix-config/tests/fixtures/fuzzed/.gitattributes b/gix-config/tests/fixtures/fuzzed/.gitattributes new file mode 100644 index 0000000000..b375b71449 --- /dev/null +++ b/gix-config/tests/fixtures/fuzzed/.gitattributes @@ -0,0 +1 @@ +*.config -text -eof diff --git a/gix-config/tests/fixtures/fuzzed/mem-amplification.config b/gix-config/tests/fixtures/fuzzed/mem-amplification.config new file mode 100644 index 0000000000000000000000000000000000000000..c2b03e650610af0df061ab2a514a0946dabacd14 GIT binary patch literal 977438 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%0D8}RL*?TO|G_%`6%%1H{y03ZW^45;1!%p5Rt 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 literal 0 HcmV?d00001 diff --git a/gix-config/tests/mem.rs b/gix-config/tests/mem.rs new file mode 100644 index 0000000000..d8ceb76169 --- /dev/null +++ b/gix-config/tests/mem.rs @@ -0,0 +1,33 @@ +use bytesize::ByteSize; +use cap::Cap; +use std::alloc; +use std::time::Instant; + +#[global_allocator] +static ALLOCATOR: Cap = Cap::new(alloc::System, usize::max_value()); + +#[test] +fn usage() { + let before = ALLOCATOR.allocated(); + let start = Instant::now(); + let config = gix_config::File::from_bytes_no_includes( + include_bytes!("fixtures/fuzzed/mem-amplification.config"), + gix_config::file::Metadata::from(gix_config::Source::User), + Default::default(), + ) + .unwrap(); + let after = ALLOCATOR.allocated(); + let used = after - before; + let elapsed = start.elapsed().as_secs_f32(); + eprintln!( + "used mem: {}B for {} sections, took {elapsed:.02}s [total-mem: {total}, peak-mem: {peak}]", + ByteSize(used as u64), + config.sections().count(), + total = ByteSize(ALLOCATOR.total_allocated() as u64), + peak = ByteSize(ALLOCATOR.max_allocated() as u64), + ); + assert!( + used < 60 * 1024 * 1024, + "we should now start using more memory than anticipated, to keep mem-amplification low" + ); +}