diff --git a/mini-lsm/src/block/tests.rs b/mini-lsm/src/block/tests.rs deleted file mode 100644 index 52b2b12..0000000 --- a/mini-lsm/src/block/tests.rs +++ /dev/null @@ -1,122 +0,0 @@ -use std::sync::Arc; - -use super::builder::BlockBuilder; -use super::iterator::BlockIterator; -use super::*; - -#[test] -fn test_block_build_single_key() { - let mut builder = BlockBuilder::new(16); - assert!(builder.add(b"233", b"233333")); - builder.build(); -} - -#[test] -fn test_block_build_full() { - let mut builder = BlockBuilder::new(16); - assert!(builder.add(b"11", b"11")); - assert!(!builder.add(b"22", b"22")); - builder.build(); -} - -fn key_of(idx: usize) -> Vec { - format!("key_{:03}", idx * 5).into_bytes() -} - -fn value_of(idx: usize) -> Vec { - format!("value_{:010}", idx).into_bytes() -} - -fn num_of_keys() -> usize { - 100 -} - -fn generate_block() -> Block { - let mut builder = BlockBuilder::new(10000); - for idx in 0..num_of_keys() { - let key = key_of(idx); - let value = value_of(idx); - assert!(builder.add(&key[..], &value[..])); - } - builder.build() -} - -#[test] -fn test_block_build_all() { - generate_block(); -} - -#[test] -fn test_block_encode() { - let block = generate_block(); - block.encode(); -} - -#[test] -fn test_block_decode() { - let block = generate_block(); - let encoded = block.encode(); - let decoded_block = Block::decode(&encoded); - assert_eq!(block.offsets, decoded_block.offsets); - assert_eq!(block.data, decoded_block.data); -} - -fn as_bytes(x: &[u8]) -> Bytes { - Bytes::copy_from_slice(x) -} - -#[test] -fn test_block_iterator() { - let block = Arc::new(generate_block()); - let mut iter = BlockIterator::create_and_seek_to_first(block); - for _ in 0..5 { - for i in 0..num_of_keys() { - let key = iter.key(); - let value = iter.value(); - assert_eq!( - key, - key_of(i), - "expected key: {:?}, actual key: {:?}", - as_bytes(&key_of(i)), - as_bytes(key) - ); - assert_eq!( - value, - value_of(i), - "expected value: {:?}, actual value: {:?}", - as_bytes(&value_of(i)), - as_bytes(value) - ); - iter.next(); - } - iter.seek_to_first(); - } -} - -#[test] -fn test_block_seek_key() { - let block = Arc::new(generate_block()); - let mut iter = BlockIterator::create_and_seek_to_key(block, &key_of(0)); - for offset in 1..=5 { - for i in 0..num_of_keys() { - let key = iter.key(); - let value = iter.value(); - assert_eq!( - key, - key_of(i), - "expected key: {:?}, actual key: {:?}", - as_bytes(&key_of(i)), - as_bytes(key) - ); - assert_eq!( - value, - value_of(i), - "expected value: {:?}, actual value: {:?}", - as_bytes(&value_of(i)), - as_bytes(value) - ); - iter.seek_to_key(&format!("key_{:03}", i * 5 + offset).into_bytes()); - } - iter.seek_to_key(b"k"); - } -} diff --git a/mini-lsm/src/compact.rs b/mini-lsm/src/compact.rs index 19146dc..5f3c7cd 100644 --- a/mini-lsm/src/compact.rs +++ b/mini-lsm/src/compact.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] // REMOVE THIS LINE after fully implementing this functionality - mod leveled; mod simple_leveled; mod tiered; diff --git a/mini-lsm/src/iterators/tests.rs b/mini-lsm/src/iterators/tests.rs deleted file mode 100644 index 2c2963c..0000000 --- a/mini-lsm/src/iterators/tests.rs +++ /dev/null @@ -1,40 +0,0 @@ -use anyhow::Result; -use bytes::Bytes; - -use super::StorageIterator; - -pub mod merge_iterator_test; -pub mod two_merge_iterator_test; - -#[derive(Clone)] -pub struct MockIterator { - pub data: Vec<(Bytes, Bytes)>, - pub index: usize, -} - -impl MockIterator { - pub fn new(data: Vec<(Bytes, Bytes)>) -> Self { - Self { data, index: 0 } - } -} - -impl StorageIterator for MockIterator { - fn next(&mut self) -> Result<()> { - if self.index < self.data.len() { - self.index += 1; - } - Ok(()) - } - - fn key(&self) -> &[u8] { - self.data[self.index].0.as_ref() - } - - fn value(&self) -> &[u8] { - self.data[self.index].1.as_ref() - } - - fn is_valid(&self) -> bool { - self.index < self.data.len() - } -} diff --git a/mini-lsm/src/mem_table.rs b/mini-lsm/src/mem_table.rs index 361ccb5..688380b 100644 --- a/mini-lsm/src/mem_table.rs +++ b/mini-lsm/src/mem_table.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] // REMOVE THIS LINE after fully implementing this functionality - use std::ops::Bound; use std::path::Path; use std::sync::atomic::AtomicUsize; diff --git a/mini-lsm/src/mem_table/tests.rs b/mini-lsm/src/mem_table/tests.rs deleted file mode 100644 index 76a80da..0000000 --- a/mini-lsm/src/mem_table/tests.rs +++ /dev/null @@ -1,95 +0,0 @@ -use tempfile::tempdir; - -use super::MemTable; -use crate::iterators::StorageIterator; -use crate::table::{SsTableBuilder, SsTableIterator}; - -#[test] -fn test_memtable_get() { - let memtable = MemTable::create(0); - memtable.put(b"key1", b"value1").unwrap(); - memtable.put(b"key2", b"value2").unwrap(); - memtable.put(b"key3", b"value3").unwrap(); - assert_eq!(&memtable.get(b"key1").unwrap()[..], b"value1"); - assert_eq!(&memtable.get(b"key2").unwrap()[..], b"value2"); - assert_eq!(&memtable.get(b"key3").unwrap()[..], b"value3"); -} - -#[test] -fn test_memtable_overwrite() { - let memtable = MemTable::create(0); - memtable.put(b"key1", b"value1").unwrap(); - memtable.put(b"key2", b"value2").unwrap(); - memtable.put(b"key3", b"value3").unwrap(); - memtable.put(b"key1", b"value11").unwrap(); - memtable.put(b"key2", b"value22").unwrap(); - memtable.put(b"key3", b"value33").unwrap(); - assert_eq!(&memtable.get(b"key1").unwrap()[..], b"value11"); - assert_eq!(&memtable.get(b"key2").unwrap()[..], b"value22"); - assert_eq!(&memtable.get(b"key3").unwrap()[..], b"value33"); -} - -#[test] -fn test_memtable_flush() { - let memtable = MemTable::create(0); - memtable.put(b"key1", b"value1").unwrap(); - memtable.put(b"key2", b"value2").unwrap(); - memtable.put(b"key3", b"value3").unwrap(); - let mut builder = SsTableBuilder::new(128); - memtable.flush(&mut builder).unwrap(); - let dir = tempdir().unwrap(); - let sst = builder.build_for_test(dir.path().join("1.sst")).unwrap(); - let mut iter = SsTableIterator::create_and_seek_to_first(sst.into()).unwrap(); - assert_eq!(iter.key(), b"key1"); - assert_eq!(iter.value(), b"value1"); - iter.next().unwrap(); - assert_eq!(iter.key(), b"key2"); - assert_eq!(iter.value(), b"value2"); - iter.next().unwrap(); - assert_eq!(iter.key(), b"key3"); - assert_eq!(iter.value(), b"value3"); - iter.next().unwrap(); - assert!(!iter.is_valid()); -} - -#[test] -fn test_memtable_iter() { - use std::ops::Bound; - let memtable = MemTable::create(0); - memtable.put(b"key1", b"value1").unwrap(); - memtable.put(b"key2", b"value2").unwrap(); - memtable.put(b"key3", b"value3").unwrap(); - - { - let mut iter = memtable.scan(Bound::Unbounded, Bound::Unbounded); - assert_eq!(iter.key(), b"key1"); - assert_eq!(iter.value(), b"value1"); - iter.next().unwrap(); - assert_eq!(iter.key(), b"key2"); - assert_eq!(iter.value(), b"value2"); - iter.next().unwrap(); - assert_eq!(iter.key(), b"key3"); - assert_eq!(iter.value(), b"value3"); - iter.next().unwrap(); - assert!(!iter.is_valid()); - } - - { - let mut iter = memtable.scan(Bound::Included(b"key1"), Bound::Included(b"key2")); - assert_eq!(iter.key(), b"key1"); - assert_eq!(iter.value(), b"value1"); - iter.next().unwrap(); - assert_eq!(iter.key(), b"key2"); - assert_eq!(iter.value(), b"value2"); - iter.next().unwrap(); - assert!(!iter.is_valid()); - } - - { - let mut iter = memtable.scan(Bound::Excluded(b"key1"), Bound::Excluded(b"key3")); - assert_eq!(iter.key(), b"key2"); - assert_eq!(iter.value(), b"value2"); - iter.next().unwrap(); - assert!(!iter.is_valid()); - } -} diff --git a/mini-lsm/src/table/tests.rs b/mini-lsm/src/table/tests.rs deleted file mode 100644 index 708d676..0000000 --- a/mini-lsm/src/table/tests.rs +++ /dev/null @@ -1,130 +0,0 @@ -use std::sync::Arc; - -use bytes::Bytes; -use tempfile::{tempdir, TempDir}; - -use super::*; -use crate::iterators::StorageIterator; -use crate::table::SsTableBuilder; - -#[test] -fn test_sst_build_single_key() { - let mut builder = SsTableBuilder::new(16); - builder.add(b"233", b"233333"); - let dir = tempdir().unwrap(); - builder.build_for_test(dir.path().join("1.sst")).unwrap(); -} - -#[test] -fn test_sst_build_two_blocks() { - let mut builder = SsTableBuilder::new(16); - builder.add(b"11", b"11"); - builder.add(b"22", b"22"); - builder.add(b"33", b"11"); - builder.add(b"44", b"22"); - builder.add(b"55", b"11"); - builder.add(b"66", b"22"); - assert!(builder.meta.len() >= 2); - let dir = tempdir().unwrap(); - builder.build_for_test(dir.path().join("1.sst")).unwrap(); -} - -fn key_of(idx: usize) -> Vec { - format!("key_{:03}", idx * 5).into_bytes() -} - -fn value_of(idx: usize) -> Vec { - format!("value_{:010}", idx).into_bytes() -} - -fn num_of_keys() -> usize { - 100 -} - -fn generate_sst() -> (TempDir, SsTable) { - let mut builder = SsTableBuilder::new(128); - for idx in 0..num_of_keys() { - let key = key_of(idx); - let value = value_of(idx); - builder.add(&key[..], &value[..]); - } - let dir = tempdir().unwrap(); - let path = dir.path().join("1.sst"); - (dir, builder.build_for_test(path).unwrap()) -} - -#[test] -fn test_sst_build_all() { - generate_sst(); -} - -#[test] -fn test_sst_decode() { - let (_dir, sst) = generate_sst(); - let meta = sst.block_meta.clone(); - let new_sst = SsTable::open_for_test(sst.file).unwrap(); - assert_eq!(new_sst.block_meta, meta); -} - -fn as_bytes(x: &[u8]) -> Bytes { - Bytes::copy_from_slice(x) -} - -#[test] -fn test_sst_iterator() { - let (_dir, sst) = generate_sst(); - let sst = Arc::new(sst); - let mut iter = SsTableIterator::create_and_seek_to_first(sst).unwrap(); - for _ in 0..5 { - for i in 0..num_of_keys() { - let key = iter.key(); - let value = iter.value(); - assert_eq!( - key, - key_of(i), - "expected key: {:?}, actual key: {:?}", - as_bytes(&key_of(i)), - as_bytes(key) - ); - assert_eq!( - value, - value_of(i), - "expected value: {:?}, actual value: {:?}", - as_bytes(&value_of(i)), - as_bytes(value) - ); - iter.next().unwrap(); - } - iter.seek_to_first().unwrap(); - } -} - -#[test] -fn test_sst_seek_key() { - let (_dir, sst) = generate_sst(); - let sst = Arc::new(sst); - let mut iter = SsTableIterator::create_and_seek_to_key(sst, &key_of(0)).unwrap(); - for offset in 1..=5 { - for i in 0..num_of_keys() { - let key = iter.key(); - let value = iter.value(); - assert_eq!( - key, - key_of(i), - "expected key: {:?}, actual key: {:?}", - as_bytes(&key_of(i)), - as_bytes(key) - ); - assert_eq!( - value, - value_of(i), - "expected value: {:?}, actual value: {:?}", - as_bytes(&value_of(i)), - as_bytes(value) - ); - iter.seek_to_key(&format!("key_{:03}", i * 5 + offset).into_bytes()) - .unwrap(); - } - iter.seek_to_key(b"k").unwrap(); - } -}