#![cfg(target_arch = "wasm32")]
#![allow(unused_imports)]
use absurder_sql::storage::{BLOCK_SIZE, BlockStorage};
use std::collections::HashMap;
use wasm_bindgen_test::*;
wasm_bindgen_test_configure!(run_in_browser);
#[wasm_bindgen_test]
async fn test_idempotent_writes_same_block_version() {
let db_name = "idempotent_same_version";
let mut storage = BlockStorage::new(db_name).await.expect("create storage");
let block_id = storage.allocate_block().await.expect("alloc block");
let data = vec![0xAAu8; BLOCK_SIZE];
storage
.write_block(block_id, data.clone())
.await
.expect("write block first time");
storage.sync().await.expect("sync first time");
let marker1 = storage.get_commit_marker();
web_sys::console::log_1(&format!("First sync commit marker: {}", marker1).into());
storage
.write_block(block_id, data.clone())
.await
.expect("write block second time");
storage.sync().await.expect("sync second time");
let marker2 = storage.get_commit_marker();
web_sys::console::log_1(&format!("Second sync commit marker: {}", marker2).into());
assert!(marker2 > marker1, "Commit marker should advance on sync");
let read_data = storage.read_block_sync(block_id).expect("read block");
assert_eq!(
read_data, data,
"Data should be identical after idempotent write"
);
let storage2 = BlockStorage::new(db_name).await.expect("create storage2");
let read_data2 = storage2
.read_block_sync(block_id)
.expect("read block from new instance");
assert_eq!(
read_data2, data,
"Data should be consistent across instances"
);
}
#[wasm_bindgen_test]
async fn test_idempotent_writes_different_versions() {
let db_name = "idempotent_diff_versions";
let mut storage = BlockStorage::new(db_name).await.expect("create storage");
let block_id = storage.allocate_block().await.expect("alloc block");
let data1 = vec![0x11u8; BLOCK_SIZE];
storage
.write_block(block_id, data1.clone())
.await
.expect("write block v1");
storage.sync().await.expect("sync v1");
let marker1 = storage.get_commit_marker();
web_sys::console::log_1(&format!("Version 1 commit marker: {}", marker1).into());
let data2 = vec![0x22u8; BLOCK_SIZE];
storage
.write_block(block_id, data2.clone())
.await
.expect("write block v2");
storage.sync().await.expect("sync v2");
let marker2 = storage.get_commit_marker();
web_sys::console::log_1(&format!("Version 2 commit marker: {}", marker2).into());
assert!(
marker2 > marker1,
"Commit marker should advance for new version"
);
let read_data = storage.read_block_sync(block_id).expect("read latest");
assert_eq!(read_data, data2, "Should read the latest version of data");
}
#[wasm_bindgen_test]
async fn test_idempotent_writes_concurrent_same_version() {
let db_name = "idempotent_concurrent";
let mut storage1 = BlockStorage::new(db_name).await.expect("create storage1");
let storage2 = BlockStorage::new(db_name).await.expect("create storage2");
let block_id = storage1.allocate_block().await.expect("alloc block");
let data = vec![0xBBu8; BLOCK_SIZE];
storage1
.write_block(block_id, data.clone())
.await
.expect("write from storage1");
storage1.sync().await.expect("sync from storage1");
let _marker1 = storage1.get_commit_marker();
let read_data = storage2
.read_block_sync(block_id)
.expect("read from storage2");
assert_eq!(read_data, data, "Storage2 should see data from storage1");
storage1
.write_block(block_id, data.clone())
.await
.expect("write again from storage1");
storage2
.write_block(block_id, data.clone())
.await
.expect("write same from storage2");
storage1.sync().await.expect("sync again from storage1");
storage2.sync().await.expect("sync from storage2");
let marker1_final = storage1.get_commit_marker();
let marker2_final = storage2.get_commit_marker();
web_sys::console::log_1(
&format!(
"Final markers - storage1: {}, storage2: {}",
marker1_final, marker2_final
)
.into(),
);
let data1_final = storage1
.read_block_sync(block_id)
.expect("final read storage1");
let data2_final = storage2
.read_block_sync(block_id)
.expect("final read storage2");
assert_eq!(data1_final, data, "Storage1 final data should be correct");
assert_eq!(data2_final, data, "Storage2 final data should be correct");
assert_eq!(
data1_final, data2_final,
"Both storages should have identical data"
);
}
#[wasm_bindgen_test]
async fn test_idempotent_writes_checksum_consistency() {
let db_name = "idempotent_checksum";
let mut storage = BlockStorage::new(db_name).await.expect("create storage");
let block_id = storage.allocate_block().await.expect("alloc block");
let data = vec![0xCCu8; BLOCK_SIZE];
for i in 0..3 {
web_sys::console::log_1(&format!("Idempotent write iteration: {}", i).into());
storage
.write_block(block_id, data.clone())
.await
.expect("write block");
storage.sync().await.expect("sync block");
let read_data = storage.read_block_sync(block_id).expect("read block");
assert_eq!(
read_data, data,
"Data should be consistent on iteration {}",
i
);
}
let storage2 = BlockStorage::new(db_name).await.expect("create storage2");
let final_data = storage2.read_block_sync(block_id).expect("final read");
assert_eq!(
final_data, data,
"Final data should be consistent across instances"
);
}
#[wasm_bindgen_test]
async fn test_idempotent_writes_metadata_handling() {
let db_name = "idempotent_metadata";
let mut storage = BlockStorage::new(db_name).await.expect("create storage");
let block_id = storage.allocate_block().await.expect("alloc block");
let data = vec![0xDDu8; BLOCK_SIZE];
storage
.write_block(block_id, data.clone())
.await
.expect("write block");
storage.sync().await.expect("sync block");
let marker_after_first = storage.get_commit_marker();
storage
.write_block(block_id, data.clone())
.await
.expect("write block again");
storage.sync().await.expect("sync block again");
let marker_after_second = storage.get_commit_marker();
assert!(
marker_after_second > marker_after_first,
"Commit marker should advance for idempotent writes"
);
let read_data = storage.read_block_sync(block_id).expect("read block");
assert_eq!(read_data, data, "Data should remain consistent");
web_sys::console::log_1(
&format!(
"Metadata test - markers: {} -> {}",
marker_after_first, marker_after_second
)
.into(),
);
}
#[wasm_bindgen_test]
async fn test_explicit_block_id_version_idempotency() {
let db_name = "explicit_idempotent";
let mut storage1 = BlockStorage::new(db_name).await.expect("create storage1");
let block_id = storage1.allocate_block().await.expect("alloc block");
let data = vec![0xEEu8; BLOCK_SIZE];
storage1
.write_block(block_id, data.clone())
.await
.expect("write v1");
storage1.sync().await.expect("sync v1");
let version1_marker = storage1.get_commit_marker();
web_sys::console::log_1(
&format!("Established version 1 with marker: {}", version1_marker).into(),
);
let storage2 = BlockStorage::new(db_name).await.expect("create storage2");
let data1 = storage1
.read_block_sync(block_id)
.expect("read from storage1");
let data2 = storage2
.read_block_sync(block_id)
.expect("read from storage2");
assert_eq!(data1, data2, "Both instances should see identical data");
storage1
.write_block(block_id, data.clone())
.await
.expect("retry write storage1");
storage2
.write_block(block_id, data.clone())
.await
.expect("retry write storage2");
storage1.sync().await.expect("retry sync storage1");
storage2.sync().await.expect("retry sync storage2");
let final_data1 = storage1
.read_block_sync(block_id)
.expect("final read storage1");
let final_data2 = storage2
.read_block_sync(block_id)
.expect("final read storage2");
assert_eq!(final_data1, data, "Storage1 should have correct final data");
assert_eq!(final_data2, data, "Storage2 should have correct final data");
assert_eq!(
final_data1, final_data2,
"Both instances should converge to same state"
);
let final_marker1 = storage1.get_commit_marker();
let final_marker2 = storage2.get_commit_marker();
web_sys::console::log_1(
&format!(
"Final state - marker1: {}, marker2: {}",
final_marker1, final_marker2
)
.into(),
);
assert!(
final_marker1 >= version1_marker,
"Marker should not go backwards"
);
assert!(
final_marker2 >= version1_marker,
"Marker should not go backwards"
);
}