v0.2.5-pre.010.fix.001
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-wallet-lib/unit_tests/persistence.rs
|
||||
// version: 3
|
||||
// version: 4
|
||||
|
||||
fn temp_directory() -> std::io::Result<tempfile::TempDir> {
|
||||
return tempfile::tempdir();
|
||||
@@ -11,9 +11,8 @@ fn no_clobber_create_keeps_the_first_published_document() {
|
||||
let destination = directory.path().join("wallet.kspwallet");
|
||||
let first = b"first-wallet";
|
||||
let second = b"second-wallet";
|
||||
|
||||
crate::persistence::persist_new_wallet_for_test(destination.as_path(), first).expect("first no-clobber publication must succeed");
|
||||
let second_result = crate::persistence::persist_new_wallet_for_test(destination.as_path(), second);
|
||||
crate::persist_new_wallet_for_test(destination.as_path(), first).expect("first no-clobber publication must succeed");
|
||||
let second_result = crate::persist_new_wallet_for_test(destination.as_path(), second);
|
||||
let error = second_result.expect_err("second publication must not overwrite an existing wallet");
|
||||
assert_eq!(error.code(), crate::ERROR_CODE_DESTINATION_EXISTS);
|
||||
let persisted = std::fs::read(destination.as_path()).expect("published wallet must remain readable");
|
||||
@@ -24,11 +23,10 @@ fn no_clobber_create_keeps_the_first_published_document() {
|
||||
fn injected_failure_before_publish_leaves_no_destination_or_partial_wallet() {
|
||||
let directory = temp_directory().expect("Wallet persistence test directory must be creatable");
|
||||
let destination = directory.path().join("wallet.kspwallet");
|
||||
let result = crate::persistence::persist_new_wallet_fault_before_publish(destination.as_path(), b"candidate-wallet");
|
||||
let result = crate::persist_new_wallet_fault_before_publish(destination.as_path(), b"candidate-wallet");
|
||||
let error = result.expect_err("fault injection must abort before publication");
|
||||
assert_eq!(error.code(), crate::ERROR_CODE_ATOMIC_PERSISTENCE_FAILED);
|
||||
assert!(!destination.exists());
|
||||
|
||||
let entries = std::fs::read_dir(directory.path()).expect("Wallet persistence test directory must remain readable");
|
||||
let count = entries.count();
|
||||
assert_eq!(count, 0, "temporary artifacts should be cleaned on ordinary error unwinding");
|
||||
@@ -40,17 +38,15 @@ fn concurrent_no_clobber_publish_has_exactly_one_winner() {
|
||||
let destination = directory.path().join("wallet.kspwallet");
|
||||
let barrier = std::sync::Arc::new(std::sync::Barrier::new(8));
|
||||
let mut handles = std::vec::Vec::new();
|
||||
|
||||
for index in 0_u8..8 {
|
||||
let destination = destination.clone();
|
||||
let barrier = std::sync::Arc::clone(&barrier);
|
||||
handles.push(std::thread::spawn(move || {
|
||||
barrier.wait();
|
||||
let content = [index; 32];
|
||||
return crate::persistence::persist_new_wallet_for_test(destination.as_path(), content.as_slice());
|
||||
return crate::persist_new_wallet_for_test(destination.as_path(), content.as_slice());
|
||||
}));
|
||||
}
|
||||
|
||||
let mut success_count = 0_usize;
|
||||
let mut exists_count = 0_usize;
|
||||
let mut unexpected_code = std::option::Option::None;
|
||||
@@ -74,7 +70,6 @@ fn bounded_reader_rejects_oversized_wallet_before_parser_allocation() {
|
||||
let destination = directory.path().join("oversized.kspwallet");
|
||||
let oversized = std::vec![b'x'; crate::KSPWALLET_MAX_FILE_BYTES + 1];
|
||||
std::fs::write(destination.as_path(), oversized).expect("oversized fixture must be writable");
|
||||
|
||||
let runtime = tokio::runtime::Builder::new_current_thread().build().expect("Wallet persistence test runtime must build");
|
||||
let result = runtime.block_on(crate::inspect_locked_wallet_file_v1(destination.as_path()));
|
||||
let error = result.expect_err("oversized Wallet file must be rejected before parsing");
|
||||
@@ -91,7 +86,6 @@ fn public_file_create_and_locked_inspect_round_trip_without_revealing_identity()
|
||||
.block_on(crate::create_wallet_file_v1(destination.as_path(), owner_password, std::option::Option::None, crate::WalletCreateMetadataV1::default()))
|
||||
.expect("native Wallet file creation must succeed");
|
||||
let locked = runtime.block_on(crate::inspect_locked_wallet_file_v1(destination.as_path())).expect("persisted Wallet must inspect successfully");
|
||||
|
||||
assert!(!locked.view_enabled());
|
||||
assert_eq!(created.capability(), crate::WalletCapability::Owner);
|
||||
assert!(destination.exists());
|
||||
@@ -110,8 +104,7 @@ fn persisted_full_vector_opens_view_and_owner_through_file_apis() {
|
||||
let directory = temp_directory().expect("Wallet persistence test directory must be creatable");
|
||||
let destination = directory.path().join("vector.kspwallet");
|
||||
let vector = include_bytes!("../tests/fixtures/kspwallet_v1_full_vector.json");
|
||||
crate::persistence::persist_new_wallet_for_test(destination.as_path(), vector).expect("full vector must publish through no-clobber persistence");
|
||||
|
||||
crate::persist_new_wallet_for_test(destination.as_path(), vector).expect("full vector must publish through no-clobber persistence");
|
||||
let runtime = tokio::runtime::Builder::new_current_thread().build().expect("Wallet persistence test runtime must build");
|
||||
let view_password = crate::ViewPassword::new(std::string::String::from("pre005-view-password"));
|
||||
let view = runtime
|
||||
@@ -121,7 +114,6 @@ fn persisted_full_vector_opens_view_and_owner_through_file_apis() {
|
||||
let owner = runtime
|
||||
.block_on(crate::open_wallet_owner_file_v1(destination.as_path(), owner_password))
|
||||
.expect("persisted full vector must open through OWNER file API");
|
||||
|
||||
assert_eq!(view.capability(), crate::WalletCapability::View);
|
||||
assert_eq!(owner.capability(), crate::WalletCapability::Owner);
|
||||
assert_eq!(view.pubkey(), owner.pubkey());
|
||||
@@ -136,8 +128,7 @@ fn replacement_fault_before_publish_preserves_the_previous_wallet_bytes() {
|
||||
let original = b"ORIGINAL-WALLET-CANARY";
|
||||
let replacement = b"REPLACEMENT-WALLET-CANARY";
|
||||
std::fs::write(destination.as_path(), original).expect("replacement test original must be writable");
|
||||
|
||||
let result = crate::persistence::replace_wallet_fault_before_publish(destination.as_path(), replacement);
|
||||
let result = crate::replace_wallet_fault_before_publish(destination.as_path(), replacement);
|
||||
assert_eq!(result.expect_err("injected replacement fault must fail").code(), crate::ERROR_CODE_ATOMIC_PERSISTENCE_FAILED);
|
||||
assert_eq!(std::fs::read(destination.as_path()).expect("original Wallet bytes must remain readable"), original);
|
||||
}
|
||||
@@ -146,10 +137,9 @@ fn replacement_fault_before_publish_preserves_the_previous_wallet_bytes() {
|
||||
fn replacement_requires_an_existing_regular_file_and_replaces_complete_content() {
|
||||
let directory = temp_directory().expect("Wallet replacement test directory must be creatable");
|
||||
let destination = directory.path().join("replace.kspwallet");
|
||||
let missing = crate::persistence::replace_wallet_for_test(destination.as_path(), b"replacement");
|
||||
let missing = crate::replace_wallet_for_test(destination.as_path(), b"replacement");
|
||||
assert_eq!(missing.expect_err("replacement must not create a missing Wallet destination").code(), crate::ERROR_CODE_IO_FAILED);
|
||||
|
||||
std::fs::write(destination.as_path(), b"old").expect("replacement test original must be writable");
|
||||
crate::persistence::replace_wallet_for_test(destination.as_path(), b"new-complete-wallet").expect("existing Wallet replacement must succeed");
|
||||
crate::replace_wallet_for_test(destination.as_path(), b"new-complete-wallet").expect("existing Wallet replacement must succeed");
|
||||
assert_eq!(std::fs::read(destination.as_path()).expect("replaced Wallet must be readable"), b"new-complete-wallet");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user