@@ -878,12 +878,14 @@ mod tests {
878878 Put ( PointOffset , Payload ) ,
879879 Delete ( PointOffset ) ,
880880 Update ( PointOffset , Payload ) ,
881+ Get ( PointOffset ) ,
882+ Flush ,
881883 }
882884
883885 impl Operation {
884886 fn random ( rng : & mut impl Rng , max_point_offset : u32 ) -> Self {
885887 let point_offset = rng. random_range ( 0 ..=max_point_offset) ;
886- let operation = rng. random_range ( 0 ..3 ) ;
888+ let operation = rng. random_range ( 0 ..4 ) ;
887889 match operation {
888890 0 => {
889891 let size_factor = rng. random_range ( 1 ..10 ) ;
@@ -896,6 +898,8 @@ mod tests {
896898 let payload = random_payload ( rng, size_factor) ;
897899 Operation :: Update ( point_offset, payload)
898900 }
901+ 3 => Operation :: Get ( point_offset) ,
902+ 4 => Operation :: Flush ,
899903 _ => unreachable ! ( ) ,
900904 }
901905 }
@@ -905,14 +909,14 @@ mod tests {
905909 fn test_behave_like_hashmap (
906910 #[ values( 1_048_576 , 2_097_152 , DEFAULT_PAGE_SIZE_BYTES ) ] page_size : usize ,
907911 ) {
908- use std :: collections :: HashMap ;
912+ use ahash :: AHashMap ;
909913
910914 let ( dir, mut storage) = empty_storage_sized ( page_size) ;
911915
912916 let rng = & mut rand:: rngs:: SmallRng :: from_os_rng ( ) ;
913- let max_point_offset = 100000u32 ;
917+ let max_point_offset = 10000u32 ;
914918
915- let mut model_hashmap = HashMap :: new ( ) ;
919+ let mut model_hashmap = AHashMap :: with_capacity ( max_point_offset as usize ) ;
916920
917921 let operations = ( 0 ..100000u32 )
918922 . map ( |_| Operation :: random ( rng, max_point_offset) )
@@ -925,10 +929,15 @@ mod tests {
925929 for operation in operations {
926930 match operation {
927931 Operation :: Put ( point_offset, payload) => {
928- storage
932+ let old1 = storage
929933 . put_value ( point_offset, & payload, hw_counter_ref)
930934 . unwrap ( ) ;
931- model_hashmap. insert ( point_offset, payload) ;
935+ let old2 = model_hashmap. insert ( point_offset, payload) ;
936+ assert_eq ! (
937+ old1,
938+ old2. is_some( ) ,
939+ "put failed for point_offset: {point_offset} with {old1:?} vs {old2:?}" ,
940+ ) ;
932941 }
933942 Operation :: Delete ( point_offset) => {
934943 let old1 = storage. delete_value ( point_offset) ;
@@ -944,6 +953,20 @@ mod tests {
944953 . unwrap ( ) ;
945954 model_hashmap. insert ( point_offset, payload) ;
946955 }
956+ Operation :: Get ( point_offset) => {
957+ let v1_seq = storage. get_value :: < true > ( point_offset, & hw_counter) ;
958+ let v1_rand = storage. get_value :: < false > ( point_offset, & hw_counter) ;
959+ let v2 = model_hashmap. get ( & point_offset) . cloned ( ) ;
960+ assert_eq ! (
961+ v1_seq, v2,
962+ "get sequential failed for point_offset: {point_offset} with {v1_seq:?} vs {v2:?}" ,
963+ ) ;
964+ assert_eq ! (
965+ v1_rand, v2,
966+ "get_rand sequential failed for point_offset: {point_offset} with {v1_rand:?} vs {v2:?}" ,
967+ ) ;
968+ }
969+ Operation :: Flush => storage. flusher ( ) ( ) . unwrap ( ) ,
947970 }
948971 }
949972
0 commit comments