From 234623a0ccc92739a195ae5085ccbe51a0083085 Mon Sep 17 00:00:00 2001 From: Sayan Nandan Date: Tue, 31 Aug 2021 21:05:15 -0700 Subject: [PATCH] Add corruption tests --- server/src/storage/mod.rs | 2 +- server/src/storage/tests.rs | 40 ++++++++++++++++++++++++++++++----- server/src/storage/unflush.rs | 2 +- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/server/src/storage/mod.rs b/server/src/storage/mod.rs index c7c9ec39..d47e6db5 100644 --- a/server/src/storage/mod.rs +++ b/server/src/storage/mod.rs @@ -400,7 +400,7 @@ mod de { } } /// Deserialize a file that contains a serialized map. This also returns the model code - pub fn deserialize_map(data: Vec) -> Option> { + pub fn deserialize_map(data: &[u8]) -> Option> { let mut rawiter = RawSliceIter::new(&data); let len = rawiter.next_64bit_integer_to_usize()?; let hm = Coremap::with_capacity(len); diff --git a/server/src/storage/tests.rs b/server/src/storage/tests.rs index 7b71346c..03e5371a 100644 --- a/server/src/storage/tests.rs +++ b/server/src/storage/tests.rs @@ -30,7 +30,7 @@ use super::*; fn test_serialize_deserialize_empty() { let cmap = Coremap::new(); let ser = se::serialize_map(&cmap).unwrap(); - let de = de::deserialize_map(ser).unwrap(); + let de = de::deserialize_map(&ser).unwrap(); assert!(de.len() == 0); } @@ -40,7 +40,7 @@ fn test_ser_de_few_elements() { cmap.upsert("sayan".into(), "writes code".into()); cmap.upsert("supersayan".into(), "writes super code".into()); let ser = se::serialize_map(&cmap).unwrap(); - let de = de::deserialize_map(ser).unwrap(); + let de = de::deserialize_map(&ser).unwrap(); assert!(de.len() == cmap.len()); assert!(de .iter() @@ -65,7 +65,7 @@ cfg_test!( .map(|(k, v)| (Data::from(k.to_owned()), Data::from(v.to_owned()))) .collect(); let ser = se::serialize_map(&cmap).unwrap(); - let de = de::deserialize_map(ser).unwrap(); + let de = de::deserialize_map(&ser).unwrap(); assert!(de .iter() .all(|kv| cmap.get(kv.key()).unwrap().eq(kv.value()))); @@ -90,7 +90,7 @@ cfg_test!( // random chop se.truncate(124); // corrupted - assert!(de::deserialize_map(se).is_none()); + assert!(de::deserialize_map(&se).is_none()); } #[test] fn test_ser_de_excess_bytes() { @@ -114,7 +114,7 @@ cfg_test!( // random patch let patch: Vec = (0u16..500u16).into_iter().map(|v| (v >> 7) as u8).collect(); se.extend(patch); - assert!(de::deserialize_map(se).is_none()); + assert!(de::deserialize_map(&se).is_none()); } ); @@ -384,3 +384,33 @@ mod list_tests { assert_eq!(de.len(), 0) } } + +mod corruption_tests { + use crate::corestore::htable::Coremap; + #[test] + fn test_corruption_map_basic() { + let mymap = Coremap::new(); + let seresult = super::se::serialize_map(&mymap).unwrap(); + // now chop it; since this has 8B, let's drop some bytes + assert!(super::de::deserialize_map(&seresult[..seresult.len() - 6]).is_none()); + } + #[test] + fn test_map_corruption_end_corruption() { + let cmap = Coremap::new(); + cmap.upsert("sayan".into(), "writes code".into()); + cmap.upsert("supersayan".into(), "writes super code".into()); + let ser = super::se::serialize_map(&cmap).unwrap(); + // corrupt the last 16B + assert!(super::de::deserialize_map(&ser[..ser.len() - 16]).is_none()); + } + #[test] + fn test_map_corruption_midway_corruption() { + let cmap = Coremap::new(); + cmap.upsert("sayan".into(), "writes code".into()); + cmap.upsert("supersayan".into(), "writes super code".into()); + let mut ser = super::se::serialize_map(&cmap).unwrap(); + // middle chop + ser.drain(16..ser.len() / 2); + assert!(super::de::deserialize_map(&ser).is_none()); + } +} diff --git a/server/src/storage/unflush.rs b/server/src/storage/unflush.rs index ed6cfba0..a50a5e50 100644 --- a/server/src/storage/unflush.rs +++ b/server/src/storage/unflush.rs @@ -63,7 +63,7 @@ pub fn read_table( } else { // not volatile, so read this in let f = fs::read(filepath)?; - super::de::deserialize_map(f).ok_or_else(|| bad_data!())? + super::de::deserialize_map(&f).ok_or_else(|| bad_data!())? }; let tbl = match model_code { bytemarks::BYTEMARK_MODEL_KV_BIN_BIN => {