public async Task ConsensusTipChanged_CachedHeadersConsumedFullyAsync()
        {
            var cache = new List <BlockHeader>()
            {
                this.headers[11].Header, this.headers[12].Header
            };

            ConsensusManagerBehavior behavior = this.helper.CreateAndAttachBehavior(this.headers[5], cache, this.headers[10], NetworkPeerState.HandShaked,
                                                                                    (presentedHeaders, triggerDownload) =>
            {
                Assert.Equal(this.headers[12].Header, presentedHeaders.Last());

                return(new ConnectNewHeadersResult()
                {
                    Consumed = this.headers[12]
                });
            });

            ConnectNewHeadersResult result = await behavior.ConsensusTipChangedAsync();

            Assert.Equal(this.headers[12], behavior.BestReceivedTip);
            Assert.Equal(this.headers[12], behavior.BestSentHeader);
            Assert.Empty(this.helper.GetCachedHeaders(behavior));
            Assert.Equal(1, this.helper.GetHeadersPayloadSentTimes);
            Assert.Equal(result.Consumed, this.headers[12]);
        }
        public async Task ConsensusTipChanged_ConsensusTipAdvancedBuNoCachedHeadersAsync()
        {
            ConsensusManagerBehavior behavior = this.helper.CreateAndAttachBehavior(this.headers[5], null, this.headers[10]);

            ConnectNewHeadersResult result = await behavior.ConsensusTipChangedAsync();

            Assert.Null(result);
            Assert.Equal(0, this.helper.GetHeadersPayloadSentTimes);
            Assert.Equal(0, this.helper.HeadersPresentedCalledTimes);
        }
        public async Task ConsensusTipChanged_PeerNotAttachedAsync()
        {
            var cache = new List <BlockHeader>()
            {
                this.headers[11].Header, this.headers[12].Header
            };

            ConsensusManagerBehavior behavior = this.helper.CreateAndAttachBehavior(this.headers[5], cache, this.headers[10]);

            // That will set peer to null.
            behavior.Dispose();

            ConnectNewHeadersResult result = await behavior.ConsensusTipChangedAsync();

            Assert.Equal(0, this.helper.GetHeadersPayloadSentTimes);
            Assert.Equal(0, this.helper.HeadersPresentedCalledTimes);
            Assert.Null(result);
        }
        public async Task ConsensusTipChanged_NotAbleToConnectCachedHeadersAsync()
        {
            var cache = new List <BlockHeader>()
            {
                this.headers[14].Header, this.headers[15].Header
            };

            ConsensusManagerBehavior behavior = this.helper.CreateAndAttachBehavior(this.headers[5], cache, this.headers[10], NetworkPeerState.HandShaked,
                                                                                    (presentedHeaders, triggerDownload) =>
            {
                Assert.Equal(this.headers[14].Header, presentedHeaders.First());

                throw new ConnectHeaderException();
            });

            ConnectNewHeadersResult result = await behavior.ConsensusTipChangedAsync();

            Assert.Equal(this.headers[10], behavior.BestReceivedTip);
            Assert.Equal(this.headers[10], behavior.BestSentHeader);
            Assert.Equal(1, this.helper.GetHeadersPayloadSentTimes);
            Assert.Null(result);
            Assert.Empty(this.helper.GetCachedHeaders(behavior));
        }
        public async Task ConsensusTipChanged_CachedHeadersConsumedPartiallyAsync()
        {
            var cache = new List <BlockHeader>();

            for (int i = 11; i <= 50; i++)
            {
                cache.Add(this.headers[i].Header);
            }

            ConsensusManagerBehavior behavior = this.helper.CreateAndAttachBehavior(this.headers[5], cache, this.headers[10], NetworkPeerState.HandShaked,
                                                                                    (presentedHeaders, triggerDownload) =>
            {
                Assert.Equal(this.headers[50].Header, presentedHeaders.Last());

                return(new ConnectNewHeadersResult()
                {
                    Consumed = this.headers[40]
                });
            });

            ConnectNewHeadersResult result = await behavior.ConsensusTipChangedAsync();

            Assert.Equal(this.headers[40], behavior.BestReceivedTip);
            Assert.Equal(this.headers[40], behavior.BestSentHeader);
            Assert.Equal(0, this.helper.GetHeadersPayloadSentTimes);
            Assert.Equal(result.Consumed, this.headers[40]);

            List <BlockHeader> cacheAfterTipChanged = this.helper.GetCachedHeaders(behavior);

            Assert.Equal(10, cacheAfterTipChanged.Count);

            for (int i = 41; i <= 50; i++)
            {
                Assert.Contains(this.headers[i].Header, cacheAfterTipChanged);
            }
        }