dharmadb 0.1.0

Persistent, fault tolerant key-value store written in Rust.
Documentation
use crate::common::test_key::TestKey;
use crate::common::test_value::TestValue;
use crate::common::{cleanup_paths, get_test_data, get_test_data_in_range};
use dharmadb::errors::Errors;
use dharmadb::options::DharmaOpts;
use dharmadb::persistence::Persistence;
use dharmadb::storage::sorted_string_table_reader::SSTableReader;

mod common;

#[test]
fn test_create_persistence() {
    let options = DharmaOpts::default();
    cleanup_paths(&options);
    let persistence_result: Result<Persistence<TestKey>, Errors> =
        Persistence::create::<TestValue>(options);
    assert!(persistence_result.is_ok());
}

#[test]
fn test_insert_works() {
    let options = DharmaOpts::default();
    cleanup_paths(&options);
    let persistence_result: Result<Persistence<TestKey>, Errors> =
        Persistence::create::<TestValue>(options);
    let mut persistence = persistence_result.unwrap();
    let key = TestKey::from(1);
    let value = TestValue::from("Test Value");
    let insert_result = persistence.insert(key, value);
    assert!(insert_result.is_ok());
}

#[test]
fn test_flush_to_disk_works() {
    let options = DharmaOpts::default();
    cleanup_paths(&options);
    let data = get_test_data(200);
    let persistence_result: Result<Persistence<TestKey>, Errors> =
        Persistence::create::<TestValue>(options);
    let mut persistence = persistence_result.unwrap();
    let flush_result = persistence.flush(&data);
    assert!(flush_result.is_ok());
}

#[test]
fn test_persistence_get_after_flush() {
    let data = get_test_data(500);
    let options = DharmaOpts::default();
    cleanup_paths(&options);
    let persistence_result: Result<Persistence<TestKey>, Errors> =
        Persistence::create::<TestValue>(options);
    let mut persistence = persistence_result.unwrap();
    let flush_result = persistence.flush(&data);
    assert!(flush_result.is_ok());

    for (key, value) in data {
        let get_result: Result<Option<TestValue>, Errors> = persistence.get(&key);
        assert!(get_result.is_ok());
        let get_value = get_result.unwrap();
        assert!(get_value.is_some());
        assert_eq!(get_value.unwrap(), value);
    }
}

#[test]
fn test_flush_respects_compaction_threshold() {
    let options = DharmaOpts::default();
    let data_1 = get_test_data_in_range(0, 100);
    let data_2 = get_test_data_in_range(80, 300);
    let data_3 = get_test_data_in_range(280, 400);

    cleanup_paths(&options);
    let persistence_result: Result<Persistence<TestKey>, Errors> =
        Persistence::create::<TestValue>(options.clone());
    let mut persistence = persistence_result.unwrap();

    assert!(persistence.flush(&data_1).is_ok());
    assert!(persistence.flush(&data_2).is_ok());
    assert!(persistence.flush(&data_3).is_ok());

    let sstable_paths = SSTableReader::get_valid_table_paths(&options.path);
    assert!(sstable_paths.is_ok());
    assert_eq!(sstable_paths.unwrap().len(), 3);
}

#[test]
fn test_tables_are_compacted_after_threshold_is_met() {
    let options = DharmaOpts::default();
    cleanup_paths(&options);
    let data_1 = get_test_data_in_range(0, 100);
    let data_2 = get_test_data_in_range(80, 300);
    let data_3 = get_test_data_in_range(280, 400);
    let data_4 = get_test_data_in_range(400, 500);
    let persistence_result: Result<Persistence<TestKey>, Errors> =
        Persistence::create::<TestValue>(options.clone());
    let mut persistence = persistence_result.unwrap();

    assert!(persistence.flush(&data_1).is_ok());
    assert!(persistence.flush(&data_2).is_ok());
    assert!(persistence.flush(&data_3).is_ok());
    assert!(persistence.flush(&data_4).is_ok());

    let sstable_paths = SSTableReader::get_valid_table_paths(&options.path);
    assert!(sstable_paths.is_ok());
    assert_eq!(sstable_paths.unwrap().len(), 1);
}