Gouzi Mohaled
Ajout du dossier lib
84d2a97
use std::path::Path;
use serde_json::json;
use super::mmap_payload_storage::MmapPayloadStorage;
use super::on_disk_payload_storage::OnDiskPayloadStorage;
use super::simple_payload_storage::SimplePayloadStorage;
use super::PayloadStorage;
use crate::common::rocksdb_wrapper::open_db;
use crate::types::Payload;
fn test_trait_impl<S: PayloadStorage>(open: impl Fn(&Path) -> S) {
let dir = tempfile::tempdir().unwrap();
let mut storage = open(dir.path());
let payload: Payload = json!({
"a": "some text",
})
.into();
// set
storage.set(0, &payload).unwrap();
assert_eq!(storage.get(0).unwrap(), payload);
// set on existing
let payload_to_merge = json!({
"zzz": "some other text",
})
.into();
storage.set(0, &payload_to_merge).unwrap();
let stored = storage.get(0).unwrap();
assert_eq!(
stored,
json!({
"a": "some text",
"zzz": "some other text",
})
.into()
);
// set_by_key
let nested_payload = json!({
"layer2": true,
})
.into();
storage
.set_by_key(0, &nested_payload, &"layer1".try_into().unwrap())
.unwrap();
let stored = storage.get(0).unwrap();
assert_eq!(
stored,
json!({
"a": "some text",
"zzz": "some other text",
"layer1": {
"layer2": true,
}
})
.into()
);
// delete key
storage.delete(0, &"layer1".try_into().unwrap()).unwrap();
let stored = storage.get(0).unwrap();
assert_eq!(
stored,
json!({
"a": "some text",
"zzz": "some other text",
})
.into()
);
// overwrite
let new_payload = json!({
"new": "new text",
"other_new": "other new text",
})
.into();
storage.overwrite(0, &new_payload).unwrap();
let stored = storage.get(0).unwrap();
assert_eq!(stored, new_payload);
storage.clear(0).unwrap();
assert_eq!(storage.get(0).unwrap(), json!({}).into());
for i in 1..10 {
storage.set(i, &payload).unwrap();
}
let assert_payloads = |storage: &S| {
storage
.iter(|key, value| {
if key == 0 {
assert_eq!(value, &json!({}).into());
return Ok(true);
}
assert_eq!(value, &payload);
Ok(true)
})
.unwrap();
};
assert_payloads(&storage);
eprintln!("storage is correct before drop");
// flush, drop, and reopen
storage.flusher()().unwrap();
drop(storage);
let storage = open(dir.path());
// check if the data is still there
assert_payloads(&storage);
eprintln!("storage is correct after drop");
}
#[test]
fn test_in_memory_storage() {
test_trait_impl(|path| {
let db = open_db(path, &[""]).unwrap();
SimplePayloadStorage::open(db).unwrap()
});
}
#[test]
fn test_mmap_storage() {
test_trait_impl(|path| MmapPayloadStorage::open_or_create(path).unwrap());
}
#[test]
fn test_on_disk_storage() {
test_trait_impl(|path| {
let db = open_db(path, &[""]).unwrap();
OnDiskPayloadStorage::open(db).unwrap()
});
}