d286668707e437635c1bc4e3920b45b4d2fa7072
[mono.git] / mcs / class / System / Test / System.Net.Sockets / SocketAsyncTest.cs
1 using System;
2 using System.Collections;
3 using System.Threading;
4 using System.Net;
5 using System.Net.Sockets;
6 using NUnit.Framework;
7
8 namespace MonoTests.System.Net.Sockets
9 {
10         [TestFixture]
11         [Category ("RequiresBSDSockets")]
12         public class SocketAsyncTest
13         {
14                 Socket serverSocket;
15                 Socket clientSocket;
16                 ManualResetEvent readyEvent;
17                 ManualResetEvent mainEvent;
18                 Exception error;
19
20                 [TestFixtureSetUp]
21                 public void SetUp ()
22                 {
23                         readyEvent = new ManualResetEvent (false);
24                         mainEvent = new ManualResetEvent (false);
25
26                         ThreadPool.QueueUserWorkItem (_ => DoWork ());
27                         readyEvent.WaitOne ();
28
29                         clientSocket = new Socket (
30                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
31                         clientSocket.Connect (serverSocket.LocalEndPoint);
32                         clientSocket.NoDelay = true;
33                 }
34
35                 [TestFixtureTearDown]
36                 public void TearDown ()
37                 {
38                         if (serverSocket != null)
39                                 serverSocket.Close ();
40                         readyEvent.Close ();
41                         mainEvent.Close ();
42                 }
43
44                 void DoWork ()
45                 {
46                         serverSocket = new Socket (
47                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
48                         serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
49                         serverSocket.Listen (1);
50
51                         var async = new SocketAsyncEventArgs ();
52                         async.Completed += (s,e) => OnAccepted (e);
53
54                         readyEvent.Set ();
55
56                         if (!serverSocket.AcceptAsync (async))
57                                 OnAccepted (async);
58                 }
59
60                 void OnAccepted (SocketAsyncEventArgs e)
61                 {
62                         var acceptSocket = e.AcceptSocket;
63
64                         try {
65                                 var header = new byte [4];
66                                 acceptSocket.Receive (header);
67                                 if ((header [0] != 0x12) || (header [1] != 0x34) ||
68                                     (header [2] != 0x56) || (header [3] != 0x78))
69                                         throw new InvalidOperationException ();
70                         } catch (Exception ex) {
71                                 error = ex;
72                                 return;
73                         }
74
75                         var recvAsync = new SocketAsyncEventArgs ();
76                         recvAsync.Completed += (sender, args) => OnReceived (args);
77                         recvAsync.SetBuffer (new byte [4], 0, 4);
78                         if (!acceptSocket.ReceiveAsync (recvAsync))
79                                 OnReceived (recvAsync);
80
81                         mainEvent.Set ();
82                 }
83
84                 void OnReceived (SocketAsyncEventArgs e)
85                 {
86                         if (e.SocketError != SocketError.Success)
87                                 error = new SocketException ((int) e.SocketError);
88                         else if (e.Buffer [0] != 0x9a)
89                                 error = new InvalidOperationException ();
90
91                         mainEvent.Set ();
92                 }
93
94                 [Test]
95                 [Category("Test")]
96                 public void SendAsync ()
97                 {
98                         var buffer = new byte [] { 0x12, 0x34, 0x56, 0x78 };
99                         var m = new ManualResetEvent (false);
100                         var e = new SocketAsyncEventArgs ();
101                         e.SetBuffer (buffer, 0, buffer.Length);
102                         e.Completed += (s,o) => {
103                                 if (o.SocketError != SocketError.Success)
104                                         error = new SocketException ((int)o.SocketError);
105                                 m.Set ();
106                         };
107                         bool res = clientSocket.SendAsync (e);
108                         if (res) {
109                                 if (!m.WaitOne (1500))
110                                         Assert.Fail ("Timeout #1");
111                         }
112
113                         if (!mainEvent.WaitOne (1500))
114                                 Assert.Fail ("Timeout #2");
115                         if (error != null)
116                                 throw error;
117
118                         m.Reset ();
119                         mainEvent.Reset ();
120
121                         buffer [0] = 0x9a;
122                         buffer [1] = 0xbc;
123                         buffer [2] = 0xde;
124                         buffer [3] = 0xff;
125                         res = clientSocket.SendAsync (e);
126                         if (res) {
127                                 if (!m.WaitOne (1500))
128                                         Assert.Fail ("Timeout #3");
129                         }
130
131                         if (!mainEvent.WaitOne (1500))
132                                 Assert.Fail ("Timeout #4");
133                         if (error != null)
134                                 throw error;
135                 }
136         }
137 }