Skip to content

Commit bd6c905

Browse files
authored
Socket.Tests: remove TestSettings.UDPRedundancy (#44202)
dotnet/corefx#15697 changed this value to 1, and no-one touched it since then. As the comment in that PR points out, the root cause of the UDP test failures wasn't packet loss, but IPv4 / IPv6 port collision on Unix in dual-mode cases. The value and the for loops are complicating Socket test code unnecessarily, simplification seems reasonable.
1 parent d8b2120 commit bd6c905

File tree

8 files changed

+54
-140
lines changed

8 files changed

+54
-140
lines changed

src/libraries/Common/tests/System/Net/Sockets/TestSettings.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,6 @@ public static class TestSettings
1111
public const int PassingTestTimeout = 10000;
1212
public const int FailingTestTimeout = 100;
1313

14-
// Number of redundant UDP packets to send to increase test reliability
15-
// Update: was 10, changing to 1 to measure impact of random test failures occurring on *nix.
16-
// Certain random failures appear to be caused by a UDP client sending in a loop (based on UDPRedundancy)
17-
// to a server which was closed but another server created (on a different thread \ test) that happens to
18-
// have the same port #.
19-
// This occurs on *nix but not Windows because *nix uses random values (1024-65535) while Windows increments.
20-
public const int UDPRedundancy = 1;
21-
2214
public static Task WhenAllOrAnyFailedWithTimeout(params Task[] tasks) => tasks.WhenAllOrAnyFailed(PassingTestTimeout);
2315
}
2416
}

src/libraries/System.Net.Sockets/tests/FunctionalTests/DualModeSocketTest.cs

Lines changed: 33 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1090,12 +1090,8 @@ private void DualModeSendTo_IPEndPointToHost_Helper(IPAddress connectTo, IPAddre
10901090
using (Socket client = new Socket(SocketType.Dgram, ProtocolType.Udp))
10911091
using (SocketUdpServer server = new SocketUdpServer(_log, listenOn, dualModeServer, out int port))
10921092
{
1093-
// Send a few packets, in case they aren't delivered reliably.
1094-
for (int i = 0; i < (expectedToTimeout ? 1 : TestSettings.UDPRedundancy); i++)
1095-
{
1096-
int sent = client.SendTo(new byte[1], new IPEndPoint(connectTo, port));
1097-
Assert.Equal(1, sent);
1098-
}
1093+
int sent = client.SendTo(new byte[1], new IPEndPoint(connectTo, port));
1094+
Assert.Equal(1, sent);
10991095

11001096
bool success = server.WaitHandle.WaitOne(expectedToTimeout ? TestSettings.FailingTestTimeout : TestSettings.PassingTestTimeout); // Make sure the bytes were received
11011097
if (!success)
@@ -1189,14 +1185,10 @@ private void DualModeBeginSendTo_EndPointToHost_Helper(IPAddress connectTo, IPAd
11891185
using (Socket client = new Socket(SocketType.Dgram, ProtocolType.Udp))
11901186
using (SocketUdpServer server = new SocketUdpServer(_log, listenOn, dualModeServer, out int port))
11911187
{
1192-
// Send a few packets, in case they aren't delivered reliably.
1193-
for (int i = 0; i < (expectedToTimeout ? 1 : TestSettings.UDPRedundancy); i++)
1194-
{
1195-
IAsyncResult async = client.BeginSendTo(new byte[1], 0, 1, SocketFlags.None, new IPEndPoint(connectTo, port), null, null);
1188+
IAsyncResult async = client.BeginSendTo(new byte[1], 0, 1, SocketFlags.None, new IPEndPoint(connectTo, port), null, null);
11961189

1197-
int sent = client.EndSendTo(async);
1198-
Assert.Equal(1, sent);
1199-
}
1190+
int sent = client.EndSendTo(async);
1191+
Assert.Equal(1, sent);
12001192

12011193
bool success = server.WaitHandle.WaitOne(expectedToTimeout ? TestSettings.FailingTestTimeout : TestSettings.PassingTestTimeout); // Make sure the bytes were received
12021194
if (!success)
@@ -1311,28 +1303,24 @@ private void DualModeSendToAsync_IPEndPointToHost_Helper(IPAddress connectTo, IP
13111303
using (Socket client = new Socket(SocketType.Dgram, ProtocolType.Udp))
13121304
using (SocketUdpServer server = new SocketUdpServer(_log, listenOn, dualModeServer, out int port))
13131305
{
1314-
// Send a few packets, in case they aren't delivered reliably.
1315-
for (int i = 0; i < (expectedToTimeout ? 1 : TestSettings.UDPRedundancy); i++)
1306+
using (ManualResetEvent waitHandle = new ManualResetEvent(false))
13161307
{
1317-
using (ManualResetEvent waitHandle = new ManualResetEvent(false))
1308+
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
1309+
args.RemoteEndPoint = new IPEndPoint(connectTo, port);
1310+
args.SetBuffer(new byte[1], 0, 1);
1311+
args.UserToken = waitHandle;
1312+
args.Completed += AsyncCompleted;
1313+
1314+
bool async = client.SendToAsync(args);
1315+
if (async)
13181316
{
1319-
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
1320-
args.RemoteEndPoint = new IPEndPoint(connectTo, port);
1321-
args.SetBuffer(new byte[1], 0, 1);
1322-
args.UserToken = waitHandle;
1323-
args.Completed += AsyncCompleted;
1324-
1325-
bool async = client.SendToAsync(args);
1326-
if (async)
1327-
{
1328-
Assert.True(waitHandle.WaitOne(TestSettings.PassingTestTimeout), "Timeout while waiting for connection");
1329-
}
1330-
1331-
Assert.Equal(1, args.BytesTransferred);
1332-
if (args.SocketError != SocketError.Success)
1333-
{
1334-
throw new SocketException((int)args.SocketError);
1335-
}
1317+
Assert.True(waitHandle.WaitOne(TestSettings.PassingTestTimeout), "Timeout while waiting for connection");
1318+
}
1319+
1320+
Assert.Equal(1, args.BytesTransferred);
1321+
if (args.SocketError != SocketError.Success)
1322+
{
1323+
throw new SocketException((int)args.SocketError);
13361324
}
13371325
}
13381326

@@ -1605,7 +1593,7 @@ private void BeginReceiveFrom_Helper(IPAddress listenOn, IPAddress connectTo, bo
16051593
// Assert.Equal(AddressFamily.InterNetworkV6, remoteEndPoint.AddressFamily);
16061594
// Assert.Equal(connectTo.MapToIPv6(), remoteEndPoint.Address);
16071595

1608-
SocketUdpClient client = new SocketUdpClient(_log, serverSocket, connectTo, port, redundant: !expectedToTimeout);
1596+
SocketUdpClient client = new SocketUdpClient(_log, serverSocket, connectTo, port);
16091597
bool success = async.AsyncWaitHandle.WaitOne(expectedToTimeout ? TestSettings.FailingTestTimeout : TestSettings.PassingTestTimeout);
16101598
if (!success)
16111599
{
@@ -1750,7 +1738,7 @@ private void ReceiveFromAsync_Helper(IPAddress listenOn, IPAddress connectTo, bo
17501738
args.Completed += AsyncCompleted;
17511739

17521740
bool async = serverSocket.ReceiveFromAsync(args);
1753-
SocketUdpClient client = new SocketUdpClient(_log, serverSocket, connectTo, port, redundant: !expectedToTimeout);
1741+
SocketUdpClient client = new SocketUdpClient(_log, serverSocket, connectTo, port);
17541742
if (async && !waitHandle.WaitOne(expectedToTimeout ? TestSettings.FailingTestTimeout : TestSettings.PassingTestTimeout))
17551743
{
17561744
throw new TimeoutException();
@@ -1978,10 +1966,7 @@ public void ReceiveMessageFromAsync_SocketAsyncEventArgs_Success(bool ipv4)
19781966
var ep = new IPEndPoint(loopback, receiverPort);
19791967
for (int iters = 0; iters < 5; iters++)
19801968
{
1981-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
1982-
{
1983-
sender.SendTo(new byte[DataLength], ep);
1984-
}
1969+
sender.SendTo(new byte[DataLength], ep);
19851970

19861971
if (!receiver.ReceiveMessageFromAsync(args))
19871972
{
@@ -2203,7 +2188,7 @@ private void BeginReceiveMessageFrom_Helper(IPAddress listenOn, IPAddress connec
22032188
// Assert.Equal(AddressFamily.InterNetworkV6, remoteEndPoint.AddressFamily);
22042189
// Assert.Equal(connectTo.MapToIPv6(), remoteEndPoint.Address);
22052190

2206-
SocketUdpClient client = new SocketUdpClient(_log, serverSocket, connectTo, port, redundant: !expectedToTimeout);
2191+
SocketUdpClient client = new SocketUdpClient(_log, serverSocket, connectTo, port);
22072192
bool success = async.AsyncWaitHandle.WaitOne(expectedToTimeout ? TestSettings.FailingTestTimeout : TestSettings.PassingTestTimeout);
22082193
if (!success)
22092194
{
@@ -2378,7 +2363,7 @@ private void ReceiveMessageFromAsync_Helper(IPAddress listenOn, IPAddress connec
23782363
bool async = serverSocket.ReceiveMessageFromAsync(args);
23792364
Assert.True(async);
23802365

2381-
SocketUdpClient client = new SocketUdpClient(_log, serverSocket, connectTo, port, redundant: !expectedToTimeout);
2366+
SocketUdpClient client = new SocketUdpClient(_log, serverSocket, connectTo, port);
23822367
if (!waitHandle.WaitOne(serverSocket.ReceiveTimeout))
23832368
{
23842369
throw new TimeoutException();
@@ -2708,7 +2693,7 @@ protected class SocketUdpClient
27082693
private IPAddress _connectTo;
27092694
private Socket _serverSocket;
27102695

2711-
public SocketUdpClient(ITestOutputHelper output, Socket serverSocket, IPAddress connectTo, int port, bool redundant = true, bool sendNow = true)
2696+
public SocketUdpClient(ITestOutputHelper output, Socket serverSocket, IPAddress connectTo, int port, bool sendNow = true)
27122697
{
27132698
_output = output;
27142699

@@ -2718,25 +2703,22 @@ public SocketUdpClient(ITestOutputHelper output, Socket serverSocket, IPAddress
27182703

27192704
if (sendNow)
27202705
{
2721-
Task.Run(() => ClientSend(redundant));
2706+
Task.Run(() => ClientSend());
27222707
}
27232708
}
27242709

2725-
public void ClientSend(bool redundant = true, int timeout = 3)
2710+
public void ClientSend(int timeout = 3)
27262711
{
27272712
try
27282713
{
27292714
Socket socket = new Socket(_connectTo.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
27302715
socket.SendTimeout = timeout * 1000;
27312716

2732-
for (int i = 0; i < (redundant ? TestSettings.UDPRedundancy : 1); i++)
2733-
{
2734-
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
2735-
e.RemoteEndPoint = new IPEndPoint(_connectTo, _port);
2736-
e.SetBuffer(new byte[1], 0, 1);
2717+
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
2718+
e.RemoteEndPoint = new IPEndPoint(_connectTo, _port);
2719+
e.SetBuffer(new byte[1], 0, 1);
27372720

2738-
socket.SendToAsync(e);
2739-
}
2721+
socket.SendToAsync(e);
27402722
}
27412723
catch (SocketException e)
27422724
{

src/libraries/System.Net.Sockets/tests/FunctionalTests/IPPacketInformationTest.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,7 @@ private IPPacketInformation GetNonDefaultIPPacketInformation()
7070
Assert.True(receiver.ReceiveMessageFromAsync(receiveArgs), "receiver.ReceiveMessageFromAsync");
7171

7272
// Send a few packets, in case they aren't delivered reliably.
73-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
74-
{
75-
sender.SendTo(new byte[1], new IPEndPoint(IPAddress.Loopback, port));
76-
}
73+
sender.SendTo(new byte[1], new IPEndPoint(IPAddress.Loopback, port));
7774

7875
Assert.True(waitHandle.WaitOne(ReceiveTimeout), "waitHandle.WaitOne");
7976

src/libraries/System.Net.Sockets/tests/FunctionalTests/ReceiveMessageFrom.cs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@ public void Success(bool forceNonBlocking)
2929

3030
sender.ForceNonBlocking(forceNonBlocking);
3131

32-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
33-
{
34-
sender.SendTo(new byte[1024], new IPEndPoint(IPAddress.Loopback, port));
35-
}
32+
sender.SendTo(new byte[1024], new IPEndPoint(IPAddress.Loopback, port));
3633

3734
IPPacketInformation packetInformation;
3835
SocketFlags flags = SocketFlags.None;
@@ -69,10 +66,7 @@ public void Success_IPv6(bool forceNonBlocking)
6966

7067
sender.ForceNonBlocking(forceNonBlocking);
7168

72-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
73-
{
74-
sender.SendTo(new byte[1024], new IPEndPoint(IPAddress.IPv6Loopback, port));
75-
}
69+
sender.SendTo(new byte[1024], new IPEndPoint(IPAddress.IPv6Loopback, port));
7670

7771
IPPacketInformation packetInformation;
7872
SocketFlags flags = SocketFlags.None;
@@ -122,10 +116,7 @@ public void Success_APM(bool ipv4)
122116
receiver.SetSocketOption(level, SocketOptionName.PacketInformation, true);
123117
sender.Bind(new IPEndPoint(loopback, 0));
124118

125-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
126-
{
127-
sender.SendTo(new byte[1024], new IPEndPoint(loopback, port));
128-
}
119+
sender.SendTo(new byte[1024], new IPEndPoint(loopback, port));
129120

130121
IPPacketInformation packetInformation;
131122
SocketFlags flags = SocketFlags.None;
@@ -203,10 +194,7 @@ public void Success_EventArgs(bool ipv4, int bufferMode)
203194
saea.Completed += delegate { mres.Set(); };
204195

205196
bool pending = receiver.ReceiveMessageFromAsync(saea);
206-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
207-
{
208-
sender.SendTo(new byte[1024], new IPEndPoint(loopback, port));
209-
}
197+
sender.SendTo(new byte[1024], new IPEndPoint(loopback, port));
210198
if (pending) Assert.True(mres.Wait(30000), "Expected operation to complete within timeout");
211199

212200
Assert.Equal(1024, saea.BytesTransferred);

src/libraries/System.Net.Sockets/tests/FunctionalTests/ReceiveMessageFromAsync.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@ public void ReceiveSentMessages_SocketAsyncEventArgs_Success(bool ipv4, bool cha
3535

3636
for (int iters = 0; iters < 5; iters++)
3737
{
38-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
39-
{
40-
sender.SendTo(new byte[DataLength], new IPEndPoint(loopback, port));
41-
}
38+
sender.SendTo(new byte[DataLength], new IPEndPoint(loopback, port));
4239

4340
if (changeReceiveBufferEachCall)
4441
{
@@ -78,10 +75,7 @@ public async Task ReceiveSentMessages_Tasks_Success(bool ipv4)
7875

7976
for (int iters = 0; iters < 5; iters++)
8077
{
81-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
82-
{
83-
sender.SendTo(new byte[DataLength], new IPEndPoint(loopback, port));
84-
}
78+
sender.SendTo(new byte[DataLength], new IPEndPoint(loopback, port));
8579

8680
SocketReceiveMessageFromResult result = await receiver.ReceiveMessageFromAsync(
8781
new ArraySegment<byte>(new byte[DataLength], 0, DataLength), SocketFlags.None,

src/libraries/System.Net.Sockets/tests/FunctionalTests/SelectAndPollTests.cs

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,7 @@ public void SelectRead_Single_Success()
3636
int receiverPort = receiver.BindToAnonymousPort(IPAddress.Loopback);
3737
var receiverEndpoint = new IPEndPoint(IPAddress.Loopback, receiverPort);
3838

39-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
40-
{
41-
sender.SendTo(new byte[1], SocketFlags.None, receiverEndpoint);
42-
}
39+
sender.SendTo(new byte[1], SocketFlags.None, receiverEndpoint);
4340

4441
var list = new List<Socket> { receiver };
4542
Socket.Select(list, null, null, SelectSuccessTimeoutMicroseconds);
@@ -76,11 +73,8 @@ public void SelectRead_Multiple_Success()
7673
int secondReceiverPort = secondReceiver.BindToAnonymousPort(IPAddress.Loopback);
7774
var secondReceiverEndpoint = new IPEndPoint(IPAddress.Loopback, secondReceiverPort);
7875

79-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
80-
{
81-
sender.SendTo(new byte[1], SocketFlags.None, firstReceiverEndpoint);
82-
sender.SendTo(new byte[1], SocketFlags.None, secondReceiverEndpoint);
83-
}
76+
sender.SendTo(new byte[1], SocketFlags.None, firstReceiverEndpoint);
77+
sender.SendTo(new byte[1], SocketFlags.None, secondReceiverEndpoint);
8478

8579
var sw = Stopwatch.StartNew();
8680
Assert.True(SpinWait.SpinUntil(() =>
@@ -127,10 +121,7 @@ public void SelectRead_Multiple_Mixed()
127121
int secondReceiverPort = secondReceiver.BindToAnonymousPort(IPAddress.Loopback);
128122
var secondReceiverEndpoint = new IPEndPoint(IPAddress.Loopback, secondReceiverPort);
129123

130-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
131-
{
132-
sender.SendTo(new byte[1], SocketFlags.None, secondReceiverEndpoint);
133-
}
124+
sender.SendTo(new byte[1], SocketFlags.None, secondReceiverEndpoint);
134125

135126
var list = new List<Socket> { firstReceiver, secondReceiver };
136127
Socket.Select(list, null, null, SelectSuccessTimeoutMicroseconds);
@@ -276,10 +267,7 @@ public void PollRead_Single_Success()
276267
int receiverPort = receiver.BindToAnonymousPort(IPAddress.Loopback);
277268
var receiverEndpoint = new IPEndPoint(IPAddress.Loopback, receiverPort);
278269

279-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
280-
{
281-
sender.SendTo(new byte[1], SocketFlags.None, receiverEndpoint);
282-
}
270+
sender.SendTo(new byte[1], SocketFlags.None, receiverEndpoint);
283271

284272
Assert.True(receiver.Poll(SelectSuccessTimeoutMicroseconds, SelectMode.SelectRead));
285273
}

src/libraries/System.Net.Sockets/tests/FunctionalTests/SocketOptionNameTest.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,7 @@ private async Task MulticastInterface_Set_Helper(int interfaceIndex)
100100
var receiveBuffer = new byte[1024];
101101
var receiveTask = receiveSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), SocketFlags.None);
102102

103-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
104-
{
105-
sendSocket.SendTo(Encoding.UTF8.GetBytes(message), new IPEndPoint(multicastAddress, port));
106-
}
103+
sendSocket.SendTo(Encoding.UTF8.GetBytes(message), new IPEndPoint(multicastAddress, port));
107104

108105
var cts = new CancellationTokenSource();
109106
Assert.True(await Task.WhenAny(receiveTask, Task.Delay(30_000, cts.Token)) == receiveTask, "Waiting for received data timed out");
@@ -213,10 +210,7 @@ private async Task MulticastInterface_Set_IPv6_Helper(int interfaceIndex)
213210
var receiveBuffer = new byte[1024];
214211
var receiveTask = receiveSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), SocketFlags.None);
215212

216-
for (int i = 0; i < TestSettings.UDPRedundancy; i++)
217-
{
218-
sendSocket.SendTo(Encoding.UTF8.GetBytes(message), new IPEndPoint(multicastAddress, port));
219-
}
213+
sendSocket.SendTo(Encoding.UTF8.GetBytes(message), new IPEndPoint(multicastAddress, port));
220214

221215
var cts = new CancellationTokenSource();
222216
Assert.True(await Task.WhenAny(receiveTask, Task.Delay(30_000, cts.Token)) == receiveTask, "Waiting for received data timed out");

0 commit comments

Comments
 (0)