From 7235403f204e8e72746c5ea1e63251694dd36433 Mon Sep 17 00:00:00 2001 From: Vitalii Orazov Date: Sat, 30 Sep 2023 22:56:40 +0300 Subject: [PATCH 1/4] remove extra wait code --- .../ShareClipbrd.Core/Services/DataClient.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ShareClipbrd/ShareClipbrd.Core/Services/DataClient.cs b/ShareClipbrd/ShareClipbrd.Core/Services/DataClient.cs index 6a8a986..372904e 100644 --- a/ShareClipbrd/ShareClipbrd.Core/Services/DataClient.cs +++ b/ShareClipbrd/ShareClipbrd.Core/Services/DataClient.cs @@ -73,11 +73,11 @@ async ValueTask Handshake() { public async Task SendFileDropList(StringCollection fileDropList) { cts.Cancel(); - var inProcess = !pingTimer.Enabled; - if(inProcess) { - Debug.WriteLine("--- inProcess 0"); - await Task.Delay(1000); - } + // var inProcess = !pingTimer.Enabled; + // if(inProcess) { + // Debug.WriteLine("--- inProcess 0"); + // await Task.Delay(1000); + // } cts = new(); var cancellationToken = cts.Token; try { @@ -116,11 +116,11 @@ static async Task SendSize(Int64 size, NetworkStream stream, CancellationToken c public async Task SendData(ClipboardData clipboardData) { cts.Cancel(); - var inProcess = !pingTimer.Enabled; - if(inProcess) { - Debug.WriteLine("--- inProcess 0"); - await Task.Delay(1000); - } + // var inProcess = !pingTimer.Enabled; + // if(inProcess) { + // Debug.WriteLine("--- inProcess 0"); + // await Task.Delay(1000); + // } cts = new(); var cancellationToken = cts.Token; try { From 8c9bbf2c4a6316cf227e20a30c7f9ce8ddf5fd08 Mon Sep 17 00:00:00 2001 From: Vitalii Orazov Date: Sat, 30 Sep 2023 23:05:20 +0300 Subject: [PATCH 2/4] fix address source --- ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs b/ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs index e3bee0c..e531580 100644 --- a/ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs +++ b/ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs @@ -1,4 +1,4 @@ -using System.Buffers; +using System.Buffers; using System.Diagnostics; using System.Net; using System.Net.Sockets; @@ -162,7 +162,7 @@ public void Start() { Task.Run(async () => { while(!cancellationToken.IsCancellationRequested) { - if(string.IsNullOrEmpty(systemConfiguration.PartnerAddress)) { + if(string.IsNullOrEmpty(systemConfiguration.HostAddress)) { connectStatusService.Offline(); break; } From 3061a10b8838e162c0ce70ad5a35e2690371d58f Mon Sep 17 00:00:00 2001 From: Vitalii Orazov Date: Sat, 30 Sep 2023 23:10:53 +0300 Subject: [PATCH 3/4] await of server starting and return binded port --- .../Services/ClientServerTests.cs | 25 +++++++++++-------- .../ShareClipbrd.Core/Services/DataServer.cs | 15 ++++++++--- .../ShareClipbrdApp/MainWindow.axaml.cs | 2 +- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/ShareClipbrd/ShareClipbrd.Core.Tests/Services/ClientServerTests.cs b/ShareClipbrd/ShareClipbrd.Core.Tests/Services/ClientServerTests.cs index 05796a9..f1e7e52 100644 --- a/ShareClipbrd/ShareClipbrd.Core.Tests/Services/ClientServerTests.cs +++ b/ShareClipbrd/ShareClipbrd.Core.Tests/Services/ClientServerTests.cs @@ -30,8 +30,7 @@ public void Setup() { addressDiscoveryServiceMock = new(); timeServiceMock.SetupGet(x => x.DataClientPingPeriod).Returns(TimeSpan.FromMilliseconds(10000)); - systemConfigurationMock.SetupGet(x => x.HostAddress).Returns("127.0.0.1:55542"); - systemConfigurationMock.SetupGet(x => x.PartnerAddress).Returns("127.0.0.1:55542"); + systemConfigurationMock.SetupGet(x => x.HostAddress).Returns("127.0.0.1:0"); server = new DataServer(systemConfigurationMock.Object, dialogServiceMock.Object, dispatchServiceMock.Object, progressServiceMock.Object, connectStatusServiceMock.Object, addressDiscoveryServiceMock.Object); @@ -52,7 +51,8 @@ public async Task Send_CommonData_Test() { .Setup(x => x.ReceiveData(It.IsAny())) .Callback(x => receivedClipboard.Add(x)); - server.Start(); + var port = await server.Start(); + systemConfigurationMock.SetupGet(x => x.PartnerAddress).Returns($"127.0.0.1:{port}"); var clipboardData = new ClipboardData(); clipboardData.Add("UnicodeText", new MemoryStream(System.Text.Encoding.Unicode.GetBytes("UnicodeText юникод Œ"))); @@ -82,7 +82,8 @@ public async Task Send_Common_Big_Data_Test() { .Setup(x => x.ReceiveData(It.IsAny())) .Callback(x => receivedClipboard = x); - server.Start(); + var port = await server.Start(); + systemConfigurationMock.SetupGet(x => x.PartnerAddress).Returns($"127.0.0.1:{port}"); var clipboardData = new ClipboardData(); @@ -134,8 +135,8 @@ public async Task Send_Files_Test() { files.Add(filename); } - server.Start(); - + var port = await server.Start(); + systemConfigurationMock.SetupGet(x => x.PartnerAddress).Returns($"127.0.0.1:{port}"); try { await client.SendFileDropList(files); await client.SendFileDropList(files); @@ -193,7 +194,8 @@ public async Task Send_Big_File_Test() { files.Add(filename); - server.Start(); + var port = await server.Start(); + systemConfigurationMock.SetupGet(x => x.PartnerAddress).Returns($"127.0.0.1:{port}"); try { await client.SendFileDropList(files); @@ -266,7 +268,8 @@ public async Task Send_Files_And_Folders_Test() { files.Add(directory0_child1); files.Add(directory0_child1_empty0); - server.Start(); + var port = await server.Start(); + systemConfigurationMock.SetupGet(x => x.PartnerAddress).Returns($"127.0.0.1:{port}"); try { await client.SendFileDropList(files); } finally { @@ -350,7 +353,8 @@ public async Task Send_identical_Files__Test() { files.Add(filename0); files.Add(filename0); - server.Start(); + var port = await server.Start(); + systemConfigurationMock.SetupGet(x => x.PartnerAddress).Returns($"127.0.0.1:{port}"); try { await client.SendFileDropList(files); } finally { @@ -410,7 +414,8 @@ public async Task DataClient_Ping_Periodic_Test() { Debug.WriteLine("clientConnected = false"); }); - server.Start(); + var port = await server.Start(); + systemConfigurationMock.SetupGet(x => x.PartnerAddress).Returns($"127.0.0.1:{port}"); client.Start(); await AwaitClientConnectStatus(true); diff --git a/ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs b/ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs index e531580..136ddfb 100644 --- a/ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs +++ b/ShareClipbrd/ShareClipbrd.Core/Services/DataServer.cs @@ -1,4 +1,4 @@ -using System.Buffers; +using System.Buffers; using System.Diagnostics; using System.Net; using System.Net.Sockets; @@ -11,7 +11,7 @@ namespace ShareClipbrd.Core.Services { public interface IDataServer { - void Start(); + Task Start(); Task Stop(); } @@ -23,6 +23,7 @@ public class DataServer : IDataServer { readonly IConnectStatusService connectStatusService; readonly IAddressDiscoveryService addressDiscoveryService; CancellationTokenSource? cts; + TaskCompletionSource tcsStarted; TaskCompletionSource tcsStopped; public DataServer( @@ -46,6 +47,8 @@ IAddressDiscoveryService addressDiscoveryService this.connectStatusService = connectStatusService; this.addressDiscoveryService = addressDiscoveryService; + tcsStarted = new TaskCompletionSource(); + tcsStarted.TrySetResult(-1); tcsStopped = new TaskCompletionSource(); tcsStopped.TrySetResult(true); } @@ -154,9 +157,10 @@ async ValueTask HandleClient(TcpClient tcpClient, CancellationToken cancellation } } - public void Start() { + public Task Start() { cts?.Cancel(); cts = new CancellationTokenSource(); + tcsStarted = new TaskCompletionSource(); tcsStopped = new TaskCompletionSource(); var cancellationToken = cts.Token; Task.Run(async () => { @@ -184,6 +188,8 @@ public void Start() { var tcpServer = new TcpListener(ipEndPoint.Address, ipEndPoint.Port); try { tcpServer.Start(); + tcsStarted.TrySetResult(((IPEndPoint)tcpServer.LocalEndpoint).Port); + Debug.WriteLine($"start tcpServer: {((IPEndPoint)tcpServer.LocalEndpoint)}"); if(useAddressDiscoveryService) { @@ -217,8 +223,11 @@ public void Start() { } connectStatusService.Offline(); } + tcsStarted.TrySetResult(-1); tcsStopped.TrySetResult(true); }, cancellationToken); + + return tcsStarted.Task; } public Task Stop() { diff --git a/ShareClipbrd/ShareClipbrdApp/MainWindow.axaml.cs b/ShareClipbrd/ShareClipbrdApp/MainWindow.axaml.cs index 7967f7f..60b05ef 100644 --- a/ShareClipbrd/ShareClipbrdApp/MainWindow.axaml.cs +++ b/ShareClipbrd/ShareClipbrdApp/MainWindow.axaml.cs @@ -180,7 +180,7 @@ async void SettingsUpdated() { edHostAddress.Text = systemConfiguration!.HostAddress; edPartnerAddress.Text = systemConfiguration!.PartnerAddress; await (dataServer?.Stop() ?? Task.CompletedTask); - dataServer?.Start(); + await (dataServer?.Start() ?? Task.CompletedTask); dataClient?.Stop(); dataClient?.Start(); } From 482115bbe814f0942bd120ceff9d010f8c71b221 Mon Sep 17 00:00:00 2001 From: Vitalii Orazov Date: Sat, 30 Sep 2023 23:14:28 +0300 Subject: [PATCH 4/4] temporary fix stability --- .../ShareClipbrd.Core.Tests/Services/ClientServerTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ShareClipbrd/ShareClipbrd.Core.Tests/Services/ClientServerTests.cs b/ShareClipbrd/ShareClipbrd.Core.Tests/Services/ClientServerTests.cs index f1e7e52..b9f5b38 100644 --- a/ShareClipbrd/ShareClipbrd.Core.Tests/Services/ClientServerTests.cs +++ b/ShareClipbrd/ShareClipbrd.Core.Tests/Services/ClientServerTests.cs @@ -62,6 +62,7 @@ public async Task Send_CommonData_Test() { clipboardData.Add("Text", new MemoryStream(System.Text.Encoding.Unicode.GetBytes("Text 0123456789"))); await client.SendData(clipboardData); + await Task.Delay(500); await server.Stop(); client.Stop();