70
mini-lsm/src/tests/harness.rs
Normal file
70
mini-lsm/src/tests/harness.rs
Normal file
@@ -0,0 +1,70 @@
|
||||
use anyhow::{bail, Result};
|
||||
use bytes::Bytes;
|
||||
|
||||
use crate::iterators::StorageIterator;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct MockIterator {
|
||||
pub data: Vec<(Bytes, Bytes)>,
|
||||
pub error_when: Option<usize>,
|
||||
pub index: usize,
|
||||
}
|
||||
|
||||
impl MockIterator {
|
||||
pub fn new(data: Vec<(Bytes, Bytes)>) -> Self {
|
||||
Self {
|
||||
data,
|
||||
index: 0,
|
||||
error_when: None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_with_error(data: Vec<(Bytes, Bytes)>, error_when: usize) -> Self {
|
||||
Self {
|
||||
data,
|
||||
index: 0,
|
||||
error_when: Some(error_when),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl StorageIterator for MockIterator {
|
||||
fn next(&mut self) -> Result<()> {
|
||||
if self.index < self.data.len() {
|
||||
self.index += 1;
|
||||
}
|
||||
if let Some(error_when) = self.error_when {
|
||||
if self.index == error_when {
|
||||
bail!("fake error!");
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn key(&self) -> &[u8] {
|
||||
if let Some(error_when) = self.error_when {
|
||||
if self.index >= error_when {
|
||||
panic!("invalid access after next returns an error!");
|
||||
}
|
||||
}
|
||||
self.data[self.index].0.as_ref()
|
||||
}
|
||||
|
||||
fn value(&self) -> &[u8] {
|
||||
if let Some(error_when) = self.error_when {
|
||||
if self.index >= error_when {
|
||||
panic!("invalid access after next returns an error!");
|
||||
}
|
||||
}
|
||||
self.data[self.index].1.as_ref()
|
||||
}
|
||||
|
||||
fn is_valid(&self) -> bool {
|
||||
if let Some(error_when) = self.error_when {
|
||||
if self.index >= error_when {
|
||||
panic!("invalid access after next returns an error!");
|
||||
}
|
||||
}
|
||||
self.index < self.data.len()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user