diff --git a/src/consensus/base.rs b/src/consensus/base.rs index 2bd896f6c3bd052a7734d23974b6b283791c07d4..f17b9e54d24b4a08cabcaab050f498578d71c3bf 100644 --- a/src/consensus/base.rs +++ b/src/consensus/base.rs @@ -213,6 +213,11 @@ pub type BlockRewardSchedule = BlockSchedule<U256>; #[cfg(test)] mod tests { + use std::{ + thread::sleep, + time::{Duration, UNIX_EPOCH}, + }; + use crate::res::chainspec::MAINNET; use super::*; @@ -334,4 +339,73 @@ mod tests { assert_eq!(schedule.for_block(BlockNumber(block)), expected_reward); } } + + #[test] + fn validate_block_header_error_future_block_issue_123() { + // ARRANGE + let consensus_engine_base = ConsensusEngineBase::new(ChainId(63), None, None); + + let now = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs(); + + sleep(Duration::from_secs(3)); + + let mut header = BlockHeader::default(); + header.timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() + + 5; + let parent = BlockHeader::default(); + + sleep(Duration::from_secs(3)); + + // ACT + let result = consensus_engine_base.validate_block_header(&header, &parent, true); + + // ASSERT + assert!(result.is_err()); + } + + #[test] + fn validate_block_header_error_future_block() { + // ARRANGE + let consensus_engine_base = ConsensusEngineBase::new(ChainId(63), None, None); + + let mut header = BlockHeader::default(); + header.timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() + + 1_000_000; + let parent = BlockHeader::default(); + + // ACT + let result = consensus_engine_base.validate_block_header(&header, &parent, true); + + // ASSERT + assert!(result.is_err()); + } + + #[test] + fn validate_block_header_should_work() { + // ARRANGE + let consensus_engine_base = ConsensusEngineBase::new(ChainId(63), None, None); + + let mut header = BlockHeader::default(); + header.timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() + - 3600; + let parent = BlockHeader::default(); + + // ACT + let result = consensus_engine_base.validate_block_header(&header, &parent, true); + + // ASSERT + assert!(result.is_ok()); + } }