From 829c484300a7fde0e3f3448d1b285a5f51cc5f07 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Tue, 6 Oct 2020 17:22:58 +0200 Subject: [PATCH] also test for async --- .../tests/FunctionalTests/Connect.cs | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Net.Sockets/tests/FunctionalTests/Connect.cs b/src/libraries/System.Net.Sockets/tests/FunctionalTests/Connect.cs index 2e0161c23f5ae9..d794ec8f9b8699 100644 --- a/src/libraries/System.Net.Sockets/tests/FunctionalTests/Connect.cs +++ b/src/libraries/System.Net.Sockets/tests/FunctionalTests/Connect.cs @@ -215,10 +215,9 @@ public unsafe void DisconnectKernelBugRepro() [PlatformSpecific(TestPlatforms.Linux)] public async Task DisposeShouldAbortSyncConnectOnLinux() { - IPAddress ip = (Dns.GetHostAddresses("microsoft.com"))[0]; - IPEndPoint endPoint = new IPEndPoint(ip, 12345); + IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("1.1.1.1"), 23); - using var client = new Socket(SocketType.Stream, ProtocolType.Tcp); + var client = new Socket(SocketType.Stream, ProtocolType.Tcp); Task connectTask = ConnectAsync(client, endPoint); @@ -318,6 +317,46 @@ public ConnectApm(ITestOutputHelper output) : base(output) {} public sealed class ConnectTask : Connect { public ConnectTask(ITestOutputHelper output) : base(output) {} + + [Fact] + [PlatformSpecific(TestPlatforms.Linux)] + public async Task DisposeShouldAbortSyncConnectOnLinux() + { + IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("1.1.1.1"), 23); + + var client = new Socket(SocketType.Stream, ProtocolType.Tcp); + + Task connectTask = ConnectAsync(client, endPoint); + + // Make 100% sure the connect operation starts + await Task.Delay(200); + + Task timeoutTask = Task.Delay(2000); + Task disposeTask = Task.Run(() => client.Dispose()); + + Task finishedFirst = null; + try + { + finishedFirst = await Task.WhenAny(connectTask, timeoutTask, disposeTask); + } + catch (SocketException ex) + { + Assert.True(finishedFirst == connectTask, $"Got {ex.SocketErrorCode} during Dispose: {ex.Message}"); + } + + if (finishedFirst == timeoutTask) + { + throw new TimeoutException(); + } + else if (finishedFirst == connectTask) + { + await disposeTask; + } + else + { + await Assert.ThrowsAsync(() => connectTask); + } + } } public sealed class ConnectEap : Connect