diff --git a/Cargo.lock b/Cargo.lock
index 41ed530..195f3c5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -36,12 +36,6 @@ version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
-[[package]]
-name = "fuchsia-cprng"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
-
[[package]]
name = "getrandom"
version = "0.3.3"
@@ -84,58 +78,11 @@ version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
-[[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_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 = "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 = "remove_dir_all"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
-dependencies = [
- "winapi",
-]
-
[[package]]
name = "rust_kvs"
version = "0.1.0"
dependencies = [
"adler32",
- "tempdir",
"tempfile",
"tinyjson",
]
@@ -162,16 +109,6 @@ dependencies = [
"windows-sys 0.59.0",
]
-[[package]]
-name = "tempdir"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
-dependencies = [
- "rand",
- "remove_dir_all",
-]
-
[[package]]
name = "tempfile"
version = "3.20.0"
@@ -200,28 +137,6 @@ dependencies = [
"wit-bindgen-rt",
]
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
[[package]]
name = "windows-sys"
version = "0.59.0"
diff --git a/MODULE.bazel b/MODULE.bazel
index d267d19..2985f3e 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -60,9 +60,29 @@ bazel_dep(name = "score_format_checker", version = "0.1.1")
bazel_dep(name = "aspect_rules_lint", version = "1.0.3")
bazel_dep(name = "buildifier_prebuilt", version = "7.3.1")
+# Provides, pytest & venv
+bazel_dep(name = "score_python_basics", version = "0.3.2")
+
#docs-as-code
bazel_dep(name = "score_docs_as_code", version = "0.3.3")
+#local_path_override(
+# module_name = "score_docs_as_code",
+# path = "/home/dcalavrezo/sources/docs-as-code",
+#)
+
+
+
+
+git_override(
+ module_name = "score_docs_as_code",
+ remote = "https://github.com/qorix-group/docs-as-code",
+ commit = "5291e3ac506eca9a37d4a4dccf08aa26b920ff9b",
+)
+
+# Additional Python rules provided by aspect, e.g. an improved version of
+bazel_dep(name = "aspect_rules_py", version = "1.4.0")
+
# Module deps
rust = use_extension("@rules_rust//rust:extensions.bzl", "rust")
diff --git a/docs/conf.py b/docs/conf.py
index 0721742..2dd51c3 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -36,6 +36,7 @@
"score_draw_uml_funcs",
"score_source_code_linker",
"score_layout",
+ "sphinxcontrib.test_reports",
]
exclude_patterns = [
diff --git a/docs/test-results/junit-report.xml b/docs/test-results/junit-report.xml
new file mode 100644
index 0000000..6f72a48
--- /dev/null
+++ b/docs/test-results/junit-report.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/test-results/rust-test.json b/docs/test-results/rust-test.json
new file mode 100644
index 0000000..87de275
--- /dev/null
+++ b/docs/test-results/rust-test.json
@@ -0,0 +1,110 @@
+{ "type": "suite", "event": "started", "test_count": 29 }
+{ "type": "test", "event": "started", "name": "tests::test_build" }
+{ "type": "test", "event": "started", "name": "tests::test_build_with_defaults" }
+{ "type": "test", "event": "started", "name": "tests::test_build_with_kvs" }
+{ "type": "test", "event": "started", "name": "tests::test_conversion_failed_from_slice_error" }
+{ "type": "test", "event": "started", "name": "tests::test_conversion_failed_from_utf8_error" }
+{ "type": "test", "event": "started", "name": "tests::test_conversion_failed_from_vec_u8" }
+{ "type": "test", "event": "started", "name": "tests::test_drop" }
+{ "type": "test", "event": "started", "name": "tests::test_flush_on_exit" }
+{ "type": "test", "name": "tests::test_conversion_failed_from_slice_error", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_get_all_keys" }
+{ "type": "test", "name": "tests::test_conversion_failed_from_vec_u8", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_get_filename" }
+{ "type": "test", "name": "tests::test_conversion_failed_from_utf8_error", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_get_inner_value" }
+{ "type": "test", "name": "tests::test_get_inner_value", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_get_value" }
+{ "type": "test", "name": "tests::test_drop", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_get_value_try_from_error" }
+{ "type": "test", "name": "tests::test_flush_on_exit", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_key_exists" }
+{ "type": "test", "name": "tests::test_get_filename", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_kvs_flush_and_snapshot" }
+{ "type": "test", "name": "tests::test_get_value_try_from_error", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_kvs_key_exists_and_get_all_keys" }
+{ "type": "test", "name": "tests::test_build_with_defaults", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_kvs_open_and_set_get_value" }
+{ "type": "test", "name": "tests::test_build", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_kvs_remove_key" }
+{ "type": "test", "name": "tests::test_get_all_keys", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_kvs_reset" }
+{ "type": "test", "name": "tests::test_get_value", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_kvs_working_dir_is_file" }
+{ "type": "test", "name": "tests::test_build_with_kvs", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_kvs_working_dir_not_found" }
+{ "type": "test", "name": "tests::test_key_exists", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_mutex_lock_failed_from_poison_error" }
+{ "type": "test", "name": "tests::test_kvs_flush_and_snapshot", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_need_defaults" }
+{ "type": "test", "name": "tests::test_kvs_key_exists_and_get_all_keys", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_need_kvs" }
+{ "type": "test", "name": "tests::test_kvs_open_and_set_get_value", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_new_kvs_builder" }
+{ "type": "test", "name": "tests::test_kvs_remove_key", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_reset" }
+{ "type": "test", "name": "tests::test_kvs_working_dir_not_found", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_unknown_error_code_from_io_error" }
+{ "type": "test", "name": "tests::test_mutex_lock_failed_from_poison_error", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_unknown_error_code_from_json_generate_error" }
+{ "type": "test", "name": "tests::test_kvs_working_dir_is_file", "event": "ok" }
+{ "type": "test", "event": "started", "name": "tests::test_unknown_error_code_from_json_parse_error" }
+{ "type": "test", "name": "tests::test_unknown_error_code_from_io_error", "event": "ok" }
+{ "type": "test", "name": "tests::test_unknown_error_code_from_json_generate_error", "event": "ok" }
+{ "type": "test", "name": "tests::test_unknown_error_code_from_json_parse_error", "event": "ok" }
+{ "type": "test", "name": "tests::test_need_kvs", "event": "ok" }
+{ "type": "test", "name": "tests::test_new_kvs_builder", "event": "ok" }
+{ "type": "test", "name": "tests::test_kvs_reset", "event": "ok" }
+{ "type": "test", "name": "tests::test_need_defaults", "event": "ok" }
+{ "type": "test", "name": "tests::test_reset", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 29, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.021810895 }
+{ "type": "suite", "event": "started", "test_count": 3 }
+{ "type": "test", "event": "started", "name": "cit_persistency_flush_on_exit_disabled_drop_data" }
+{ "type": "test", "event": "started", "name": "cit_persistency_flush_on_exit_disabled_manual_flush" }
+{ "type": "test", "event": "started", "name": "cit_persistency_flush_on_exit_enabled" }
+{ "type": "test", "name": "cit_persistency_flush_on_exit_disabled_drop_data", "event": "ok" }
+{ "type": "test", "name": "cit_persistency_flush_on_exit_disabled_manual_flush", "event": "ok" }
+{ "type": "test", "name": "cit_persistency_flush_on_exit_enabled", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 3, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.001635728 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "kvs_check_needs_defaults" }
+{ "type": "test", "name": "kvs_check_needs_defaults", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.000578276 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "kvs_check_needs_kvs" }
+{ "type": "test", "name": "kvs_check_needs_kvs", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.000304167 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "kvs_checksum_missing" }
+{ "type": "test", "name": "kvs_checksum_missing", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.000704232 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "kvs_checksum_wrong" }
+{ "type": "test", "name": "kvs_checksum_wrong", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.000873368 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "kvs_without_defaults" }
+{ "type": "test", "name": "kvs_without_defaults", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.001370442 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "kvs_without_defaults" }
+{ "type": "test", "name": "kvs_without_defaults", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.0008213 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "kvs_without_defaults_builder" }
+{ "type": "test", "name": "kvs_without_defaults_builder", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.000572513 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "kvs_snapshot_restore" }
+{ "type": "test", "name": "kvs_snapshot_restore", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.00131247 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "kvs_snapshot_rotation" }
+{ "type": "test", "name": "kvs_snapshot_rotation", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.002026067 }
+{ "type": "suite", "event": "started", "test_count": 0 }
+{ "type": "suite", "event": "ok", "passed": 0, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.00002947 }
+{ "type": "suite", "event": "started", "test_count": 1 }
+{ "type": "test", "event": "started", "name": "src/rust/rust_kvs/src/lib.rs - (line 58)" }
+{ "type": "test", "name": "src/rust/rust_kvs/src/lib.rs - (line 58)", "event": "ok" }
+{ "type": "suite", "event": "ok", "passed": 1, "failed": 0, "ignored": 0, "measured": 0, "filtered_out": 0, "exec_time": 0.123733832 }
diff --git a/docs/utr.rst b/docs/utr.rst
new file mode 100644
index 0000000..e6d7096
--- /dev/null
+++ b/docs/utr.rst
@@ -0,0 +1,6 @@
+Unit Test Results
+================================
+
+.. test-report:: Demo
+ :id: REPORT
+ :file: test-results/junit-report.xml
diff --git a/rust-test.json b/rust-test.json
new file mode 100644
index 0000000..9d9ad31
--- /dev/null
+++ b/rust-test.json
@@ -0,0 +1,142 @@
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#adler32@1.2.0","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/adler32-1.2.0/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"adler32","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/adler32-1.2.0/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","std"],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libadler32-37a0525d1c76412b.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libadler32-37a0525d1c76412b.rmeta"],"executable":null,"fresh":true}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#tinyjson@2.5.1","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tinyjson-2.5.1/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"tinyjson","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tinyjson-2.5.1/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libtinyjson-3ee115ecd092c329.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libtinyjson-3ee115ecd092c329.rmeta"],"executable":null,"fresh":true}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.1","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/cfg-if-1.0.1/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"cfg_if","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/cfg-if-1.0.1/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libcfg_if-4401a9b80495548e.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libcfg_if-4401a9b80495548e.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-message","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"rust_kvs","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"message":{"rendered":"warning: unexpected `cfg` condition name: `coverage_nightly`\n --> src/rust/rust_kvs/src/lib.rs:137:13\n |\n137 | #![cfg_attr(coverage_nightly, feature(coverage_attribute))]\n | ^^^^^^^^^^^^^^^^\n |\n = help: expected names are: `clippy`, `debug_assertions`, `doc`, `docsrs`, `doctest`, `feature`, `fmt_debug`, `miri`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `rustfmt`, `sanitize`, `sanitizer_cfi_generalize_pointers`, `sanitizer_cfi_normalize_integers`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `ub_checks`, `unix`, and `windows`\n = help: consider using a Cargo feature instead\n = help: or consider adding in `Cargo.toml` the `check-cfg` lint config for the lint:\n [lints.rust]\n unexpected_cfgs = { level = \"warn\", check-cfg = ['cfg(coverage_nightly)'] }\n = help: or consider adding `println!(\"cargo::rustc-check-cfg=cfg(coverage_nightly)\");` to the top of the `build.rs`\n = note: see for more information about checking conditional configuration\n = note: `#[warn(unexpected_cfgs)]` on by default\n\n","$message_type":"diagnostic","children":[{"children":[],"code":null,"level":"help","message":"expected names are: `clippy`, `debug_assertions`, `doc`, `docsrs`, `doctest`, `feature`, `fmt_debug`, `miri`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `rustfmt`, `sanitize`, `sanitizer_cfi_generalize_pointers`, `sanitizer_cfi_normalize_integers`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `ub_checks`, `unix`, and `windows`","rendered":null,"spans":[]},{"children":[],"code":null,"level":"help","message":"consider using a Cargo feature instead","rendered":null,"spans":[]},{"children":[],"code":null,"level":"help","message":"or consider adding in `Cargo.toml` the `check-cfg` lint config for the lint:\n [lints.rust]\n unexpected_cfgs = { level = \"warn\", check-cfg = ['cfg(coverage_nightly)'] }","rendered":null,"spans":[]},{"children":[],"code":null,"level":"help","message":"or consider adding `println!(\"cargo::rustc-check-cfg=cfg(coverage_nightly)\");` to the top of the `build.rs`","rendered":null,"spans":[]},{"children":[],"code":null,"level":"note","message":"see for more information about checking conditional configuration","rendered":null,"spans":[]},{"children":[],"code":null,"level":"note","message":"`#[warn(unexpected_cfgs)]` on by default","rendered":null,"spans":[]}],"code":{"code":"unexpected_cfgs","explanation":null},"level":"warning","message":"unexpected `cfg` condition name: `coverage_nightly`","spans":[{"byte_end":5919,"byte_start":5903,"column_end":29,"column_start":13,"expansion":null,"file_name":"src/rust/rust_kvs/src/lib.rs","is_primary":true,"label":null,"line_end":137,"line_start":137,"suggested_replacement":null,"suggestion_applicability":null,"text":[{"highlight_end":29,"highlight_start":13,"text":"#![cfg_attr(coverage_nightly, feature(coverage_attribute))]"}]}]}}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#bitflags@2.9.1","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/bitflags-2.9.1/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"bitflags","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/bitflags-2.9.1/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["std"],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libbitflags-e301e063792c9aac.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libbitflags-e301e063792c9aac.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#pico-args@0.5.0","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/pico-args-0.5.0/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"pico_args","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/pico-args-0.5.0/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default"],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libpico_args-d9e82ca8dbf36eab.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libpico_args-d9e82ca8dbf36eab.rmeta"],"executable":null,"fresh":true}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#once_cell@1.21.3","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/once_cell-1.21.3/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"once_cell","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/once_cell-1.21.3/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","race","std"],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libonce_cell-a0538d40dd182819.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libonce_cell-a0538d40dd182819.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#fastrand@2.3.0","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/fastrand-2.3.0/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"fastrand","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/fastrand-2.3.0/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","default","std"],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libfastrand-b967019321eacf2d.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libfastrand-b967019321eacf2d.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#linux-raw-sys@0.9.4","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/linux-raw-sys-0.9.4/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"linux_raw_sys","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/linux-raw-sys-0.9.4/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["elf","errno","general","ioctl","no_std"],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/liblinux_raw_sys-6471e113c6680e41.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/liblinux_raw_sys-6471e113c6680e41.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.3.3","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/getrandom-0.3.3/Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/getrandom-0.3.3/build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/build/getrandom-8eb593454ad3eb91/build-script-build"],"executable":null,"fresh":false}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#rustix@1.0.7","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustix-1.0.7/Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustix-1.0.7/build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","default","fs","std"],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/build/rustix-70b76c5d0f29852f/build-script-build"],"executable":null,"fresh":false}
+{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.3.3","linked_libs":[],"linked_paths":[],"cfgs":[],"env":[],"out_dir":"/home/dcalavrezo/sources/inc_mw_per/target/debug/build/getrandom-24d5395f6a1785d2/out"}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#libc@0.2.174","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libc-0.2.174/Cargo.toml","target":{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libc-0.2.174/build.rs","edition":"2021","doc":false,"doctest":false,"test":false},"profile":{"opt_level":"0","debuginfo":0,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/build/libc-237ef186908011d7/build-script-build"],"executable":null,"fresh":false}
+{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#rustix@1.0.7","linked_libs":[],"linked_paths":[],"cfgs":["static_assertions","linux_raw","linux_like","linux_kernel"],"env":[],"out_dir":"/home/dcalavrezo/sources/inc_mw_per/target/debug/build/rustix-18406a6bb8916bce/out"}
+{"reason":"build-script-executed","package_id":"registry+https://github.com/rust-lang/crates.io-index#libc@0.2.174","linked_libs":[],"linked_paths":[],"cfgs":["freebsd11","libc_const_extern_fn"],"env":[],"out_dir":"/home/dcalavrezo/sources/inc_mw_per/target/debug/build/libc-6e96a3c09ece9e62/out"}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"rust_kvs","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/librust_kvs-f9e43a89afe15f7b.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/librust_kvs-f9e43a89afe15f7b.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-message","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs_tool#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs_tool/Cargo.toml","target":{"kind":["bin"],"crate_types":["bin"],"name":"kvs_tool","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs_tool/src/kvs_tool.rs","edition":"2021","doc":true,"doctest":false,"test":true},"message":{"rendered":"warning: unused imports: `OpenNeedDefaults` and `OpenNeedKvs`\n --> src/rust/rust_kvs_tool/src/kvs_tool.rs:84:63\n |\n84 | ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue, OpenNeedDefaults, OpenNeedKvs,\n | ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^\n |\n = note: `#[warn(unused_imports)]` on by default\n\n","$message_type":"diagnostic","children":[{"children":[],"code":null,"level":"note","message":"`#[warn(unused_imports)]` on by default","rendered":null,"spans":[]},{"children":[],"code":null,"level":"help","message":"remove the unused imports","rendered":null,"spans":[{"byte_end":3702,"byte_start":3671,"column_end":92,"column_start":61,"expansion":null,"file_name":"src/rust/rust_kvs_tool/src/kvs_tool.rs","is_primary":true,"label":null,"line_end":84,"line_start":84,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","text":[{"highlight_end":92,"highlight_start":61,"text":" ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue, OpenNeedDefaults, OpenNeedKvs,"}]}]}],"code":{"code":"unused_imports","explanation":null},"level":"warning","message":"unused imports: `OpenNeedDefaults` and `OpenNeedKvs`","spans":[{"byte_end":3689,"byte_start":3673,"column_end":79,"column_start":63,"expansion":null,"file_name":"src/rust/rust_kvs_tool/src/kvs_tool.rs","is_primary":true,"label":null,"line_end":84,"line_start":84,"suggested_replacement":null,"suggestion_applicability":null,"text":[{"highlight_end":79,"highlight_start":63,"text":" ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue, OpenNeedDefaults, OpenNeedKvs,"}]},{"byte_end":3702,"byte_start":3691,"column_end":92,"column_start":81,"expansion":null,"file_name":"src/rust/rust_kvs_tool/src/kvs_tool.rs","is_primary":true,"label":null,"line_end":84,"line_start":84,"suggested_replacement":null,"suggestion_applicability":null,"text":[{"highlight_end":92,"highlight_start":81,"text":" ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue, OpenNeedDefaults, OpenNeedKvs,"}]}]}}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs_tool#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs_tool/Cargo.toml","target":{"kind":["bin"],"crate_types":["bin"],"name":"kvs_tool","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs_tool/src/kvs_tool.rs","edition":"2021","doc":true,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_tool-d116fdaec230d770"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_tool-d116fdaec230d770","fresh":false}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#libc@0.2.174","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libc-0.2.174/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"libc","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libc-0.2.174/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/liblibc-8c5aa5eb947b56af.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/liblibc-8c5aa5eb947b56af.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.3.3","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/getrandom-0.3.3/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"getrandom","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/getrandom-0.3.3/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libgetrandom-3c54ed69cc4645e4.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libgetrandom-3c54ed69cc4645e4.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#rustix@1.0.7","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustix-1.0.7/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"rustix","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustix-1.0.7/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["alloc","default","fs","std"],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/librustix-dfac96628721dd43.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/librustix-dfac96628721dd43.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-artifact","package_id":"registry+https://github.com/rust-lang/crates.io-index#tempfile@3.20.0","manifest_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tempfile-3.20.0/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"tempfile","src_path":"/home/dcalavrezo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tempfile-3.20.0/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default","getrandom"],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libtempfile-00bd9e08fe93d614.rlib","/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/libtempfile-00bd9e08fe93d614.rmeta"],"executable":null,"fresh":false}
+{"reason":"compiler-message","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"rust_kvs","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"message":{"rendered":"warning: unexpected `cfg` condition name: `coverage_nightly`\n --> src/rust/rust_kvs/src/lib.rs:137:13\n |\n137 | #![cfg_attr(coverage_nightly, feature(coverage_attribute))]\n | ^^^^^^^^^^^^^^^^\n |\n = help: expected names are: `clippy`, `debug_assertions`, `doc`, `docsrs`, `doctest`, `feature`, `fmt_debug`, `miri`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `rustfmt`, `sanitize`, `sanitizer_cfi_generalize_pointers`, `sanitizer_cfi_normalize_integers`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `ub_checks`, `unix`, and `windows`\n = help: consider using a Cargo feature instead\n = help: or consider adding in `Cargo.toml` the `check-cfg` lint config for the lint:\n [lints.rust]\n unexpected_cfgs = { level = \"warn\", check-cfg = ['cfg(coverage_nightly)'] }\n = help: or consider adding `println!(\"cargo::rustc-check-cfg=cfg(coverage_nightly)\");` to the top of the `build.rs`\n = note: see for more information about checking conditional configuration\n = note: `#[warn(unexpected_cfgs)]` on by default\n\n","$message_type":"diagnostic","children":[{"children":[],"code":null,"level":"help","message":"expected names are: `clippy`, `debug_assertions`, `doc`, `docsrs`, `doctest`, `feature`, `fmt_debug`, `miri`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `rustfmt`, `sanitize`, `sanitizer_cfi_generalize_pointers`, `sanitizer_cfi_normalize_integers`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `ub_checks`, `unix`, and `windows`","rendered":null,"spans":[]},{"children":[],"code":null,"level":"help","message":"consider using a Cargo feature instead","rendered":null,"spans":[]},{"children":[],"code":null,"level":"help","message":"or consider adding in `Cargo.toml` the `check-cfg` lint config for the lint:\n [lints.rust]\n unexpected_cfgs = { level = \"warn\", check-cfg = ['cfg(coverage_nightly)'] }","rendered":null,"spans":[]},{"children":[],"code":null,"level":"help","message":"or consider adding `println!(\"cargo::rustc-check-cfg=cfg(coverage_nightly)\");` to the top of the `build.rs`","rendered":null,"spans":[]},{"children":[],"code":null,"level":"note","message":"see for more information about checking conditional configuration","rendered":null,"spans":[]},{"children":[],"code":null,"level":"note","message":"`#[warn(unexpected_cfgs)]` on by default","rendered":null,"spans":[]}],"code":{"code":"unexpected_cfgs","explanation":null},"level":"warning","message":"unexpected `cfg` condition name: `coverage_nightly`","spans":[{"byte_end":5919,"byte_start":5903,"column_end":29,"column_start":13,"expansion":null,"file_name":"src/rust/rust_kvs/src/lib.rs","is_primary":true,"label":null,"line_end":137,"line_start":137,"suggested_replacement":null,"suggestion_applicability":null,"text":[{"highlight_end":29,"highlight_start":13,"text":"#![cfg_attr(coverage_nightly, feature(coverage_attribute))]"}]}]}}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"kvs_check_need_kvs","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/kvs_check_need_kvs.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_check_need_kvs-e4dffc45ec94f3f6"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_check_need_kvs-e4dffc45ec94f3f6","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"kvs_checksum_wrong","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/kvs_checksum_wrong.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_checksum_wrong-d2f9486129979b57"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_checksum_wrong-d2f9486129979b57","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"kvs_snapshot_rotation","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/kvs_snapshot_rotation.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_snapshot_rotation-92e487f49a4ecccc"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_snapshot_rotation-92e487f49a4ecccc","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"kvs_new_wo_defaults","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/kvs_new_wo_defaults.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_new_wo_defaults-dff5ba608456bf34"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_new_wo_defaults-dff5ba608456bf34","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"kvs_snapshot_restore","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/kvs_snapshot_restore.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_snapshot_restore-693fb19cd8c52f3a"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_snapshot_restore-693fb19cd8c52f3a","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"kvs_new_wo_defaults_builder","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/kvs_new_wo_defaults_builder.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_new_wo_defaults_builder-d57790eb69f815b4"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_new_wo_defaults_builder-d57790eb69f815b4","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"cit_persistency","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/cit_persistency.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/cit_persistency-53de2a6ed5f7b746"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/cit_persistency-53de2a6ed5f7b746","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"kvs_check_need_defaults","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/kvs_check_need_defaults.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_check_need_defaults-635f9e6946f78335"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_check_need_defaults-635f9e6946f78335","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"kvs_default_values","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/kvs_default_values.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_default_values-5d4221be06ce4977"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_default_values-5d4221be06ce4977","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["test"],"crate_types":["bin"],"name":"kvs_checksum_missing","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/tests/kvs_checksum_missing.rs","edition":"2021","doc":false,"doctest":false,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_checksum_missing-946ee290dc73b6b0"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/kvs_checksum_missing-946ee290dc73b6b0","fresh":false}
+{"reason":"compiler-artifact","package_id":"path+file:///home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs#0.1.0","manifest_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"rust_kvs","src_path":"/home/dcalavrezo/sources/inc_mw_per/src/rust/rust_kvs/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":2,"debug_assertions":true,"overflow_checks":true,"test":true},"features":[],"filenames":["/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/rust_kvs-67e3a1f4bb06ff06"],"executable":"/home/dcalavrezo/sources/inc_mw_per/target/debug/deps/rust_kvs-67e3a1f4bb06ff06","fresh":false}
+{"reason":"build-finished","success":true}
+
+running 29 tests
+test tests::test_conversion_failed_from_utf8_error ... ok
+test tests::test_conversion_failed_from_vec_u8 ... ok
+test tests::test_build ... ok
+test tests::test_build_with_defaults ... ok
+test tests::test_drop ... ok
+test tests::test_conversion_failed_from_slice_error ... ok
+test tests::test_flush_on_exit ... ok
+test tests::test_get_inner_value ... ok
+test tests::test_get_all_keys ... ok
+test tests::test_get_value_try_from_error ... ok
+test tests::test_key_exists ... ok
+test tests::test_kvs_reset ... ok
+test tests::test_build_with_kvs ... ok
+test tests::test_kvs_working_dir_not_found ... ok
+test tests::test_kvs_open_and_set_get_value ... ok
+test tests::test_mutex_lock_failed_from_poison_error ... ok
+test tests::test_get_value ... ok
+test tests::test_need_defaults ... ok
+test tests::test_kvs_remove_key ... ok
+test tests::test_kvs_working_dir_is_file ... ok
+test tests::test_get_filename ... ok
+test tests::test_unknown_error_code_from_io_error ... ok
+test tests::test_unknown_error_code_from_json_parse_error ... ok
+test tests::test_unknown_error_code_from_json_generate_error ... ok
+test tests::test_kvs_key_exists_and_get_all_keys ... ok
+test tests::test_new_kvs_builder ... ok
+test tests::test_reset ... ok
+test tests::test_need_kvs ... ok
+test tests::test_kvs_flush_and_snapshot ... ok
+
+test result: ok. 29 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
+
+
+running 3 tests
+test cit_persistency_flush_on_exit_disabled_drop_data ... ok
+test cit_persistency_flush_on_exit_disabled_manual_flush ... ok
+test cit_persistency_flush_on_exit_enabled ... ok
+
+test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test kvs_check_needs_defaults ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test kvs_check_needs_kvs ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test kvs_checksum_missing ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test kvs_checksum_wrong ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test kvs_without_defaults ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test kvs_without_defaults ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test kvs_without_defaults_builder ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test kvs_snapshot_restore ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test kvs_snapshot_rotation ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
+
+
+running 1 test
+test src/rust/rust_kvs/src/lib.rs - (line 58) ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.18s
+
diff --git a/src/rust/rust_kvs/Cargo.toml b/src/rust/rust_kvs/Cargo.toml
index 9009f03..ca30f0e 100644
--- a/src/rust/rust_kvs/Cargo.toml
+++ b/src/rust/rust_kvs/Cargo.toml
@@ -8,5 +8,4 @@ adler32.workspace = true
tinyjson.workspace = true
[dev-dependencies]
-tempdir = "0.3"
tempfile = "3.20"
diff --git a/src/rust/rust_kvs/src/lib.rs b/src/rust/rust_kvs/src/lib.rs
index e2e8370..493ac04 100644
--- a/src/rust/rust_kvs/src/lib.rs
+++ b/src/rust/rust_kvs/src/lib.rs
@@ -58,11 +58,12 @@
//! ```
//! use rust_kvs::{ErrorCode, InstanceId,Kvs,KvsApi, KvsBuilder, KvsValue};
//! use std::collections::HashMap;
+//! use tempfile::tempdir;
//!
//! fn main() -> Result<(), ErrorCode> {
-//!
-//!
-//! let kvs = KvsBuilder::::new(InstanceId::new(0)).dir("").build()?;
+//! let dir = tempdir()?;
+//! let dir_path = dir.path().to_path_buf();
+//! let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path).build()?;
//!
//! kvs.set_value("number", 123.0)?;
//! kvs.set_value("bool", true)?;
@@ -146,7 +147,7 @@ use core::ops::Index;
//std libs
use std::collections::HashMap;
use std::fs;
-use std::path::Path;
+use std::path::PathBuf;
use std::sync::{
atomic::{self, AtomicBool},
Mutex, MutexGuard, PoisonError,
@@ -177,6 +178,9 @@ pub enum ErrorCode {
/// File not found
FileNotFound,
+ /// Not a directory
+ NotADirectory,
+
/// KVS file read error
KvsFileReadError,
@@ -234,15 +238,15 @@ pub struct KvsBuilder {
/// Instance ID
instance_id: InstanceId,
+ /// Working directory
+ dir: PathBuf,
+
/// Need-defaults flag
need_defaults: bool,
/// Need-KVS flag
need_kvs: bool,
- /// Working directory
- dir: Option,
-
/// Phantom data for drop check
_phantom: std::marker::PhantomData,
}
@@ -259,6 +263,9 @@ pub struct Kvs {
/// Feature: `FEAT_REQ__KVS__default_values`
default: HashMap,
+ /// Working directory
+ dir: PathBuf,
+
/// Filename prefix
filename_prefix: String,
@@ -369,6 +376,7 @@ impl From for ErrorCode {
let kind = cause.kind();
match kind {
std::io::ErrorKind::NotFound => ErrorCode::FileNotFound,
+ std::io::ErrorKind::NotADirectory => ErrorCode::NotADirectory,
_ => {
eprintln!("error: unmapped error: {kind}");
ErrorCode::UnmappedError
@@ -452,9 +460,9 @@ impl SnapshotId {
pub trait KvsApi {
fn open(
instance_id: InstanceId,
+ dir: PathBuf,
need_defaults: OpenNeedDefaults,
need_kvs: OpenNeedKvs,
- dir: Option,
) -> Result
where
Self: Sized;
@@ -481,8 +489,8 @@ pub trait KvsApi {
where
Self: Sized;
fn snapshot_restore(&self, id: SnapshotId) -> Result<(), ErrorCode>;
- fn get_kvs_filename(&self, id: SnapshotId) -> String;
- fn get_hash_filename(&self, id: SnapshotId) -> String;
+ fn get_kvs_filename(&self, id: SnapshotId) -> PathBuf;
+ fn get_hash_filename(&self, id: SnapshotId) -> PathBuf;
}
impl KvsBuilder
@@ -491,20 +499,21 @@ where
{
/// Create a builder to open the key-value-storage
///
- /// Only the instance ID must be set. All other settings are using default values until changed
- /// via the builder API.
+ /// Instance ID and working directory must be set.
+ /// All other settings are using default values until changed via the builder API.
///
/// # Parameters
/// * `instance_id`: Instance ID
+ /// * `dir`: Working directory
///
/// # Return Values
/// * KvsBuilder instance
- pub fn new(instance_id: InstanceId) -> Self {
+ pub fn new(instance_id: InstanceId, dir: PathBuf) -> Self {
Self {
instance_id,
+ dir,
need_defaults: false,
need_kvs: false,
- dir: None,
_phantom: std::marker::PhantomData,
}
}
@@ -533,17 +542,6 @@ where
self
}
- /// Set the key-value-storage permanent storage directory
- ///
- /// # Parameters
- /// * `dir`: Path to permanent storage
- ///
- /// # Return Values
- pub fn dir>(mut self, dir: P) -> Self {
- self.dir = Some(dir.into());
- self
- }
-
/// Finalize the builder and open the key-value-storage
///
/// Calls `Kvs::open` with the configured settings.
@@ -563,9 +561,9 @@ where
pub fn build(self) -> Result {
T::open(
self.instance_id,
+ self.dir,
self.need_defaults.into(),
self.need_kvs.into(),
- self.dir,
)
}
}
@@ -579,6 +577,8 @@ impl Kvs {
/// * `FEAT_REQ__KVS__integrity_check`
///
/// # Parameters
+ /// * `dir`: Working directory
+ /// * `filename_prefix`: Filename prefix
/// * `need_file`: fail if file doesn't exist
/// * `verify_hash`: content is verified against a hash file
///
@@ -590,15 +590,16 @@ impl Kvs {
/// * `ErrorCode::KvsHashFileReadError`: KVS hash file read error
/// * `ErrorCode::UnmappedError`: Generic error
fn open_json(
- filename_prefix: &str,
+ dir: &PathBuf,
+ filename_prefix: &String,
need_file: T,
verify_hash: OpenJsonVerifyHash,
) -> Result, ErrorCode>
where
T: Into,
{
- let filename_json = format!("{filename_prefix}.json");
- let filename_hash = format!("{filename_prefix}.hash");
+ let filename_json = dir.join(format!("{filename_prefix}.json"));
+ let filename_hash = dir.join(format!("{filename_prefix}.hash"));
match fs::read_to_string(&filename_json) {
Ok(data) => {
if verify_hash == OpenJsonVerifyHash::Yes {
@@ -608,13 +609,15 @@ impl Kvs {
let hash_kvs = RollingAdler32::from_buffer(data.as_bytes()).hash();
if u32::from_be_bytes(hash.try_into()?) != hash_kvs {
eprintln!(
- "error: KVS data corrupted ({filename_json}, {filename_hash})"
+ "error: KVS data corrupted ({}, {})",
+ filename_json.display(),
+ filename_hash.display()
);
Err(ErrorCode::ValidationFailed)
} else {
println!("JSON data has valid hash");
let data: JsonValue = data.parse()?;
- println!("parsing file {filename_json}");
+ println!("parsing file {}", filename_json.display());
Ok(data
.get::>()
.ok_or(ErrorCode::JsonParserError)?
@@ -625,7 +628,8 @@ impl Kvs {
}
Err(err) => {
eprintln!(
- "error: hash file {filename_hash} could not be read: {err:#?}"
+ "error: hash file {} could not be read: {err:#?}",
+ filename_hash.display()
);
Err(ErrorCode::KvsHashFileReadError)
}
@@ -642,10 +646,16 @@ impl Kvs {
}
Err(err) => {
if need_file.into() == OpenJsonNeedFile::Required {
- eprintln!("error: file {filename_json} could not be read: {err:#?}");
+ eprintln!(
+ "error: file {} could not be read: {err:#?}",
+ filename_json.display()
+ );
Err(ErrorCode::KvsFileReadError)
} else {
- println!("file {filename_json} not found, using empty data");
+ println!(
+ "file {} not found, using empty data",
+ filename_json.display()
+ );
Ok(HashMap::new())
}
}
@@ -662,12 +672,20 @@ impl Kvs {
/// * `ErrorCode::UnmappedError`: Unmapped error
fn snapshot_rotate(&self) -> Result<(), ErrorCode> {
for idx in (1..=KVS_MAX_SNAPSHOTS).rev() {
- let hash_old = format!("{}_{}.hash", self.filename_prefix, idx - 1);
- let hash_new = format!("{}_{}.hash", self.filename_prefix, idx);
- let snap_old = format!("{}_{}.json", self.filename_prefix, idx - 1);
- let snap_new = format!("{}_{}.json", self.filename_prefix, idx);
-
- println!("rotating: {snap_old} -> {snap_new}");
+ let hash_old = self
+ .dir
+ .join(format!("{}_{}.hash", self.filename_prefix, idx - 1));
+ let hash_new = self
+ .dir
+ .join(format!("{}_{}.hash", self.filename_prefix, idx));
+ let snap_old = self
+ .dir
+ .join(format!("{}_{}.json", self.filename_prefix, idx - 1));
+ let snap_new = self
+ .dir
+ .join(format!("{}_{}.json", self.filename_prefix, idx));
+
+ println!("rotating: {} -> {}", snap_old.display(), snap_new.display());
let res = fs::rename(hash_old, hash_new);
if let Err(err) = res {
@@ -713,21 +731,25 @@ impl KvsApi for Kvs {
/// * `ErrorCode::UnmappedError`: Generic error
fn open(
instance_id: InstanceId,
+ dir: PathBuf,
need_defaults: OpenNeedDefaults,
need_kvs: OpenNeedKvs,
- dir: Option,
) -> Result {
- let dir = if let Some(dir) = dir {
- format!("{dir}/")
- } else {
- "".to_string()
- };
- let filename_default = format!("{dir}kvs_{instance_id}_default");
- let filename_prefix = format!("{dir}kvs_{instance_id}");
+ if !dir.is_dir() {
+ return Err(ErrorCode::NotADirectory);
+ }
+ let dir = dir.canonicalize()?;
+ let filename_default = format!("kvs_{instance_id}_default");
+ let filename_prefix = format!("kvs_{instance_id}");
let filename_kvs = format!("{filename_prefix}_0");
- let default = Self::open_json(&filename_default, need_defaults, OpenJsonVerifyHash::No)?;
- let kvs = Self::open_json(&filename_kvs, need_kvs, OpenJsonVerifyHash::Yes)?;
+ let default = Self::open_json(
+ &dir,
+ &filename_default,
+ need_defaults,
+ OpenJsonVerifyHash::No,
+ )?;
+ let kvs = Self::open_json(&dir, &filename_kvs, need_kvs, OpenJsonVerifyHash::Yes)?;
println!("opened KVS: instance '{instance_id}'");
println!("max snapshot count: {KVS_MAX_SNAPSHOTS}");
@@ -735,6 +757,7 @@ impl KvsApi for Kvs {
Ok(Self {
kvs: Mutex::new(kvs),
default,
+ dir,
filename_prefix,
flush_on_exit: AtomicBool::new(true),
})
@@ -939,11 +962,11 @@ impl KvsApi for Kvs {
let hash = RollingAdler32::from_buffer(&buf).hash();
- let filename_json = format!("{}_0.json", self.filename_prefix);
+ let filename_json = self.dir.join(format!("{}_0.json", self.filename_prefix));
let data = String::from_utf8(buf)?;
fs::write(filename_json, &data)?;
- let filename_hash = format!("{}_0.hash", self.filename_prefix);
+ let filename_hash = self.dir.join(format!("{}_0.hash", self.filename_prefix));
fs::write(filename_hash, hash.to_be_bytes()).ok();
Ok(())
@@ -957,7 +980,10 @@ impl KvsApi for Kvs {
let mut count = 0;
for idx in 0..=KVS_MAX_SNAPSHOTS {
- if !Path::new(&format!("{}_{}.json", self.filename_prefix, idx)).exists() {
+ let snapshot_path = self
+ .dir
+ .join(format!("{}_{}.json", self.filename_prefix, idx));
+ if !snapshot_path.exists() {
break;
}
@@ -1011,6 +1037,7 @@ impl KvsApi for Kvs {
}
let kvs = Self::open_json(
+ &self.dir,
&format!("{}_{}", self.filename_prefix, id.0),
OpenJsonNeedFile::Required,
OpenJsonVerifyHash::Yes,
@@ -1026,9 +1053,10 @@ impl KvsApi for Kvs {
/// * `id`: Snapshot ID to get the filename for
///
/// # Return Values
- /// * String: Filename for ID
- fn get_kvs_filename(&self, id: SnapshotId) -> String {
- format!("{}_{}.json", self.filename_prefix, id)
+ /// * PathBuf: Filename for ID
+ fn get_kvs_filename(&self, id: SnapshotId) -> PathBuf {
+ self.dir
+ .join(format!("{}_{}.json", self.filename_prefix, id))
}
/// Return the hash-filename for a given snapshot ID
@@ -1037,9 +1065,10 @@ impl KvsApi for Kvs {
/// * `id`: Snapshot ID to get the hash filename for
///
/// # Return Values
- /// * String: Hash filename for ID
- fn get_hash_filename(&self, id: SnapshotId) -> String {
- format!("{}_{}.hash", self.filename_prefix, id)
+ /// * PathBuf: Hash filename for ID
+ fn get_hash_filename(&self, id: SnapshotId) -> PathBuf {
+ self.dir
+ .join(format!("{}_{}.hash", self.filename_prefix, id))
}
}
@@ -1183,21 +1212,18 @@ impl Index for KvsValue {
#[cfg(test)]
mod tests {
use super::*;
+ use std::fs::File;
use std::sync::Arc;
use std::thread;
- use tempdir::TempDir;
-
- #[must_use]
- fn test_dir() -> (TempDir, String) {
- let temp_dir = TempDir::new("").unwrap();
- let temp_path = temp_dir.path().display().to_string();
- (temp_dir, temp_path)
- }
+ use tempfile::tempdir;
#[test]
fn test_new_kvs_builder() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let builder = KvsBuilder::::new(instance_id.clone()).dir(test_dir().1);
+ let builder = KvsBuilder::::new(instance_id.clone(), dir_path);
assert_eq!(builder.instance_id, instance_id);
assert!(!builder.need_defaults);
@@ -1206,62 +1232,65 @@ mod tests {
#[test]
fn test_need_defaults() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let builder = KvsBuilder::::new(instance_id.clone())
- .dir(test_dir().1)
- .need_defaults(true);
+ let builder = KvsBuilder::::new(instance_id.clone(), dir_path).need_defaults(true);
assert!(builder.need_defaults);
}
#[test]
fn test_need_kvs() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let builder = KvsBuilder::::new(instance_id.clone())
- .dir(test_dir().1)
- .need_kvs(true);
+ let builder = KvsBuilder::::new(instance_id.clone(), dir_path).need_kvs(true);
assert!(builder.need_kvs);
}
#[test]
fn test_build() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let builder = KvsBuilder::::new(instance_id.clone()).dir(test_dir().1);
+ let builder = KvsBuilder::::new(instance_id.clone(), dir_path);
builder.build().unwrap();
}
#[test]
fn test_build_with_defaults() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let builder = KvsBuilder::::new(instance_id.clone())
- .dir(test_dir().1)
- .need_defaults(true);
+ let builder = KvsBuilder::::new(instance_id.clone(), dir_path).need_defaults(true);
assert!(builder.build().is_err());
}
#[test]
fn test_build_with_kvs() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let temp_dir = test_dir();
// negative
- let builder = KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
- .need_kvs(true);
+ let builder = KvsBuilder::::new(instance_id.clone(), dir_path.clone()).need_kvs(true);
assert!(builder.build().is_err());
- KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
+ KvsBuilder::::new(instance_id.clone(), dir_path.clone())
.build()
.unwrap();
// positive
- let builder = KvsBuilder::::new(instance_id)
- .dir(temp_dir.1)
- .need_kvs(true);
+ let builder = KvsBuilder::::new(instance_id, dir_path).need_kvs(true);
builder.build().unwrap();
}
@@ -1326,10 +1355,11 @@ mod tests {
#[test]
fn test_flush_on_exit() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let temp_dir = test_dir();
- let kvs = KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
+ let kvs = KvsBuilder::::new(instance_id.clone(), dir_path)
.build()
.unwrap();
kvs.flush_on_exit(true);
@@ -1337,10 +1367,11 @@ mod tests {
#[test]
fn test_reset() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let temp_dir = test_dir();
- let kvs = KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
+ let kvs = KvsBuilder::::new(instance_id.clone(), dir_path)
.build()
.unwrap();
let _ = kvs.set_value("test", KvsValue::Number(1.0));
@@ -1350,10 +1381,11 @@ mod tests {
#[test]
fn test_get_all_keys() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let temp_dir = test_dir();
- let kvs = KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
+ let kvs = KvsBuilder::::new(instance_id.clone(), dir_path)
.build()
.unwrap();
let _ = kvs.set_value("test", KvsValue::Number(1.0));
@@ -1368,10 +1400,11 @@ mod tests {
#[test]
fn test_key_exists() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let temp_dir = test_dir();
- let kvs = KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
+ let kvs = KvsBuilder::::new(instance_id.clone(), dir_path)
.build()
.unwrap();
let exists = kvs.key_exists("test");
@@ -1385,26 +1418,28 @@ mod tests {
#[test]
fn test_get_filename() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let temp_dir = test_dir();
- let kvs = KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
+ let kvs = KvsBuilder::::new(instance_id.clone(), dir_path)
.build()
.unwrap();
let filename = kvs.get_kvs_filename(SnapshotId::new(0));
assert!(
- filename.ends_with("_0.json"),
+ filename.to_string_lossy().to_string().ends_with("_0.json"),
"Expected filename to end with _0.json"
);
}
#[test]
fn test_get_value() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let temp_dir = test_dir();
let kvs = Arc::new(
- KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
+ KvsBuilder::::new(instance_id.clone(), dir_path)
.build()
.unwrap(),
);
@@ -1426,11 +1461,12 @@ mod tests {
#[test]
fn test_drop() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let temp_dir = test_dir();
let kvs = Arc::new(
- KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
+ KvsBuilder::::new(instance_id.clone(), dir_path)
.build()
.unwrap(),
);
@@ -1453,18 +1489,19 @@ mod tests {
#[cfg_attr(miri, ignore)]
#[test]
fn test_get_value_try_from_error() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(0);
- let temp_dir = test_dir();
std::fs::copy(
"tests/kvs_0_default.json",
- format!("{}/kvs_0_default.json", temp_dir.1.clone()),
+ format!("{}/kvs_0_default.json", dir_path.clone().display()),
)
.unwrap();
let kvs = Arc::new(
- KvsBuilder::::new(instance_id.clone())
- .dir(temp_dir.1.clone())
+ KvsBuilder::::new(instance_id.clone(), dir_path)
.need_defaults(true)
.build()
.unwrap(),
@@ -1489,13 +1526,15 @@ mod tests {
#[test]
fn test_kvs_open_and_set_get_value() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(42);
- let temp_dir = test_dir();
let kvs = Kvs::open(
instance_id.clone(),
+ dir_path,
OpenNeedDefaults::Optional,
OpenNeedKvs::Optional,
- Some(temp_dir.1.clone()),
)
.unwrap();
let _ = kvs.set_value("direct", KvsValue::String("abc".to_string()));
@@ -1505,13 +1544,15 @@ mod tests {
#[test]
fn test_kvs_reset() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(43);
- let temp_dir = test_dir();
let kvs = Kvs::open(
instance_id.clone(),
+ dir_path,
OpenNeedDefaults::Optional,
OpenNeedKvs::Optional,
- Some(temp_dir.1.clone()),
)
.unwrap();
let _ = kvs.set_value("reset", KvsValue::Number(1.0));
@@ -1525,13 +1566,15 @@ mod tests {
#[test]
fn test_kvs_key_exists_and_get_all_keys() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(44);
- let temp_dir = test_dir();
let kvs = Kvs::open(
instance_id.clone(),
+ dir_path,
OpenNeedDefaults::Optional,
OpenNeedKvs::Optional,
- Some(temp_dir.1.clone()),
)
.unwrap();
assert!(!kvs.key_exists("foo").unwrap());
@@ -1543,13 +1586,15 @@ mod tests {
#[test]
fn test_kvs_remove_key() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(45);
- let temp_dir = test_dir();
let kvs = Kvs::open(
instance_id.clone(),
+ dir_path,
OpenNeedDefaults::Optional,
OpenNeedKvs::Optional,
- Some(temp_dir.1.clone()),
)
.unwrap();
let _ = kvs.set_value("bar", KvsValue::Number(2.0));
@@ -1560,13 +1605,15 @@ mod tests {
#[test]
fn test_kvs_flush_and_snapshot() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+
let instance_id = InstanceId::new(46);
- let temp_dir = test_dir();
let kvs = Kvs::open(
instance_id.clone(),
+ dir_path,
OpenNeedDefaults::Optional,
OpenNeedKvs::Optional,
- Some(temp_dir.1.clone()),
)
.unwrap();
let _ = kvs.set_value("snap", KvsValue::Number(3.0));
@@ -1581,4 +1628,31 @@ mod tests {
kvs.snapshot_restore(SnapshotId::new(1)).unwrap();
}
}
+
+ #[test]
+ fn test_kvs_working_dir_not_found() {
+ let result = Kvs::open(
+ InstanceId::new(0),
+ PathBuf::from("/definitely/invalid/"),
+ OpenNeedDefaults::Optional,
+ OpenNeedKvs::Optional,
+ );
+ assert!(result.is_err_and(|e| e == ErrorCode::NotADirectory));
+ }
+
+ #[test]
+ fn test_kvs_working_dir_is_file() {
+ let dir = tempdir().unwrap();
+ let dir_path = dir.path().to_path_buf();
+ let file_path = dir_path.join("example");
+ File::create_new(&file_path).unwrap();
+
+ let result = Kvs::open(
+ InstanceId::new(0),
+ file_path,
+ OpenNeedDefaults::Optional,
+ OpenNeedKvs::Optional,
+ );
+ assert!(result.is_err_and(|e| e == ErrorCode::NotADirectory));
+ }
}
diff --git a/src/rust/rust_kvs/tests/cit_persistency.rs b/src/rust/rust_kvs/tests/cit_persistency.rs
index 59db52a..62ddec8 100644
--- a/src/rust/rust_kvs/tests/cit_persistency.rs
+++ b/src/rust/rust_kvs/tests/cit_persistency.rs
@@ -71,7 +71,7 @@ fn cmp_array(left: Vec, right: Vec) -> bool {
fn cit_persistency_flush_on_exit_enabled() -> Result<(), ErrorCode> {
// Temp directory.
let dir = tempdir()?;
- let dir_path = dir.path().to_string_lossy().to_string();
+ let dir_path = dir.path().to_path_buf();
// Values.
let kv_number = ("number", 123.4);
@@ -94,9 +94,9 @@ fn cit_persistency_flush_on_exit_enabled() -> Result<(), ErrorCode> {
// First KVS run.
let kvs = Kvs::open(
InstanceId::new(0),
+ dir_path.clone(),
OpenNeedDefaults::Optional,
OpenNeedKvs::Optional,
- Some(dir_path.clone()),
)?;
// Set value of each type.
@@ -114,9 +114,9 @@ fn cit_persistency_flush_on_exit_enabled() -> Result<(), ErrorCode> {
// KVS file is expected to exist.
let kvs = Kvs::open(
InstanceId::new(0),
+ dir_path,
OpenNeedDefaults::Optional,
OpenNeedKvs::Required,
- Some(dir_path),
)?;
// Compare each value.
@@ -141,7 +141,7 @@ fn cit_persistency_flush_on_exit_enabled() -> Result<(), ErrorCode> {
fn cit_persistency_flush_on_exit_disabled_drop_data() -> Result<(), ErrorCode> {
// Temp directory.
let dir = tempdir()?;
- let dir_path = dir.path().to_string_lossy().to_string();
+ let dir_path = dir.path().to_path_buf();
// Values.
let kv_number = ("number", 123.4);
@@ -164,9 +164,9 @@ fn cit_persistency_flush_on_exit_disabled_drop_data() -> Result<(), ErrorCode> {
// First KVS run.
let kvs = Kvs::open(
InstanceId::new(0),
+ dir_path.clone(),
OpenNeedDefaults::Optional,
OpenNeedKvs::Optional,
- Some(dir_path.clone()),
)?;
kvs.flush_on_exit(false);
@@ -185,9 +185,9 @@ fn cit_persistency_flush_on_exit_disabled_drop_data() -> Result<(), ErrorCode> {
// KVS file is expected to not to exist.
let kvs = Kvs::open(
InstanceId::new(0),
+ dir_path,
OpenNeedDefaults::Optional,
OpenNeedKvs::Optional,
- Some(dir_path),
)?;
// Make sure no keys are defined.
@@ -201,7 +201,7 @@ fn cit_persistency_flush_on_exit_disabled_drop_data() -> Result<(), ErrorCode> {
fn cit_persistency_flush_on_exit_disabled_manual_flush() -> Result<(), ErrorCode> {
// Temp directory.
let dir = tempdir()?;
- let dir_path = dir.path().to_string_lossy().to_string();
+ let dir_path = dir.path().to_path_buf();
// Values.
let kv_number = ("number", 123.4);
@@ -224,9 +224,9 @@ fn cit_persistency_flush_on_exit_disabled_manual_flush() -> Result<(), ErrorCode
// First KVS run.
let kvs = Kvs::open(
InstanceId::new(0),
+ dir_path.clone(),
OpenNeedDefaults::Optional,
OpenNeedKvs::Optional,
- Some(dir_path.clone()),
)?;
kvs.flush_on_exit(false);
@@ -248,9 +248,9 @@ fn cit_persistency_flush_on_exit_disabled_manual_flush() -> Result<(), ErrorCode
// KVS file is expected to exist.
let kvs = Kvs::open(
InstanceId::new(0),
+ dir_path,
OpenNeedDefaults::Optional,
OpenNeedKvs::Required,
- Some(dir_path),
)?;
// Compare each value.
diff --git a/src/rust/rust_kvs/tests/common.rs b/src/rust/rust_kvs/tests/common.rs
deleted file mode 100644
index 075f358..0000000
--- a/src/rust/rust_kvs/tests/common.rs
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2025 Contributors to the Eclipse Foundation
-//
-// See the NOTICE file(s) distributed with this work for additional
-// information regarding copyright ownership.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Apache License Version 2.0 which is available at
-//
-//
-// SPDX-License-Identifier: Apache-2.0
-
-//! # Common Testcase Functionality
-
-use rust_kvs::ErrorCode;
-use std::time::SystemTime;
-use std::{
- fmt,
- path::{Path, PathBuf},
-};
-
-pub struct TempDir {
- path: PathBuf,
-}
-
-impl TempDir {
- /// Create a temporary directory based on the current timestamp in nanoseconds
- ///
- /// The directory will be removed when the handle is dropped.
- pub fn create() -> Result {
- let mut path = std::env::temp_dir();
- path.push(format!("{:016x}", Self::get_nanos()));
- std::fs::create_dir(&path)?;
- Ok(TempDir { path })
- }
-
- /// Set the generated dir to the current working dir
- pub fn set_current_dir(&self) -> Result<(), ErrorCode> {
- Ok(std::env::set_current_dir(&self.path)?)
- }
-
- /// Return the current timestamp in nanoseconds
- fn get_nanos() -> u128 {
- let time = SystemTime::now()
- .duration_since(SystemTime::UNIX_EPOCH)
- .unwrap();
- time.as_nanos()
- }
-}
-
-impl std::fmt::Display for TempDir {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{}", self.path.display())
- }
-}
-
-impl AsRef for TempDir {
- fn as_ref(&self) -> &Path {
- &self.path
- }
-}
-
-impl Drop for TempDir {
- fn drop(&mut self) {
- let _ = std::fs::remove_dir_all(self.path.clone());
- }
-}
diff --git a/src/rust/rust_kvs/tests/kvs_check_need_defaults.rs b/src/rust/rust_kvs/tests/kvs_check_need_defaults.rs
index 79f7228..965fba0 100644
--- a/src/rust/rust_kvs/tests/kvs_check_need_defaults.rs
+++ b/src/rust/rust_kvs/tests/kvs_check_need_defaults.rs
@@ -12,17 +12,16 @@
//! # Verify File Check for non-existing Defaults File
use rust_kvs::{ErrorCode, InstanceId, Kvs, KvsBuilder};
-
-mod common;
-use crate::common::TempDir;
+use tempfile::tempdir;
/// Start with no KVS and check if the `need_defaults` flag is working
#[test]
fn kvs_check_needs_defaults() -> Result<(), ErrorCode> {
- let dir = TempDir::create()?;
- dir.set_current_dir()?;
+ // Temp directory.
+ let dir = tempdir()?;
+ let dir_path = dir.path().to_path_buf();
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path)
.need_defaults(true)
.need_kvs(false)
.build();
diff --git a/src/rust/rust_kvs/tests/kvs_check_need_kvs.rs b/src/rust/rust_kvs/tests/kvs_check_need_kvs.rs
index 45a7fe8..3cb3b62 100644
--- a/src/rust/rust_kvs/tests/kvs_check_need_kvs.rs
+++ b/src/rust/rust_kvs/tests/kvs_check_need_kvs.rs
@@ -12,17 +12,16 @@
//! # Verify File Check for non-existing KVS File
use rust_kvs::{ErrorCode, InstanceId, Kvs, KvsBuilder};
-
-mod common;
-use crate::common::TempDir;
+use tempfile::tempdir;
/// Start with no KVS and check if the `need_kvs` flag is working
#[test]
fn kvs_check_needs_kvs() -> Result<(), ErrorCode> {
- let dir = TempDir::create()?;
- dir.set_current_dir()?;
+ // Temp directory.
+ let dir = tempdir()?;
+ let dir_path = dir.path().to_path_buf();
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path)
.need_defaults(false)
.need_kvs(true)
.build();
diff --git a/src/rust/rust_kvs/tests/kvs_checksum_missing.rs b/src/rust/rust_kvs/tests/kvs_checksum_missing.rs
index a57c8b0..9f236e0 100644
--- a/src/rust/rust_kvs/tests/kvs_checksum_missing.rs
+++ b/src/rust/rust_kvs/tests/kvs_checksum_missing.rs
@@ -12,17 +12,16 @@
//! # Verify KVS Open with missing Checksum
use rust_kvs::{ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue, SnapshotId};
-
-mod common;
-use crate::common::TempDir;
+use tempfile::tempdir;
/// Create a KVS, close it, delete checksum and try to reopen it.
#[test]
fn kvs_checksum_missing() -> Result<(), ErrorCode> {
- let dir = TempDir::create()?;
- dir.set_current_dir()?;
+ // Temp directory.
+ let dir = tempdir()?;
+ let dir_path = dir.path().to_path_buf();
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path.clone())
.need_defaults(false)
.need_kvs(false)
.build()?;
@@ -50,7 +49,7 @@ fn kvs_checksum_missing() -> Result<(), ErrorCode> {
std::fs::remove_file(hash_filename)?;
// opening must fail because of the missing checksum file
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path)
.need_defaults(false)
.need_kvs(true)
.build();
diff --git a/src/rust/rust_kvs/tests/kvs_checksum_wrong.rs b/src/rust/rust_kvs/tests/kvs_checksum_wrong.rs
index adc6479..ac05399 100644
--- a/src/rust/rust_kvs/tests/kvs_checksum_wrong.rs
+++ b/src/rust/rust_kvs/tests/kvs_checksum_wrong.rs
@@ -12,17 +12,16 @@
//! # Verify KVS Open with wrong Checksum
use rust_kvs::{ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue, SnapshotId};
-
-mod common;
-use crate::common::TempDir;
+use tempfile::tempdir;
/// Create a KVS, close it, modify checksum and try to reopen it.
#[test]
fn kvs_checksum_wrong() -> Result<(), ErrorCode> {
- let dir = TempDir::create()?;
- dir.set_current_dir()?;
+ // Temp directory.
+ let dir = tempdir()?;
+ let dir_path = dir.path().to_path_buf();
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path.clone())
.need_defaults(false)
.need_kvs(false)
.build()?;
@@ -50,7 +49,7 @@ fn kvs_checksum_wrong() -> Result<(), ErrorCode> {
std::fs::write(hash_filename, vec![0x12, 0x34, 0x56, 0x78])?;
// opening must fail because of the missing checksum file
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path)
.need_defaults(false)
.need_kvs(true)
.build();
diff --git a/src/rust/rust_kvs/tests/kvs_default_values.rs b/src/rust/rust_kvs/tests/kvs_default_values.rs
index c51a8c7..d890ace 100644
--- a/src/rust/rust_kvs/tests/kvs_default_values.rs
+++ b/src/rust/rust_kvs/tests/kvs_default_values.rs
@@ -13,11 +13,9 @@
use rust_kvs::{ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue};
use std::collections::HashMap;
+use tempfile::tempdir;
use tinyjson::{JsonGenerator, JsonValue};
-mod common;
-use crate::common::TempDir;
-
/// Test default values
/// * Default file must exist
/// * Default value must be returned when key isn't set
@@ -27,10 +25,12 @@ use crate::common::TempDir;
/// * Change in default must be ignored when key was once set
#[test]
fn kvs_without_defaults() -> Result<(), ErrorCode> {
- let dir = TempDir::create()?;
- dir.set_current_dir()?;
+ // Temp directory.
+ let dir = tempdir()?;
+ let dir_path = dir.path().to_path_buf();
// create defaults file
+ let default_file_path = dir_path.join("kvs_0_default.json");
let defaults: HashMap = HashMap::from([
("number1".to_string(), KvsValue::from(123.0)),
("bool1".to_string(), true.into()),
@@ -44,10 +44,10 @@ fn kvs_without_defaults() -> Result<(), ErrorCode> {
gen.generate(&json)?;
let data = String::from_utf8(buf)?;
- std::fs::write("kvs_0_default.json", &data)?;
+ std::fs::write(default_file_path.clone(), &data)?;
// create KVS
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path.clone())
.need_defaults(true)
.need_kvs(false)
.build()?;
@@ -83,7 +83,7 @@ fn kvs_without_defaults() -> Result<(), ErrorCode> {
// drop the current instance with flush-on-exit enabled and reopen storage
drop(kvs);
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path.clone())
.need_defaults(false)
.need_kvs(true)
.build()?;
@@ -111,9 +111,9 @@ fn kvs_without_defaults() -> Result<(), ErrorCode> {
gen.generate(&json)?;
let data = String::from_utf8(buf)?;
- std::fs::write("kvs_0_default.json", &data)?;
+ std::fs::write(default_file_path, &data)?;
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path)
.need_defaults(false)
.need_kvs(true)
.build()?;
diff --git a/src/rust/rust_kvs/tests/kvs_new_wo_defaults.rs b/src/rust/rust_kvs/tests/kvs_new_wo_defaults.rs
index ca23d04..6509b35 100644
--- a/src/rust/rust_kvs/tests/kvs_new_wo_defaults.rs
+++ b/src/rust/rust_kvs/tests/kvs_new_wo_defaults.rs
@@ -13,17 +13,16 @@
use rust_kvs::{ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue};
use std::collections::HashMap;
-
-mod common;
-use crate::common::TempDir;
+use tempfile::tempdir;
/// Create a key-value-storage without defaults
#[test]
fn kvs_without_defaults() -> Result<(), ErrorCode> {
- let dir = TempDir::create()?;
- dir.set_current_dir()?;
+ // Temp directory.
+ let dir = tempdir()?;
+ let dir_path = dir.path().to_path_buf();
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path.clone())
.need_defaults(false)
.need_kvs(false)
.build()?;
@@ -61,7 +60,7 @@ fn kvs_without_defaults() -> Result<(), ErrorCode> {
// drop the current instance with flush-on-exit enabled and reopen storage
drop(kvs);
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path)
.need_defaults(false)
.need_kvs(true)
.build()?;
diff --git a/src/rust/rust_kvs/tests/kvs_new_wo_defaults_builder.rs b/src/rust/rust_kvs/tests/kvs_new_wo_defaults_builder.rs
index a84c7af..03b416f 100644
--- a/src/rust/rust_kvs/tests/kvs_new_wo_defaults_builder.rs
+++ b/src/rust/rust_kvs/tests/kvs_new_wo_defaults_builder.rs
@@ -13,16 +13,16 @@
use rust_kvs::{ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue};
use std::collections::HashMap;
+use tempfile::tempdir;
-mod common;
-use crate::common::TempDir;
/// Create a key-value-storage without defaults via builder
#[test]
fn kvs_without_defaults_builder() -> Result<(), ErrorCode> {
- let dir = TempDir::create()?;
- dir.set_current_dir()?;
+ // Temp directory.
+ let dir = tempdir()?;
+ let dir_path = dir.path().to_path_buf();
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir_path.clone())
.need_defaults(false)
.need_kvs(false)
.build()?;
@@ -60,7 +60,7 @@ fn kvs_without_defaults_builder() -> Result<(), ErrorCode> {
// drop the current instance with flush-on-exit enabled and reopen storage
drop(kvs);
- let builder = KvsBuilder::::new(InstanceId::new(0));
+ let builder = KvsBuilder::::new(InstanceId::new(0), dir_path);
let builder = builder.need_defaults(false);
let builder = builder.need_kvs(true);
let kvs = builder.build()?;
diff --git a/src/rust/rust_kvs/tests/kvs_snapshot_restore.rs b/src/rust/rust_kvs/tests/kvs_snapshot_restore.rs
index f1c5c66..d17ba97 100644
--- a/src/rust/rust_kvs/tests/kvs_snapshot_restore.rs
+++ b/src/rust/rust_kvs/tests/kvs_snapshot_restore.rs
@@ -12,18 +12,16 @@
//! # Verify Snapshot Recovery
use rust_kvs::{ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, SnapshotId};
-
-mod common;
-use crate::common::TempDir;
+use tempfile::tempdir;
/// Test snapshot recovery
#[test]
fn kvs_snapshot_restore() -> Result<(), ErrorCode> {
- let dir = TempDir::create()?;
- dir.set_current_dir()?;
+ let dir = tempdir()?;
+ let dir_path = dir.path().to_path_buf();
let max_count = Kvs::snapshot_max_count();
- let mut kvs = KvsBuilder::::new(InstanceId::new(0))
+ let mut kvs = KvsBuilder::::new(InstanceId::new(0), dir_path.clone())
.need_defaults(false)
.need_kvs(false)
.build()?;
@@ -43,7 +41,7 @@ fn kvs_snapshot_restore() -> Result<(), ErrorCode> {
// drop the current instance with flush-on-exit enabled and re-open it
drop(kvs);
- kvs = KvsBuilder::new(InstanceId::new(0))
+ kvs = KvsBuilder::new(InstanceId::new(0), dir_path.clone())
.need_defaults(false)
.need_kvs(true)
.build()?;
diff --git a/src/rust/rust_kvs/tests/kvs_snapshot_rotation.rs b/src/rust/rust_kvs/tests/kvs_snapshot_rotation.rs
index 47d49e2..e119083 100644
--- a/src/rust/rust_kvs/tests/kvs_snapshot_rotation.rs
+++ b/src/rust/rust_kvs/tests/kvs_snapshot_rotation.rs
@@ -13,18 +13,18 @@
use rust_kvs::{ErrorCode, InstanceId, Kvs, KvsApi, KvsBuilder, KvsValue, SnapshotId};
use std::collections::HashMap;
-
-mod common;
-use crate::common::TempDir;
+use std::path::PathBuf;
+use tempfile::tempdir;
/// Test snapshot rotation
#[test]
fn kvs_snapshot_rotation() -> Result<(), ErrorCode> {
- let dir = TempDir::create()?;
- dir.set_current_dir()?;
+ // Temp directory.
+ let dir = tempdir()?;
+ let dir_path = dir.path().to_path_buf();
let max_count = Kvs::snapshot_max_count();
- let mut kvs = create_kvs()?;
+ let mut kvs = create_kvs(dir_path.clone())?;
// we need a double zero here because after the first flush no snapshot is created
// and the max count is also added twice to make sure we rotate once
@@ -40,7 +40,7 @@ fn kvs_snapshot_rotation() -> Result<(), ErrorCode> {
// drop the current instance with flush-on-exit enabled and re-open it
drop(kvs);
- kvs = KvsBuilder::new(InstanceId::new(0))
+ kvs = KvsBuilder::new(InstanceId::new(0), dir_path.clone())
.need_defaults(false)
.need_kvs(true)
.build()?;
@@ -59,8 +59,8 @@ fn kvs_snapshot_rotation() -> Result<(), ErrorCode> {
}
/// Create an example KVS
-fn create_kvs() -> Result {
- let kvs = KvsBuilder::::new(InstanceId::new(0))
+fn create_kvs(dir: PathBuf) -> Result {
+ let kvs = KvsBuilder::::new(InstanceId::new(0), dir)
.need_defaults(false)
.need_kvs(false)
.build()?;
diff --git a/src/rust/rust_kvs_tool/src/kvs_tool.rs b/src/rust/rust_kvs_tool/src/kvs_tool.rs
index 750492d..6d0081c 100644
--- a/src/rust/rust_kvs_tool/src/kvs_tool.rs
+++ b/src/rust/rust_kvs_tool/src/kvs_tool.rs
@@ -440,7 +440,7 @@ fn _getkvsfilename(kvs: Kvs, mut args: Arguments) -> Result<(), ErrorCode> {
};
let snapshot_id = SnapshotId::new(snapshot_id as usize);
let filename = kvs.get_kvs_filename(snapshot_id);
- println!("KVS Filename: {}", filename);
+ println!("KVS Filename: {}", filename.display());
println!("----------------------");
Ok(())
}
@@ -462,7 +462,7 @@ fn _gethashfilename(kvs: Kvs, mut args: Arguments) -> Result<(), ErrorCode> {
};
let snapshot_id = SnapshotId::new(snapshot_id as usize);
let filename = kvs.get_hash_filename(snapshot_id);
- println!("Hash Filename: {}", filename);
+ println!("Hash Filename: {}", filename.display());
println!("----------------------");
Ok(())
}
@@ -529,8 +529,9 @@ fn _createtestdata(kvs: Kvs) -> Result<(), ErrorCode> {
/// Main function to run the KVS tool command line interface.
fn main() -> Result<(), ErrorCode> {
let mut args = Arguments::from_env();
+ let cwd = std::env::current_dir()?;
- let builder = KvsBuilder::new(InstanceId::new(0))
+ let builder = KvsBuilder::new(InstanceId::new(0), cwd)
.need_defaults(false)
.need_kvs(false);