public HeaderTimeChecksPoARuleTests()
 {
     this.timeChecksRule        = new HeaderTimeChecksPoARule();
     this.timeChecksRule.Parent = this.rulesEngine;
     this.timeChecksRule.Logger = this.loggerFactory.CreateLogger(this.timeChecksRule.GetType().FullName);
     this.timeChecksRule.Initialize();
 }
        public void EnsureTimestampDivisibleByTargetSpacing()
        {
            // Set up a rule with a fixed time so that we don't have non-deterministic tests due to running times et.
            DateTimeOffset time = DateTimeOffset.FromUnixTimeSeconds(new DateTimeProvider().GetUtcNow().ToUnixTimestamp() / this.consensusOptions.TargetSpacingSeconds * this.consensusOptions.TargetSpacingSeconds);

            var timeProvider = new Mock <IDateTimeProvider>();

            timeProvider.Setup(x => x.GetAdjustedTimeAsUnixTimestamp())
            .Returns(time.ToUnixTimeSeconds() + this.consensusOptions.TargetSpacingSeconds);

            this.rulesEngine = new PoAConsensusRuleEngine(this.network, this.loggerFactory, timeProvider.Object, this.ChainIndexer, new NodeDeployments(this.network, this.ChainIndexer),
                                                          this.consensusSettings, new Checkpoints(this.network, this.consensusSettings), new Mock <ICoinView>().Object, this.chainState, new InvalidBlockHashStore(timeProvider.Object),
                                                          new NodeStats(timeProvider.Object, this.loggerFactory), this.slotsManager, this.poaHeaderValidator, this.votingManager, this.federationManager, this.asyncProvider, new ConsensusRulesContainer());

            var timeRule = new HeaderTimeChecksPoARule();

            this.InitRule(timeRule);

            ChainedHeader prevHeader = this.currentHeader.Previous;

            var validationContext = new ValidationContext()
            {
                ChainedHeaderToValidate = this.currentHeader
            };
            var ruleContext = new RuleContext(validationContext, time);

            // New block has smaller timestamp.
            prevHeader.Header.Time = (uint)time.ToUnixTimeSeconds();

            this.currentHeader.Header.Time = prevHeader.Header.Time + this.consensusOptions.TargetSpacingSeconds;
            timeRule.Run(ruleContext);

            this.currentHeader.Header.Time = prevHeader.Header.Time + this.consensusOptions.TargetSpacingSeconds - 1;

            Assert.Throws <ConsensusErrorException>(() => timeRule.Run(ruleContext));

            try
            {
                timeRule.Run(ruleContext);
            }
            catch (ConsensusErrorException exception)
            {
                Assert.Equal(PoAConsensusErrors.InvalidHeaderTimestamp, exception.ConsensusError);
            }
        }
 public HeaderTimeChecksPoARuleTests()
 {
     this.timeChecksRule = new HeaderTimeChecksPoARule();
     this.InitRule(this.timeChecksRule);
 }