private async Task AddFileToDfs(long byteSize)
        {
            var fakeNode                   = Substitute.For <IRpcClient>();
            var sender                     = PeerIdHelper.GetPeerId("sender");
            var recipient                  = PeerIdHelper.GetPeerId("recipient");
            var senderPeerId               = sender;
            var peerSettings               = senderPeerId.ToSubstitutedPeerSettings();
            var recipientPeerId            = recipient;
            var fileToTransfer             = FileHelper.CreateRandomTempFile(byteSize);
            var addFileToDfsRequestHandler =
                new AddFileToDfsRequestObserver(_dfs, peerSettings, _nodeFileTransferFactory, _logger);
            var transferBytesRequestHandler =
                new TransferFileBytesRequestObserver(_nodeFileTransferFactory, peerSettings, _logger);

            var uniqueFileKey = CorrelationId.GenerateCorrelationId();
            var crcValue      = FileHelper.GetCrcValue(fileToTransfer);

            //Create a response object and set its return value
            var request = new AddFileToDfsRequest
            {
                Node     = "node1",
                FileName = fileToTransfer,
                FileSize = (ulong)byteSize
            }.ToProtocolMessage(sender, uniqueFileKey);

            request.SendToHandler(_fakeContext, addFileToDfsRequestHandler);

            Assert.Single(_nodeFileTransferFactory.Keys);

            var fileTransferInformation =
                _nodeFileTransferFactory.GetFileTransferInformation(uniqueFileKey);

            Assert.True(fileTransferInformation.Initialised, "File transfer not initialised");

            using (var fs = File.Open(fileToTransfer, FileMode.Open))
            {
                var fileUploadInformation = new UploadFileTransferInformation(fs, senderPeerId, recipientPeerId,
                                                                              fakeNode.Channel, uniqueFileKey);
                for (uint i = 0; i < fileTransferInformation.MaxChunk; i++)
                {
                    fileUploadInformation.GetUploadMessageDto(i).Content
                    .SendToHandler(_fakeContext, transferBytesRequestHandler);
                }
            }

            Assert.True(fileTransferInformation.ChunkIndicatorsTrue());

            await TaskHelper.WaitForAsync(() => fileTransferInformation.DfsHash != null, TimeSpan.FromSeconds(15));

            Assert.NotNull(fileTransferInformation.DfsHash);

            long ipfsCrcValue;

            using (var ipfsStream = await _dfs.ReadAsync(fileTransferInformation.DfsHash))
            {
                ipfsCrcValue = FileHelper.GetCrcValue(ipfsStream);
            }

            Assert.Equal(crcValue, ipfsCrcValue);
        }
        public async Task Get_File_Rpc(long byteSize)
        {
            var    addedIpfsHash = AddFileToDfs(byteSize, out var crcValue, out var stream);
            Stream fileStream    = null;

            try
            {
                var nodePeerId   = PeerIdHelper.GetPeerId("sender");
                var rpcPeerId    = PeerIdHelper.GetPeerId("recipient");
                var peerSettings = Substitute.For <IPeerSettings>();
                peerSettings.PeerId.Returns(rpcPeerId);
                var nodePeer           = nodePeerId;
                var rpcPeer            = rpcPeerId;
                var correlationId      = CorrelationId.GenerateCorrelationId();
                var fakeFileOutputPath = Path.GetTempFileName();
                IDownloadFileInformation fileDownloadInformation = new DownloadFileTransferInformation(rpcPeer,
                                                                                                       nodePeer,
                                                                                                       _fakeContext.Channel, correlationId, fakeFileOutputPath, 0);
                var getFileFromDfsResponseHandler =
                    new GetFileFromDfsResponseObserver(_logger, _fileDownloadFactory);
                var transferBytesHandler =
                    new TransferFileBytesRequestObserver(_fileDownloadFactory, peerSettings, _logger);

                _fileDownloadFactory.RegisterTransfer(fileDownloadInformation);

                var getFileResponse = new GetFileFromDfsResponse
                {
                    FileSize     = (ulong)byteSize,
                    ResponseCode = ByteString.CopyFrom((byte)FileTransferResponseCodeTypes.Successful.Id)
                }.ToProtocolMessage(nodePeer, correlationId);

                getFileResponse.SendToHandler(_fakeContext, getFileFromDfsResponseHandler);

                fileStream = await _dfsService.UnixFsApi.ReadFileAsync(addedIpfsHash.ToString());

                IUploadFileInformation fileUploadInformation = new UploadFileTransferInformation(
                    fileStream,
                    rpcPeer,
                    nodePeer,
                    _fakeContext.Channel,
                    correlationId);

                for (uint i = 0; i < fileUploadInformation.MaxChunk; i++)
                {
                    var transferMessage = fileUploadInformation
                                          .GetUploadMessageDto(i);
                    transferMessage.Content.SendToHandler(_fakeContext, transferBytesHandler);
                }

                await TaskHelper.WaitForAsync(() => fileDownloadInformation.IsCompleted, TimeSpan.FromSeconds(10));

                Assert.AreEqual(crcValue, FileHelper.GetCrcValue(fileDownloadInformation.TempPath));
            }
            finally
            {
                stream.Close();
                fileStream?.Close();
            }
        }
        public TransferFileBytesRequestObserverTests()
        {
            _context = Substitute.For <IChannelHandlerContext>();
            _context.Channel.Returns(Substitute.For <IChannel>());
            _downloadFileTransferFactory = Substitute.For <IDownloadFileTransferFactory>();
            var peerSettings = PeerIdHelper.GetPeerId("Test").ToSubstitutedPeerSettings();

            _observer = new TransferFileBytesRequestObserver(_downloadFileTransferFactory,
                                                             peerSettings,
                                                             Substitute.For <ILogger>());
        }