public async Task TransactionBroadcastStream_Test()
        {
            var received = new List <TransactionsReceivedEvent>();

            _eventBus.Subscribe <TransactionsReceivedEvent>(a =>
            {
                received.Add(a);
                return(Task.CompletedTask);
            });

            var peer     = _peerPool.GetPeers(true).First();
            var pubkey   = peer.Info.Pubkey;
            var metadata = new Metadata {
                { GrpcConstants.PubkeyMetadataKey, pubkey }
            };

            var transaction = await _osTestHelper.GenerateTransferTransaction();

            var requestStream = new TestAsyncStreamReader <Transaction>(new List <Transaction> {
                transaction
            });
            await _serverService.TransactionBroadcastStream(requestStream, BuildServerCallContext(metadata));

            peer.TryAddKnownTransaction(transaction.GetHash()).ShouldBeFalse();
            received.Count.ShouldBe(1);
        }
        public async Task LibAnnouncementBroadcastStream_Stream_Test()
        {
            long libHeight        = 0;
            var  libHash          = Hash.Empty;
            var  libAnnouncements = new List <LibAnnouncement>();

            for (var i = 0; i <= 3; i++)
            {
                libHeight = 100 + i;
                libHash   = HashHelper.ComputeFrom(libHeight);

                libAnnouncements.Add(new LibAnnouncement
                {
                    LibHeight = libHeight,
                    LibHash   = libHash
                });
            }
            var peer = _peerPool.GetPeers(true).First();

            peer.SyncState.ShouldNotBe(SyncState.Finished);
            var pubkey   = peer.Info.Pubkey;
            var metadata = new Metadata {
                { GrpcConstants.PubkeyMetadataKey, pubkey }
            };

            var requestStream = new TestAsyncStreamReader <LibAnnouncement>(libAnnouncements);
            var context       = BuildServerCallContext(metadata);
            await _serverService.LibAnnouncementBroadcastStream(requestStream, context);

            peer.SyncState.ShouldBe(SyncState.Finished);
            peer.LastKnownLibHash.ShouldBe(libHash);
            peer.LastKnownLibHeight.ShouldBe(libHeight);
        }
        public async Task BlockBroadcastStream_Test()
        {
            var received = new List <BlockReceivedEvent>();

            _eventBus.Subscribe <BlockReceivedEvent>(a =>
            {
                received.Add(a);
                return(Task.CompletedTask);
            });

            var peer = _peerPool.GetPeers(true).First();

            peer.SyncState.ShouldNotBe(SyncState.Finished);
            var pubkey   = peer.Info.Pubkey;
            var metadata = new Metadata {
                { GrpcConstants.PubkeyMetadataKey, pubkey }
            };

            var block = _osTestHelper.GenerateBlockWithTransactions(HashHelper.ComputeFrom("block1"), 1,
                                                                    (await _osTestHelper.GenerateTransferTransactions(1)).ToList());

            var requestStream = new TestAsyncStreamReader <BlockWithTransactions>(new List <BlockWithTransactions> {
                block
            });
            await _serverService.BlockBroadcastStream(requestStream, BuildServerCallContext(metadata));

            peer.TryAddKnownBlock(block.GetHash()).ShouldBeFalse();
            received.Count.ShouldBe(1);
            peer.SyncState.ShouldBe(SyncState.Finished);
        }
        public async Task TransactionBroadcastStream_TransactionIsTooHigh_Test()
        {
            var received = new List <TransactionsReceivedEvent>();

            _eventBus.Subscribe <TransactionsReceivedEvent>(a =>
            {
                received.Add(a);
                return(Task.CompletedTask);
            });

            var peer     = _peerPool.GetPeers(true).First();
            var pubkey   = peer.Info.Pubkey;
            var metadata = new Metadata {
                { GrpcConstants.PubkeyMetadataKey, pubkey }
            };

            var chain = await _blockchainService.GetChainAsync();

            var transaction = await _osTestHelper.GenerateTransferTransaction();

            transaction.RefBlockNumber = chain.LongestChainHeight + NetworkConstants.DefaultInitialSyncOffset + 1;

            var requestStream = new TestAsyncStreamReader <Transaction>(new List <Transaction> {
                transaction
            });
            await _serverService.TransactionBroadcastStream(requestStream, BuildServerCallContext(metadata));

            peer.TryAddKnownBlock(transaction.GetHash()).ShouldBeTrue();
            received.Count.ShouldBe(0);
        }
        public async Task TransactionBroadcastStream_UnknownPeer_Test()
        {
            var metadata = new Metadata {
                { GrpcConstants.PubkeyMetadataKey, "UnknownPeerPubkey" }
            };

            var transaction = await _osTestHelper.GenerateTransferTransaction();

            var requestStream = new TestAsyncStreamReader <Transaction>(new List <Transaction> {
                transaction
            });
            await _serverService.TransactionBroadcastStream(requestStream, BuildServerCallContext(metadata))
            .ShouldThrowAsync <RpcException>();
        }
        public async Task LibAnnouncementBroadcastStream_Test()
        {
            var libHeight = 100;
            var libHash   = HashHelper.ComputeFrom("LibHash");
            var peer      = _peerPool.GetPeers(true).First();

            peer.SyncState.ShouldNotBe(SyncState.Finished);
            var pubkey   = peer.Info.Pubkey;
            var metadata = new Metadata {
                { GrpcConstants.PubkeyMetadataKey, pubkey }
            };
            var context = BuildServerCallContext(metadata);

            var lastLibHeight = peer.LastKnownLibHeight;
            var lastLibHash   = peer.LastKnownLibHash;
            var requestStream = new TestAsyncStreamReader <LibAnnouncement>(new List <LibAnnouncement>
            {
                null
            });
            await _serverService.LibAnnouncementBroadcastStream(requestStream, context);

            peer.SyncState.ShouldNotBe(SyncState.Finished);
            peer.LastKnownLibHash.ShouldBe(lastLibHash);
            peer.LastKnownLibHeight.ShouldBe(lastLibHeight);

            requestStream = new TestAsyncStreamReader <LibAnnouncement>(new List <LibAnnouncement>
            {
                new LibAnnouncement()
            });
            await _serverService.LibAnnouncementBroadcastStream(requestStream, context);

            peer.SyncState.ShouldNotBe(SyncState.Finished);
            peer.LastKnownLibHash.ShouldBe(lastLibHash);
            peer.LastKnownLibHeight.ShouldBe(lastLibHeight);

            requestStream = new TestAsyncStreamReader <LibAnnouncement>(new List <LibAnnouncement>
            {
                new LibAnnouncement
                {
                    LibHeight = libHeight,
                    LibHash   = libHash
                }
            });
            await _serverService.LibAnnouncementBroadcastStream(requestStream, context);

            peer.SyncState.ShouldBe(SyncState.Finished);
            peer.LastKnownLibHash.ShouldBe(libHash);
            peer.LastKnownLibHeight.ShouldBe(libHeight);
        }
        public async Task BlockBroadcastStream_UnknownPeer_Test()
        {
            var metadata = new Metadata {
                { GrpcConstants.PubkeyMetadataKey, "UnknownPeerPubkey" }
            };

            var block = _osTestHelper.GenerateBlockWithTransactions(HashHelper.ComputeFrom("block1"), 1,
                                                                    (await _osTestHelper.GenerateTransferTransactions(1)).ToList());

            var requestStream = new TestAsyncStreamReader <BlockWithTransactions>(new List <BlockWithTransactions> {
                block
            });
            await _serverService.BlockBroadcastStream(requestStream, BuildServerCallContext(metadata))
            .ShouldThrowAsync <RpcException>();
        }
        public async Task LibAnnouncementBroadcastStream_UnknownPeer_Test()
        {
            var metadata = new Metadata {
                { GrpcConstants.PubkeyMetadataKey, "UnknownPeerPubkey" }
            };

            var transaction = await _osTestHelper.GenerateTransferTransaction();

            var requestStream = new TestAsyncStreamReader <LibAnnouncement>(new List <LibAnnouncement>
            {
                new LibAnnouncement
                {
                    LibHeight = 100,
                    LibHash   = HashHelper.ComputeFrom("LibHash")
                }
            });
            await _serverService.LibAnnouncementBroadcastStream(requestStream, BuildServerCallContext(metadata))
            .ShouldThrowAsync <RpcException>();
        }
        public async Task AnnouncementBroadcastStream_RepeatedBlock_Test()
        {
            var peer     = _peerPool.GetPeers(true).First();
            var pubkey   = peer.Info.Pubkey;
            var metadata = new Metadata {
                { GrpcConstants.PubkeyMetadataKey, pubkey }
            };

            var block = _osTestHelper.GenerateBlockWithTransactions(HashHelper.ComputeFrom("block1"), 1,
                                                                    (await _osTestHelper.GenerateTransferTransactions(1)).ToList());

            var requestStream = new TestAsyncStreamReader <BlockAnnouncement>(new List <BlockAnnouncement>
            {
                new BlockAnnouncement
                {
                    BlockHash   = block.GetHash(),
                    BlockHeight = block.Height
                }
            });
            await _serverService.AnnouncementBroadcastStream(requestStream, BuildServerCallContext(metadata));

            var received = new List <AnnouncementReceivedEventData>();

            _eventBus.Subscribe <AnnouncementReceivedEventData>(a =>
            {
                received.Add(a);
                return(Task.CompletedTask);
            });

            requestStream = new TestAsyncStreamReader <BlockAnnouncement>(new List <BlockAnnouncement>
            {
                new BlockAnnouncement
                {
                    BlockHash   = block.GetHash(),
                    BlockHeight = block.Height
                }
            });
            await _serverService.AnnouncementBroadcastStream(requestStream, BuildServerCallContext(metadata));

            received.Count.ShouldBe(0);
        }
        public async Task AnnouncementBroadcastStream_Stream_Test()
        {
            var received = new List <AnnouncementReceivedEventData>();

            _eventBus.Subscribe <AnnouncementReceivedEventData>(a =>
            {
                received.Add(a);
                return(Task.CompletedTask);
            });

            var announcements = new List <BlockAnnouncement>();

            for (var i = 0; i < 5; i++)
            {
                announcements.Add(new BlockAnnouncement
                {
                    BlockHash   = HashHelper.ComputeFrom($"block-{i}"),
                    BlockHeight = 10 + i
                });
            }

            var pubkey   = _peerPool.GetPeers(true).First().Info.Pubkey;
            var metadata = new Metadata {
                {
                    GrpcConstants.PubkeyMetadataKey, pubkey
                }
            };

            var context       = BuildServerCallContext(metadata);
            var requestStream = new TestAsyncStreamReader <BlockAnnouncement>(announcements.ToArray());


            await _serverService.AnnouncementBroadcastStream(requestStream, context);

            received.Count.ShouldBe(5);
        }
        public async Task BlockBroadcastStream_Stream_Test()
        {
            var received = new List <BlockReceivedEvent>();

            _eventBus.Subscribe <BlockReceivedEvent>(a =>
            {
                received.Add(a);
                return(Task.CompletedTask);
            });

            var blocks = new List <BlockWithTransactions>();

            blocks.Add(_osTestHelper.GenerateBlockWithTransactions(HashHelper.ComputeFrom("block1"), 1, (await _osTestHelper.GenerateTransferTransactions(1)).ToList()));
            blocks.Add(_osTestHelper.GenerateBlockWithTransactions(HashHelper.ComputeFrom("block2"), 2, (await _osTestHelper.GenerateTransferTransactions(2)).ToList()));
            blocks.Add(_osTestHelper.GenerateBlockWithTransactions(HashHelper.ComputeFrom("block3"), 3, (await _osTestHelper.GenerateTransferTransactions(3)).ToList()));

            var context       = BuildServerCallContext();
            var requestStream = new TestAsyncStreamReader <BlockWithTransactions>(blocks.ToArray());

            context.RequestHeaders.Add(new Metadata.Entry(GrpcConstants.PubkeyMetadataKey, NetworkTestConstants.FakePubkey2));
            await _serverService.BlockBroadcastStream(requestStream, context);

            received.Count.ShouldBe(3);
        }