Remove TestRandom (#9006)

We  have a legacy `TestRandom` trait which generates random types for testing and fuzzing.
This function overlaps with `arbitrary` which is used very commonly in the ecosystem.


  Remove `TestRandom` and generate random type instances using `Arbitrary`.


Co-Authored-By: Mac L <mjladson@pm.me>

Co-Authored-By: Michael Sproul <michael@sigmaprime.io>
This commit is contained in:
Mac L
2026-05-05 10:35:57 +04:00
committed by GitHub
parent 4b314d8e79
commit 3351db1ba8
121 changed files with 418 additions and 1141 deletions

View File

@@ -501,10 +501,9 @@ mod tests {
DataColumnsByRangeRequestId, DataColumnsByRangeRequester, Id, RangeRequestId,
},
};
use rand::SeedableRng;
use std::{collections::HashMap, sync::Arc};
use tracing::Span;
use types::{Epoch, ForkName, MinimalEthSpec as E, SignedBeaconBlock, test_utils::XorShiftRng};
use types::{Epoch, ForkName, MinimalEthSpec as E, SignedBeaconBlock};
fn components_id() -> ComponentsByRangeRequestId {
ComponentsByRangeRequestId {
@@ -549,10 +548,11 @@ mod tests {
#[test]
fn no_blobs_into_responses() {
let mut rng = XorShiftRng::from_seed([42; 16]);
let mut u = types::test_utils::test_unstructured();
let blocks = (0..4)
.map(|_| {
generate_rand_block_and_blobs::<E>(ForkName::Base, NumBlobs::None, &mut rng)
generate_rand_block_and_blobs::<E>(ForkName::Base, NumBlobs::None, &mut u)
.unwrap()
.0
.into()
})
@@ -574,11 +574,12 @@ mod tests {
#[test]
fn empty_blobs_into_responses() {
let mut rng = XorShiftRng::from_seed([42; 16]);
let mut u = types::test_utils::test_unstructured();
let blocks = (0..4)
.map(|_| {
// Always generate some blobs.
generate_rand_block_and_blobs::<E>(ForkName::Deneb, NumBlobs::Number(3), &mut rng)
generate_rand_block_and_blobs::<E>(ForkName::Deneb, NumBlobs::Number(3), &mut u)
.unwrap()
.0
.into()
})
@@ -619,15 +620,16 @@ mod tests {
.custody_context()
.sampling_columns_for_epoch(Epoch::new(0), &spec)
.to_vec();
let mut rng = XorShiftRng::from_seed([42; 16]);
let mut u = types::test_utils::test_unstructured();
let blocks = (0..4)
.map(|_| {
generate_rand_block_and_data_columns::<E>(
ForkName::Fulu,
NumBlobs::Number(1),
&mut rng,
&mut u,
&spec,
)
.unwrap()
})
.collect::<Vec<_>>();
@@ -729,15 +731,16 @@ mod tests {
Span::none(),
);
let mut rng = XorShiftRng::from_seed([42; 16]);
let mut u = types::test_utils::test_unstructured();
let blocks = (0..4)
.map(|_| {
generate_rand_block_and_data_columns::<E>(
ForkName::Fulu,
NumBlobs::Number(1),
&mut rng,
&mut u,
&spec,
)
.unwrap()
})
.collect::<Vec<_>>();
@@ -787,15 +790,16 @@ mod tests {
.custody_context()
.sampling_columns_for_epoch(Epoch::new(0), &spec)
.to_vec();
let mut rng = XorShiftRng::from_seed([42; 16]);
let mut u = types::test_utils::test_unstructured();
let blocks = (0..2)
.map(|_| {
generate_rand_block_and_data_columns::<E>(
ForkName::Fulu,
NumBlobs::Number(1),
&mut rng,
&mut u,
&spec,
)
.unwrap()
})
.collect::<Vec<_>>();
@@ -884,15 +888,16 @@ mod tests {
.custody_context()
.sampling_columns_for_epoch(Epoch::new(0), &spec)
.to_vec();
let mut rng = XorShiftRng::from_seed([42; 16]);
let mut u = types::test_utils::test_unstructured();
let blocks = (0..2)
.map(|_| {
generate_rand_block_and_data_columns::<E>(
ForkName::Fulu,
NumBlobs::Number(1),
&mut rng,
&mut u,
&spec,
)
.unwrap()
})
.collect::<Vec<_>>();
@@ -999,15 +1004,16 @@ mod tests {
.custody_context()
.sampling_columns_for_epoch(Epoch::new(0), &spec)
.to_vec();
let mut rng = XorShiftRng::from_seed([42; 16]);
let mut u = types::test_utils::test_unstructured();
let blocks = (0..1)
.map(|_| {
generate_rand_block_and_data_columns::<E>(
ForkName::Fulu,
NumBlobs::Number(1),
&mut rng,
&mut u,
&spec,
)
.unwrap()
})
.collect::<Vec<_>>();

View File

@@ -38,7 +38,6 @@ use tracing::info;
use types::{
BlobSidecar, BlockImportSource, ColumnIndex, DataColumnSidecar, EthSpec, ForkContext, ForkName,
Hash256, MinimalEthSpec as E, SignedBeaconBlock, Slot,
test_utils::{SeedableRng, XorShiftRng},
};
const D: Duration = Duration::new(0, 0);
@@ -279,7 +278,6 @@ impl TestRig {
// deterministic seed
let rng_08 = <rand_chacha_03::ChaCha20Rng as rand_08::SeedableRng>::from_seed([0u8; 32]);
let rng = ChaCha20Rng::from_seed([0u8; 32]);
init_tracing();
@@ -291,7 +289,7 @@ impl TestRig {
sync_rx,
sync_rx_queue: vec![],
rng_08,
rng,
unstructured: types::test_utils::test_unstructured(),
network_globals: beacon_processor.network_globals.clone(),
sync_manager: SyncManager::new(
chain,
@@ -1492,8 +1490,7 @@ impl TestRig {
num_blobs: NumBlobs,
) -> (SignedBeaconBlock<E>, Vec<BlobSidecar<E>>) {
let fork_name = self.fork_name;
let rng = &mut self.rng;
generate_rand_block_and_blobs::<E>(fork_name, num_blobs, rng)
generate_rand_block_and_blobs::<E>(fork_name, num_blobs, &mut self.unstructured).unwrap()
}
pub fn send_sync_message(&mut self, sync_message: SyncMessage<E>) {
@@ -1829,16 +1826,17 @@ impl TestRig {
}
#[test]
fn stable_rng() {
let mut rng = XorShiftRng::from_seed([42; 16]);
let (block, _) = generate_rand_block_and_blobs::<E>(ForkName::Base, NumBlobs::None, &mut rng);
fn stable_arbitrary() {
let mut u = types::test_utils::test_unstructured();
let (block, _) =
generate_rand_block_and_blobs::<E>(ForkName::Base, NumBlobs::None, &mut u).unwrap();
assert_eq!(
block.canonical_root(),
Hash256::from_slice(
&hex::decode("adfd2e9e7a7976e8ccaed6eaf0257ed36a5b476732fee63ff44966602fd099ec")
&hex::decode("7348573d99ca404b502e2be790593203a1d899f9cf04f42ec9c5b4975803e3c5")
.unwrap()
),
"rng produces a consistent value"
"arbitrary produces a consistent value"
);
}

View File

@@ -11,7 +11,6 @@ use beacon_processor::WorkEvent;
use lighthouse_network::rpc::RequestType;
use lighthouse_network::service::api_types::{AppRequestId, Id};
use lighthouse_network::{NetworkGlobals, PeerId};
use rand_chacha::ChaCha20Rng;
use slot_clock::ManualSlotClock;
use std::collections::{HashMap, HashSet};
use std::fs::OpenOptions;
@@ -72,9 +71,8 @@ struct TestRig {
network_globals: Arc<NetworkGlobals<E>>,
/// Beacon chain harness
harness: BeaconChainHarness<EphemeralHarnessType<E>>,
/// `rng` for generating test blocks and blobs.
rng_08: rand_chacha_03::ChaCha20Rng,
rng: ChaCha20Rng,
unstructured: arbitrary::Unstructured<'static>,
fork_name: ForkName,
/// Blocks that will be used in the test but may not be known to `harness` yet.
network_blocks_by_root: HashMap<Hash256, RangeSyncBlock<E>>,