@@ -22,32 +22,38 @@ use crate::{
22
22
} ,
23
23
} ;
24
24
25
+ /// The size of the small value used for tests.
26
+ pub const SMALL_BYTE_UPPER_LIMIT : u8 = 3 ;
27
+
25
28
/// Returns a random key prefix used for tests
26
29
pub fn get_random_key_prefix ( ) -> Vec < u8 > {
27
30
let mut key_prefix = vec ! [ 0 ] ;
28
- let value: usize = make_nondeterministic_rng ( ) . rng_mut ( ) . gen ( ) ;
31
+ let value: usize = make_nondeterministic_rng ( ) . gen ( ) ;
29
32
bcs:: serialize_into ( & mut key_prefix, & value) . unwrap ( ) ;
30
33
key_prefix
31
34
}
32
35
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 > {
35
42
let mut v = key_prefix. to_vec ( ) ;
36
43
for _ in 0 ..n {
37
- let val = rng. gen_range ( 0 ..256 ) as u8 ;
44
+ let val = rng. gen_range ( 0 ..=byte_upper_limit ) ;
38
45
v. push ( val) ;
39
46
}
40
47
v
41
48
}
42
49
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 )
51
57
}
52
58
53
59
/// 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> {
61
67
}
62
68
63
69
/// 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.
67
73
pub fn get_random_key_values_prefix < R : Rng > (
68
74
rng : & mut R ,
69
75
key_prefix : Vec < u8 > ,
70
76
len_key : usize ,
71
77
len_value : usize ,
72
78
num_entries : usize ,
79
+ key_byte_upper_limit : u8 ,
73
80
) -> 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) ) ;
87
98
}
99
+
100
+ key_value_pairs
88
101
}
89
102
90
103
/// Takes a random number generator `rng`, a number n and returns n random `(key, value)`
91
104
/// which are all distinct with key and value being of length 8.
92
105
pub 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 )
94
107
}
95
108
96
109
type VectorPutDelete = ( Vec < ( Vec < u8 > , Vec < u8 > ) > , usize ) ;
@@ -101,8 +114,7 @@ pub fn get_random_key_value_operations<R: Rng>(
101
114
num_entries : usize ,
102
115
k : usize ,
103
116
) -> 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)
106
118
}
107
119
108
120
/// 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
234
246
}
235
247
}
236
248
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 > ) > {
238
255
let key_prefix = vec ! [ 0 ] ;
239
256
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
+ )
241
265
}
242
266
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 (
245
268
num_entries : usize ,
246
269
len_key : usize ,
247
270
len_value : usize ,
248
271
) -> Vec < ( Vec < u8 > , Vec < u8 > ) > {
249
- let mut rng = make_deterministic_rng ( ) ;
250
272
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
+ )
262
282
}
263
283
264
284
/// 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
276
296
/// We build a number of scenarios for testing the reads.
277
297
pub fn get_random_test_scenarios ( ) -> Vec < Vec < ( Vec < u8 > , Vec < u8 > ) > > {
278
298
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 ) ,
284
304
]
285
305
}
286
306
0 commit comments