#![cfg(feature = "ef_tests")] use ef_tests::*; use types::*; // Check that the hand-computed multiplications on EthSpec are correctly computed. // This test lives here because one is most likely to muck these up during a spec update. fn check_typenum_values() { assert_eq!( E::MaxPendingAttestations::to_u64(), E::MaxAttestations::to_u64() * E::SlotsPerEpoch::to_u64() ); assert_eq!( E::SlotsPerEth1VotingPeriod::to_u64(), E::EpochsPerEth1VotingPeriod::to_u64() * E::SlotsPerEpoch::to_u64() ); } #[test] fn derived_typenum_values() { check_typenum_values::(); check_typenum_values::(); } #[test] fn shuffling() { ShufflingHandler::::default().run(); ShufflingHandler::::default().run(); } #[test] fn operations_deposit() { OperationsHandler::::default().run(); OperationsHandler::::default().run(); } #[test] fn operations_exit() { OperationsHandler::::default().run(); OperationsHandler::::default().run(); } #[test] fn operations_proposer_slashing() { OperationsHandler::::default().run(); OperationsHandler::::default().run(); } #[test] fn operations_attester_slashing() { OperationsHandler::>::default().run(); OperationsHandler::>::default().run(); } #[test] fn operations_attestation() { OperationsHandler::>::default().run(); OperationsHandler::>::default().run(); } #[test] fn operations_block_header() { OperationsHandler::>::default().run(); OperationsHandler::>::default().run(); } #[test] fn operations_sync_aggregate() { OperationsHandler::>::default().run(); OperationsHandler::>::default().run(); } #[test] fn operations_execution_payload_full() { OperationsHandler::>::default().run(); OperationsHandler::>::default().run(); } #[test] fn operations_execution_payload_blinded() { OperationsHandler::>::default().run(); OperationsHandler::>::default().run(); } #[cfg(feature = "withdrawals-processing")] #[test] fn operations_withdrawals() { OperationsHandler::>::default().run(); OperationsHandler::>::default().run(); } #[cfg(feature = "withdrawals-processing")] #[test] fn operations_bls_to_execution_change() { OperationsHandler::::default().run(); OperationsHandler::::default().run(); } #[test] fn sanity_blocks() { SanityBlocksHandler::::default().run(); SanityBlocksHandler::::default().run(); } #[test] fn sanity_slots() { SanitySlotsHandler::::default().run(); SanitySlotsHandler::::default().run(); } #[test] fn random() { RandomHandler::::default().run(); RandomHandler::::default().run(); } #[test] #[cfg(not(feature = "fake_crypto"))] fn bls_aggregate() { BlsAggregateSigsHandler::default().run(); } #[test] #[cfg(not(feature = "fake_crypto"))] fn bls_sign() { BlsSignMsgHandler::default().run(); } #[test] #[cfg(not(feature = "fake_crypto"))] fn bls_verify() { BlsVerifyMsgHandler::default().run(); } #[test] #[cfg(not(feature = "fake_crypto"))] fn bls_batch_verify() { BlsBatchVerifyHandler::default().run(); } #[test] #[cfg(not(feature = "fake_crypto"))] fn bls_aggregate_verify() { BlsAggregateVerifyHandler::default().run(); } #[test] #[cfg(not(feature = "fake_crypto"))] fn bls_fast_aggregate_verify() { BlsFastAggregateVerifyHandler::default().run(); } #[test] #[cfg(not(feature = "fake_crypto"))] fn bls_eth_aggregate_pubkeys() { BlsEthAggregatePubkeysHandler::default().run(); } #[test] #[cfg(not(feature = "fake_crypto"))] fn bls_eth_fast_aggregate_verify() { BlsEthFastAggregateVerifyHandler::default().run(); } /// As for `ssz_static_test_no_run` (below), but also executes the function as a test. #[cfg(feature = "fake_crypto")] macro_rules! ssz_static_test { ($($args:tt)*) => { ssz_static_test_no_run!(#[test] $($args)*); }; } /// Generate a function to run the SSZ static tests for a type. /// /// Quite complex in order to support an optional #[test] attrib, generics, and the two EthSpecs. #[cfg(feature = "fake_crypto")] macro_rules! ssz_static_test_no_run { // Top-level ($(#[$test:meta])? $test_name:ident, $typ:ident$(<$generics:tt>)?) => { ssz_static_test_no_run!($(#[$test])? $test_name, SszStaticHandler, $typ$(<$generics>)?); }; // Generic ($(#[$test:meta])? $test_name:ident, $handler:ident, $typ:ident<_>) => { ssz_static_test_no_run!( $(#[$test])? $test_name, $handler, { ($typ, MinimalEthSpec), ($typ, MainnetEthSpec) } ); }; // Non-generic ($(#[$test:meta])? $test_name:ident, $handler:ident, $typ:ident) => { ssz_static_test_no_run!( $(#[$test])? $test_name, $handler, { ($typ, MinimalEthSpec), ($typ, MainnetEthSpec) } ); }; // Base case ($(#[$test:meta])? $test_name:ident, $handler:ident, { $(($($typ:ty),+)),+ }) => { $(#[$test])? fn $test_name() { $( $handler::<$($typ),+>::default().run(); )+ } }; } #[cfg(feature = "fake_crypto")] mod ssz_static { use ef_tests::{Handler, SszStaticHandler, SszStaticTHCHandler, SszStaticWithSpecHandler}; use types::*; ssz_static_test!(aggregate_and_proof, AggregateAndProof<_>); ssz_static_test!(attestation, Attestation<_>); ssz_static_test!(attestation_data, AttestationData); ssz_static_test!(attester_slashing, AttesterSlashing<_>); ssz_static_test!(beacon_block, SszStaticWithSpecHandler, BeaconBlock<_>); ssz_static_test!(beacon_block_header, BeaconBlockHeader); ssz_static_test!(beacon_state, SszStaticTHCHandler, BeaconState<_>); ssz_static_test!(checkpoint, Checkpoint); ssz_static_test!(deposit, Deposit); ssz_static_test!(deposit_data, DepositData); ssz_static_test!(deposit_message, DepositMessage); // NOTE: Eth1Block intentionally omitted, see: https://github.com/sigp/lighthouse/issues/1835 ssz_static_test!(eth1_data, Eth1Data); ssz_static_test!(fork, Fork); ssz_static_test!(fork_data, ForkData); ssz_static_test!(historical_batch, HistoricalBatch<_>); ssz_static_test!(indexed_attestation, IndexedAttestation<_>); // NOTE: LightClient* intentionally omitted ssz_static_test!(pending_attestation, PendingAttestation<_>); ssz_static_test!(proposer_slashing, ProposerSlashing); ssz_static_test!(signed_aggregate_and_proof, SignedAggregateAndProof<_>); ssz_static_test!( signed_beacon_block, SszStaticWithSpecHandler, SignedBeaconBlock<_> ); ssz_static_test!(signed_beacon_block_header, SignedBeaconBlockHeader); ssz_static_test!(signed_voluntary_exit, SignedVoluntaryExit); ssz_static_test!(signing_data, SigningData); ssz_static_test!(validator, Validator); ssz_static_test!(voluntary_exit, VoluntaryExit); // BeaconBlockBody has no internal indicator of which fork it is for, so we test it separately. #[test] fn beacon_block_body() { SszStaticHandler::, MinimalEthSpec>::base_only().run(); SszStaticHandler::, MainnetEthSpec>::base_only().run(); SszStaticHandler::, MinimalEthSpec>::altair_only() .run(); SszStaticHandler::, MainnetEthSpec>::altair_only() .run(); SszStaticHandler::, MinimalEthSpec>::merge_only() .run(); SszStaticHandler::, MainnetEthSpec>::merge_only() .run(); SszStaticHandler::, MinimalEthSpec>::capella_only() .run(); SszStaticHandler::, MainnetEthSpec>::capella_only() .run(); } // Altair and later #[test] fn contribution_and_proof() { SszStaticHandler::, MinimalEthSpec>::altair_and_later( ) .run(); SszStaticHandler::, MainnetEthSpec>::altair_and_later( ) .run(); } #[test] fn signed_contribution_and_proof() { SszStaticHandler::, MinimalEthSpec>::altair_and_later().run(); SszStaticHandler::, MainnetEthSpec>::altair_and_later().run(); } #[test] fn sync_aggregate() { SszStaticHandler::, MinimalEthSpec>::altair_and_later().run(); SszStaticHandler::, MainnetEthSpec>::altair_and_later().run(); } #[test] fn sync_committee() { SszStaticHandler::, MinimalEthSpec>::altair_and_later().run(); SszStaticHandler::, MainnetEthSpec>::altair_and_later().run(); } #[test] fn sync_committee_contribution() { SszStaticHandler::, MinimalEthSpec>::altair_and_later().run(); SszStaticHandler::, MainnetEthSpec>::altair_and_later().run(); } #[test] fn sync_committee_message() { SszStaticHandler::::altair_and_later().run(); SszStaticHandler::::altair_and_later().run(); } #[test] fn sync_aggregator_selection_data() { SszStaticHandler::::altair_and_later().run(); SszStaticHandler::::altair_and_later().run(); } // Merge and later #[test] fn execution_payload() { SszStaticHandler::, MinimalEthSpec>::merge_only() .run(); SszStaticHandler::, MainnetEthSpec>::merge_only() .run(); SszStaticHandler::, MinimalEthSpec>::capella_only() .run(); SszStaticHandler::, MainnetEthSpec>::capella_only() .run(); } #[test] fn execution_payload_header() { SszStaticHandler::, MinimalEthSpec>::merge_only() .run(); SszStaticHandler::, MainnetEthSpec>::merge_only() .run(); SszStaticHandler::, MinimalEthSpec> ::capella_only().run(); SszStaticHandler::, MainnetEthSpec> ::capella_only().run(); } #[test] fn withdrawal() { SszStaticHandler::::capella_only().run(); SszStaticHandler::::capella_only().run(); } #[test] fn bls_to_execution_change() { SszStaticHandler::::capella_only().run(); SszStaticHandler::::capella_only().run(); } #[test] fn signed_bls_to_execution_change() { SszStaticHandler::::capella_only().run(); SszStaticHandler::::capella_only().run(); } } #[test] fn ssz_generic() { SszGenericHandler::::default().run(); SszGenericHandler::::default().run(); SszGenericHandler::::default().run(); SszGenericHandler::::default().run(); SszGenericHandler::::default().run(); SszGenericHandler::::default().run(); } #[test] fn epoch_processing_justification_and_finalization() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_rewards_and_penalties() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_registry_updates() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_slashings() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_eth1_data_reset() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_effective_balance_updates() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_slashings_reset() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_randao_mixes_reset() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_historical_roots_update() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_participation_record_updates() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_sync_committee_updates() { // There are presently no mainnet tests, see: // https://github.com/ethereum/consensus-spec-tests/issues/29 EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_inactivity_updates() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn epoch_processing_participation_flag_updates() { EpochProcessingHandler::::default().run(); EpochProcessingHandler::::default().run(); } #[test] fn fork_upgrade() { ForkHandler::::default().run(); ForkHandler::::default().run(); } #[test] fn transition() { TransitionHandler::::default().run(); TransitionHandler::::default().run(); } #[test] fn finality() { FinalityHandler::::default().run(); FinalityHandler::::default().run(); } #[test] fn fork_choice_get_head() { ForkChoiceHandler::::new("get_head").run(); ForkChoiceHandler::::new("get_head").run(); } #[test] fn fork_choice_on_block() { ForkChoiceHandler::::new("on_block").run(); ForkChoiceHandler::::new("on_block").run(); } #[test] fn fork_choice_on_merge_block() { ForkChoiceHandler::::new("on_merge_block").run(); ForkChoiceHandler::::new("on_merge_block").run(); } #[test] fn fork_choice_ex_ante() { ForkChoiceHandler::::new("ex_ante").run(); ForkChoiceHandler::::new("ex_ante").run(); } #[test] fn optimistic_sync() { OptimisticSyncHandler::::default().run(); OptimisticSyncHandler::::default().run(); } #[test] fn genesis_initialization() { GenesisInitializationHandler::::default().run(); } #[test] fn genesis_validity() { GenesisValidityHandler::::default().run(); // Note: there are no genesis validity tests for mainnet } #[test] fn merkle_proof_validity() { MerkleProofValidityHandler::::default().run(); } #[test] fn rewards() { for handler in &["basic", "leak", "random"] { RewardsHandler::::new(handler).run(); RewardsHandler::::new(handler).run(); } }