#[cfg(target_arch = "wasm32")]
use wasm_bindgen_test::*;
#[cfg(target_arch = "wasm32")]
use absurder_sql::storage::BlockStorage;
#[cfg(target_arch = "wasm32")]
wasm_bindgen_test_configure!(run_in_browser);
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_force_sync_persists_to_indexeddb() {
let mut storage = BlockStorage::new("force_sync_test")
.await
.expect("create storage");
let block1 = storage.allocate_block().await.expect("allocate block1");
let block2 = storage.allocate_block().await.expect("allocate block2");
storage
.write_block(block1, vec![1u8; 4096])
.await
.expect("write block1");
storage
.write_block(block2, vec![2u8; 4096])
.await
.expect("write block2");
storage
.force_sync()
.await
.expect("force_sync should succeed");
let storage2 = BlockStorage::new("force_sync_test")
.await
.expect("create storage2");
let data1 = storage2.read_block(block1).await.expect("read block1");
let data2 = storage2.read_block(block2).await.expect("read block2");
assert_eq!(data1[0], 1u8, "Block1 should be persisted");
assert_eq!(data2[0], 2u8, "Block2 should be persisted");
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_vfs_xsync_triggers_force_sync() {
let mut storage = BlockStorage::new("vfs_xsync_test")
.await
.expect("create storage");
let block1 = storage.allocate_block().await.expect("allocate block1");
storage
.write_block(block1, vec![1u8; 4096])
.await
.expect("write block1");
storage.force_sync().await.expect("force_sync");
let storage2 = BlockStorage::new("vfs_xsync_test")
.await
.expect("create storage2");
let data = storage2.read_block(block1).await.expect("read block1");
assert_eq!(data[0], 1u8, "Data should be persisted");
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_force_sync_error_handling() {
let mut storage = BlockStorage::new("force_sync_errors")
.await
.expect("create storage");
let block1 = storage.allocate_block().await.expect("allocate block1");
storage
.write_block(block1, vec![42u8; 4096])
.await
.expect("write block1");
let result = storage.force_sync().await;
match result {
Ok(_) => {
let storage2 = BlockStorage::new("force_sync_errors")
.await
.expect("create storage2");
let data = storage2.read_block(block1).await.expect("read block1");
assert_eq!(data[0], 42u8, "Data should be persisted");
}
Err(e) => {
assert!(!e.message.is_empty(), "Error should have message");
}
}
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_force_sync_idempotent() {
let mut storage = BlockStorage::new("force_sync_idempotent")
.await
.expect("create storage");
let block1 = storage.allocate_block().await.expect("allocate block1");
storage
.write_block(block1, vec![99u8; 4096])
.await
.expect("write block1");
storage.force_sync().await.expect("force_sync 1");
storage.force_sync().await.expect("force_sync 2");
storage.force_sync().await.expect("force_sync 3");
let storage2 = BlockStorage::new("force_sync_idempotent")
.await
.expect("create storage2");
let data = storage2.read_block(block1).await.expect("read block1");
assert_eq!(data[0], 99u8, "Data should be persisted correctly");
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_force_sync_advances_commit_marker() {
let mut storage = BlockStorage::new("force_sync_marker")
.await
.expect("create storage");
let initial_marker = storage.get_commit_marker();
let block1 = storage.allocate_block().await.expect("allocate block1");
storage
.write_block(block1, vec![77u8; 4096])
.await
.expect("write block1");
storage.force_sync().await.expect("force_sync");
let new_marker = storage.get_commit_marker();
assert!(new_marker > initial_marker, "Commit marker should advance");
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_force_sync_waits_for_persistence() {
let mut storage = BlockStorage::new("force_sync_wait")
.await
.expect("create storage");
let mut block_ids = Vec::new();
for i in 0..10 {
let block = storage.allocate_block().await.expect("allocate block");
storage
.write_block(block, vec![i as u8; 4096])
.await
.expect("write block");
block_ids.push(block);
}
let start = js_sys::Date::now();
storage.force_sync().await.expect("force_sync");
let duration = js_sys::Date::now() - start;
assert!(duration >= 0.0, "Should take some time");
assert!(duration < 5000.0, "Should complete within 5 seconds");
let storage2 = BlockStorage::new("force_sync_wait")
.await
.expect("create storage2");
for (i, block_id) in block_ids.iter().enumerate() {
let data = storage2.read_block(*block_id).await.expect("read block");
assert_eq!(data[0], i as u8, "Block {} should be persisted", i);
}
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_vfs_xsync_transaction_durability() {
let mut storage = BlockStorage::new("vfs_transaction_test")
.await
.expect("create storage");
let block1 = storage.allocate_block().await.expect("allocate block1");
let block2 = storage.allocate_block().await.expect("allocate block2");
storage
.write_block(block1, vec![1u8; 4096])
.await
.expect("write block1");
storage
.write_block(block2, vec![2u8; 4096])
.await
.expect("write block2");
storage.force_sync().await.expect("force_sync");
let storage2 = BlockStorage::new("vfs_transaction_test")
.await
.expect("create storage2");
let data1 = storage2.read_block(block1).await.expect("read block1");
let data2 = storage2.read_block(block2).await.expect("read block2");
assert_eq!(data1[0], 1u8, "Block1 should be persisted");
assert_eq!(data2[0], 2u8, "Block2 should be persisted");
}