2007-01-24 Dick Porter <dick@ximian.com>
authorDick Porter <dick@acm.org>
Wed, 24 Jan 2007 15:26:47 +0000 (15:26 -0000)
committerDick Porter <dick@acm.org>
Wed, 24 Jan 2007 15:26:47 +0000 (15:26 -0000)
* NetworkStream.cs: 2.0 profile updates, based on a patch by
Sridhar Kulkarni (sridharkulkarni@gmail.com)

2007-01-24  Dick Porter  <dick@ximian.com>

* NetworkStreamTest.cs: Test 2.0 ReadTimeout property

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

mcs/class/System/System.Net.Sockets/ChangeLog
mcs/class/System/System.Net.Sockets/NetworkStream.cs
mcs/class/System/System_test.dll.sources
mcs/class/System/Test/System.Net.Sockets/ChangeLog
mcs/class/System/Test/System.Net.Sockets/NetworkStreamTest.cs [new file with mode: 0644]

index ad1e59c3ce733c57c3da2f7e17cb9f21d211a078..1f60e58e4fe331e68b2f433fb34a58d6b1ca2a79 100644 (file)
@@ -1,3 +1,8 @@
+2007-01-24  Dick Porter  <dick@ximian.com>
+
+       * NetworkStream.cs: 2.0 profile updates, based on a patch by
+       Sridhar Kulkarni (sridharkulkarni@gmail.com)
+
 2007-01-23  Dick Porter  <dick@ximian.com>
 
        * TcpListener.cs: 
index c7ec9b71636880bd3da034955a62707285a52df7..7c7b457c05c0b5f6d989aea8ab5e15fbe879c8c2 100644 (file)
@@ -3,8 +3,10 @@
 //
 // Author:
 //   Miguel de Icaza (miguel@ximian.com)
+//   Sridhar Kulkarni <sridharkulkarni@gmail.com>
 //
 // (C) 2002 Ximian, Inc. http://www.ximian.com
+// Copyright (C) 2002-2006 Novell, Inc.  http://www.novell.com
 //
 
 //
 
 using System.IO;
 using System.Runtime.InteropServices;
+#if NET_2_0
+using System.Timers;
+using System.Threading;
+#endif
 
 namespace System.Net.Sockets
 {
@@ -87,6 +93,15 @@ namespace System.Net.Sockets
                        }
                }
 
+#if NET_2_0
+               public override bool CanTimeout
+               {
+                       get {
+                               return(true);
+                       }
+               }
+#endif
+
                public override bool CanWrite {
                        get {
                                return access == FileAccess.ReadWrite || access == FileAccess.Write;
@@ -129,6 +144,22 @@ namespace System.Net.Sockets
                        }
                }
 
+#if NET_2_0
+               public override int ReadTimeout
+               {
+                       get {
+                               return(socket.ReceiveTimeout);
+                       }
+                       set {
+                               if (value <= 0 && value != Timeout.Infinite) {
+                                       throw new ArgumentOutOfRangeException ("value", "The value specified is less than or equal to zero and is not Infinite.");
+                               }
+                               
+                               socket.ReceiveTimeout = value;
+                       }
+               }
+#endif
+
                protected Socket Socket {
                        get {
                                return socket;
@@ -145,6 +176,22 @@ namespace System.Net.Sockets
                        }
                }
 
+#if NET_2_0
+               public override int WriteTimeout
+               {
+                       get {
+                               return(socket.SendTimeout);
+                       }
+                       set {
+                               if (value <= 0 && value != Timeout.Infinite) {
+                                       throw new ArgumentOutOfRangeException ("value", "The value specified is less than or equal to zero and is not Infinite");
+                               }
+                               
+                               socket.SendTimeout = value;
+                       }
+               }
+#endif
+
                public override IAsyncResult BeginRead (byte [] buffer, int offset, int size,
                                                        AsyncCallback callback, object state)
                {
@@ -206,6 +253,29 @@ namespace System.Net.Sockets
                        ((IDisposable) this).Dispose ();
                }
 
+#if NET_2_0
+               public void Close (int timeout)
+               {
+                       if (timeout < -1) {
+                               throw new ArgumentOutOfRangeException ("timeout", "timeout is less than -1");
+                       }
+                       
+                       System.Timers.Timer close_timer = new System.Timers.Timer ();
+                       close_timer.Elapsed += new ElapsedEventHandler (OnTimeoutClose);
+                       /* NB timeout is in milliseconds here, cf
+                        * seconds in Socket.Close(int)
+                        */
+                       close_timer.Interval = timeout;
+                       close_timer.AutoReset = false;
+                       close_timer.Enabled = true;
+               }
+               
+               private void OnTimeoutClose (object source, ElapsedEventArgs e)
+               {
+                       this.Close ();
+               }
+#endif
+
                protected
 #if NET_2_0
                override
index 9c371fb51045639e4a0e6bdba32e6136da56c753..da97b78500debfc72c9125b42b26b28abc775e18 100644 (file)
@@ -184,6 +184,7 @@ System.Net/WebRequestTest.cs
 System.Net.Configuration/ConnectionManagementSectionTest.cs
 System.Net.Configuration/HttpWebRequestElementTest.cs
 System.Net.Configuration/WebRequestModulesSectionTest.cs
+System.Net.Sockets/NetworkStreamTest.cs
 System.Net.Sockets/TcpClientTest.cs
 System.Net.Sockets/TcpListenerTest.cs
 System.Net.Sockets/SocketTest.cs
index aa34326e942103aa55a3f34d6ee75e44353a7be8..2bc17a588f75b11a8804bdf142d4cb62f0bb5651 100644 (file)
@@ -1,3 +1,7 @@
+2007-01-24  Dick Porter  <dick@ximian.com>
+
+       * NetworkStreamTest.cs: Test 2.0 ReadTimeout property
+
 2007-01-23  Dick Porter  <dick@ximian.com>
 
        * TcpListenerTest.cs: Test 2.0 Start(int) overload
diff --git a/mcs/class/System/Test/System.Net.Sockets/NetworkStreamTest.cs b/mcs/class/System/Test/System.Net.Sockets/NetworkStreamTest.cs
new file mode 100644 (file)
index 0000000..043e023
--- /dev/null
@@ -0,0 +1,67 @@
+// System.Net.Sockets.NetworkStreamTest.cs
+//
+// Author:
+//     Dick Porter (dick@ximian.com)
+//
+// Copyright (C) 2007 Novell, Inc (http://www.novell.com)
+//
+
+using System.Net.Sockets;
+using System.Net;
+using System;
+using System.IO;
+using NUnit.Framework;
+
+
+namespace MonoTests.System.Net.Sockets
+{
+       [TestFixture]
+       public class NetworkStreamTest
+       {
+#if NET_2_0
+               [Test]
+               public void ReadTimeout ()
+               {
+                       Socket sock = new Socket (AddressFamily.InterNetwork,
+                                                 SocketType.Stream,
+                                                 ProtocolType.Tcp);
+                       Socket listen = new Socket (AddressFamily.InterNetwork,
+                                                   SocketType.Stream,
+                                                   ProtocolType.Tcp);
+                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 0);
+                       
+                       listen.Bind (ep);
+                       listen.Listen (1);
+                       
+                       sock.Connect (listen.LocalEndPoint);
+                       
+                       NetworkStream stream = new NetworkStream (sock);
+                       stream.ReadTimeout = 1000;
+
+                       byte[] buf = new byte[1024];
+                       
+                       try {
+                               stream.Read (buf, 0, buf.Length);
+                               Assert.Fail ("ReadTimeout #1");
+                       } catch (IOException ex) {
+                               Exception inner = ex.InnerException;
+                               SocketException sockex = inner as SocketException;
+                               
+                               Assert.IsNotNull (sockex, "ReadTimeout #2");
+
+/* Linux gives error 10035 (EWOULDBLOCK) here, whereas windows has 10060 (ETIMEDOUT)
+                               Assertion.AssertEquals ("ReadTimeout #3",
+                                                       10060,
+                                                       sockex.ErrorCode);
+*/
+                       } catch {
+                               Assert.Fail ("ReadTimeout #4");
+                       } finally {
+                               stream.Close ();
+                               sock.Close ();
+                               listen.Close ();
+                       }
+               }
+#endif
+       }
+}