[bcl] Remove the ValueAdd and InetAccess NUnit categories (#2212)
[mono.git] / mcs / class / System / Test / System.Net.Sockets / SocketTest.cs
index 9551c1e6027131d4217bd59a13d986438873d5e2..9a24b95e1b1642201544691b3af094e39acc17af 100755 (executable)
@@ -28,7 +28,6 @@ using MonoTests.Helpers;
 namespace MonoTests.System.Net.Sockets
 {
        [TestFixture]
-       [Category ("RequiresBSDSockets")]
        public class SocketTest
        {
                // note: also used in SocketCas tests
@@ -36,6 +35,9 @@ namespace MonoTests.System.Net.Sockets
                public const int BogusPort = 23483;
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ConnectIPAddressAny ()
                {
                        IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
@@ -85,7 +87,10 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
-               [Category ("InetAccess")]
+               [Category ("NotWorking")]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BogusEndConnect ()
                {
                        IPAddress ipOne = IPAddress.Parse (BogusAddress);
@@ -156,6 +161,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void AcceptBlockingStatus()
                {
                        bool block;
@@ -200,6 +208,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ConnectFailAsync ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -222,6 +233,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SetSocketOptionBoolean ()
                {
                        IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
@@ -233,6 +247,9 @@ namespace MonoTests.System.Net.Sockets
                        }
                }
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void TestSelect1 ()
                {
                        Socket srv = CreateServer (NetworkHelpers.FindFreePort ());
@@ -370,7 +387,11 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#else
                [ExpectedException (typeof (ObjectDisposedException))]
+#endif
                public void Disposed19 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
@@ -381,7 +402,11 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#else
                [ExpectedException (typeof (ObjectDisposedException))]
+#endif
                public void Disposed20 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
@@ -392,7 +417,11 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#else
                [ExpectedException (typeof (ObjectDisposedException))]
+#endif
                public void Disposed21 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
@@ -403,7 +432,11 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#else
                [ExpectedException (typeof (ObjectDisposedException))]
+#endif
                public void Disposed22 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
@@ -424,6 +457,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void GetHashCodeTest ()
                {
                        Socket server = new Socket (AddressFamily.InterNetwork,
@@ -459,6 +495,7 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+               [Category ("RequiresBSDSockets")] // This verifies particular error codes, which we don't care about when nothing's working anyway.
                public void SocketErrorTest ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -700,6 +737,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void IsBoundTcp ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -732,6 +772,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void IsBoundUdp ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1207,9 +1250,9 @@ namespace MonoTests.System.Net.Sockets
                        Socket sock = new Socket (AddressFamily.InterNetwork,
                                                  SocketType.Stream,
                                                  ProtocolType.Tcp);
-                       
+
                        Assert.AreEqual (false, sock.NoDelay, "NoDelayDefaultTcp");
-                       
+
                        sock.Close ();
                }
 
@@ -1304,7 +1347,11 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#else
                [ExpectedException (typeof(InvalidOperationException))]
+#endif
                public void BeginAcceptNotListening ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1319,6 +1366,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginAccept ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1386,6 +1436,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginAcceptData ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1450,6 +1503,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginAcceptSocketUdp ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1477,6 +1533,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginAcceptSocketBound ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1508,6 +1567,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginAcceptSocket ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1589,6 +1651,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginAcceptSocketAccClosed ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1638,6 +1703,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginConnectAddressPort ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1687,6 +1755,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginConnectAddressPortListen ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1781,6 +1852,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginConnectMultiple2 ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1853,6 +1927,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginConnectMultipleListen ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1917,6 +1994,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginConnectHostPortListen ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -1984,6 +2064,9 @@ namespace MonoTests.System.Net.Sockets
                
                [Test]
                [Category ("NotDotNet")] // "Needs XP or later"
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginDisconnect ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2080,6 +2163,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BindTwice ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2103,6 +2189,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void Close ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2131,6 +2220,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ConnectAddressPort ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2171,6 +2263,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ConnectAddressPortListen ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2257,6 +2352,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ConnectMultiple2 ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2314,6 +2412,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ConnectMultipleListen ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2376,6 +2477,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ConnectHostPortListen ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2414,7 +2518,11 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#else
                [ExpectedException (typeof(ObjectDisposedException))]
+#endif
                public void ConnectHostPortClosed ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2428,6 +2536,9 @@ namespace MonoTests.System.Net.Sockets
                
                [Test]
                [Category ("NotDotNet")] // "Needs XP or later"
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void Disconnect ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
@@ -2485,6 +2596,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveGeneric ()
                {
                        int i;
@@ -2542,6 +2656,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SendGeneric ()
                {
                        int i;
@@ -2599,6 +2716,78 @@ namespace MonoTests.System.Net.Sockets
                        listensock.Close ();
                }
 
+               [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (AggregateException))] // Something catches the PlatformNotSupportedException and re-throws an AggregateException    
+#endif
+               public void ConcurrentExceedSocketLimit ()
+               {
+                       var tasks = new Task[4];
+                       for (int i = 0; i < 4; i++) {
+                               tasks[i] = Task.Factory.StartNew (() => SendGenericExceedBuffer ());
+                       }
+                       Task.WaitAll (tasks);
+               }
+
+               [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
+               public void SendGenericExceedBuffer ()
+               {
+                       // Create a buffer larger than the default max.
+                       const int BUFFER_SIZE = 65 * 1024;
+                       int i;
+
+                       IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
+
+                       Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       listensock.Bind (endpoint);
+                       listensock.Listen (1);
+
+                       Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       sendsock.Connect (endpoint);
+
+                       Socket clientsock = listensock.Accept ();
+
+                       byte[] sendbuf = new byte[BUFFER_SIZE];
+
+                       for (i = 0; i < BUFFER_SIZE; i++) {
+                               sendbuf[i] = (byte)i;
+                       }
+
+                       Task sendTask = Task.Factory.StartNew(() => {
+                               int sent = sendsock.Send (sendbuf);
+
+                               Assert.AreEqual (BUFFER_SIZE, sent, "#1");
+                       });
+
+                       byte[] recvbuf = new byte[BUFFER_SIZE];
+
+                       Task recvTask = Task.Factory.StartNew(() => {
+                               int totalReceived = 0;
+                               byte[] buffer = new byte[256];
+                               while (totalReceived < sendbuf.Length) {
+                                       int recvd = clientsock.Receive (buffer, 0, buffer.Length, SocketFlags.None);
+                                       Array.Copy (buffer, 0, recvbuf, totalReceived, recvd);
+                                       totalReceived += recvd;
+                               }
+
+                               Assert.AreEqual (BUFFER_SIZE, totalReceived, "#2");
+                       });
+
+                       Assert.IsTrue (Task.WaitAll (new []{sendTask, recvTask}, 20 * 1000), "#2a");
+
+                       for (i = 0; i < BUFFER_SIZE; i++) {
+                               Assert.AreEqual (recvbuf[i], sendbuf[i],
+                                                "#3/" + i.ToString());
+                       }
+
+                       sendsock.Close ();
+                       clientsock.Close ();
+                       listensock.Close ();
+               }
+
                [Test]
                public void ListenNotBound ()
                {
@@ -2634,6 +2823,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void CloseWhileReceiving ()
                {
                        CWRSocket = new Socket (AddressFamily.InterNetwork,
@@ -3003,6 +3195,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], ref EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom1_Buffer_Null ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3044,6 +3239,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], ref EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom1_Socket_Closed ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3064,6 +3262,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom2_Buffer_Null ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3105,6 +3306,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom2_Socket_Closed ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3125,6 +3329,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom3_Buffer_Null ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3167,6 +3374,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom3_Size_OutOfRange ()
                {
                        Socket s;
@@ -3208,6 +3418,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom3_Socket_Closed ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3229,6 +3442,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom4_Buffer_Null ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3248,6 +3464,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom4_Offset_OutOfRange ()
                {
                        Socket s;
@@ -3311,6 +3530,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom4_Size_OutOfRange ()
                {
                        Socket s;
@@ -3369,6 +3591,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref EndPoint)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveFrom4_Socket_Closed ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
@@ -3391,6 +3616,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ReceiveRemoteClosed ()
                {
                        var port = NetworkHelpers.FindFreePort ();
@@ -3418,6 +3646,9 @@ namespace MonoTests.System.Net.Sockets
                //
                // Test case for bug #471580
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void UdpDoubleBind ()
                {
                        using (Socket s = new Socket (AddressFamily.InterNetwork,
@@ -3451,6 +3682,9 @@ namespace MonoTests.System.Net.Sockets
 
                // Test case for bug #31557
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void TcpDoubleBind ()
                {
                        using (Socket s = new Socket (AddressFamily.InterNetwork,
@@ -3484,27 +3718,84 @@ namespace MonoTests.System.Net.Sockets
                        }
                }
 
+               // Test case for https://bugzilla.novell.com/show_bug.cgi?id=443346
+               // See also https://bugzilla.xamarin.com/show_bug.cgi?id=52157
                [Test]
-               [Category ("NotOnMac")]
-                public void ConnectedProperty ()
-                {
-                       TcpListener listener = new TcpListener (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
+               public void ConnectedProperty ()
+               {
+                       var port = NetworkHelpers.FindFreePort ();
+                       var listener = new TcpListener (IPAddress.Loopback, port);
                        listener.Start();
 
-                       Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-                       client.Connect (IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port);
-                       Socket server = listener.AcceptSocket ();
+                       var client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       client.Connect (IPAddress.Loopback, port);
+                       var server = listener.AcceptSocket ();
 
-                       try {
-                               server.EndSend(server.BeginSend (new byte[10], 0, 10, SocketFlags.None, null, null));
+                       const int blobSize = 2048;
+
+                       // Small send/recv buffers so that our send operation will fill them
+                       server.ReceiveBufferSize = server.SendBufferSize = 256;
+                       client.ReceiveBufferSize = client.SendBufferSize = 256;
+
+                       // Setting this linger state causes shutdown to be a hard close (RST if send data is pending)
+                       server.LingerState = client.LingerState = new LingerOption (true, 0);
+
+                       // KeepAlive being set introduces another opportunity for a RST according to some documentation
+                       server.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
+                       client.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
+
+                       try 
+                       {
+                               // Fill the send buffer
+                               client.Send (new byte[blobSize]);
+                               // Now shut down the socket. Because of the linger state this will hard close and send RST.
+                               client.Shutdown (SocketShutdown.Both);
                                client.Close ();
-                               try {
-                                       server.EndReceive (server.BeginReceive (new byte[10], 0, 10, SocketFlags.None, null, null));
-                               } catch {
+
+                               Assert.IsFalse (client.Connected);
+                               Assert.IsTrue (server.Connected);
+
+                               var isDead = false;
+
+                               try 
+                               {
+                                       // On Windows this BeginSend succeeds... it really shouldn't and a sync send fails.
+                                       // On Linux this fails with a ConnectionReset.
+                                       var ar = server.BeginSend (new byte[blobSize], 0, blobSize, SocketFlags.None, null, null);
+                                       // On Mac we get an erroneous WSAESHUTDOWN (10058) here
+                                       server.EndSend (ar);
+                               } 
+                               catch (SocketException se) 
+                               {
+                                       isDead = true;
+
+                                       if (
+                                               (se.SocketErrorCode != SocketError.ConnectionReset) &&
+                                               (se.SocketErrorCode != SocketError.Shutdown)
+                                       )
+                                               throw;
+                               } 
+
+                               if (!isDead) 
+                               {
+                                       try 
+                                       {
+                                               // On Windows this second send operation will fail with a ConnectionReset.
+                                               var ar = server.BeginSend (new byte[blobSize], 0, blobSize, SocketFlags.None, null, null);
+                                               server.EndSend (ar);
+                                       } 
+                                       catch (SocketException se) 
+                                       {
+                                               if (se.SocketErrorCode != SocketError.ConnectionReset)
+                                                       throw;
+                                       } 
                                }
-                               Assert.IsTrue (!client.Connected);
-                               Assert.IsTrue (!server.Connected);
-                       } finally {
+
+                               Assert.IsFalse (client.Connected);
+                               Assert.IsFalse (server.Connected);
+                       } 
+                       finally 
+                       {
                                listener.Stop ();
                                client.Close ();
                                server.Close ();
@@ -3689,6 +3980,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SetSocketOption3_AddMembershipIPv4_IPv6MulticastOption ()
                {
                        IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
@@ -3711,6 +4005,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SetSocketOption3_AddMembershipIPv4_MulticastOption ()
                {
                        IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
@@ -3747,6 +4044,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SetSocketOption3_AddMembershipIPv6_IPv6MulticastOption ()
                {
                        if (!Socket.OSSupportsIPv6)
@@ -3762,6 +4062,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SetSocketOption3_AddMembershipIPv6_MulticastOption ()
                {
                        if (!Socket.OSSupportsIPv6)
@@ -3916,6 +4219,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SetSocketOption3_DropMembershipIPv4_IPv6MulticastOption ()
                {
                        IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
@@ -3940,6 +4246,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SetSocketOption3_DropMembershipIPv4_MulticastOption ()
                {
                        IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
@@ -3980,6 +4289,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SetSocketOption3_DropMembershipIPv6_IPv6MulticastOption ()
                {
                        if (!Socket.OSSupportsIPv6)
@@ -3998,6 +4310,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SetSocketOption3_DropMembershipIPv6_MulticastOption ()
                {
                        if (!Socket.OSSupportsIPv6)
@@ -4084,6 +4399,7 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+               [Category ("RequiresBSDSockets")] // on watchOS device this happens: System.Net.Sockets.SocketException : The requested address is not valid in this context. This situation is too complex to detect and throw a PlatformNotSupportedException, so just ignore it.
                public void SetSocketOption_MulticastInterfaceIndex_Any ()
                {
                        IPAddress ip = IPAddress.Parse ("239.255.255.250");
@@ -4096,6 +4412,7 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+               [Category ("RequiresBSDSockets")] // on watchOS device this happens: System.Net.Sockets.SocketException : The requested address is not valid in this context. This situation is too complex to detect and throw a PlatformNotSupportedException, so just ignore it.
                public void SetSocketOption_MulticastInterfaceIndex_Loopback ()
                {
                        IPAddress ip = IPAddress.Parse ("239.255.255.250");
@@ -4132,6 +4449,9 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void Shutdown_NoConnect ()
                {
                        Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
@@ -4228,6 +4548,9 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void SendAsyncFile ()
                {
                        Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
@@ -4272,10 +4595,8 @@ namespace MonoTests.System.Net.Sockets
                                        mSent.Set ();
                                }, clientSocket);
 
-                               if (!mSent.WaitOne (1500))
-                                       throw new TimeoutException ();
-                               if (!mReceived.WaitOne (1500))
-                                       throw new TimeoutException ();
+                               Assert.IsTrue (mSent.WaitOne (5000), "#1");
+                               Assert.IsTrue (mReceived.WaitOne (5000), "#2");
                        } finally {
                                if (File.Exists (temp))
                                        File.Delete (temp);
@@ -4286,56 +4607,104 @@ namespace MonoTests.System.Net.Sockets
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void ConnectToIPV4EndPointUsingDualModelSocket () {
-                       using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
-                       using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
+                       /*
+                        * IPv6 DualMode sockets are defaults in Mono. Explicitly specify that
+                        * anyways in this test to make it more interoparable with .NET where
+                        * IPv6 and DualMode needs to be specified.
+                        */
+                       using (var server = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp)) {
+
                                var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
-                                       
+
+                               server.DualMode = true;
                                server.Bind (host);
-                               server.Listen (0);
+                               /*
+                                * Nothing to Accept the connect - we need a backlog to make sure we don't get 
+                                Connection refused.
+                                */
+                               server.Listen (3);
                                
                                var ep = server.LocalEndPoint as IPEndPoint;
-                               
+                               var client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
+                               client.DualMode = true;
                                client.Connect (ep);
-                               client.Disconnect (true);
-                               
+                               client.Disconnect (false);
+                               client.Close ();
+
+                               client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
+                               client.DualMode = true;
                                client.Connect (IPAddress.Loopback, ep.Port);
-                               client.Disconnect (true);
-                               
-                               client.Connect (new [] {IPAddress.Loopback}, ep.Port);
-                               client.Disconnect (true);
+                               client.Disconnect (false);
+                               client.Close ();
+
+                               client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
+                               client.DualMode = true;
+                               client.Connect (new [] { IPAddress.Loopback }, ep.Port);
+                               client.Disconnect (false);
+                               client.Close ();
                        }
                }
                
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void BeginConnectToIPV4EndPointUsingDualModelSocket () {
-                       using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
-                       using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
+                       /*
+                        * IPv6 DualMode sockets are defaults in Mono. Explicitly specify that
+                        * anyways in this test to make it more interoparable with .NET where
+                        * IPv6 and DualMode needs to be specified.
+                        */
+                       using (var server = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp))
+                       {
                                var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
-                                       
+
+                               server.DualMode = true;
                                server.Bind (host);
-                               server.Listen (0);
+                               server.Listen (10);
                                
                                var ep = server.LocalEndPoint as IPEndPoint;
-                               
+
                                BCCalledBack.Reset ();
+                               var client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
+                               client.DualMode = true;
                                var ar1 = client.BeginConnect (ep, BCCallback, client);
                                Assert.IsTrue (BCCalledBack.WaitOne (10000), "#1");
-                               client.Disconnect (true);
-                               
+                               Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#2");
+                               Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#3");
+                               client.Disconnect (false);
+                               client.Close ();
+
                                BCCalledBack.Reset ();
+                               client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
+                               client.DualMode = true;
                                var ar2 = client.BeginConnect (IPAddress.Loopback, ep.Port, BCCallback, client);
-                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
-                               client.Disconnect (true);
-                               
+                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#4");
+                               Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#5");
+                               Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#6");
+                               client.Disconnect (false);
+                               client.Close ();
+
                                BCCalledBack.Reset ();
+                               client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
+                               client.DualMode = true;
                                var ar3 = client.BeginConnect (new [] {IPAddress.Loopback}, ep.Port, BCCallback, client);
-                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
-                               client.Disconnect (true);
+                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#7");
+                               Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#8");
+                               Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#9");
+                               client.Disconnect (false);
+                               client.Close();
                        }
                }
 
                [Test]
+#if FEATURE_NO_BSD_SOCKETS
+               [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
                public void UdpMulticasTimeToLive ()
                {
                        /* see https://bugzilla.xamarin.com/show_bug.cgi?id=36941 */
@@ -4364,6 +4733,26 @@ namespace MonoTests.System.Net.Sockets
 
                        Assert.IsTrue (mre.WaitOne (1000), "ConnectedAsync timeout");
                }
+
+               [Test] // Covers https://bugzilla.xamarin.com/show_bug.cgi?id=52549
+               public void SocketMismatchProtocol ()
+               {
+                       try {
+                               using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Tcp));
+                               Assert.Fail ("#1");
+                       } catch (SocketException e) {
+                               // Only work on OSX
+                               // Assert.AreEqual(SocketError.ProtocolType, e.SocketErrorCode, "#2");
+                       }
+
+                       try {
+                               using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp));
+                               Assert.Fail ("#3");
+                       } catch (SocketException e) {
+                               // Only work on OSX
+                               // Assert.AreEqual(SocketError.ProtocolType, e.SocketErrorCode, "#4");
+                       }
+               }
        }
 }