public async Task VerifyProcessRequestBacklog()
        {
            var testClientLogFilePath = $"{Logging.GetTimeStampForFileName()}_VerifyProcessRequestBacklog_testClient.log";
            var testServerLogFilePath = $"{Logging.GetTimeStampForFileName()}_VerifyProcessRequestBacklog_testServer.log";

            var client2LogFilePath = $"{Logging.GetTimeStampForFileName()}_VerifyProcessRequestBacklog_client2.log";
            var client3LogFilePath = $"{Logging.GetTimeStampForFileName()}_VerifyProcessRequestBacklog_client3.log";
            var client4LogFilePath = $"{Logging.GetTimeStampForFileName()}_VerifyProcessRequestBacklog_client4.log";

            _client2LogMessages = new List <string>();
            _client3LogMessages = new List <string>();
            _client4LogMessages = new List <string>();

            _clientSettings.LocalServerPortNumber = 8027;
            _serverSettings.LocalServerPortNumber = 8028;

            var client2Settings = new ServerSettings
            {
                LocalServerPortNumber      = 8029,
                LocalServerFolderPath      = _localFolder,
                LocalNetworkCidrIp         = _cidrIp,
                SocketSettings             = _socketSettings,
                TransferUpdateInterval     = 0.10f,
                FileTransferStalledTimeout = TimeSpan.FromSeconds(5),
                TransferRetryLimit         = 2,
                RetryLimitLockout          = TimeSpan.FromSeconds(3),
                LogLevel = LogLevel.Info
            };

            var client3Settings = new ServerSettings
            {
                LocalServerPortNumber      = 8030,
                LocalServerFolderPath      = _localFolder,
                LocalNetworkCidrIp         = _cidrIp,
                SocketSettings             = _socketSettings,
                TransferUpdateInterval     = 0.10f,
                FileTransferStalledTimeout = TimeSpan.FromSeconds(5),
                TransferRetryLimit         = 2,
                RetryLimitLockout          = TimeSpan.FromSeconds(3),
                LogLevel = LogLevel.Info
            };

            var client4Settings = new ServerSettings
            {
                LocalServerPortNumber      = 8031,
                LocalServerFolderPath      = _localFolder,
                LocalNetworkCidrIp         = _cidrIp,
                SocketSettings             = _socketSettings,
                TransferUpdateInterval     = 0.10f,
                FileTransferStalledTimeout = TimeSpan.FromSeconds(5),
                TransferRetryLimit         = 2,
                RetryLimitLockout          = TimeSpan.FromSeconds(3),
                LogLevel = LogLevel.Info
            };

            var token = _cts.Token;

            var testServer = new SpecialAsyncServer(_serverSettings);

            testServer.EventOccurred       += HandleServerEvent;
            testServer.SocketEventOccurred += HandleServerEvent;

            var testClient = new SpecialAsyncServer(_clientSettings);

            testClient.EventOccurred       += HandleClientEvent;
            testClient.SocketEventOccurred += HandleClientEvent;

            var client2 = new AsyncServer(client2Settings);

            client2.EventOccurred       += HandleClient2Event;
            client2.SocketEventOccurred += HandleClient2Event;

            var client3 = new AsyncServer(client3Settings);

            client3.EventOccurred       += HandleClient3Event;
            client3.SocketEventOccurred += HandleClient3Event;

            var client4 = new AsyncServer(client4Settings);

            client4.EventOccurred       += HandleClient4Event;
            client4.SocketEventOccurred += HandleClient4Event;

            var testClientState = new ServerState(testClient);
            var testServerState = new ServerState(testServer);
            var client2State    = new ServerState(client2);
            var client3State    = new ServerState(client3);
            var client4State    = new ServerState(client4);

            await testServer.InitializeAsync("test server").ConfigureAwait(false);

            await testClient.InitializeAsync("test client").ConfigureAwait(false);

            await client2.InitializeAsync("client2").ConfigureAwait(false);

            await client3.InitializeAsync("client3").ConfigureAwait(false);

            await client4.InitializeAsync("client4").ConfigureAwait(false);

            var runTestServerTask = Task.Run(() => testServer.RunAsync(token), token);
            var runTestClientTask = Task.Run(() => testClient.RunAsync(token), token);
            var runClient2Task    = Task.Run(() => client2.RunAsync(token), token);
            var runClient3Task    = Task.Run(() => client3.RunAsync(token), token);
            var runClient4Task    = Task.Run(() => client4.RunAsync(token), token);

            while (!testServer.IsRunning)
            {
            }
            while (!testClient.IsRunning)
            {
            }
            while (!client2.IsRunning)
            {
            }
            while (!client3.IsRunning)
            {
            }
            while (!client4.IsRunning)
            {
            }

            Assert.IsTrue(File.Exists(_remoteFilePath));
            var sentFileSize = new FileInfo(_remoteFilePath).Length;

            FileHelper.DeleteFileIfAlreadyExists(_localFilePath, 3);
            Assert.IsFalse(File.Exists(_localFilePath));

            // Request file transfer which will be mocked to simulate a long-running transfer
            var getFileResult =
                await testClient.GetFileAsync(
                    testServer.MyInfo,
                    FileName,
                    sentFileSize,
                    _remoteFolder,
                    _localFolder).ConfigureAwait(false);

            if (getFileResult.Failure)
            {
                var getFileError = "There was an error requesting the file from the remote server: " + getFileResult.Error;
                Assert.Fail(getFileError);
            }

            while (!_clientFileTransferPending)
            {
            }

            // Before accepting the file transfer, change both server and client instances of the
            // file transfer controller object to use the mock transfer controllers

            var pendingId           = testClientState.PendingFileTransferIds[0];
            var pendingFiletransfer = testClient.GetFileTransferById(pendingId).Value;

            var fileTransferDuration = TimeSpan.FromSeconds(3);

            testServer.UseMockTimeFileSender(fileTransferDuration);
            testClient.UseMockTimeFileReceiver(fileTransferDuration);

            var receiveFileTask = Task.Run(() => testClient.AcceptInboundFileTransferAsync(pendingFiletransfer), token);

            while (!_serverSendFileBytesStarted)
            {
            }
            while (!_clientReceiveFileBytesStarted)
            {
            }

            _clientFileTransferPending = false;

            var clientFilePath = Path.Combine(_localFolder, "fake.exe");
            var serverFilePath = Path.Combine(_remoteFolder, "fake.exe");

            FileHelper.DeleteFileIfAlreadyExists(clientFilePath, 3);
            Assert.IsFalse(File.Exists(clientFilePath));

            FileHelper.DeleteFileIfAlreadyExists(serverFilePath, 3);
            Assert.IsFalse(File.Exists(serverFilePath));

            // Both testClient and testServer will be "busy" for the length of time defined in fileTransferDuration
            // Now, the remaining client instances will send requests to both servers which should be placed in
            // the queue and processed after the file transfer has completed.

            Thread.Sleep(900);

            var serverInfoRequest = await
                                    client2.RequestServerInfoAsync(
                testServer.MyInfo.LocalIpAddress,
                testServer.MyInfo.PortNumber)
                                    .ConfigureAwait(false);

            Thread.Sleep(150);

            var fileListRequest1 =
                await client3.RequestFileListAsync(testServer.MyInfo).ConfigureAwait(false);

            Thread.Sleep(150);

            var textMessage1 =
                await client4.SendTextMessageAsync(testServer.MyInfo, "this too shall pend");

            Thread.Sleep(150);

            var sendFile1 = await
                            client2.SendFileAsync(
                testClient.MyInfo,
                "fake.exe",
                46692,
                _testFilesFolder,
                _localFolder);

            Thread.Sleep(150);

            var sendFile2 = await
                            client3.SendFileAsync(
                testServer.MyInfo,
                "fake.exe",
                46692,
                _testFilesFolder,
                _remoteFolder);

            Thread.Sleep(150);

            var fileListRequest2 =
                await client4.RequestFileListAsync(testClient.MyInfo).ConfigureAwait(false);

            Thread.Sleep(150);

            var getFileResult2 =
                await client2.GetFileAsync(
                    testClient.MyInfo,
                    "private_key.txt",
                    4559,
                    _remoteFolder,
                    _localFolder).ConfigureAwait(false);

            Thread.Sleep(150);

            var textMessage2 =
                await client3.SendTextMessageAsync(testClient.MyInfo, "the pending will never end");

            Thread.Sleep(150);

            var textMessage3 =
                await client4.SendTextMessageAsync(testServer.MyInfo, "pending all over your face");

            Thread.Sleep(900);

            if (Result.Combine(
                    serverInfoRequest,
                    fileListRequest1,
                    textMessage1,
                    sendFile1,
                    sendFile2,
                    fileListRequest2,
                    getFileResult2,
                    textMessage2,
                    textMessage3).Failure)
            {
                Assert.Fail("There was an error with one of the clients sending requests to the test instances");
            }

            while (!_serverSendFileBytesComplete)
            {
            }
            while (!_clientReceiveFileBytesComplete)
            {
            }

            var receivedFile = await receiveFileTask;

            if (receivedFile.Failure)
            {
                Assert.Fail("Error receiving file.");
            }

            while (!_serverProcessingRequestBacklogStarted)
            {
            }
            while (!_clientProcessingRequestBacklogStarted)
            {
            }

            while (!_client2WasNotifiedFileDoesNotExist)
            {
            }
            while (!_client2ReceivedServerInfo)
            {
            }
            while (!_client3ReceivedFileInfoList)
            {
            }
            while (!_client4WasNotifiedFolderIsEmpty)
            {
            }
            while (!_clientReceivedTextMessage)
            {
            }
            while (!_serverReceivedTextMessage)
            {
            }

            while (!_serverProcessingRequestBacklogComplete)
            {
            }
            while (!_clientProcessingRequestBacklogComplete)
            {
            }

            Assert.AreEqual(1, testClientState.PendingFileTransferIds.Count);
            Assert.AreEqual(1, testServerState.PendingFileTransferIds.Count);

            // Check the status of all requests on all server/client instances

            var testServerString   = testServer.ToString();
            var testServerEndPoint = $"{testServer.MyInfo.LocalIpAddress}:{testServer.MyInfo.PortNumber}";

            Assert.IsTrue(testServerString.Contains($"test server [{testServerEndPoint}]"));
            Assert.IsTrue(testServerString.Contains("[11 Requests (8 Rx, 3 Tx)]"));
            Assert.IsTrue(testServerString.Contains("[2 File Transfers (0 Rx, 1 Tx, 1 Pending)]"));
            Assert.IsTrue(testServerString.Contains("[2 Messages (1 conversations)]"));

            Assert.IsFalse(testServerState.PendingRequestInQueue);
            Assert.AreEqual(11, testServerState.RequestIds.Count);
            Assert.IsTrue(testServerState.FileTransferPending);
            Assert.AreEqual(2, testServerState.FileTransferIds.Count);
            Assert.IsFalse(testServerState.NoTextSessions);
            Assert.AreEqual(1, testServerState.TextSessionIds.Count);

            var textSessionId1 = testServerState.TextSessionIds[0];
            var textSession1   = testServer.GetConversationById(textSessionId1).Value;
            var messageCount1  = textSession1.MessageCount;

            Assert.AreEqual(2, messageCount1);

            var testClientString   = testClient.ToString();
            var testClientEndPoint = $"{testClient.MyInfo.LocalIpAddress}:{testClient.MyInfo.PortNumber}";

            Assert.IsTrue(testClientString.Contains($"test client [{testClientEndPoint}]"));
            //Assert.IsTrue(testClientString.Contains("[10 Requests (5 Rx, 5 Tx)]"));
            Assert.IsTrue(testClientString.Contains("[2 File Transfers (1 Rx, 0 Tx, 1 Pending)]"));
            Assert.IsTrue(testClientString.Contains("[1 Messages (1 conversations)]"));

            Assert.IsFalse(testClientState.PendingRequestInQueue);
            //Assert.AreEqual(10, testClientState.RequestIds.Count);
            Assert.IsTrue(testClientState.FileTransferPending);
            Assert.AreEqual(2, testClientState.FileTransferIds.Count);
            Assert.IsFalse(testClientState.NoTextSessions);
            Assert.AreEqual(1, testClientState.TextSessionIds.Count);

            var textSessionId2 = testClientState.TextSessionIds[0];
            var textSession2   = testClient.GetConversationById(textSessionId2).Value;
            var messageCount2  = textSession2.MessageCount;

            Assert.AreEqual(1, messageCount2);

            var client2String   = client2.ToString();
            var client2EndPoint = $"{client2.MyInfo.LocalIpAddress}:{client2.MyInfo.PortNumber}";

            Assert.IsTrue(client2String.Contains($"client2 [{client2EndPoint}]"));
            Assert.IsTrue(client2String.Contains("[5 Requests (2 Rx, 3 Tx)]"));
            Assert.IsTrue(client2String.Contains("[2 File Transfers (0 Rx, 0 Tx, 1 Pending, 1 Rejected)]"));
            Assert.IsTrue(client2String.Contains("[0 Messages (0 conversations)]"));

            Assert.IsFalse(client2State.PendingRequestInQueue);
            Assert.AreEqual(5, client2State.RequestIds.Count);
            Assert.IsFalse(client2State.FileTransferPending);
            Assert.AreEqual(2, client2State.FileTransferIds.Count);
            Assert.IsTrue(client2State.NoTextSessions);
            Assert.AreEqual(0, client2State.TextSessionIds.Count);

            var client3String   = client3.ToString();
            var client3EndPoint = $"{client3.MyInfo.LocalIpAddress}:{client3.MyInfo.PortNumber}";

            Assert.IsTrue(client3String.Contains($"client3 [{client3EndPoint}]"));
            Assert.IsTrue(client3String.Contains("[4 Requests (1 Rx, 3 Tx)]"));
            Assert.IsTrue(client3String.Contains("[1 File Transfers (0 Rx, 0 Tx, 1 Pending)]"));
            Assert.IsTrue(client3String.Contains("[1 Messages (1 conversations)]"));

            Assert.IsFalse(client3State.PendingRequestInQueue);
            Assert.AreEqual(4, client3State.RequestIds.Count);
            Assert.IsFalse(client3State.FileTransferPending);
            Assert.AreEqual(1, client3State.FileTransferIds.Count);
            Assert.IsFalse(client3State.NoTextSessions);
            Assert.AreEqual(1, client3State.TextSessionIds.Count);

            var textSessionId3 = client3State.TextSessionIds[0];
            var textSession3   = client3.GetConversationById(textSessionId3).Value;
            var messageCount3  = textSession3.MessageCount;

            Assert.AreEqual(1, messageCount3);

            var client4String   = client4.ToString();
            var client4EndPoint = $"{client4.MyInfo.LocalIpAddress}:{client4.MyInfo.PortNumber}";

            Assert.IsTrue(client4String.Contains($"client4 [{client4EndPoint}]"));
            Assert.IsTrue(client4String.Contains("[4 Requests (1 Rx, 3 Tx)]"));
            Assert.IsTrue(client4String.Contains("[0 File Transfers]"));
            Assert.IsTrue(client4String.Contains("[2 Messages (1 conversations)]"));

            Assert.IsFalse(client4State.PendingRequestInQueue);
            Assert.AreEqual(4, client4State.RequestIds.Count);
            Assert.IsFalse(client4State.FileTransferPending);
            Assert.AreEqual(0, client4State.FileTransferIds.Count);
            Assert.IsFalse(client4State.NoTextSessions);
            Assert.AreEqual(1, client4State.TextSessionIds.Count);

            var textSessionId4 = client4State.TextSessionIds[0];
            var textSession4   = client4.GetConversationById(textSessionId4).Value;
            var messageCount4  = textSession4.MessageCount;

            Assert.AreEqual(2, messageCount4);

            var fileTransferEventLog = testServer.GetEventLogForFileTransfer(1, LogLevel.Info);
            var requestEventLog      = testServer.GetEventLogForRequest(1);
            var allEvents            = testServer.GetCompleteEventLog(LogLevel.Trace);

            Assert.AreEqual(1, fileTransferEventLog.Count);
            Assert.AreEqual(0, requestEventLog.Count);
            Assert.IsTrue(allEvents.Count >= 100);

            // Cleanup all server instances
            // Cleanup all server instances
            // Cleanup all server instances

            await ShutdownServerAsync(client2, runClient2Task);
            await ShutdownServerAsync(client3, runClient3Task);
            await ShutdownServerAsync(client4, runClient4Task);
            await ShutdownServerAsync(testServer, runTestServerTask);
            await ShutdownServerAsync(testClient, runTestClientTask);

            if (_generateLogFiles)
            {
                File.AppendAllLines(testClientLogFilePath, _clientLogMessages);
                File.AppendAllLines(testServerLogFilePath, _serverLogMessages);
                File.AppendAllLines(client2LogFilePath, _client2LogMessages);
                File.AppendAllLines(client3LogFilePath, _client3LogMessages);
                File.AppendAllLines(client4LogFilePath, _client4LogMessages);
            }
        }
Exemplo n.º 2
0
        public async Task VerifyGetFileAfterRetryLimitExceeded()
        {
            var clientLogFilePath = $"{Logging.GetTimeStampForFileName()}_VerifyGetFileAfterRetryLimitExceeded_client.log";
            var serverLogFilePath = $"{Logging.GetTimeStampForFileName()}_VerifyGetFileAfterRetryLimitExceeded_testServer.log";

            _clientSettings.LocalServerPortNumber = 8009;
            _serverSettings.LocalServerPortNumber = 8010;

            var token = _cts.Token;

            var testServer = new SpecialAsyncServer(_serverSettings);

            testServer.EventOccurred       += HandleServerEvent;
            testServer.SocketEventOccurred += HandleServerEvent;

            var client = new AsyncServer(_clientSettings);

            client.EventOccurred       += HandleClientEvent;
            client.SocketEventOccurred += HandleClientEvent;

            var clientState = new ServerState(client);

            await testServer.InitializeAsync("test server").ConfigureAwait(false);

            await client.InitializeAsync("client").ConfigureAwait(false);

            var runServerTask = Task.Run(() => testServer.RunAsync(token), token);
            var runClientTask = Task.Run(() => client.RunAsync(token), token);

            while (!testServer.IsRunning)
            {
            }
            while (!client.IsRunning)
            {
            }

            Assert.IsTrue(File.Exists(_remoteFilePath));
            var fileSizeInBytes = new FileInfo(_remoteFilePath).Length;

            FileHelper.DeleteFileIfAlreadyExists(_localFilePath, 3);
            Assert.IsFalse(File.Exists(_localFilePath));

            // 1st transfer attempt
            var getFile =
                await client.GetFileAsync(
                    testServer.MyInfo,
                    FileName,
                    fileSizeInBytes,
                    _remoteFolder,
                    _localFolder).ConfigureAwait(false);

            if (getFile.Failure)
            {
                var getFileError = "There was an error requesting the file from the remote server: " + getFile.Error;
                Assert.Fail(getFileError);
            }

            // Wait for 1st transfer attempt
            while (!_clientFileTransferPending)
            {
            }

            var pendingId           = clientState.PendingFileTransferIds[0];
            var pendingFiletransfer = client.GetFileTransferById(pendingId).Value;

            testServer.UseMockStalledFileSender();

            var transferResult = await client.AcceptInboundFileTransferAsync(pendingFiletransfer);

            if (transferResult.Failure)
            {
                Assert.Fail("There was an error receiving the file from the remote server: " + transferResult.Error);
            }

            // Wait for 1st transfer attempt stalled notification
            while (!_serverStoppedSendingFileBytes)
            {
                if (_clientErrorOccurred)
                {
                    Assert.Fail("File transfer failed");
                }
            }

            var stalledIdCount = 0;

            while (stalledIdCount == 0)
            {
                stalledIdCount = clientState.StalledFileTransferIds.Count;
            }

            var stalledId = clientState.StalledFileTransferIds[0];

            // Notify server that 1st transfer attempt is stalled
            var notifyTransferStalled =
                await client.SendNotificationFileTransferStalledAsync(stalledId).ConfigureAwait(false);

            if (notifyTransferStalled.Failure)
            {
                Assert.Fail("There was an error notifying the remote server that the file transfer has stalled: " + transferResult.Error);
            }

            // Wait for 1st transfer attempt cancelled notification
            while (!_serverWasNotifiedFileTransferStalled)
            {
            }

            testServer.UseOriginalFileSender();

            _clientFileTransferPending            = false;
            _serverStoppedSendingFileBytes        = false;
            _serverWasNotifiedFileTransferStalled = false;

            /////////////////////////////////////////////////////////////////////////////////////////////
            //
            // 2nd transfer attempt
            var retryFileTransfer = await
                                    client.RetryFileTransferAsync(stalledId).ConfigureAwait(false);

            if (retryFileTransfer.Failure)
            {
                Assert.Fail("There was an error attempting to retry the stalled file transfer: " + transferResult.Error);
            }

            // Wait for 2nd transfer attempt
            while (!_clientFileTransferPending)
            {
            }

            var pendingId2           = clientState.PendingFileTransferIds[0];
            var pendingFiletransfer2 = client.GetFileTransferById(pendingId2).Value;

            testServer.UseMockStalledFileSender();

            var transferResult2 = await client.AcceptInboundFileTransferAsync(pendingFiletransfer2);

            if (transferResult2.Failure)
            {
                Assert.Fail("There was an error receiving the file from the remote server: " + transferResult2.Error);
            }

            // Wait for 2nd transfer attempt stalled notification
            while (!_serverStoppedSendingFileBytes)
            {
                if (_clientErrorOccurred)
                {
                    Assert.Fail("File transfer failed");
                }
            }

            var stalledIdCount2 = 0;

            while (stalledIdCount2 == 0)
            {
                stalledIdCount2 = clientState.StalledFileTransferIds.Count;
            }

            var stalledId2 = clientState.StalledFileTransferIds[0];

            // Notify server that 2nd transfer attempt is stalled
            var notifyTransferStalled2 =
                await client.SendNotificationFileTransferStalledAsync(stalledId2).ConfigureAwait(false);

            if (notifyTransferStalled2.Failure)
            {
                Assert.Fail("There was an error notifying the remote server that the file transfer has stalled: " + notifyTransferStalled2.Error);
            }

            // Wait for 2nd transfer attempt cancelled notification
            while (!_serverWasNotifiedFileTransferStalled)
            {
            }

            testServer.UseOriginalFileSender();

            _clientFileTransferPending            = false;
            _serverStoppedSendingFileBytes        = false;
            _serverWasNotifiedFileTransferStalled = false;
            _clientWasNotifiedRetryLimitExceeded  = false;

            /////////////////////////////////////////////////////////////////////////////////////////////
            //
            // 3rd transfer attempt
            var retryFileTransfer2 = await
                                     client.RetryFileTransferAsync(stalledId2).ConfigureAwait(false);

            if (retryFileTransfer2.Failure)
            {
                Assert.Fail("There was an error attempting to retry the stalled file transfer: " + retryFileTransfer2.Error);
            }

            while (!_clientWasNotifiedRetryLimitExceeded)
            {
            }

            var stalledFileTransfer2 = client.GetFileTransferById(stalledId2).Value;

            Assert.IsFalse(stalledFileTransfer2.RetryLockoutExpired);

            _clientWasNotifiedRetryLimitExceeded = false;

            /////////////////////////////////////////////////////////////////////////////////////////////
            //
            // 4th transfer attempt
            var retryFileTransfer3 = await
                                     client.RetryFileTransferAsync(stalledId2).ConfigureAwait(false);

            if (retryFileTransfer3.Success)
            {
                var error =
                    "Did not receive error message indicating that the requested file transfer " +
                    "cannot be requested until the retry lockout has expired";

                Assert.Fail(error);
            }

            if (retryFileTransfer3.Failure)
            {
                Assert.IsTrue(retryFileTransfer3.Error.Contains(
                                  "Maximum # of attempts to complete stalled file transfer reached or exceeded"));
            }

            await Task.Delay(_serverSettings.RetryLimitLockout + TimeSpan.FromSeconds(1), token);

            Assert.IsTrue(stalledFileTransfer2.RetryLockoutExpired);

            /////////////////////////////////////////////////////////////////////////////////////////////
            //
            // 5th transfer attempt
            var retryFileTransfer4 = await
                                     client.RetryFileTransferAsync(stalledId2).ConfigureAwait(false);

            if (retryFileTransfer4.Failure)
            {
                Assert.Fail("There was an error attempting to retry the stalled file transfer: " + retryFileTransfer4.Error);
            }

            // Wait for 5th transfer attempt
            while (!_clientFileTransferPending)
            {
            }

            var pendingId3           = clientState.PendingFileTransferIds[0];
            var pendingFiletransfer3 = client.GetFileTransferById(pendingId3).Value;

            var transferResult3 = await client.AcceptInboundFileTransferAsync(pendingFiletransfer3);

            if (transferResult3.Failure)
            {
                Assert.Fail("There was an error receiving the file from the remote server: " + transferResult3.Error);
            }

            // Wait for all file bytes to be received
            while (!_clientReceiveFileBytesComplete)
            {
                if (_clientErrorOccurred)
                {
                    Assert.Fail("File transfer failed");
                }
            }

            // Wait for server to receive confirmation message
            while (!_clientConfirmedFileTransferComplete)
            {
            }

            Assert.IsTrue(File.Exists(_localFilePath));
            Assert.AreEqual(fileSizeInBytes, new FileInfo(_localFilePath).Length);

            await ShutdownServerAsync(client, runClientTask);
            await ShutdownServerAsync(testServer, runServerTask);

            if (_generateLogFiles)
            {
                File.AppendAllLines(clientLogFilePath, _clientLogMessages);
                File.AppendAllLines(serverLogFilePath, _serverLogMessages);
            }
        }