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);