Mercurial > lbo > hg > leveldb-rs
changeset 206:c214575a9fd7
version_set: Add some unit tests.
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Mon, 04 Sep 2017 20:48:06 +0200 |
parents | f6c58969201c |
children | 58e068ea2b58 |
files | src/types.rs src/version_set.rs |
diffstat | 2 files changed, 72 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/types.rs Mon Sep 04 20:12:25 2017 +0200 +++ b/src/types.rs Mon Sep 04 20:48:06 2017 +0200 @@ -80,6 +80,7 @@ /// Describes a file on disk. #[derive(Clone, Debug, PartialEq)] pub struct FileMetaData { + // default: size / 16384. pub allowed_seeks: isize, pub num: u64, pub size: u64,
--- a/src/version_set.rs Mon Sep 04 20:12:25 2017 +0200 +++ b/src/version_set.rs Mon Sep 04 20:48:06 2017 +0200 @@ -362,14 +362,14 @@ } /// key_is_after_file returns true if the given user key is larger than the largest key in f. -fn key_is_after_file(cmp: &InternalKeyCmp, key: &[u8], f: &FileMetaHandle) -> bool { - let (_, _, ulargest) = parse_internal_key(&(*f).largest); +fn key_is_after_file<'a>(cmp: &InternalKeyCmp, key: UserKey<'a>, f: &FileMetaHandle) -> bool { + let ulargest = parse_internal_key(&(*f).largest).2; !key.is_empty() && cmp.cmp_inner(key, ulargest) == Ordering::Greater } /// key_is_before_file returns true if the given user key is larger than the largest key in f. -fn key_is_before_file(cmp: &InternalKeyCmp, key: &[u8], f: &FileMetaHandle) -> bool { - let (_, _, usmallest) = parse_internal_key(&(*f).smallest); +fn key_is_before_file<'a>(cmp: &InternalKeyCmp, key: UserKey<'a>, f: &FileMetaHandle) -> bool { + let usmallest = parse_internal_key(&(*f).smallest).2; !key.is_empty() && cmp.cmp_inner(key, usmallest) == Ordering::Less } @@ -418,3 +418,70 @@ } false } + +#[cfg(test)] +mod tests { + use super::*; + use cmp::DefaultCmp; + + fn new_file(num: u64, smallest: &[u8], largest: &[u8]) -> FileMetaHandle { + Rc::new(FileMetaData { + allowed_seeks: 10, + size: 163840, + num: num, + smallest: LookupKey::new(smallest, MAX_SEQUENCE_NUMBER).internal_key().to_vec(), + largest: LookupKey::new(largest, 0).internal_key().to_vec(), + }) + } + + #[test] + fn test_version_key_ordering() { + time_test!(); + let fmh = new_file(1, &[1, 0, 0], &[2, 0, 0]); + let cmp = InternalKeyCmp(Rc::new(Box::new(DefaultCmp))); + + // Keys before file. + for k in &[&[0][..], &[1], &[1, 0], &[0, 9, 9, 9]] { + assert!(key_is_before_file(&cmp, k, &fmh)); + assert!(!key_is_after_file(&cmp, k, &fmh)); + } + // Keys in file. + for k in &[&[1, 0, 0][..], &[1, 0, 1], &[1, 2, 3, 4], &[1, 9, 9], &[2, 0, 0]] { + assert!(!key_is_before_file(&cmp, k, &fmh)); + assert!(!key_is_after_file(&cmp, k, &fmh)); + } + // Keys after file. + for k in &[&[2, 0, 1][..], &[9, 9, 9], &[9, 9, 9, 9]] { + assert!(!key_is_before_file(&cmp, k, &fmh)); + assert!(key_is_after_file(&cmp, k, &fmh)); + } + } + + #[test] + fn test_version_file_overlaps() { + time_test!(); + + let files_disjoint = [new_file(1, &[2, 0, 0], &[3, 0, 0]), + new_file(2, &[3, 0, 1], &[4, 0, 0]), + new_file(3, &[4, 0, 1], &[5, 0, 0])]; + let files_joint = [new_file(1, &[2, 0, 0], &[3, 0, 0]), + new_file(2, &[2, 5, 0], &[4, 0, 0]), + new_file(3, &[3, 5, 1], &[5, 0, 0])]; + let cmp = InternalKeyCmp(Rc::new(Box::new(DefaultCmp))); + + assert!(some_file_overlaps_range(&cmp, &files_joint, &[2, 5, 0], &[3, 1, 0])); + assert!(some_file_overlaps_range(&cmp, &files_joint, &[2, 5, 0], &[7, 0, 0])); + assert!(some_file_overlaps_range(&cmp, &files_joint, &[0, 0], &[2, 0, 0])); + assert!(some_file_overlaps_range(&cmp, &files_joint, &[0, 0], &[7, 0, 0])); + assert!(!some_file_overlaps_range(&cmp, &files_joint, &[0, 0], &[0, 5])); + assert!(!some_file_overlaps_range(&cmp, &files_joint, &[6, 0], &[7, 5])); + + assert!(some_file_overlaps_range_disjoint(&cmp, &files_disjoint, &[2, 0, 1], &[2, 5, 0])); + assert!(some_file_overlaps_range_disjoint(&cmp, &files_disjoint, &[3, 0, 1], &[4, 9, 0])); + assert!(some_file_overlaps_range_disjoint(&cmp, &files_disjoint, &[2, 0, 1], &[6, 5, 0])); + assert!(some_file_overlaps_range_disjoint(&cmp, &files_disjoint, &[0, 0, 1], &[2, 5, 0])); + assert!(some_file_overlaps_range_disjoint(&cmp, &files_disjoint, &[0, 0, 1], &[6, 5, 0])); + assert!(!some_file_overlaps_range_disjoint(&cmp, &files_disjoint, &[0, 0, 1], &[0, 1])); + assert!(!some_file_overlaps_range_disjoint(&cmp, &files_disjoint, &[6, 0, 1], &[7, 0, 1])); + } +}