@@ -22,32 +22,38 @@ use crate::{
2222 } ,
2323} ;
2424
25+ /// The size of the small value used for tests.
26+ pub const SMALL_BYTE_UPPER_LIMIT : u8 = 3 ;
27+
2528/// Returns a random key prefix used for tests
2629pub fn get_random_key_prefix ( ) -> Vec < u8 > {
2730 let mut key_prefix = vec ! [ 0 ] ;
28- let value: usize = make_nondeterministic_rng ( ) . rng_mut ( ) . gen ( ) ;
31+ let value: usize = make_nondeterministic_rng ( ) . gen ( ) ;
2932 bcs:: serialize_into ( & mut key_prefix, & value) . unwrap ( ) ;
3033 key_prefix
3134}
3235
33- /// Takes a random number generator, a `key_prefix` and extends it by n random bytes.
34- pub fn get_random_byte_vector < R : Rng > ( rng : & mut R , key_prefix : & [ u8 ] , n : usize ) -> Vec < u8 > {
36+ fn get_random_byte_vector_with_byte_upper_limit < R : Rng > (
37+ rng : & mut R ,
38+ key_prefix : & [ u8 ] ,
39+ n : usize ,
40+ byte_upper_limit : u8 ,
41+ ) -> Vec < u8 > {
3542 let mut v = key_prefix. to_vec ( ) ;
3643 for _ in 0 ..n {
37- let val = rng. gen_range ( 0 ..256 ) as u8 ;
44+ let val = rng. gen_range ( 0 ..=byte_upper_limit ) ;
3845 v. push ( val) ;
3946 }
4047 v
4148}
4249
43- /// Appends a small value to a key making collisions likely.
44- pub fn get_small_key_space < R : Rng > ( rng : & mut R , key_prefix : & [ u8 ] , n : usize ) -> Vec < u8 > {
45- let mut key = key_prefix. to_vec ( ) ;
46- for _ in 0 ..n {
47- let byte = rng. gen_range ( 0 ..4 ) as u8 ;
48- key. push ( byte) ;
49- }
50- key
50+ fn get_small_key_space < R : Rng > ( rng : & mut R , key_prefix : & [ u8 ] , n : usize ) -> Vec < u8 > {
51+ get_random_byte_vector_with_byte_upper_limit ( rng, key_prefix, n, SMALL_BYTE_UPPER_LIMIT )
52+ }
53+
54+ /// Takes a random number generator, a `key_prefix` and extends it by n random bytes.
55+ pub fn get_random_byte_vector < R : Rng > ( rng : & mut R , key_prefix : & [ u8 ] , n : usize ) -> Vec < u8 > {
56+ get_random_byte_vector_with_byte_upper_limit ( rng, key_prefix, n, u8:: MAX )
5157}
5258
5359/// Builds a random k element subset of n
@@ -61,36 +67,43 @@ pub fn get_random_kset<R: Rng>(rng: &mut R, n: usize, k: usize) -> Vec<usize> {
6167}
6268
6369/// Takes a random number generator, a `key_prefix` and generates
64- /// pairs `(key, value)` with key obtained by appending 8 bytes at random to `key_prefix`
65- /// and value obtained by appending 8 bytes to the trivial vector .
66- /// We return n such `(key, value)` pairs which are all distinct
70+ /// pairs `(key, value)` with key obtained by appending `len_key` random bytes to `key_prefix`
71+ /// and value obtained by creating a vector with `len_value` random bytes .
72+ /// We return n such `(key, value)` pairs which are all distinct.
6773pub fn get_random_key_values_prefix < R : Rng > (
6874 rng : & mut R ,
6975 key_prefix : Vec < u8 > ,
7076 len_key : usize ,
7177 len_value : usize ,
7278 num_entries : usize ,
79+ key_byte_upper_limit : u8 ,
7380) -> Vec < ( Vec < u8 > , Vec < u8 > ) > {
74- loop {
75- let mut v_ret = Vec :: new ( ) ;
76- let mut vector_set = HashSet :: new ( ) ;
77- for _ in 0 ..num_entries {
78- let v1 = get_random_byte_vector ( rng, & key_prefix, len_key) ;
79- let v2 = get_random_byte_vector ( rng, & Vec :: new ( ) , len_value) ;
80- let v12 = ( v1. clone ( ) , v2) ;
81- vector_set. insert ( v1) ;
82- v_ret. push ( v12) ;
83- }
84- if vector_set. len ( ) == num_entries {
85- return v_ret;
86- }
81+ let mut key_value_pairs = Vec :: new ( ) ;
82+ let mut unique_keys = HashSet :: new ( ) ;
83+ for _ in 0 ..num_entries {
84+ let key = loop {
85+ let key = get_random_byte_vector_with_byte_upper_limit (
86+ rng,
87+ & key_prefix,
88+ len_key,
89+ key_byte_upper_limit,
90+ ) ;
91+ if !unique_keys. contains ( & key) {
92+ unique_keys. insert ( key. clone ( ) ) ;
93+ break key;
94+ }
95+ } ;
96+ let value = get_random_byte_vector ( rng, & Vec :: new ( ) , len_value) ;
97+ key_value_pairs. push ( ( key, value) ) ;
8798 }
99+
100+ key_value_pairs
88101}
89102
90103/// Takes a random number generator `rng`, a number n and returns n random `(key, value)`
91104/// which are all distinct with key and value being of length 8.
92105pub fn get_random_key_values < R : Rng > ( rng : & mut R , num_entries : usize ) -> Vec < ( Vec < u8 > , Vec < u8 > ) > {
93- get_random_key_values_prefix ( rng, Vec :: new ( ) , 8 , 8 , num_entries)
106+ get_random_key_values_prefix ( rng, Vec :: new ( ) , 8 , 8 , num_entries, u8 :: MAX )
94107}
95108
96109type VectorPutDelete = ( Vec < ( Vec < u8 > , Vec < u8 > ) > , usize ) ;
@@ -101,8 +114,7 @@ pub fn get_random_key_value_operations<R: Rng>(
101114 num_entries : usize ,
102115 k : usize ,
103116) -> VectorPutDelete {
104- let key_value_vector = get_random_key_values_prefix ( rng, Vec :: new ( ) , 8 , 8 , num_entries) ;
105- ( key_value_vector, k)
117+ ( get_random_key_values ( rng, num_entries) , k)
106118}
107119
108120/// A random reordering of the puts and deletes.
@@ -234,31 +246,39 @@ pub async fn run_reads<S: RestrictedKeyValueStore>(store: S, key_values: Vec<(Ve
234246 }
235247}
236248
237- fn get_random_key_values1 ( num_entries : usize , len_value : usize ) -> Vec < ( Vec < u8 > , Vec < u8 > ) > {
249+ /// Generates a list of random key-values with no duplicates
250+ pub fn get_random_key_values_with_sizes (
251+ num_entries : usize ,
252+ len_key : usize ,
253+ len_value : usize ,
254+ ) -> Vec < ( Vec < u8 > , Vec < u8 > ) > {
238255 let key_prefix = vec ! [ 0 ] ;
239256 let mut rng = make_deterministic_rng ( ) ;
240- get_random_key_values_prefix ( & mut rng, key_prefix, 8 , len_value, num_entries)
257+ get_random_key_values_prefix (
258+ & mut rng,
259+ key_prefix,
260+ len_key,
261+ len_value,
262+ num_entries,
263+ u8:: MAX ,
264+ )
241265}
242266
243- /// Generates a list of random key-values with no duplicates
244- pub fn get_random_key_values2 (
267+ fn get_random_key_values_with_small_keys (
245268 num_entries : usize ,
246269 len_key : usize ,
247270 len_value : usize ,
248271) -> Vec < ( Vec < u8 > , Vec < u8 > ) > {
249- let mut rng = make_deterministic_rng ( ) ;
250272 let key_prefix = vec ! [ 0 ] ;
251- let mut key_values = Vec :: new ( ) ;
252- let mut key_set = HashSet :: new ( ) ;
253- for _ in 0 ..num_entries {
254- let key = get_small_key_space ( & mut rng, & key_prefix, len_key) ;
255- if !key_set. contains ( & key) {
256- key_set. insert ( key. clone ( ) ) ;
257- let value = get_random_byte_vector ( & mut rng, & [ ] , len_value) ;
258- key_values. push ( ( key, value) ) ;
259- }
260- }
261- key_values
273+ let mut rng = make_deterministic_rng ( ) ;
274+ get_random_key_values_prefix (
275+ & mut rng,
276+ key_prefix,
277+ len_key,
278+ len_value,
279+ num_entries,
280+ SMALL_BYTE_UPPER_LIMIT ,
281+ )
262282}
263283
264284/// Adds a prefix to a list of key-values
@@ -276,11 +296,11 @@ pub fn add_prefix(prefix: &[u8], key_values: Vec<(Vec<u8>, Vec<u8>)>) -> Vec<(Ve
276296/// We build a number of scenarios for testing the reads.
277297pub fn get_random_test_scenarios ( ) -> Vec < Vec < ( Vec < u8 > , Vec < u8 > ) > > {
278298 vec ! [
279- get_random_key_values1 ( 7 , 3 ) ,
280- get_random_key_values1 ( 150 , 3 ) ,
281- get_random_key_values1 ( 30 , 10 ) ,
282- get_random_key_values2 ( 30 , 4 , 10 ) ,
283- get_random_key_values2 ( 30 , 4 , 100 ) ,
299+ get_random_key_values_with_sizes ( 7 , 8 , 3 ) ,
300+ get_random_key_values_with_sizes ( 150 , 8 , 3 ) ,
301+ get_random_key_values_with_sizes ( 30 , 8 , 10 ) ,
302+ get_random_key_values_with_small_keys ( 30 , 4 , 10 ) ,
303+ get_random_key_values_with_small_keys ( 30 , 4 , 100 ) ,
284304 ]
285305}
286306
0 commit comments