d56bd7d309fee403e74d9c93d4d798a238b66e2c
[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                 private Socket _listenSocket;
13                 private Socket _clientSocket;
14                 private Socket _serverSocket;
15                 private Socket _acceptedSocket;
16                 private ManualResetEvent _readyEvent;
17                 private ManualResetEvent _mainEvent;
18
19                 [TestFixtureSetUp]
20                 public void SetUp()
21                 {
22                         _readyEvent = new ManualResetEvent(false);
23                         _mainEvent = new ManualResetEvent(false);
24
25                         ThreadPool.QueueUserWorkItem(_ => StartListen());
26                         Assert.IsTrue(_readyEvent.WaitOne(1500));
27
28                         _clientSocket = new Socket(
29                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
30                         _clientSocket.Connect(_listenSocket.LocalEndPoint);
31                         _clientSocket.NoDelay = true;
32                 }
33
34                 [TestFixtureTearDown]
35                 public void TearDown()
36                 {
37                         if (_acceptedSocket != null)
38                                 _acceptedSocket.Close();
39                         if (_listenSocket != null)
40                                 _listenSocket.Close();
41                         _readyEvent.Close();
42                         _mainEvent.Close();
43                 }
44
45                 private void StartListen()
46                 {
47                         _listenSocket = new Socket(
48                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
49                         _listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
50                         _listenSocket.Listen(1);
51
52                         _serverSocket = new Socket(
53                                 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
54
55       var async = new SocketAsyncEventArgs();
56                         async.AcceptSocket = _serverSocket;
57                         async.Completed += (s, e) => OnAccepted(e);
58
59                         _readyEvent.Set();
60
61                         if (!_listenSocket.AcceptAsync(async))
62                                 OnAccepted(async);
63                 }
64
65                 private void OnAccepted(SocketAsyncEventArgs e)
66                 {
67                         _acceptedSocket = e.AcceptSocket;
68                         _mainEvent.Set();
69                 }
70
71                 [Test]
72                 public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
73                 {
74                         Assert.IsTrue(_mainEvent.WaitOne(1500));
75                         Assert.AreEqual(_serverSocket, _acceptedSocket);
76                         _mainEvent.Reset();
77                 }
78         }
79 }