Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 884557a

Browse files
authored
Rewrite SendFile_APM test (#19603)
* Rewrite SendFile_APM test The test sporadically failed with a timeout, but little details are available about why. Most likely it's due to a failure in one of the operations that causes the other to hang. It could also be due to errors getting eaten. I've rewritten the test to both make it simpler code and to address these issues; if it fails again, we'll have a better idea of why. * Remove LingerState usage
1 parent 950db3e commit 884557a

File tree

3 files changed

+34
-112
lines changed

3 files changed

+34
-112
lines changed

src/System.Net.Sockets/tests/FunctionalTests/SendFile.cs

Lines changed: 34 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ public void NotConnected_ThrowsException()
101101
public void SendFile_Synchronous(IPAddress listenAt, bool sendPreAndPostBuffers, int bytesToSend)
102102
{
103103
const int ListenBacklog = 1;
104-
const int LingerTime = 10;
105104
const int TestTimeout = 30000;
106105

107106
// Create file to send
@@ -152,8 +151,7 @@ public void SendFile_Synchronous(IPAddress listenAt, bool sendPreAndPostBuffers,
152151
using (client)
153152
{
154153
client.SendFile(filename, preBuffer, postBuffer, TransmitFileOptions.UseDefaultWorkerThread);
155-
156-
client.LingerState = new LingerOption(true, LingerTime);
154+
client.Shutdown(SocketShutdown.Send);
157155
}
158156

159157
Assert.True(serverThread.Join(TestTimeout), "Completed within allowed time");
@@ -170,86 +168,58 @@ public void SendFile_Synchronous(IPAddress listenAt, bool sendPreAndPostBuffers,
170168
[MemberData(nameof(SendFile_MemberData))]
171169
public void SendFile_APM(IPAddress listenAt, bool sendPreAndPostBuffers, int bytesToSend)
172170
{
173-
const int ListenBacklog = 1;
174-
const int LingerTime = 10;
175-
const int TestTimeout = 30000;
171+
const int ListenBacklog = 1, TestTimeout = 30000;
176172

177173
// Create file to send
178-
byte[] preBuffer;
179-
byte[] postBuffer;
174+
byte[] preBuffer, postBuffer;
180175
Fletcher32 sentChecksum;
181176
string filename = CreateFileToSend(bytesToSend, sendPreAndPostBuffers, out preBuffer, out postBuffer, out sentChecksum);
182177

183178
// Start server
184-
var server = new Socket(listenAt.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
185-
server.BindToAnonymousPort(listenAt);
186-
187-
server.Listen(ListenBacklog);
188-
189-
var serverFinished = new TaskCompletionSource<bool>();
190-
int bytesReceived = 0;
191-
var receivedChecksum = new Fletcher32();
192-
193-
server.AcceptAPM(remote =>
179+
using (var listener = new Socket(listenAt.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
194180
{
195-
Action<int> recvHandler = null;
196-
bool first = true;
181+
listener.BindToAnonymousPort(listenAt);
182+
listener.Listen(ListenBacklog);
197183

198-
var recvBuffer = new byte[256];
199-
recvHandler = received =>
184+
int bytesReceived = 0;
185+
var receivedChecksum = new Fletcher32();
186+
187+
Task serverTask = Task.Run(async () =>
200188
{
201-
if (!first)
189+
using (var serverStream = new NetworkStream(await listener.AcceptAsync(), ownsSocket: true))
202190
{
203-
if (received == 0)
191+
var buffer = new byte[256];
192+
int bytesRead;
193+
while ((bytesRead = await serverStream.ReadAsync(buffer, 0, buffer.Length)) != 0)
204194
{
205-
remote.Dispose();
206-
server.Dispose();
207-
serverFinished.SetResult(true);
208-
return;
195+
bytesReceived += bytesRead;
196+
receivedChecksum.Add(buffer, 0, bytesRead);
209197
}
210-
211-
bytesReceived += received;
212-
receivedChecksum.Add(recvBuffer, 0, received);
213-
}
214-
else
215-
{
216-
first = false;
217198
}
218-
219-
remote.ReceiveAPM(recvBuffer, 0, recvBuffer.Length, SocketFlags.None, recvHandler);
220-
};
221-
222-
recvHandler(0);
223-
});
224-
225-
// Run client
226-
EndPoint clientEndpoint = server.LocalEndPoint;
227-
var client = new Socket(clientEndpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
228-
229-
var clientFinished = new TaskCompletionSource<bool>();
230-
client.ConnectAPM(clientEndpoint, () =>
231-
{
232-
client.SendFileAPM(filename, preBuffer, postBuffer, TransmitFileOptions.UseDefaultWorkerThread, ex =>
199+
});
200+
Task clientTask = Task.Run(async () =>
233201
{
234-
client.LingerState = new LingerOption(true, LingerTime);
235-
client.Dispose();
236-
237-
if (ex != null)
238-
{
239-
clientFinished.SetException(ex);
240-
}
241-
else
202+
using (var client = new Socket(listener.LocalEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
242203
{
243-
clientFinished.SetResult(true);
204+
await client.ConnectAsync(listener.LocalEndPoint);
205+
await Task.Factory.FromAsync(
206+
(callback, state) => client.BeginSendFile(filename, preBuffer, postBuffer, TransmitFileOptions.UseDefaultWorkerThread, callback, state),
207+
iar => client.EndSendFile(iar),
208+
null);
209+
client.Shutdown(SocketShutdown.Send);
244210
}
245211
});
246-
});
247212

248-
Assert.True(clientFinished.Task.Wait(TestTimeout), "Completed within allowed time");
249-
Assert.True(serverFinished.Task.Wait(TestTimeout), "Completed within allowed time");
213+
// Wait for the tasks to complete
214+
Task<Task> firstCompleted = Task.WhenAny(serverTask, clientTask);
215+
Assert.True(firstCompleted.Wait(TestTimeout), "Neither client nor server task completed within allowed time");
216+
firstCompleted.Result.GetAwaiter().GetResult();
217+
Assert.True(Task.WaitAll(new[] { serverTask, clientTask }, TestTimeout), $"Tasks didn't complete within allowed time. Server:{serverTask.Status} Client:{clientTask.Status}");
250218

251-
Assert.Equal(bytesToSend, bytesReceived);
252-
Assert.Equal(sentChecksum.Sum, receivedChecksum.Sum);
219+
// Validate the results
220+
Assert.Equal(bytesToSend, bytesReceived);
221+
Assert.Equal(sentChecksum.Sum, receivedChecksum.Sum);
222+
}
253223

254224
// Clean up the file we created
255225
File.Delete(filename);

src/System.Net.Sockets/tests/FunctionalTests/SocketAPMExtensions.cs

Lines changed: 0 additions & 47 deletions
This file was deleted.

src/System.Net.Sockets/tests/FunctionalTests/System.Net.Sockets.Tests.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
<Compile Include="TimeoutTest.cs" />
3939
<Compile Include="TcpClientTest.cs" />
4040
<Compile Include="Shutdown.cs" />
41-
<Compile Include="SocketAPMExtensions.cs" />
4241
<Compile Include="SocketAsyncEventArgsTest.cs" />
4342
<Compile Include="SocketOptionNameTest.cs" />
4443
<Compile Include="MulticastOptionTest.cs" />

0 commit comments

Comments
 (0)