28bc6bb81745f29059c186633126c3addaabfa9a
[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         [Category ("RequiresBSDSockets")]
10         public class SocketAcceptAsyncTest
11         {
12                 [Test]
13                 public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
14                 {
15                         var readyEvent = new ManualResetEvent(false);
16                         var mainEvent = new ManualResetEvent(false);
17                         var listenSocket = new Socket(
18                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
19                         var serverSocket = new Socket(
20                                         AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
21                         Socket acceptedSocket = null;
22
23                         ThreadPool.QueueUserWorkItem(_ =>
24                         {
25                                 listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
26                                 listenSocket.Listen(1);
27
28                                 var asyncEventArgs = new SocketAsyncEventArgs {AcceptSocket = serverSocket};
29                                 asyncEventArgs.Completed += (s, e) =>
30                                 {
31                                         acceptedSocket = e.AcceptSocket;
32                                         mainEvent.Set();
33                                 };
34
35                                 readyEvent.Set();
36
37                                 if (listenSocket.AcceptAsync(asyncEventArgs))
38                                         return;
39                                 acceptedSocket = asyncEventArgs.AcceptSocket;
40                                 mainEvent.Set();
41                         });
42                         Assert.IsTrue(readyEvent.WaitOne(1500));
43
44                         var clientSocket = new Socket(
45                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
46                         clientSocket.Connect(listenSocket.LocalEndPoint);
47                         clientSocket.NoDelay = true;
48
49                         Assert.IsTrue(mainEvent.WaitOne(1500));
50                         Assert.AreEqual(serverSocket, acceptedSocket);
51                         mainEvent.Reset();
52
53                         if (acceptedSocket != null)
54                                 acceptedSocket.Close();
55
56                         listenSocket.Close();
57                         readyEvent.Close();
58                         mainEvent.Close();
59                 }
60         }
61 }