mod common;
use std::{thread, time::Duration};
use docdb::{DocDb, DumpPolicy, SerializationMethod};
#[test]
fn test_auto_dump() {
let db_name = "auto_dump.db";
let mut db = DocDb::new(&db_name, DumpPolicy::AutoDump, SerializationMethod::Yaml);
assert!(db.set("num", &1).is_ok());
{
let read_db = DocDb::load_read_only(db_name, SerializationMethod::Yaml).unwrap();
assert_eq!(read_db.get::<i32>("num").unwrap(), 1);
}
assert!(db.rem("num").unwrap_or(false));
{
let read_db = DocDb::load_read_only(db_name, SerializationMethod::Yaml).unwrap();
assert!(read_db.get::<i32>("num").is_none());
}
}
#[test]
fn test_read_only_policy() {
let db_name = "read_only.db";
let mut db = DocDb::new(&db_name, DumpPolicy::AutoDump, SerializationMethod::Json);
assert!(db.set("key", &String::from("this is key's val")).is_ok());
let mut read_db = DocDb::load_read_only(db_name, SerializationMethod::Json).unwrap();
assert!(read_db.set("key2", &"val2").is_ok());
assert!(read_db.exist("key2"));
{
let read_db2 = DocDb::load_read_only(db_name, SerializationMethod::Json).unwrap();
assert!(read_db2.exist("key"));
assert!(!read_db2.exist("key2"));
}
assert!(read_db.dump().is_ok());
{
let read_db2 = DocDb::load_read_only(db_name, SerializationMethod::Json).unwrap();
assert!(read_db2.exist("key"));
assert!(!read_db2.exist("key2"));
}
drop(read_db);
{
let read_db2 = DocDb::load_read_only(db_name, SerializationMethod::Json).unwrap();
assert!(read_db2.exist("key"));
assert!(!read_db2.exist("key2"));
}
}
#[test]
fn test_rely_on_request_dump() {
let db_name = "rely_on_request.db";
let mut db = DocDb::new(
&db_name,
DumpPolicy::DumpRelyRequest,
SerializationMethod::Bin,
);
assert!(db.set("key", &String::from("this is key's val")).is_ok());
assert!(DocDb::load_read_only(db_name, SerializationMethod::Bin).is_err());
assert!(db.dump().is_ok());
{
let read_db = DocDb::load_read_only(db_name, SerializationMethod::Bin).unwrap();
assert!(read_db.exist("key"));
}
db.set("key2", &1).unwrap();
drop(db);
{
let read_db = DocDb::load_read_only(db_name, SerializationMethod::Bin).unwrap();
assert!(read_db.exist("key"));
assert!(!read_db.exist("key2"));
}
}
#[test]
fn test_periodic_dump_policy() {
let db_name = "periodid_db.db";
let mut db = DocDb::new(
&db_name,
DumpPolicy::PeriodicDump(Duration::new(1, 0)),
SerializationMethod::Bin,
);
assert!(db.set("key", &String::from("this is key's val")).is_ok());
assert!(DocDb::load_read_only(db_name, SerializationMethod::Bin).is_err());
thread::sleep(Duration::from_millis(500));
assert!(DocDb::load_read_only(db_name, SerializationMethod::Bin).is_err());
thread::sleep(Duration::from_millis(550));
db.set("key2", &1).unwrap();
{
let read_db = DocDb::load_read_only(db_name, SerializationMethod::Bin).unwrap();
assert!(read_db.exist("key"));
assert!(read_db.exist("key2"));
}
db.set("key3", &"val3").unwrap();
{
let read_db = DocDb::load_read_only(db_name, SerializationMethod::Bin).unwrap();
assert!(read_db.exist("key"));
assert!(read_db.exist("key2"));
assert!(!read_db.exist("key3"));
}
db.set("key4", &"val4").unwrap();
drop(db);
{
let read_db = DocDb::load_read_only(db_name, SerializationMethod::Bin).unwrap();
assert!(read_db.exist("key"));
assert!(read_db.exist("key4"));
}
}