v0.6.2: update test infrastructure
This commit is contained in:
		
							parent
							
								
									37c67117d3
								
							
						
					
					
						commit
						beacf42aaf
					
				| @ -3,9 +3,7 @@ use fixed_len_vec::typenum::{Unsigned, U1024, U8, U8192}; | ||||
| use serde_derive::{Deserialize, Serialize}; | ||||
| use std::fmt::Debug; | ||||
| 
 | ||||
| pub trait EthSpec: | ||||
|     'static + Default + Sync + Send + Clone + Debug + PartialEq + serde::de::DeserializeOwned | ||||
| { | ||||
| pub trait EthSpec: 'static + Default + Sync + Send + Clone + Debug + PartialEq { | ||||
|     type ShardCount: Unsigned + Clone + Sync + Send + Debug + PartialEq; | ||||
|     type SlotsPerHistoricalRoot: Unsigned + Clone + Sync + Send + Debug + PartialEq; | ||||
|     type LatestRandaoMixesLength: Unsigned + Clone + Sync + Send + Debug + PartialEq; | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| Subproject commit 746712e8a5c5b97d1bbc7724e5ccd09920c50a30 | ||||
| Subproject commit cfc6e3c91d781f0dfe493ceb548391f5e88e54c7 | ||||
| @ -1,17 +1,14 @@ | ||||
| use super::*; | ||||
| use crate::case_result::compare_beacon_state_results_without_caches; | ||||
| use serde_derive::Deserialize; | ||||
| use state_processing::per_block_processing::per_block_processing; | ||||
| use state_processing::per_epoch_processing::registry_updates::process_registry_updates; | ||||
| use state_processing::per_slot_processing; | ||||
| use types::{BeaconBlock, BeaconState, EthSpec}; | ||||
| use types::{BeaconState, EthSpec}; | ||||
| 
 | ||||
| #[derive(Debug, Clone, Deserialize)] | ||||
| pub struct EpochProcessingRegistryUpdates<E: EthSpec> { | ||||
|     pub description: String, | ||||
|     #[serde(bound = "E: EthSpec")] | ||||
|     pub pre: BeaconState<E>, | ||||
|     pub trigger_block: BeaconBlock, | ||||
|     #[serde(bound = "E: EthSpec")] | ||||
|     pub post: Option<BeaconState<E>>, | ||||
| } | ||||
| @ -35,13 +32,6 @@ impl<E: EthSpec> Case for EpochProcessingRegistryUpdates<E> { | ||||
|         // Processing requires the epoch cache.
 | ||||
|         state.build_all_caches(spec).unwrap(); | ||||
| 
 | ||||
|         // Apply the trigger block.
 | ||||
|         // FIXME: trigger block gets applied to state after per-epoch processing (test bug)
 | ||||
|         while state.slot < self.trigger_block.slot { | ||||
|             per_slot_processing(&mut state, spec).expect("slot processing failed"); | ||||
|         } | ||||
|         per_block_processing(&mut state, &self.trigger_block, spec).expect("process block"); | ||||
| 
 | ||||
|         let mut result = process_registry_updates(&mut state, spec).map(|_| state); | ||||
| 
 | ||||
|         compare_beacon_state_results_without_caches(&mut result, &mut expected) | ||||
|  | ||||
| @ -14,76 +14,82 @@ use types::{ | ||||
|     ProposerSlashing, Transfer, Validator, VoluntaryExit, | ||||
| }; | ||||
| 
 | ||||
| // Enum variant names are used by Serde when deserializing the test YAML
 | ||||
| #[derive(Debug, Clone, Deserialize)] | ||||
| pub struct SszStatic<E> { | ||||
|     pub type_name: String, | ||||
| pub enum SszStatic<E> | ||||
| where | ||||
|     E: EthSpec, | ||||
| { | ||||
|     Fork(SszStaticInner<Fork, E>), | ||||
|     Crosslink(SszStaticInner<Crosslink, E>), | ||||
|     Eth1Data(SszStaticInner<Eth1Data, E>), | ||||
|     AttestationData(SszStaticInner<AttestationData, E>), | ||||
|     AttestationDataAndCustodyBit(SszStaticInner<AttestationDataAndCustodyBit, E>), | ||||
|     IndexedAttestation(SszStaticInner<IndexedAttestation, E>), | ||||
|     DepositData(SszStaticInner<DepositData, E>), | ||||
|     BeaconBlockHeader(SszStaticInner<BeaconBlockHeader, E>), | ||||
|     Validator(SszStaticInner<Validator, E>), | ||||
|     PendingAttestation(SszStaticInner<PendingAttestation, E>), | ||||
|     HistoricalBatch(SszStaticInner<HistoricalBatch<E>, E>), | ||||
|     ProposerSlashing(SszStaticInner<ProposerSlashing, E>), | ||||
|     AttesterSlashing(SszStaticInner<AttesterSlashing, E>), | ||||
|     Attestation(SszStaticInner<Attestation, E>), | ||||
|     Deposit(SszStaticInner<Deposit, E>), | ||||
|     VoluntaryExit(SszStaticInner<VoluntaryExit, E>), | ||||
|     Transfer(SszStaticInner<Transfer, E>), | ||||
|     BeaconBlockBody(SszStaticInner<BeaconBlockBody, E>), | ||||
|     BeaconBlock(SszStaticInner<BeaconBlock, E>), | ||||
|     BeaconState(SszStaticInner<BeaconState<E>, E>), | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone, Deserialize)] | ||||
| pub struct SszStaticInner<T, E> | ||||
| where | ||||
|     E: EthSpec, | ||||
| { | ||||
|     pub value: T, | ||||
|     pub serialized: String, | ||||
|     pub root: String, | ||||
|     #[serde(skip)] | ||||
|     pub raw_yaml: String, | ||||
|     #[serde(skip, default)] | ||||
|     _phantom: PhantomData<E>, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone, Deserialize)] | ||||
| pub struct Value<T> { | ||||
|     value: T, | ||||
| } | ||||
| 
 | ||||
| impl<E> YamlDecode for SszStatic<E> { | ||||
| impl<E: EthSpec + serde::de::DeserializeOwned> YamlDecode for SszStatic<E> { | ||||
|     fn yaml_decode(yaml: &String) -> Result<Self, Error> { | ||||
|         let mut ssz_static: SszStatic<E> = serde_yaml::from_str(&yaml.as_str()).unwrap(); | ||||
| 
 | ||||
|         ssz_static.raw_yaml = yaml.clone(); | ||||
| 
 | ||||
|         Ok(ssz_static) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<E> SszStatic<E> { | ||||
|     fn value<T: serde::de::DeserializeOwned>(&self) -> Result<T, Error> { | ||||
|         let wrapper: Value<T> = serde_yaml::from_str(&self.raw_yaml.as_str()).map_err(|e| { | ||||
|             Error::FailedToParseTest(format!("Unable to parse {} YAML: {:?}", self.type_name, e)) | ||||
|         })?; | ||||
| 
 | ||||
|         Ok(wrapper.value) | ||||
|         serde_yaml::from_str(yaml).map_err(|e| Error::FailedToParseTest(format!("{:?}", e))) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<E: EthSpec> Case for SszStatic<E> { | ||||
|     fn result(&self, _case_index: usize) -> Result<(), Error> { | ||||
|         match self.type_name.as_ref() { | ||||
|             "Fork" => ssz_static_test::<Fork, E>(self), | ||||
|             "Crosslink" => ssz_static_test::<Crosslink, E>(self), | ||||
|             "Eth1Data" => ssz_static_test::<Eth1Data, E>(self), | ||||
|             "AttestationData" => ssz_static_test::<AttestationData, E>(self), | ||||
|             "AttestationDataAndCustodyBit" => { | ||||
|                 ssz_static_test::<AttestationDataAndCustodyBit, E>(self) | ||||
|             } | ||||
|             "IndexedAttestation" => ssz_static_test::<IndexedAttestation, E>(self), | ||||
|             "DepositData" => ssz_static_test::<DepositData, E>(self), | ||||
|             "BeaconBlockHeader" => ssz_static_test::<BeaconBlockHeader, E>(self), | ||||
|             "Validator" => ssz_static_test::<Validator, E>(self), | ||||
|             "PendingAttestation" => ssz_static_test::<PendingAttestation, E>(self), | ||||
|             "HistoricalBatch" => ssz_static_test::<HistoricalBatch<E>, E>(self), | ||||
|             "ProposerSlashing" => ssz_static_test::<ProposerSlashing, E>(self), | ||||
|             "AttesterSlashing" => ssz_static_test::<AttesterSlashing, E>(self), | ||||
|             "Attestation" => ssz_static_test::<Attestation, E>(self), | ||||
|             "Deposit" => ssz_static_test::<Deposit, E>(self), | ||||
|             "VoluntaryExit" => ssz_static_test::<VoluntaryExit, E>(self), | ||||
|             "Transfer" => ssz_static_test::<Transfer, E>(self), | ||||
|             "BeaconBlockBody" => ssz_static_test::<BeaconBlockBody, E>(self), | ||||
|             "BeaconBlock" => ssz_static_test::<BeaconBlock, E>(self), | ||||
|             "BeaconState" => ssz_static_test::<BeaconState<E>, E>(self), | ||||
|             _ => Err(Error::FailedToParseTest(format!( | ||||
|                 "Unknown type: {}", | ||||
|                 self.type_name | ||||
|             ))), | ||||
|         use self::SszStatic::*; | ||||
| 
 | ||||
|         match *self { | ||||
|             Fork(ref val) => ssz_static_test(val), | ||||
|             Crosslink(ref val) => ssz_static_test(val), | ||||
|             Eth1Data(ref val) => ssz_static_test(val), | ||||
|             AttestationData(ref val) => ssz_static_test(val), | ||||
|             AttestationDataAndCustodyBit(ref val) => ssz_static_test(val), | ||||
|             IndexedAttestation(ref val) => ssz_static_test(val), | ||||
|             DepositData(ref val) => ssz_static_test(val), | ||||
|             BeaconBlockHeader(ref val) => ssz_static_test(val), | ||||
|             Validator(ref val) => ssz_static_test(val), | ||||
|             PendingAttestation(ref val) => ssz_static_test(val), | ||||
|             HistoricalBatch(ref val) => ssz_static_test(val), | ||||
|             ProposerSlashing(ref val) => ssz_static_test(val), | ||||
|             AttesterSlashing(ref val) => ssz_static_test(val), | ||||
|             Attestation(ref val) => ssz_static_test(val), | ||||
|             Deposit(ref val) => ssz_static_test(val), | ||||
|             VoluntaryExit(ref val) => ssz_static_test(val), | ||||
|             Transfer(ref val) => ssz_static_test(val), | ||||
|             BeaconBlockBody(ref val) => ssz_static_test(val), | ||||
|             BeaconBlock(ref val) => ssz_static_test(val), | ||||
|             BeaconState(ref val) => ssz_static_test(val), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn ssz_static_test<T, E: EthSpec>(tc: &SszStatic<E>) -> Result<(), Error> | ||||
| fn ssz_static_test<T, E: EthSpec>(tc: &SszStaticInner<T, E>) -> Result<(), Error> | ||||
| where | ||||
|     T: Clone | ||||
|         + Decode | ||||
| @ -98,7 +104,7 @@ where | ||||
|     // Verify we can decode SSZ in the same way we can decode YAML.
 | ||||
|     let ssz = hex::decode(&tc.serialized[2..]) | ||||
|         .map_err(|e| Error::FailedToParseTest(format!("{:?}", e)))?; | ||||
|     let expected = tc.value::<T>()?; | ||||
|     let expected = tc.value.clone(); | ||||
|     let decode_result = T::from_ssz_bytes(&ssz); | ||||
|     compare_result(&decode_result, &Some(expected))?; | ||||
| 
 | ||||
|  | ||||
| @ -86,6 +86,9 @@ impl Doc { | ||||
|             ("epoch_processing", "crosslinks", "minimal") => { | ||||
|                 run_test::<EpochProcessingCrosslinks<MinimalEthSpec>>(self) | ||||
|             } | ||||
|             ("epoch_processing", "crosslinks", "mainnet") => { | ||||
|                 run_test::<EpochProcessingCrosslinks<MainnetEthSpec>>(self) | ||||
|             } | ||||
|             ("epoch_processing", "registry_updates", "minimal") => { | ||||
|                 run_test::<EpochProcessingRegistryUpdates<MinimalEthSpec>>(self) | ||||
|             } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user