[2020-02][System.Native] Handle ReadDir EINTR (#21029)
[mono-project.git] / mcs / class / System / Test / System.Net.Sockets / SocketAsyncTest.cs
blob12b3034b1ab3a2b2e9ae31d7ee1e52eb0032f380
1 using System;
2 using System.Collections;
3 using System.Threading;
4 using System.Net;
5 using System.Net.Sockets;
6 using NUnit.Framework;
8 namespace MonoTests.System.Net.Sockets
10 [TestFixture]
11 public class SocketAsyncTest
13 Socket serverSocket;
14 Socket clientSocket;
15 ManualResetEvent readyEvent;
16 ManualResetEvent mainEvent;
17 Exception error;
19 void SetUp ()
21 readyEvent = new ManualResetEvent (false);
22 mainEvent = new ManualResetEvent (false);
24 ThreadPool.QueueUserWorkItem (_ => DoWork ());
25 readyEvent.WaitOne ();
27 if (error != null)
28 throw error;
30 clientSocket = new Socket (
31 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
32 clientSocket.Connect (serverSocket.LocalEndPoint);
33 clientSocket.NoDelay = true;
36 [TestFixtureTearDown]
37 public void TearDown ()
39 if (serverSocket != null)
40 serverSocket.Close ();
41 readyEvent.Close ();
42 mainEvent.Close ();
45 void DoWork ()
47 try {
48 serverSocket = new Socket (
49 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
50 serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
51 serverSocket.Listen (1);
53 var async = new SocketAsyncEventArgs ();
54 async.Completed += (s,e) => OnAccepted (e);
56 if (!serverSocket.AcceptAsync (async))
57 OnAccepted (async);
58 } catch (Exception e) {
59 error = e;
60 } finally {
61 readyEvent.Set ();
65 void OnAccepted (SocketAsyncEventArgs e)
67 var acceptSocket = e.AcceptSocket;
69 try {
70 var header = new byte [4];
71 acceptSocket.Receive (header);
72 if ((header [0] != 0x12) || (header [1] != 0x34) ||
73 (header [2] != 0x56) || (header [3] != 0x78))
74 throw new InvalidOperationException ();
75 } catch (Exception ex) {
76 error = ex;
77 return;
80 var recvAsync = new SocketAsyncEventArgs ();
81 recvAsync.Completed += (sender, args) => OnReceived (args);
82 recvAsync.SetBuffer (new byte [4], 0, 4);
83 if (!acceptSocket.ReceiveAsync (recvAsync))
84 OnReceived (recvAsync);
86 mainEvent.Set ();
89 void OnReceived (SocketAsyncEventArgs e)
91 if (e.SocketError != SocketError.Success)
92 error = new SocketException ((int) e.SocketError);
93 else if (e.Buffer [0] != 0x9a)
94 error = new InvalidOperationException ();
96 mainEvent.Set ();
99 [Test]
100 [Category("Test")]
101 [Category("MultiThreaded")]
102 #if FEATURE_NO_BSD_SOCKETS
103 [ExpectedException (typeof (PlatformNotSupportedException))]
104 #endif
105 public void SendAsync ()
107 SetUp ();
108 var buffer = new byte [] { 0x12, 0x34, 0x56, 0x78 };
109 var m = new ManualResetEvent (false);
110 var e = new SocketAsyncEventArgs ();
111 e.SetBuffer (buffer, 0, buffer.Length);
112 e.Completed += (s,o) => {
113 if (o.SocketError != SocketError.Success)
114 error = new SocketException ((int)o.SocketError);
115 m.Set ();
117 bool res = clientSocket.SendAsync (e);
118 if (res) {
119 if (!m.WaitOne (1500))
120 Assert.Fail ("Timeout #1");
123 if (!mainEvent.WaitOne (1500))
124 Assert.Fail ("Timeout #2");
125 if (error != null)
126 throw error;
128 m.Reset ();
129 mainEvent.Reset ();
131 buffer [0] = 0x9a;
132 buffer [1] = 0xbc;
133 buffer [2] = 0xde;
134 buffer [3] = 0xff;
135 res = clientSocket.SendAsync (e);
136 if (res) {
137 if (!m.WaitOne (1500))
138 Assert.Fail ("Timeout #3");
141 if (!mainEvent.WaitOne (1500))
142 Assert.Fail ("Timeout #4");
143 if (error != null)
144 throw error;