use serial_test::serial;
use super::{
error::InnerKvError::LogicalErr,
helpers::deserialize,
sled_bindings::{handle_exists, handle_get, handle_put, handle_reserve},
types::{KeyReservation, DEFAULT_RESERVE},
};
use crate::{
clean_tests,
encrypted_sled::{Db, Result},
get_db_path, BuildType,
};
pub fn open_with_test_key() -> Result<Db> {
Db::open(get_db_path(BuildType::Test), [1; 32])
}
#[test]
#[serial]
fn reserve_success() {
let kv = open_with_test_key().unwrap();
let key: String = "key".to_string();
assert_eq!(handle_reserve(&kv, key.clone()).unwrap(), KeyReservation { key: key.clone() });
let default_reserv = kv.get(&key).unwrap().unwrap();
assert!(default_reserv == DEFAULT_RESERVE);
clean_tests();
}
#[test]
#[serial]
fn reserve_failure() {
let kv = open_with_test_key().unwrap();
let key: String = "key".to_string();
handle_reserve(&kv, key.clone()).unwrap();
let err = handle_reserve(&kv, key).err().unwrap();
assert!(matches!(err, LogicalErr(_)));
clean_tests();
}
#[test]
#[serial]
fn put_success() {
let kv = open_with_test_key().unwrap();
let key: String = "key".to_string();
handle_reserve(&kv, key.clone()).unwrap();
let value: String = "value".to_string();
assert!(handle_put(&kv, KeyReservation { key }, value).is_ok());
clean_tests();
}
#[test]
#[serial]
fn put_failure_no_reservation() {
let kv = open_with_test_key().unwrap();
let key: String = "key".to_string();
let value: String = "value".to_string();
let err = handle_put(&kv, KeyReservation { key: key.clone() }, value).err().unwrap();
assert!(matches!(err, LogicalErr(_)));
assert!(!kv.contains_key(&key).unwrap());
clean_tests();
}
#[test]
#[serial]
fn put_failure_put_twice() {
let kv = open_with_test_key().unwrap();
let key: String = "key".to_string();
let value = "value".to_string();
let value2 = "value2".to_string();
handle_reserve(&kv, key.clone()).unwrap();
handle_put(&kv, KeyReservation { key: key.clone() }, value.clone()).unwrap();
let err = handle_put(&kv, KeyReservation { key: key.clone() }, value2).err().unwrap();
assert!(matches!(err, LogicalErr(_)));
let bytes = kv.get(&key).unwrap().unwrap();
let v: String = deserialize(&bytes).unwrap();
assert!(v == value);
clean_tests();
}
#[test]
#[serial]
fn get_success() {
let kv = open_with_test_key().unwrap();
let key: String = "key".to_string();
let value = "value";
handle_reserve(&kv, key.clone()).unwrap();
handle_put(&kv, KeyReservation { key: key.clone() }, value).unwrap();
let res = handle_get::<String>(&kv, key);
assert!(res.is_ok());
let res = res.unwrap();
assert_eq!(res, value);
clean_tests();
}
#[test]
#[serial]
fn get_failure() {
let kv = open_with_test_key().unwrap();
let key: String = "key".to_string();
let err = handle_get::<String>(&kv, key).err().unwrap();
assert!(matches!(err, LogicalErr(_)));
clean_tests();
}
#[test]
#[serial]
fn test_exists() {
let kv = open_with_test_key().unwrap();
let key: String = "key".to_string();
let value: String = "value".to_string();
let exists = handle_exists(&kv, &key);
assert!(exists.is_ok());
assert!(!exists.unwrap());
let reservation = handle_reserve(&kv, key.clone()).unwrap();
let exists = handle_exists(&kv, &key);
assert!(exists.is_ok());
assert!(exists.unwrap());
handle_put(&kv, reservation, value).unwrap();
let exists = handle_exists(&kv, &key);
assert!(exists.is_ok());
assert!(exists.unwrap());
let remove = kv.remove(key.clone());
assert!(remove.is_ok());
let exists = handle_exists(&kv, &key);
assert!(exists.is_ok());
assert!(!exists.unwrap()); clean_tests();
}