[System] Fix tests that regressed in e6536dd.
[mono.git] / mcs / class / System / Test / System.Net.Sockets / SocketAcceptAsyncTest.cs
1 using System;
2 using System.Threading;
3 using System.Net;
4 using System.Net.Sockets;
5 using NUnit.Framework;
6
7 namespace MonoTests.System.Net.Sockets
8 {
9         [TestFixture]
10         public class SocketAcceptAsyncTest
11         {
12                 [Test]
13 #if FEATURE_NO_BSD_SOCKETS
14                 [ExpectedException (typeof (PlatformNotSupportedException))]
15 #endif
16                 public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
17                 {
18                         var readyEvent = new ManualResetEvent(false);
19                         var mainEvent = new ManualResetEvent(false);
20                         var listenSocket = new Socket(
21                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
22                         var serverSocket = new Socket(
23                                         AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
24                         Socket acceptedSocket = null;
25                         Exception ex = null;
26                         ThreadPool.QueueUserWorkItem(_ =>
27                         {
28                                 SocketAsyncEventArgs asyncEventArgs;
29                                 try {
30                                         listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
31                                         listenSocket.Listen(1);
32
33                                         asyncEventArgs = new SocketAsyncEventArgs {AcceptSocket = serverSocket};
34                                         asyncEventArgs.Completed += (s, e) =>
35                                         {
36                                                 acceptedSocket = e.AcceptSocket;
37                                                 mainEvent.Set();
38                                         };
39
40                                 } catch (Exception e) {
41                                         ex = e;
42                                         return;
43                                 } finally {
44                                         readyEvent.Set();
45                                 }
46
47                                 try {
48                                         if (listenSocket.AcceptAsync(asyncEventArgs))
49                                                 return;
50                                         acceptedSocket = asyncEventArgs.AcceptSocket;
51                                         mainEvent.Set();
52                                 } catch (Exception e) {
53                                         ex = e;
54                                 }
55                         });
56                         Assert.IsTrue(readyEvent.WaitOne(1500));
57                         if (ex != null)
58                                 throw ex;
59
60                         var clientSocket = new Socket(
61                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
62                         clientSocket.Connect(listenSocket.LocalEndPoint);
63                         clientSocket.NoDelay = true;
64
65                         Assert.IsTrue(mainEvent.WaitOne(1500));
66                         Assert.AreEqual(serverSocket, acceptedSocket, "x");
67                         mainEvent.Reset();
68
69                         if (acceptedSocket != null)
70                                 acceptedSocket.Close();
71
72                         listenSocket.Close();
73                         readyEvent.Close();
74                         mainEvent.Close();
75                 }
76         }
77 }