2007-05-14 Dick Porter <dick@ximian.com>
authorDick Porter <dick@acm.org>
Mon, 14 May 2007 15:22:31 +0000 (15:22 -0000)
committerDick Porter <dick@acm.org>
Mon, 14 May 2007 15:22:31 +0000 (15:22 -0000)
* SocketTest.cs: Tests for bug 75705

svn path=/trunk/mcs/; revision=77362

mcs/class/System/Test/System.Net.Sockets/ChangeLog
mcs/class/System/Test/System.Net.Sockets/SocketTest.cs

index 886abd8af81151db85586c7b2b86970c3baadfbd..ee5ad9088b134e1ee867ad84c1934f35ef678218 100644 (file)
@@ -1,3 +1,7 @@
+2007-05-14  Dick Porter  <dick@ximian.com>
+
+       * SocketTest.cs: Tests for bug 75705
+
 2007-04-21  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * TcpClientTest.cs: Enabled test for bug #81105.
index bbb2b3763178bf5afe91af09b2e122e50c5a48c5..bae5742680b52f32d2b4af1b39acd15a6bbe8b81 100644 (file)
@@ -2573,6 +2573,107 @@ namespace MonoTests.System.Net.Sockets
                        }
                }
 #endif
+
+               static Socket CWRSocket;
+               static bool CWRReceiving = true;
+               static ManualResetEvent CWRReady = new ManualResetEvent (false);
+               
+               private static void CWRReceiveThread ()
+               {
+                       byte[] buf = new byte[256];
+                       
+                       try {
+                               CWRSocket.Receive (buf);
+                       } catch (SocketException) {
+                               CWRReceiving = false;
+                       }
+
+                       CWRReady.Set ();
+               }
+               
+               [Test]
+               public void CloseWhileReceiving ()
+               {
+                       CWRSocket = new Socket (AddressFamily.InterNetwork,
+                                               SocketType.Dgram,
+                                               ProtocolType.Udp);
+                       CWRSocket.Bind (new IPEndPoint (IPAddress.Loopback,
+                                                       1256));
+                       
+                       Thread recv_thread = new Thread (new ThreadStart (CWRReceiveThread));
+                       CWRReady.Reset ();
+                       recv_thread.Start ();
+                       Thread.Sleep (250);     /* Wait for the thread to be already receiving */
+
+                       CWRSocket.Close ();
+                       if (CWRReady.WaitOne (1000, false) == false) {
+                               Assert.Fail ("CloseWhileReceiving wait timed out");
+                       }
+                       
+                       Assert.IsFalse (CWRReceiving);
+               }
+
+               static bool RRCLastRead = false;
+               static ManualResetEvent RRCReady = new ManualResetEvent (false);
+               
+               private static void RRCClientThread ()
+               {
+                       byte[] bytes = new byte[8];
+                       int readbyte;
+                       
+                       Socket sock = new Socket (AddressFamily.InterNetwork,
+                                                 SocketType.Stream,
+                                                 ProtocolType.Tcp);
+                       sock.Connect (new IPEndPoint (IPAddress.Loopback,
+                                                     1257));
+                       
+                       NetworkStream stream = new NetworkStream (sock);
+
+                       readbyte = stream.ReadByte ();
+                       Assertion.AssertEquals ("ReceiveRemoteClosed #1",
+                                               0, readbyte);
+                       
+                       stream.Read (bytes, 0, 0);
+
+                       readbyte = stream.ReadByte ();
+                       Assertion.AssertEquals ("ReceiveRemoteClosed #2",
+                                               0, readbyte);
+                       
+                       stream.Read (bytes, 0, 0);
+
+                       readbyte = stream.ReadByte ();
+                       Assertion.AssertEquals ("ReceiveRemoteClosed #3",
+                                               -1, readbyte);
+
+                       sock.Close ();
+
+                       RRCLastRead = true;
+                       RRCReady.Set ();
+               }
+               
+               [Test]
+               public void ReceiveRemoteClosed ()
+               {
+                       Socket sock = new Socket (AddressFamily.InterNetwork,
+                                                 SocketType.Stream,
+                                                 ProtocolType.Tcp);
+                       sock.Bind (new IPEndPoint (IPAddress.Loopback, 1257));
+                       sock.Listen (1);
+                       
+                       RRCReady.Reset ();
+                       Thread client_thread = new Thread (new ThreadStart (RRCClientThread));
+                       client_thread.Start ();
+                       
+                       Socket client = sock.Accept ();
+                       NetworkStream stream = new NetworkStream (client);
+                       stream.WriteByte (0x00);
+                       stream.WriteByte (0x00);
+                       client.Close ();
+                       sock.Close ();
+
+                       RRCReady.WaitOne (1000, false);
+                       Assert.IsTrue (RRCLastRead);
+               }
        }
 }