Refactoring SocketAcceptAsyncTest
[mono.git] / mcs / class / System / Test / System.Net.Sockets / SocketAcceptAsyncTest.cs
1 using System.Threading;
2 using System.Net;
3 using System.Net.Sockets;
4 using NUnit.Framework;
5
6 namespace MonoTests.System.Net.Sockets
7 {
8         [TestFixture]
9         public class SocketAcceptAsyncTest
10         {
11                 [Test]
12                 public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
13                 {
14                         var readyEvent = new ManualResetEvent(false);
15                         var mainEvent = new ManualResetEvent(false);
16                         var listenSocket = new Socket(
17                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
18                         var serverSocket = new Socket(
19                                         AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
20                         Socket acceptedSocket = null;
21
22                         ThreadPool.QueueUserWorkItem(_ =>
23                         {
24                                 listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
25                                 listenSocket.Listen(1);
26
27                                 var asyncEventArgs = new SocketAsyncEventArgs {AcceptSocket = serverSocket};
28                                 asyncEventArgs.Completed += (s, e) =>
29                                 {
30                                         acceptedSocket = e.AcceptSocket;
31                                         mainEvent.Set();
32                                 };
33
34                                 readyEvent.Set();
35
36                                 if (listenSocket.AcceptAsync(asyncEventArgs))
37                                         return;
38                                 acceptedSocket = asyncEventArgs.AcceptSocket;
39                                 mainEvent.Set();
40                         });
41                         Assert.IsTrue(readyEvent.WaitOne(1500));
42
43                         var clientSocket = new Socket(
44                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
45                         clientSocket.Connect(listenSocket.LocalEndPoint);
46                         clientSocket.NoDelay = true;
47
48                         Assert.IsTrue(mainEvent.WaitOne(1500));
49                         Assert.AreEqual(serverSocket, acceptedSocket);
50                         mainEvent.Reset();
51
52                         if (acceptedSocket != null)
53                                 acceptedSocket.Close();
54
55                         listenSocket.Close();
56                         readyEvent.Close();
57                         mainEvent.Close();
58                 }
59         }
60 }