Пример #1
0
        [InlineData(FileSender.MaxChunkSize * 3 + 1)] // multiple of chunk size + 1
        public async Task SendInChunksAllowsWriteAccessToFileAfterSendingLastChunkOk(int fileSizeInBytes)
        {
            Action <Message> senderHandler = null;
            var messaging = Substitute.For <IMessagingInfrastructure>();

            messaging.When(m => m.Subscribe(Arg.Any <string>(), Arg.Any <Action <Message> >()))
            .Do(args => senderHandler = args.Arg <Action <Message> >());

            var testChannel = $"tests/fileSender/{fileSizeInBytes}";
            var buffer      = new byte[fileSizeInBytes];

            using (var tempFile = new TemporaryFile($"file{fileSizeInBytes}.tst", buffer))
            {
                var tempFilePath = tempFile.TempFilePath;
                messaging.When(m => m.Publish(Arg.Is <Message>(msg => msg.Topic == testChannel)))
                .Do(args =>
                {
                    var msg   = args.Arg <Message>();
                    var req   = JsonSerializer.Deserialize <TransportFileEnvelope>(msg.Payload);
                    var props = req.TransportFile.FromDictionary();
                    if (props.LastChunk)
                    {
                        if (File.Exists(tempFilePath))
                        {
                            File.Delete(tempFilePath);
                        }
                        File.WriteAllText(tempFilePath, "Allowed to overwrite the file!");
                    }

                    senderHandler?.Invoke(new Message {
                        Topic = req.ReplyTo, Payload = "OK"
                    });
                });

                var fileSender = new FileSender(messaging, null);
                var sendResult = await fileSender.SendInChunks(testChannel, tempFile.TempFilePath);

                Assert.Equal(FileTransferStatus.Delivered, sendResult);
            }

            var expectedCalls = fileSizeInBytes / FileSender.MaxChunkSize;

            expectedCalls += (fileSizeInBytes % FileSender.MaxChunkSize) != 0 ? 1 : 0;
            messaging.Received(Convert.ToInt32(expectedCalls)).Publish(Arg.Is <Message>(msg => msg.Topic == testChannel));
        }
Пример #2
0
        public async Task SendInChunksWithMissingAnswerReturnsTimedOutOk()
        {
            const int fileSizeInBytes = 1024;

            var messaging = Substitute.For <IMessagingInfrastructure>();

            var testChannel = $"tests/fileSender/{fileSizeInBytes}";
            var buffer      = new byte[fileSizeInBytes];

            using (var tempFile = new TemporaryFile($"file{fileSizeInBytes}.tst", buffer))
            {
                var fileSender = new FileSender(messaging, null);
                var sendResult = await fileSender.SendInChunks(testChannel, tempFile.TempFilePath);

                Assert.Equal(FileTransferStatus.TimedOut, sendResult);
            }

            var expectedCalls = 1;

            messaging.Received(expectedCalls).Publish(Arg.Is <Message>(msg => msg.Topic == testChannel));
        }
Пример #3
0
        [InlineData(FileSender.MaxChunkSize * 3 + 1)] // multiple of chunk size + 1
        public async Task SendInChunksUsesSameUniqueTransferIdForEachChunkOk(int fileSizeInBytes)
        {
            Action <Message> senderHandler = null;
            var messaging = Substitute.For <IMessagingInfrastructure>();

            messaging.When(m => m.Subscribe(Arg.Any <string>(), Arg.Any <Action <Message> >()))
            .Do(args => senderHandler = args.Arg <Action <Message> >());

            var testChannel = $"tests/fileSender/{fileSizeInBytes}";
            var buffer      = new byte[fileSizeInBytes];

            messaging.When(m => m.Publish(Arg.Is <Message>(msg => msg.Topic == testChannel)))
            .Do(args =>
            {
                var msg   = args.Arg <Message>();
                var req   = JsonSerializer.Deserialize <TransportFileEnvelope>(msg.Payload);
                var props = req.TransportFile.FromDictionary();

                Assert.NotNull(props.TransferId);
                // each test uses a new FileSender instance, which always generates 1 as unique id for the first file being transferred
                Assert.Equal(1, props.TransferId);

                senderHandler?.Invoke(new Message {
                    Topic = req.ReplyTo, Payload = "OK"
                });
            });
            using (var tempFile = new TemporaryFile($"file{fileSizeInBytes}.tmp", buffer))
            {
                var fileSender = new FileSender(messaging, null);
                var sendResult = await fileSender.SendInChunks(testChannel, tempFile.TempFilePath);

                Assert.Equal(FileTransferStatus.Delivered, sendResult);
            }

            var expectedCalls = fileSizeInBytes / FileSender.MaxChunkSize;

            expectedCalls += fileSizeInBytes % FileSender.MaxChunkSize != 0 ? 1 : 0;
            messaging.Received(Convert.ToInt32(expectedCalls)).Publish(Arg.Is <Message>(msg => msg.Topic == testChannel));
        }