use crate::traits::{BeaconNode, BeaconNodeError, PublishOutcome}; use std::sync::RwLock; use types::{AttestationData, FreeAttestation, Slot}; type ProduceResult = Result, BeaconNodeError>; type PublishResult = Result; /// A test-only struct used to simulate a Beacon Node. #[derive(Default)] pub struct SimulatedBeaconNode { pub produce_input: RwLock>, pub produce_result: RwLock>, pub publish_input: RwLock>, pub publish_result: RwLock>, } impl SimulatedBeaconNode { pub fn set_next_produce_result(&self, result: ProduceResult) { *self.produce_result.write().unwrap() = Some(result); } pub fn set_next_publish_result(&self, result: PublishResult) { *self.publish_result.write().unwrap() = Some(result); } } impl BeaconNode for SimulatedBeaconNode { fn produce_attestation_data(&self, slot: Slot, shard: u64) -> ProduceResult { *self.produce_input.write().unwrap() = Some((slot, shard)); match *self.produce_result.read().unwrap() { Some(ref r) => r.clone(), None => panic!("TestBeaconNode: produce_result == None"), } } fn publish_attestation(&self, free_attestation: FreeAttestation) -> PublishResult { *self.publish_input.write().unwrap() = Some(free_attestation.clone()); match *self.publish_result.read().unwrap() { Some(ref r) => r.clone(), None => panic!("TestBeaconNode: publish_result == None"), } } }