in sdk/core/azure_core_test/src/recording.rs [381:418]
fn rng(&self) -> &Mutex<ChaCha20Rng> {
// Use ChaCha20 for a deterministic, portable CSPRNG.
self.rand.get_or_init(|| match self.test_mode {
TestMode::Live => ChaCha20Rng::from_entropy().into(),
TestMode::Playback => {
let variables = self
.variables
.read()
.map_err(read_lock_error)
.unwrap_or_else(|err| panic!("{err}"));
let seed: String = variables
.get(RANDOM_SEED_NAME)
.map(Into::into)
.unwrap_or_else(|| panic!("random seed variable not set"));
let seed = base64::decode(seed)
.unwrap_or_else(|err| panic!("failed to decode random seed: {err}"));
let seed = seed
.first_chunk::<32>()
.unwrap_or_else(|| panic!("insufficient random seed variable"));
ChaCha20Rng::from_seed(*seed).into()
}
TestMode::Record => {
let rng = ChaCha20Rng::from_entropy();
let seed = rng.get_seed();
let seed = base64::encode(seed);
let mut variables = self
.variables
.write()
.map_err(write_lock_error)
.unwrap_or_else(|err| panic!("{err}"));
variables.insert(RANDOM_SEED_NAME.to_string(), Value::from(Some(seed), None));
rng.into()
}
})
}