SocketConnectAsyncTest.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. namespace MonoTests.System.Net.Sockets
  8. {
  9. [TestFixture]
  10. public class SocketConnectAsyncTest
  11. {
  12. Socket serverSocket;
  13. Socket clientSocket;
  14. SocketAsyncEventArgs clientSocketAsyncArgs;
  15. ManualResetEvent readyEvent;
  16. ManualResetEvent mainEvent;
  17. Exception error;
  18. [TestFixtureSetUp]
  19. public void SetUp ()
  20. {
  21. readyEvent = new ManualResetEvent (false);
  22. mainEvent = new ManualResetEvent (false);
  23. }
  24. [TestFixtureTearDown]
  25. public void TearDown ()
  26. {
  27. readyEvent.Close ();
  28. mainEvent.Close ();
  29. }
  30. void StartServer()
  31. {
  32. readyEvent.Reset();
  33. mainEvent.Reset();
  34. ThreadPool.QueueUserWorkItem (_ => DoWork ());
  35. readyEvent.WaitOne ();
  36. }
  37. void StopServer()
  38. {
  39. if (serverSocket != null)
  40. serverSocket.Close ();
  41. }
  42. void DoWork ()
  43. {
  44. serverSocket = new Socket (
  45. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  46. serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
  47. serverSocket.Listen (1);
  48. var async = new SocketAsyncEventArgs ();
  49. async.Completed += (s,e) => OnAccepted (e);
  50. readyEvent.Set ();
  51. if (!serverSocket.AcceptAsync (async))
  52. OnAccepted (async);
  53. }
  54. void OnAccepted (SocketAsyncEventArgs e)
  55. {
  56. var acceptSocket = e.AcceptSocket;
  57. mainEvent.Set ();
  58. }
  59. [Test]
  60. [Category("NotWorking")]
  61. public void Connect ()
  62. {
  63. StartServer();
  64. EndPoint serverEndpoint = serverSocket.LocalEndPoint;
  65. var m = new ManualResetEvent (false);
  66. var e = new SocketAsyncEventArgs ();
  67. clientSocket = new Socket (
  68. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  69. clientSocketAsyncArgs = new SocketAsyncEventArgs();
  70. clientSocketAsyncArgs.RemoteEndPoint = serverEndpoint;
  71. clientSocketAsyncArgs.Completed += (s,o) => {
  72. if (o.SocketError != SocketError.Success)
  73. error = new SocketException ((int)o.SocketError);
  74. m.Set ();
  75. };
  76. bool res = clientSocket.ConnectAsync(clientSocketAsyncArgs);
  77. if (res) {
  78. if (!m.WaitOne (1500))
  79. throw new TimeoutException ();
  80. }
  81. if (!mainEvent.WaitOne (1500))
  82. throw new TimeoutException ();
  83. if (error != null)
  84. throw error;
  85. m.Reset ();
  86. mainEvent.Reset ();
  87. StopServer();
  88. // Try again to non-listening endpoint, expect error
  89. error = null;
  90. clientSocket = new Socket (
  91. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  92. clientSocketAsyncArgs = new SocketAsyncEventArgs ();
  93. clientSocketAsyncArgs.RemoteEndPoint = serverEndpoint;
  94. clientSocketAsyncArgs.Completed += (s,o) => {
  95. if (o.SocketError != SocketError.Success)
  96. error = new SocketException ((int)o.SocketError);
  97. m.Set ();
  98. };
  99. res = clientSocket.ConnectAsync (clientSocketAsyncArgs);
  100. if (res) {
  101. if (!m.WaitOne (1500))
  102. throw new TimeoutException ();
  103. }
  104. Assert.IsTrue (error != null, "Connect - no error");
  105. SocketException socketException = (SocketException)error;
  106. Assert.IsTrue(socketException.ErrorCode == (int)SocketError.ConnectionRefused);
  107. m.Reset ();
  108. mainEvent.Reset ();
  109. }
  110. }
  111. }