[System*] Throw a PlatformNotSupported exception when using the networking stack...
[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 #if FEATURE_NO_BSD_SOCKETS
13                 [ExpectedException (typeof (PlatformNotSupportedException))]
14 #endif
15                 public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
16                 {
17                         var readyEvent = new ManualResetEvent(false);
18                         var mainEvent = new ManualResetEvent(false);
19                         var listenSocket = new Socket(
20                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
21                         var serverSocket = new Socket(
22                                         AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
23                         Socket acceptedSocket = null;
24                         Exception ex = null;
25                         ThreadPool.QueueUserWorkItem(_ =>
26                         {
27                                 SocketAsyncEventArgs asyncEventArgs;
28                                 try {
29                                         listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
30                                         listenSocket.Listen(1);
31
32                                         asyncEventArgs = new SocketAsyncEventArgs {AcceptSocket = serverSocket};
33                                         asyncEventArgs.Completed += (s, e) =>
34                                         {
35                                                 acceptedSocket = e.AcceptSocket;
36                                                 mainEvent.Set();
37                                         };
38
39                                 } catch (Exception e) {
40                                         ex = e;
41                                         return;
42                                 } finally {
43                                         readyEvent.Set();
44                                 }
45
46                                 try {
47                                         if (listenSocket.AcceptAsync(asyncEventArgs))
48                                                 return;
49                                         acceptedSocket = asyncEventArgs.AcceptSocket;
50                                 } catch (Exception e) {
51                                         ex = e;
52                                 } finally {
53                                         mainEvent.Set();
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);
67                         mainEvent.Reset();
68
69                         if (acceptedSocket != null)
70                                 acceptedSocket.Close();
71
72                         listenSocket.Close();
73                         readyEvent.Close();
74                         mainEvent.Close();
75                 }
76         }
77 }