|
1 | 1 | // Copyright (c) Zefchain Labs, Inc. |
2 | 2 | // SPDX-License-Identifier: Apache-2.0 |
3 | 3 |
|
4 | | -use rand::{Rng, SeedableRng}; |
| 4 | +use rand::{ |
| 5 | + rngs::{SmallRng, ThreadRng}, |
| 6 | + Rng, SeedableRng, |
| 7 | +}; |
5 | 8 |
|
6 | 9 | // The following seed is chosen to have equal numbers of 1s and 0s, as advised by |
7 | 10 | // https://docs.rs/rand/latest/rand/rngs/struct.SmallRng.html |
8 | 11 | // Specifically, it's "01" × 32 in binary |
9 | 12 | const RNG_SEED: u64 = 6148914691236517205; |
10 | 13 |
|
11 | 14 | /// A deterministic RNG. |
12 | | -pub type DeterministicRng = rand::rngs::SmallRng; |
| 15 | +pub type DeterministicRng = SmallRng; |
13 | 16 |
|
14 | 17 | /// A RNG that is non-deterministic if the platform supports it. |
15 | | -pub struct NonDeterministicRng( |
16 | | - #[cfg(target_arch = "wasm32")] std::sync::MutexGuard<'static, DeterministicRng>, |
17 | | - #[cfg(not(target_arch = "wasm32"))] rand::rngs::ThreadRng, |
18 | | -); |
19 | | - |
20 | | -impl NonDeterministicRng { |
21 | | - /// Access the internal RNG. |
22 | | - pub fn rng_mut(&mut self) -> &mut impl Rng { |
23 | | - #[cfg(target_arch = "wasm32")] |
24 | | - { |
25 | | - &mut *self.0 |
26 | | - } |
27 | | - #[cfg(not(target_arch = "wasm32"))] |
28 | | - { |
29 | | - &mut self.0 |
30 | | - } |
31 | | - } |
32 | | -} |
| 18 | +#[cfg(not(target_arch = "wasm32"))] |
| 19 | +pub type NonDeterministicRng = ThreadRng; |
| 20 | +#[cfg(target_arch = "wasm32")] |
| 21 | +pub type NonDeterministicRng = SmallRng; |
33 | 22 |
|
34 | 23 | /// Returns a deterministic RNG for testing. |
35 | 24 | pub fn make_deterministic_rng() -> DeterministicRng { |
36 | | - rand::rngs::SmallRng::seed_from_u64(RNG_SEED) |
| 25 | + SmallRng::seed_from_u64(RNG_SEED) |
37 | 26 | } |
38 | 27 |
|
39 | 28 | /// Returns a non-deterministic RNG where supported. |
40 | 29 | pub fn make_nondeterministic_rng() -> NonDeterministicRng { |
41 | 30 | #[cfg(target_arch = "wasm32")] |
42 | 31 | { |
43 | | - use std::sync::{Mutex, OnceLock}; |
44 | | - |
45 | | - use rand::rngs::SmallRng; |
46 | | - |
47 | | - static RNG: OnceLock<Mutex<SmallRng>> = OnceLock::new(); |
48 | | - NonDeterministicRng( |
49 | | - RNG.get_or_init(|| Mutex::new(make_deterministic_rng())) |
50 | | - .lock() |
51 | | - .expect("failed to lock RNG mutex"), |
52 | | - ) |
| 32 | + make_deterministic_rng() |
53 | 33 | } |
54 | | - |
55 | 34 | #[cfg(not(target_arch = "wasm32"))] |
56 | 35 | { |
57 | | - NonDeterministicRng(rand::thread_rng()) |
| 36 | + rand::thread_rng() |
58 | 37 | } |
59 | 38 | } |
60 | 39 |
|
61 | 40 | /// Get a random alphanumeric string that can be used for all tests. |
62 | 41 | pub fn generate_random_alphanumeric_string(length: usize, charset: &[u8]) -> String { |
63 | 42 | (0..length) |
64 | 43 | .map(|_| { |
65 | | - let random_index = make_nondeterministic_rng() |
66 | | - .rng_mut() |
67 | | - .gen_range(0..charset.len()); |
| 44 | + let random_index = make_nondeterministic_rng().gen_range(0..charset.len()); |
68 | 45 | charset[random_index] as char |
69 | 46 | }) |
70 | 47 | .collect() |
|
0 commit comments