#![cfg(feature = "var-collections")]
use armdb::{Config, DbError, VarMap, VarTree};
use tempfile::tempdir;
#[test]
fn var_tree_duplicate_insert_returns_key_exists_and_preserves_value() {
let dir = tempdir().unwrap();
let tree = VarTree::<[u8; 8]>::open(dir.path(), Config::test()).unwrap();
let key = 1u64.to_be_bytes();
tree.insert(&key, b"original").unwrap();
let err = tree
.insert(&key, b"replacement")
.expect_err("duplicate insert must fail");
assert!(matches!(err, DbError::KeyExists));
let got = tree.get(&key).expect("original value must still exist");
assert_eq!(got.as_bytes(), b"original");
}
#[test]
fn var_tree_oversized_value_returns_client_error() {
let dir = tempdir().unwrap();
let mut config = Config::test();
config.write_buffer_size = 4096;
let tree = VarTree::<[u8; 8]>::open(dir.path(), config).unwrap();
let key = 7u64.to_be_bytes();
let big_value = vec![0xAB; 4096];
let err = tree
.put(&key, &big_value)
.expect_err("oversized value must be rejected");
assert!(
matches!(err, DbError::Client(msg) if msg.contains("write_buffer_size")),
"expected DbError::Client describing write_buffer_size, got: {err:?}",
);
tree.put(&key, b"normal").unwrap();
let got = tree.get(&key).expect("normal put must succeed");
assert_eq!(got.as_bytes(), b"normal");
}
#[test]
fn var_map_oversized_value_returns_client_error() {
let dir = tempdir().unwrap();
let mut config = Config::test();
config.write_buffer_size = 4096;
let map = VarMap::<[u8; 8]>::open(dir.path(), config).unwrap();
let key = 11u64.to_be_bytes();
let big_value = vec![0xCD; 4096];
let err = map
.put(&key, &big_value)
.expect_err("oversized value must be rejected");
assert!(
matches!(err, DbError::Client(msg) if msg.contains("write_buffer_size")),
"expected DbError::Client describing write_buffer_size, got: {err:?}",
);
map.put(&key, b"normal").unwrap();
let got = map.get(&key).expect("normal put must succeed");
assert_eq!(got.as_bytes(), b"normal");
}
#[cfg(feature = "encryption")]
#[test]
fn var_tree_locked_read_returns_plaintext_after_flush() {
let dir = tempdir().unwrap();
let mut config = Config::test();
config.shard_count = 1;
config.max_file_size = 8192;
config.write_buffer_size = 8192;
config.encryption_key = Some([0x42; 32]);
let tree = VarTree::<[u8; 8]>::open(dir.path(), config).unwrap();
let key = 99u64.to_be_bytes();
let value = vec![0xEFu8; 4073];
tree.put(&key, &value).unwrap();
let filler_key = 100u64.to_be_bytes();
tree.put(&filler_key, &vec![0u8; 4096]).unwrap();
let new_value = b"plain-new".to_vec();
tree.cas(&key, &value, &new_value)
.expect("cas with plaintext expected value must succeed");
let got = tree.get(&key).expect("key must still exist");
assert_eq!(got.as_bytes(), new_value.as_slice());
}
#[cfg(feature = "encryption")]
#[test]
fn var_map_locked_read_returns_plaintext_after_flush() {
let dir = tempdir().unwrap();
let mut config = Config::test();
config.shard_count = 1;
config.max_file_size = 8192;
config.write_buffer_size = 8192;
config.encryption_key = Some([0x77; 32]);
let map = VarMap::<[u8; 8]>::open(dir.path(), config).unwrap();
let key = 33u64.to_be_bytes();
let value = vec![0xABu8; 4073];
map.put(&key, &value).unwrap();
map.put(&44u64.to_be_bytes(), &vec![0u8; 4096]).unwrap();
let new_value = b"plain-new".to_vec();
map.cas(&key, &value, &new_value)
.expect("cas with plaintext expected value must succeed");
let got = map.get(&key).expect("key must still exist");
assert_eq!(got.as_bytes(), new_value.as_slice());
}