* System_test.dll.sources: Added IPv6MulticastOptionTest.cs and
authorGert Driesen <drieseng@users.sourceforge.net>
Sun, 28 Jun 2009 16:35:54 +0000 (16:35 -0000)
committerGert Driesen <drieseng@users.sourceforge.net>
Sun, 28 Jun 2009 16:35:54 +0000 (16:35 -0000)
MulticastOptionTest.cs.
* Socket.cs: In GetSocketOption, throw SocketException when (byte [])
option value is null. Use SocketError fields instead of using "magic"
number. In SetSocketOption (SocketOptionLevel, SocketOptionName, object)
only accept Linger, AddMembership, DropMembership and verify option
value.
* MulticastOption.cs: Added argument checks. Save interfaceIndex that is
passed to .ctor, and removed MonoTODO. Renamed arguments to match MS.
Reset InterfaceIndex when LocalAddress is modified, and reset
LocalAddress when InterfaceIndex is modified.
* UdpClient.cs: Modified exception to more closely match MS. Fixed
(int, AddressFamily) .ctor to construct IPv6 endpoint when family is
InterNetworkV6. Added null check for multicastAddr to (IPAddress)
JoinMulticastGroup overload. In (int, IPAddress) and (IPAddress,
IPAddress) overloads of JoinMulticastGroup throw SocketException when
client is IPv4. Added null check for multicastAddr to (IPAddress, int),
overload, and moved JoinMulticastGroup call after argument checks.
* IPv6MulticastOption.cs: Renamed argument names to match MS. Added
null check to set_Group. Added range check to set_InterfaceIndex.
* IPv6MulticastOptionTest.cs: Added .ctor and property tests.
* MulticastOptionTest.cs: Added .ctor and property tests.
* SocketTest.cs: Fixed compiler warnings. Improved tests for
closed socket. Added tests fr GetSocketOption, and SetSocketOption
overloads (for Linger, DontLinger, AddMembership and DropMembership).
* UdpClientTest.cs: Added .ctor and JoinMulticastGroup tests.

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

12 files changed:
mcs/class/System/ChangeLog
mcs/class/System/System.Net.Sockets/ChangeLog
mcs/class/System/System.Net.Sockets/IPv6MulticastOption.cs
mcs/class/System/System.Net.Sockets/MulticastOption.cs
mcs/class/System/System.Net.Sockets/Socket.cs
mcs/class/System/System.Net.Sockets/UdpClient.cs
mcs/class/System/System_test.dll.sources
mcs/class/System/Test/System.Net.Sockets/ChangeLog
mcs/class/System/Test/System.Net.Sockets/IPv6MulticastOptionTest.cs [new file with mode: 0644]
mcs/class/System/Test/System.Net.Sockets/MulticastOptionTest.cs [new file with mode: 0644]
mcs/class/System/Test/System.Net.Sockets/SocketTest.cs
mcs/class/System/Test/System.Net.Sockets/UdpClientTest.cs

index 95649ab87b131ae383e82c230c8602fa1a965404..810f4a6265f619aaebdca14057e30bc4913732c2 100644 (file)
@@ -1,3 +1,8 @@
+2009-06-28  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * System_test.dll.sources: Added IPv6MulticastOptionTest.cs and
+       MulticastOptionTest.cs.
+
 2009-05-14  Jonathan Pryor <jpryor@novell.com>
 
        * Makefile: Distribute Test/test-config-file-net-2.0.
index d1a56b92ca044376d3b12e3cd9603d5e0011cc37..94b98e843a22404eeacb362e444b1b31387d4f09 100644 (file)
@@ -1,3 +1,24 @@
+2009-06-28  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * Socket.cs: In GetSocketOption, throw SocketException when (byte [])
+       option value is null. Use SocketError fields instead of using "magic"
+       number. In SetSocketOption (SocketOptionLevel, SocketOptionName, object)
+       only accept Linger, AddMembership, DropMembership and verify option
+       value.
+       * MulticastOption.cs: Added argument checks. Save interfaceIndex that is
+       passed to .ctor, and removed MonoTODO. Renamed arguments to match MS.
+       Reset InterfaceIndex when LocalAddress is modified, and reset
+       LocalAddress when InterfaceIndex is modified.
+       * UdpClient.cs: Modified exception to more closely match MS. Fixed
+       (int, AddressFamily) .ctor to construct IPv6 endpoint when family is
+       InterNetworkV6. Added null check for multicastAddr to (IPAddress)
+       JoinMulticastGroup overload. In (int, IPAddress) and (IPAddress,
+       IPAddress) overloads of JoinMulticastGroup throw SocketException when
+       client is IPv4. Added null check for multicastAddr to (IPAddress, int),
+       overload, and moved JoinMulticastGroup call after argument checks.
+       * IPv6MulticastOption.cs: Renamed argument names to match MS. Added
+       null check to set_Group. Added range check to set_InterfaceIndex.
+
 2009-06-27 Gonzalo Paniagua Javier <gonzalo@novell.com>
 
        * Socket.cs: turn WSAEINVAL into ArgumentException.
index fec4b7d7808f0a8f114f9f17c43bb354505d6471..9b3631bd4a9e4571367b91512f5a17cdce6cf6b5 100644 (file)
@@ -47,28 +47,37 @@ namespace System.Net.Sockets
                public IPv6MulticastOption (IPAddress group)
                        : this (group, 0)
                {
-
                }
 
-               public IPv6MulticastOption (IPAddress group, long ifIndex)
+               public IPv6MulticastOption (IPAddress group, long ifindex)
                {
                        if (group == null)
-                               throw new ArgumentNullException ("grp");
+                               throw new ArgumentNullException ("group");
+                       if (ifindex < 0 || ifindex > 0xffffffff)
+                               throw new ArgumentOutOfRangeException ("ifindex");
 
                        this.group = group;
-                       this.ifIndex = ifIndex;
+                       this.ifIndex = ifindex;
                }
 
                public IPAddress Group
                {
                        get { return group; }
-                       set { group = value; }
+                       set {
+                               if (value == null)
+                                       throw new ArgumentNullException ("value");
+                               group = value;
+                       }
                }
 
                public long InterfaceIndex
                {
                        get { return ifIndex; }
-                       set { ifIndex = value; }
+                       set {
+                               if (value < 0 || value > 0xffffffff)
+                                       throw new ArgumentOutOfRangeException ("value");
+                               ifIndex = value;
+                       }
                }
        }
 #endif
index 35a8a360d558341cb6f62889f09bb473594b9f14..68f2d76b95c9db6336508032ebe99c7615222a0d 100644 (file)
@@ -46,28 +46,33 @@ namespace System.Net.Sockets
                int iface_index;
 #endif
 
-               public MulticastOption (IPAddress grp)
-                       : this (grp, IPAddress.Any)
+               public MulticastOption (IPAddress group)
+                       : this (group, IPAddress.Any)
                {
-                       group = grp;
                }
+
 #if NET_2_0
-               [MonoTODO ("Get interface IP from interface index")]
                public MulticastOption (IPAddress group, int interfaceIndex)
                {
+                       if (group == null)
+                               throw new ArgumentNullException ("group");
+                       if (interfaceIndex < 0 || interfaceIndex > 0xffffff)
+                               throw new ArgumentOutOfRangeException ("interfaceIndex");
+
                        this.group = group;
+                       this.iface_index = interfaceIndex;
                }
 #endif
-               public MulticastOption (IPAddress grp, IPAddress addr)
-               {
-                       if (grp == null)
-                               throw new ArgumentNullException ("grp");
 
-                       if (addr == null)
-                               throw new ArgumentNullException ("addr");
+               public MulticastOption (IPAddress group, IPAddress mcint)
+               {
+                       if (group == null)
+                               throw new ArgumentNullException ("group");
+                       if (mcint == null)
+                               throw new ArgumentNullException ("mcint");
 
-                       group = grp;
-                       local = addr;
+                       this.group = group;
+                       this.local = mcint;
                }
 
                public IPAddress Group {
@@ -77,13 +82,23 @@ namespace System.Net.Sockets
 
                public IPAddress LocalAddress {
                        get { return local; }
-                       set { local = value; }
+                       set {
+                               local = value;
+#if NET_2_0
+                               iface_index = 0;
+#endif
+                       }
                }
 
 #if NET_2_0
                public int InterfaceIndex {
                        get { return iface_index; }
-                       set { iface_index = value; }
+                       set {
+                               if (value < 0 || value > 0xffffff)
+                                       throw new ArgumentOutOfRangeException ("value");
+                               iface_index = value;
+                               local = null;
+                       }
                }
 #endif
        }
index 68882405e3ebddc852c6b7c330d62ea75be14596..ca333b13f9301e17e3b42669995dfdccd81f5c57 100644 (file)
@@ -2177,6 +2177,10 @@ namespace System.Net.Sockets
                        if (disposed && closed)
                                throw new ObjectDisposedException (GetType ().ToString ());
 
+                       if (opt_value == null)
+                               throw new SocketException ((int) SocketError.Fault,
+                                       "Error trying to dereference an invalid pointer");
+
                        int error;
                        
                        GetSocketOption_arr_internal(socket, level, name, ref opt_value,
@@ -3031,7 +3035,8 @@ namespace System.Net.Sockets
 
                        // I'd throw an ArgumentNullException, but this is what MS does.
                        if (opt_value == null)
-                               throw new SocketException (10014, "Error trying to dereference an invalid pointer");
+                               throw new SocketException ((int) SocketError.Fault,
+                                       "Error trying to dereference an invalid pointer");
                        
                        int error;
                        
@@ -3051,32 +3056,47 @@ namespace System.Net.Sockets
                        if (disposed && closed)
                                throw new ObjectDisposedException (GetType ().ToString ());
 
-                       // NOTE: if a null is passed, the byte[] overload is used instead...
                        if (opt_value == null)
-                               throw new ArgumentNullException("opt_value");
+                               throw new ArgumentNullException("optionValue");
                        
                        int error;
-                       /* From MS documentation on SetSocketOption: "For an
-                        * option with a Boolean data type, specify a nonzero
-                        * value to enable the option, and a zero value to
-                        * disable the option."
-                        * Booleans are only handled in 2.0
-                        */
 
-                       if (opt_value is System.Boolean) {
+                       if (level == SocketOptionLevel.Socket && name == SocketOptionName.Linger) {
+                               LingerOption linger = opt_value as LingerOption;
+                               if (linger == null)
 #if NET_2_0
-                               bool bool_val = (bool) opt_value;
-                               int int_val = (bool_val) ? 1 : 0;
-
-                               SetSocketOption_internal (socket, level, name, null, null, int_val, out error);
+                                       throw new ArgumentException ("A 'LingerOption' value must be specified.", "optionValue");
 #else
-                               throw new ArgumentException ("Use an integer 1 (true) or 0 (false) instead of a boolean.", "opt_value");
+                                       throw new ArgumentException ("optionValue");
 #endif
+                               SetSocketOption_internal (socket, level, name, linger, null, 0, out error);
+                       } else if (level == SocketOptionLevel.IP && (name == SocketOptionName.AddMembership || name == SocketOptionName.DropMembership)) {
+                               MulticastOption multicast = opt_value as MulticastOption;
+                               if (multicast == null)
+#if NET_2_0
+                                       throw new ArgumentException ("A 'MulticastOption' value must be specified.", "optionValue");
+#else
+                                       throw new ArgumentException ("optionValue");
+#endif
+                               SetSocketOption_internal (socket, level, name, multicast, null, 0, out error);
+                       } else if (level == SocketOptionLevel.IPv6 && (name == SocketOptionName.AddMembership || name == SocketOptionName.DropMembership)) {
+                               IPv6MulticastOption multicast = opt_value as IPv6MulticastOption;
+                               if (multicast == null)
+#if NET_2_0
+                                       throw new ArgumentException ("A 'IPv6MulticastOption' value must be specified.", "optionValue");
+#else
+                                       throw new ArgumentException ("optionValue");
+#endif
+                               SetSocketOption_internal (socket, level, name, multicast, null, 0, out error);
                        } else {
-                               SetSocketOption_internal (socket, level, name, opt_value, null, 0, out error);
+#if NET_2_0
+                               throw new ArgumentException ("Invalid value specified.", "optionValue");
+#else
+                               throw new ArgumentException ("optionValue");
+#endif
                        }
 
-                       if (error != 0) {
+                       if (error != 0)
                                if (error == 10022) // WSAEINVAL
                                        throw new ArgumentException ();
                                throw new SocketException (error);
index 5102cae40bccd49c9ac90091f8e2212bc79ff79e..d800b57a92a62f1d9bdaf594a9be5d4874b326c2 100644 (file)
@@ -53,7 +53,11 @@ namespace System.Net.Sockets
                public UdpClient(AddressFamily family)
                {
                        if(family != AddressFamily.InterNetwork && family != AddressFamily.InterNetworkV6)
-                               throw new ArgumentException("Family must be InterNetwork or InterNetworkV6", "family");
+#if NET_2_0
+                               throw new ArgumentException ("Family must be InterNetwork or InterNetworkV6", "family");
+#else
+                               throw new ArgumentException ("family");
+#endif
 
                        this.family = family;
                        InitSocket (null);
@@ -84,23 +88,30 @@ namespace System.Net.Sockets
 #if NET_1_1
                public UdpClient (int port, AddressFamily family)
                {
-                       if (family != AddressFamily.InterNetwork &&
-                           family != AddressFamily.InterNetworkV6) {
+                       if (family != AddressFamily.InterNetwork && family != AddressFamily.InterNetworkV6)
+#if NET_2_0
                                throw new ArgumentException ("Family must be InterNetwork or InterNetworkV6", "family");
-                       }
-                       
+#else
+                               throw new ArgumentException ("family");
+#endif
+
                        if (port < IPEndPoint.MinPort ||
                            port > IPEndPoint.MaxPort) {
                                throw new ArgumentOutOfRangeException ("port");
                        }
-                       
+
                        this.family = family;
 
-                       IPEndPoint localEP = new IPEndPoint (IPAddress.Any, port);
+                       IPEndPoint localEP;
+
+                       if (family == AddressFamily.InterNetwork)
+                               localEP = new IPEndPoint (IPAddress.Any, port);
+                       else
+                               localEP = new IPEndPoint (IPAddress.IPv6Any, port);
                        InitSocket (localEP);
                }
 #endif
-               
+
                public UdpClient (string hostname, int port)
                {
                        if (hostname == null)
@@ -245,6 +256,13 @@ namespace System.Net.Sockets
                {
                        CheckDisposed ();
 
+                       if (multicastAddr == null)
+#if NET_2_0
+                               throw new ArgumentNullException ("multicastAddr");
+#else
+                               throw new NullReferenceException ();
+#endif
+
                        if(family == AddressFamily.InterNetwork)
                                socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
                                        new MulticastOption (multicastAddr));
@@ -261,24 +279,25 @@ namespace System.Net.Sockets
                {
                        CheckDisposed ();
 
-                       /* Does this overload only apply to IPv6?
-                        * Only the IPv6MulticastOption has an
-                        * ifindex-using constructor.  The MS docs
-                        * don't say.
-                        */
-                       if (family == AddressFamily.InterNetworkV6) {
+                       if (multicastAddr == null)
+                               throw new ArgumentNullException ("multicastAddr");
+
+                       if (family == AddressFamily.InterNetworkV6)
                                socket.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership, new IPv6MulticastOption (multicastAddr, ifindex));
-                       }
+                       else
+                               throw new SocketException ((int) SocketError.OperationNotSupported);
                }
 #endif
-               
+
                public void JoinMulticastGroup (IPAddress multicastAddr, int timeToLive)
                {
                        CheckDisposed ();
-                       JoinMulticastGroup (multicastAddr);
+                       if (multicastAddr == null)
+                               throw new ArgumentNullException ("multicastAddr");
                        if (timeToLive < 0 || timeToLive > 255)
                                throw new ArgumentOutOfRangeException ("timeToLive");
 
+                       JoinMulticastGroup (multicastAddr);
                        if(family == AddressFamily.InterNetwork)
                                socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive,
                                        timeToLive);
@@ -295,16 +314,15 @@ namespace System.Net.Sockets
                {
                        CheckDisposed ();
 
-                       if (family == AddressFamily.InterNetwork) {
+                       if (family == AddressFamily.InterNetwork)
                                socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption (multicastAddr, localAddress));
-                       } else if (family == AddressFamily.InterNetworkV6) {
-                               socket.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership, new MulticastOption (multicastAddr, localAddress));
-                       }
+                       else
+                               throw new SocketException ((int) SocketError.OperationNotSupported);
                }
 #endif
-               
+
                #endregion
-#region Data I/O
+               #region Data I/O
                public byte [] Receive (ref IPEndPoint remoteEP)
                {
                        CheckDisposed ();
index a03d1a981351307e4c521fdc191b72aeb5dad356..eae59da5b01a56376db9f8073401d85b3d2fb1d2 100644 (file)
@@ -224,6 +224,8 @@ System.Net/WebClientTest.cs
 System.Net.Configuration/ConnectionManagementSectionTest.cs
 System.Net.Configuration/HttpWebRequestElementTest.cs
 System.Net.Configuration/WebRequestModulesSectionTest.cs
+System.Net.Sockets/IPv6MulticastOptionTest.cs
+System.Net.Sockets/MulticastOptionTest.cs
 System.Net.Sockets/NetworkStreamTest.cs
 System.Net.Sockets/TcpClientTest.cs
 System.Net.Sockets/TcpListenerTest.cs
index a28487aecef171dbed5c998e5ac761b82ff063d8..77033d2342ae0dec4946b2592f1c4c4ff4e0dcdc 100644 (file)
@@ -1,3 +1,12 @@
+2009-06-28  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * IPv6MulticastOptionTest.cs: Added .ctor and property tests.
+       * MulticastOptionTest.cs: Added .ctor and property tests.
+       * SocketTest.cs: Fixed compiler warnings. Improved tests for
+       closed socket. Added tests fr GetSocketOption, and SetSocketOption
+       overloads (for Linger, DontLinger, AddMembership and DropMembership).
+       * UdpClientTest.cs: Added .ctor and JoinMulticastGroup tests.
+
 2009-06-26 Gonzalo Paniagua Javier <gonzalo@novell.com>
 
        * SocketTest.cs: tests for DontLinger.
diff --git a/mcs/class/System/Test/System.Net.Sockets/IPv6MulticastOptionTest.cs b/mcs/class/System/Test/System.Net.Sockets/IPv6MulticastOptionTest.cs
new file mode 100644 (file)
index 0000000..37a3915
--- /dev/null
@@ -0,0 +1,229 @@
+// System.Net.Sockets.IPv6MulticastOptionTest.cs
+//
+// Authors:
+//     Gert Driesen (drieseng@users.sourceforge.net)
+//
+// Copyright (c) 2009 Gert Driesen
+//
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Net.Sockets
+{
+       [TestFixture]
+       public class IPv6MulticastOptionTest
+       {
+               [Test] // .ctor (IPAddress)
+               public void Constructor1 ()
+               {
+                       IPv6MulticastOption option;
+                       IPAddress group;
+
+                       group = IPAddress.Parse ("ff02::1");
+                       option = new IPv6MulticastOption (group);
+                       Assert.AreSame (group, option.Group, "#A:Group");
+                       Assert.AreEqual (0, option.InterfaceIndex, "#A:InterfaceIndex");
+
+                       group = IPAddress.Parse ("224.0.0.23");
+                       option = new IPv6MulticastOption (group);
+                       Assert.AreSame (group, option.Group, "#B:Group");
+                       Assert.AreEqual (0, option.InterfaceIndex, "#B:InterfaceIndex");
+               }
+
+               [Test] // .ctor (IPAddress)
+               public void Constructor1_Group_Null ()
+               {
+                       try {
+                               new IPv6MulticastOption ((IPAddress) null);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("group", ex.ParamName, "#5");
+                       }
+               }
+
+               [Test] // .ctor (IPAddress, Int64)
+               public void Constructor2 ()
+               {
+                       IPv6MulticastOption option;
+                       IPAddress group;
+                       long interfaceIndex;
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       interfaceIndex = 0;
+                       option = new IPv6MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#A:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#A:InterfaceIndex");
+
+                       group = IPAddress.Parse ("ff02::1");
+                       interfaceIndex = 0;
+                       option = new IPv6MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#B:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#B:InterfaceIndex");
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       interfaceIndex = 124;
+                       option = new IPv6MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#C:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#C:InterfaceIndex");
+
+                       group = IPAddress.Parse ("ff02::1");
+                       interfaceIndex = 124;
+                       option = new IPv6MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#D:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#D:InterfaceIndex");
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       interfaceIndex = 0xFFFFFFFF;
+                       option = new IPv6MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#E:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#E:InterfaceIndex");
+
+                       group = IPAddress.Parse ("ff02::1");
+                       interfaceIndex = 0xFFFFFFFF;
+                       option = new IPv6MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#F:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#F:InterfaceIndex");
+               }
+
+               [Test] // .ctor (IPAddress, Int64)
+               public void Constructor2_Group_Null ()
+               {
+                       IPAddress group = null;
+
+                       try {
+                               new IPv6MulticastOption (group, 0);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("group", ex.ParamName, "#5");
+                       }
+               }
+
+               [Test] // .ctor (IPAddress, Int64)
+               public void Constructor2_Ifindex_OutOfRange ()
+               {
+                       IPAddress group = IPAddress.Parse ("ff02::1");
+
+                       try {
+                               new IPv6MulticastOption (group, -1);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("ifindex", ex.ParamName, "#A5");
+                       }
+
+                       try {
+                               new IPv6MulticastOption (group, 0x100000000);
+                               Assert.Fail ("#B1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                               Assert.AreEqual ("ifindex", ex.ParamName, "#B5");
+                       }
+               }
+
+               [Test]
+               public void Group ()
+               {
+                       IPAddress group;
+                       IPv6MulticastOption option;
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       option = new IPv6MulticastOption (group, 5L);
+                       group = IPAddress.Parse ("224.0.0.23");
+                       option.Group = group;
+                       Assert.AreSame (group, option.Group, "#A1");
+                       Assert.AreEqual (5L, option.InterfaceIndex, "#A2");
+                       group = IPAddress.Parse ("239.255.255.250");
+                       option.Group = group;
+                       Assert.AreSame (group, option.Group, "#B1");
+                       Assert.AreEqual (5L, option.InterfaceIndex, "#B2");
+                       group = IPAddress.Parse ("ff02::1");
+                       option.Group = group;
+                       Assert.AreSame (group, option.Group, "#C1");
+                       Assert.AreEqual (5L, option.InterfaceIndex, "#C2");
+               }
+
+               [Test]
+               public void Group_Value_Null ()
+               {
+                       IPAddress group = IPAddress.Parse ("239.255.255.250");
+                       IPv6MulticastOption option = new IPv6MulticastOption (group, 10);
+
+                       try {
+                               option.Group = null;
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("value", ex.ParamName, "#5");
+                       }
+               }
+
+               [Test]
+               public void InterfaceIndex ()
+               {
+                       IPAddress group;
+                       IPv6MulticastOption option;
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       option = new IPv6MulticastOption (group, 10);
+                       option.InterfaceIndex = 0;
+                       Assert.AreSame (group, option.Group, "#A1");
+                       Assert.AreEqual (0, option.InterfaceIndex, "#A2");
+                       option.InterfaceIndex = 124;
+                       Assert.AreSame (group, option.Group, "#B1");
+                       Assert.AreEqual (124, option.InterfaceIndex, "#B2");
+                       option.InterfaceIndex = 0xFFFFFFFF;
+                       Assert.AreSame (group, option.Group, "#C1");
+                       Assert.AreEqual (0xFFFFFFFF, option.InterfaceIndex, "#C3");
+               }
+
+               [Test]
+               public void InterfaceIndex_Value_OutOfRange ()
+               {
+                       IPAddress group = IPAddress.Parse ("239.255.255.250");
+                       IPv6MulticastOption option = new IPv6MulticastOption (group, 10);
+
+                       try {
+                               option.InterfaceIndex = -1;
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("value", ex.ParamName, "#A5");
+                       }
+
+                       try {
+                               option.InterfaceIndex = 0x100000000;
+                               Assert.Fail ("#B1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                               Assert.AreEqual ("value", ex.ParamName, "#B5");
+                       }
+
+                       // ensure original value was retained
+                       Assert.AreEqual (10, option.InterfaceIndex, "#C");
+               }
+       }
+}
diff --git a/mcs/class/System/Test/System.Net.Sockets/MulticastOptionTest.cs b/mcs/class/System/Test/System.Net.Sockets/MulticastOptionTest.cs
new file mode 100644 (file)
index 0000000..684dd39
--- /dev/null
@@ -0,0 +1,364 @@
+// System.Net.Sockets.MulticastOptionTest.cs
+//
+// Authors:
+//     Gert Driesen (drieseng@users.sourceforge.net)
+//
+// Copyright (c) 2009 Gert Driesen
+//
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Net.Sockets
+{
+       [TestFixture]
+       public class MulticastOptionTest
+       {
+               [Test] // .ctor (IPAddress)
+               public void Constructor1 ()
+               {
+                       MulticastOption option;
+                       IPAddress group;
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       option = new MulticastOption (group);
+                       Assert.AreSame (group, option.Group, "#A:Group");
+#if NET_2_0
+                       Assert.AreEqual (0, option.InterfaceIndex, "#A:InterfaceIndex");
+#endif
+                       Assert.AreEqual (IPAddress.Any, option.LocalAddress, "#A:LocalAddress");
+
+                       group = IPAddress.Parse ("ff02::1");
+                       option = new MulticastOption (group);
+                       Assert.AreSame (group, option.Group, "#B:Group");
+#if NET_2_0
+                       Assert.AreEqual (0, option.InterfaceIndex, "#B:InterfaceIndex");
+#endif
+                       Assert.AreEqual (IPAddress.Any, option.LocalAddress, "#B:LocalAddress");
+               }
+
+               [Test] // .ctor (IPAddress)
+               public void Constructor1_Group_Null ()
+               {
+                       try {
+                               new MulticastOption ((IPAddress) null);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("group", ex.ParamName, "#5");
+                       }
+               }
+
+               [Test] // .ctor (IPAddress, IPAddress)
+               public void Constructor2 ()
+               {
+                       MulticastOption option;
+                       IPAddress group;
+                       IPAddress mcint;
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       mcint = IPAddress.Any;
+                       option = new MulticastOption (group, mcint);
+                       Assert.AreSame (group, option.Group, "#A:Group");
+#if NET_2_0
+                       Assert.AreEqual (0, option.InterfaceIndex, "#A:InterfaceIndex");
+#endif
+                       Assert.AreEqual (mcint, option.LocalAddress, "#A:LocalAddress");
+
+                       group = IPAddress.Parse ("ff02::1");
+                       mcint = IPAddress.IPv6Any;
+                       option = new MulticastOption (group, mcint);
+                       Assert.AreSame (group, option.Group, "#B:Group");
+#if NET_2_0
+                       Assert.AreEqual (0, option.InterfaceIndex, "#B:InterfaceIndex");
+#endif
+                       Assert.AreEqual (mcint, option.LocalAddress, "#B:LocalAddress");
+               }
+
+               [Test] // .ctor (IPAddress, IPAddress)
+               public void Constructor2_Group_Null ()
+               {
+                       IPAddress group = null;
+                       IPAddress mcint = IPAddress.Any;
+
+                       try {
+                               new MulticastOption (group, mcint);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("group", ex.ParamName, "#5");
+                       }
+               }
+
+               [Test] // .ctor (IPAddress, IPAddress)
+               public void Constructor2_Mcint_Null ()
+               {
+                       IPAddress group = IPAddress.Parse ("239.255.255.250");
+                       IPAddress mcint = null;
+
+                       try {
+                               new MulticastOption (group, mcint);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("mcint", ex.ParamName, "#5");
+                       }
+               }
+
+#if NET_2_0
+               [Test] // .ctor (IPAddress, Int32)
+               public void Constructor3 ()
+               {
+                       MulticastOption option;
+                       IPAddress group;
+                       int interfaceIndex;
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       interfaceIndex = 0;
+                       option = new MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#A:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#A:InterfaceIndex");
+                       Assert.AreEqual (null, option.LocalAddress, "#A:LocalAddress");
+
+                       group = IPAddress.Parse ("ff02::1");
+                       interfaceIndex = 0;
+                       option = new MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#B:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#B:InterfaceIndex");
+                       Assert.AreEqual (null, option.LocalAddress, "#B:LocalAddress");
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       interfaceIndex = 124;
+                       option = new MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#C:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#C:InterfaceIndex");
+                       Assert.AreEqual (null, option.LocalAddress, "#C:LocalAddress");
+
+                       group = IPAddress.Parse ("ff02::1");
+                       interfaceIndex = 124;
+                       option = new MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#D:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#D:InterfaceIndex");
+                       Assert.AreEqual (null, option.LocalAddress, "#D:LocalAddress");
+
+                       group = IPAddress.Parse ("239.255.255.250");
+                       interfaceIndex = 0xFFFFFF;
+                       option = new MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#E:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#E:InterfaceIndex");
+                       Assert.AreEqual (null, option.LocalAddress, "#E:LocalAddress");
+
+                       group = IPAddress.Parse ("ff02::1");
+                       interfaceIndex = 0xFFFFFF;
+                       option = new MulticastOption (group, interfaceIndex);
+                       Assert.AreSame (group, option.Group, "#F:Group");
+                       Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#F:InterfaceIndex");
+                       Assert.AreEqual (null, option.LocalAddress, "#F:LocalAddress");
+               }
+
+               [Test] // .ctor (IPAddress, Int32)
+               public void Constructor3_Group_Null ()
+               {
+                       IPAddress group = null;
+
+                       try {
+                               new MulticastOption (group, int.MaxValue);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("group", ex.ParamName, "#5");
+                       }
+               }
+
+               [Test] // .ctor (IPAddress, Int32)
+               public void Constructor3_InterfaceIndex_OutOfRange ()
+               {
+                       IPAddress group = IPAddress.Parse ("239.255.255.250");
+
+                       try {
+                               new MulticastOption (group, -1);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("interfaceIndex", ex.ParamName, "#A5");
+                       }
+
+                       try {
+                               new MulticastOption (group, 0x1000000);
+                               Assert.Fail ("#B1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                               Assert.AreEqual ("interfaceIndex", ex.ParamName, "#B5");
+                       }
+               }
+#endif
+
+               [Test]
+               public void Group ()
+               {
+                       IPAddress group;
+                       IPAddress local;
+                       MulticastOption option;
+
+#if NET_2_0
+                       local = Dns.GetHostEntry (string.Empty).AddressList [0];
+#else
+                       local = IPAddress.Loopback;
+#endif
+                       group = IPAddress.Parse ("239.255.255.250");
+                       option = new MulticastOption (group, local);
+                       group = IPAddress.Parse ("224.0.0.23");
+                       option.Group = group;
+                       Assert.AreSame (group, option.Group, "#A1");
+                       Assert.AreSame (local, option.LocalAddress, "#A2");
+                       group = IPAddress.Parse ("239.255.255.250");
+                       option.Group = group;
+                       Assert.AreSame (group, option.Group, "#B1");
+                       Assert.AreSame (local, option.LocalAddress, "#B2");
+                       group = IPAddress.Parse ("ff02::1");
+                       option.Group = group;
+                       Assert.AreSame (group, option.Group, "#C1");
+                       Assert.AreSame (local, option.LocalAddress, "#C2");
+                       option.Group = null;
+                       Assert.IsNull (option.Group, "#D1");
+                       Assert.AreSame (local, option.LocalAddress, "#D2");
+#if NET_2_0
+                       option = new MulticastOption (group, 5);
+                       group = IPAddress.Parse ("224.0.0.23");
+                       option.Group = group;
+                       Assert.AreSame (group, option.Group, "#E1");
+                       Assert.AreEqual (5, option.InterfaceIndex, "#E2");
+                       Assert.IsNull (option.LocalAddress, "#E3");
+#endif
+               }
+
+#if NET_2_0
+               [Test]
+               public void InterfaceIndex ()
+               {
+                       IPAddress group;
+                       IPAddress local;
+                       MulticastOption option;
+               
+                       group = IPAddress.Parse ("239.255.255.250");
+                       option = new MulticastOption (group, 10);
+                       option.InterfaceIndex = 0;
+                       Assert.AreSame (group, option.Group, "#A1");
+                       Assert.AreEqual (0, option.InterfaceIndex, "#A2");
+                       Assert.IsNull (option.LocalAddress, "#A3");
+                       option.InterfaceIndex = 124;
+                       Assert.AreSame (group, option.Group, "#B1");
+                       Assert.AreEqual (124, option.InterfaceIndex, "#B2");
+                       Assert.IsNull (option.LocalAddress, "#B3");
+                       option.InterfaceIndex = 0xFFFFFF;
+                       Assert.AreSame (group, option.Group, "#C1");
+                       Assert.AreEqual (0xFFFFFF, option.InterfaceIndex, "#C2");
+                       Assert.IsNull (option.LocalAddress, "#C3");
+
+                       local = Dns.GetHostEntry (string.Empty).AddressList [0];
+                       option = new MulticastOption (group, local);
+                       option.InterfaceIndex = 10;
+                       Assert.AreSame (group, option.Group, "#D1");
+                       Assert.AreEqual (10, option.InterfaceIndex, "#D2");
+                       Assert.IsNull (option.LocalAddress, "#D3");
+               }
+
+               [Test]
+               public void InterfaceIndex_Value_OutOfRange ()
+               {
+                       IPAddress group = IPAddress.Parse ("239.255.255.250");
+                       MulticastOption option = new MulticastOption (group, 10);
+
+                       try {
+                               option.InterfaceIndex = -1;
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("value", ex.ParamName, "#A5");
+                       }
+
+                       try {
+                               option.InterfaceIndex = 0x1000000;
+                               Assert.Fail ("#B1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                               Assert.AreEqual ("value", ex.ParamName, "#B5");
+                       }
+
+                       // ensure original value was retained
+                       Assert.AreEqual (10, option.InterfaceIndex, "#C");
+               }
+#endif
+
+               [Test]
+               public void LocalAddress ()
+               {
+                       IPAddress group;
+                       IPAddress local;
+                       MulticastOption option;
+
+#if NET_2_0
+                       local = Dns.GetHostEntry (string.Empty).AddressList [0];
+#else
+                       local = IPAddress.Loopback;
+#endif
+                       group = IPAddress.Parse ("239.255.255.250");
+                       option = new MulticastOption (group, local);
+                       local = IPAddress.Loopback;
+                       option.LocalAddress = local;
+                       Assert.AreSame (group, option.Group, "#A1");
+#if NET_2_0
+                       Assert.AreEqual (0, option.InterfaceIndex, "#A2");
+#endif
+                       Assert.AreSame (local, option.LocalAddress, "#A3");
+#if NET_2_0
+                       local = Dns.GetHostEntry (string.Empty).AddressList [0];
+#else
+                       local = IPAddress.Loopback;
+#endif
+                       option.LocalAddress = local;
+                       Assert.AreSame (group, option.Group, "#B1");
+#if NET_2_0
+                       Assert.AreEqual (0, option.InterfaceIndex, "#B2");
+#endif
+                       Assert.AreSame (local, option.LocalAddress, "#B3");
+                       option.LocalAddress = null;
+                       Assert.AreSame (group, option.Group, "#C1");
+#if NET_2_0
+                       Assert.AreEqual (0, option.InterfaceIndex, "#C2");
+#endif
+                       Assert.IsNull (option.LocalAddress, "#C3");
+#if NET_2_0
+                       option = new MulticastOption (group, 5);
+                       local = IPAddress.Loopback;
+                       option.LocalAddress = local;
+                       Assert.AreSame (group, option.Group, "#D1");
+                       Assert.AreEqual (0, option.InterfaceIndex, "#D2");
+                       Assert.AreSame (local, option.LocalAddress, "#D3");
+#endif
+               }
+       }
+}
index b5ef9e03f66b4506c479cd66c6844e7c8ad90884..e45115260cc33c7dd68262c9eaed0d699317bbb5 100644 (file)
@@ -285,36 +285,6 @@ namespace MonoTests.System.Net.Sockets
                        s.Blocking = true;
                }
 
-               [Test]
-               [ExpectedException (typeof (ObjectDisposedException))]
-               public void Disposed3 ()
-               {
-                       Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       s.Close();
-
-                       s.GetSocketOption (0, 0);
-               }
-
-               [Test]
-               [ExpectedException (typeof (ObjectDisposedException))]
-               public void Disposed4 ()
-               {
-                       Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       s.Close();
-
-                       s.GetSocketOption (0, 0, null);
-               }
-
-               [Test]
-               [ExpectedException (typeof (ObjectDisposedException))]
-               public void Disposed5 ()
-               {
-                       Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       s.Close();
-
-                       s.GetSocketOption (0, 0, 0);
-               }
-
                [Test]
                [ExpectedException (typeof (ObjectDisposedException))]
                public void Disposed6 ()
@@ -370,7 +340,6 @@ namespace MonoTests.System.Net.Sockets
                public void Disposed11 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       EndPoint ep = new IPEndPoint (IPAddress.Any, 31337);
                        s.Close();
 
                        s.Receive (buf, 0, 10, 0);
@@ -444,7 +413,6 @@ namespace MonoTests.System.Net.Sockets
                public void Disposed18 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       EndPoint ep = new IPEndPoint (IPAddress.Any, 31337);
                        s.Close();
 
                        s.Send (buf, 0, 10, 0);
@@ -499,7 +467,6 @@ namespace MonoTests.System.Net.Sockets
                public void Disposed23 ()
                {
                        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
-                       EndPoint ep = new IPEndPoint (IPAddress.Any, 31337);
                        s.Close();
 
                        s.Shutdown (0);
@@ -545,7 +512,7 @@ namespace MonoTests.System.Net.Sockets
                }
 
                [Test]
-               public void SocketError ()
+               public void SocketErrorTest ()
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork,
                                                  SocketType.Stream,
@@ -2749,35 +2716,652 @@ namespace MonoTests.System.Net.Sockets
                        }
                }
 #endif
-               [Test]
-               public void SetSocketOption_DontLinger ()
+
+               [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName)
+               public void GetSocketOption1_Socket_Closed ()
+               {
+                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       s.Close ();
+                       try {
+                               s.GetSocketOption (0, 0);
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               // Cannot access a disposed object
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
+                       }
+               }
+
+               [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
+               public void GetSocketOption2_OptionValue_Null ()
+               {
+                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       try {
+                               s.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
+                                       (byte []) null);
+                               Assert.Fail ("#1");
+                               } catch (SocketException ex) {
+                                       // The system detected an invalid pointer address in attempting
+                                       // to use a pointer argument in a call
+                                       Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                                       Assert.AreEqual (10014, ex.ErrorCode, "#3");
+                                       Assert.IsNull (ex.InnerException, "#4");
+                                       Assert.IsNotNull (ex.Message, "#5");
+                                       Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
+#if NET_2_0
+                                       Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
+#endif
+                               }
+               }
+
+               [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
+               public void GetSocketOption2_Socket_Closed ()
+               {
+                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       s.Close ();
+                       try {
+                               s.GetSocketOption (0, 0, (byte []) null);
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               // Cannot access a disposed object
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
+                       }
+               }
+
+               [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
+               public void GetSocketOption3_Socket_Closed ()
+               {
+                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       s.Close ();
+                       try {
+                               s.GetSocketOption (0, 0, 0);
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               // Cannot access a disposed object
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
+               public void SetSocketOption1_DontLinger ()
+               {
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
+                                       new byte [] { 0x00 });
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
+                                       new byte [] { 0x01 });
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
+               public void SetSocketOption1_DontLinger_Null ()
                {
                        using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket,
+                                               SocketOptionName.DontLinger, (byte []) null);
+                                       Assert.Fail ("#1");
+                               } catch (SocketException ex) {
+                                       // The system detected an invalid pointer address in attempting
+                                       // to use a pointer argument in a call
+                                       Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                                       Assert.AreEqual (10014, ex.ErrorCode, "#3");
+                                       Assert.IsNull (ex.InnerException, "#4");
+                                       Assert.IsNotNull (ex.Message, "#5");
+                                       Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
 #if NET_2_0
-                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, false);
+                                       Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
 #endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
+               public void SetSocketOption1_Linger_Null ()
+               {
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket,
+                                               SocketOptionName.DontLinger, (byte []) null);
+                                       Assert.Fail ("#1");
+                               } catch (SocketException ex) {
+                                       // The system detected an invalid pointer address in attempting
+                                       // to use a pointer argument in a call
+                                       Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                                       Assert.AreEqual (10014, ex.ErrorCode, "#3");
+                                       Assert.IsNull (ex.InnerException, "#4");
+                                       Assert.IsNotNull (ex.Message, "#5");
+                                       Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
+#if NET_2_0
+                                       Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
+               public void SetSocketOption1_Socket_Close ()
+               {
+                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       s.Close ();
+                       try {
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
+                                       new byte [] { 0x00 });
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
+               public void SetSocketOption2_DontLinger ()
+               {
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
                                s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
                                s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 5);
                        }
                }
 
-               [Test]
-               [ExpectedException (typeof (SocketException))]
-               public void SetSocketOption_Null_DontLinger ()
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
+               [Category ("NotWorking")]
+               public void SetSocketOption2_Linger ()
                {
                        using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
-                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, null);
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 0);
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 5);
                        }
                }
 
-               [Test]
-               [ExpectedException (typeof (ArgumentException))]
-               public void SetSocketOption_LingerOption_DontLinger ()
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
+               public void SetSocketOption2_Socket_Closed ()
+               {
+                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       s.Close ();
+                       try {
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               // Cannot access a disposed object
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_AddMembershipIPv4_IPv6MulticastOption ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
+
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
+                               s.Bind (new IPEndPoint (IPAddress.Any, 1901));
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
+                                               new IPv6MulticastOption (mcast_addr));
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+#if NET_2_0
+                                       // The specified value is not a valid 'MulticastOption'
+                                       Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#6");
+#else
+                                       Assert.AreEqual ("optionValue", ex.Message, "#5");
+                                       Assert.IsNull (ex.ParamName, "#6");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_AddMembershipIPv4_MulticastOption ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
+
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
+                               s.Bind (new IPEndPoint (IPAddress.Any, 1901));
+                               s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
+                                       new MulticastOption (mcast_addr));
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               [Category ("NotWorking")]
+               public void SetSocketOption3_AddMembershipIPv4_Socket_NotBound ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
+
+                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+                       try {
+                               s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
+                                       new MulticastOption (mcast_addr));
+                               Assert.Fail ("#1");
+                       } catch (SocketException ex) {
+                               // An invalid argument was supplied
+                               Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                               Assert.AreEqual (10022, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
+#if NET_2_0
+                               Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
+#endif
+                       } finally {
+                               s.Close ();
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_AddMembershipIPv6_IPv6MulticastOption ()
+               {
+#if NET_2_0
+                       if (!Socket.OSSupportsIPv6)
+#else
+                       if (!Socket.SupportsIPv6)
+#endif
+                               Assert.Ignore ("IPv6 not enabled.");
+
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+
+                       using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
+                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
+                               s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
+                                       new IPv6MulticastOption (mcast_addr));
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_AddMembershipIPv6_MulticastOption ()
+               {
+#if NET_2_0
+                       if (!Socket.OSSupportsIPv6)
+#else
+                       if (!Socket.SupportsIPv6)
+#endif
+                               Assert.Ignore ("IPv6 not enabled.");
+
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+
+                       using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
+                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
+                                               new MulticastOption (mcast_addr));
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+#if NET_2_0
+                                       // The specified value is not a valid 'IPv6MulticastOption'
+                                       Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#6");
+#else
+                                       Assert.AreEqual ("optionValue", ex.Message, "#5");
+                                       Assert.IsNull (ex.ParamName, "#6");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               [Category ("NotWorking")]
+               public void SetSocketOption3_AddMembershipIPv6_Socket_NotBound ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+
+                       Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
+                       try {
+                               s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
+                                       new IPv6MulticastOption (mcast_addr));
+                               Assert.Fail ("#1");
+                       } catch (SocketException ex) {
+                               // An invalid argument was supplied
+                               Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                               Assert.AreEqual (10022, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
+#if NET_2_0
+                               Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
+#endif
+                       } finally {
+                               s.Close ();
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_DontLinger_Boolean ()
+               {
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket,
+                                               SocketOptionName.DontLinger, (object) false);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       // The specified value is not valid
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+#if NET_2_0
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#5");
+#else
+                                       Assert.AreEqual ("optionValue", ex.Message, "#4");
+                                       Assert.IsNull (ex.ParamName, "#5");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_DontLinger_Int32 ()
+               {
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket,
+                                               SocketOptionName.DontLinger, (object) 0);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       // The specified value is not valid
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+#if NET_2_0
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#5");
+#else
+                                       Assert.AreEqual ("optionValue", ex.Message, "#4");
+                                       Assert.IsNull (ex.ParamName, "#5");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_DontLinger_LingerOption ()
+               {
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket,
+                                               SocketOptionName.DontLinger, new LingerOption (true, 1000));
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+#if NET_2_0
+                                       // The specified value is not valid
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#5");
+#else
+                                       Assert.AreEqual ("optionValue", ex.Message, "#4");
+                                       Assert.IsNull (ex.ParamName, "#5");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_Linger_Boolean ()
+               {
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket,
+                                               SocketOptionName.Linger, (object) false);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+#if NET_2_0
+                                       // The specified value is not valid
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#5");
+#else
+                                       Assert.AreEqual ("optionValue", ex.Message, "#4");
+                                       Assert.IsNull (ex.ParamName, "#5");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_Linger_Int32 ()
+               {
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket,
+                                               SocketOptionName.Linger, (object) 0);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+#if NET_2_0
+                                       // The specified value is not valid
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#5");
+#else
+                                       Assert.AreEqual ("optionValue", ex.Message, "#4");
+                                       Assert.IsNull (ex.ParamName, "#5");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_Linger_LingerOption ()
+               {
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
+                                       new LingerOption (false, 0));
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
+                                       new LingerOption (true, 0));
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
+                                       new LingerOption (false, 1000));
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
+                                       new LingerOption (true, 1000));
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_DropMembershipIPv4_IPv6MulticastOption ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
+
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
+                               s.Bind (new IPEndPoint (IPAddress.Any, 1901));
+                               s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
+                                       new MulticastOption (mcast_addr));
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
+                                               new IPv6MulticastOption (mcast_addr));
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+#if NET_2_0
+                                       // The specified value is not a valid 'MulticastOption'
+                                       Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#6");
+#else
+                                       Assert.AreEqual ("optionValue", ex.Message, "#5");
+                                       Assert.IsNull (ex.ParamName, "#6");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_DropMembershipIPv4_MulticastOption ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
+
+                       using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
+                               MulticastOption option = new MulticastOption (mcast_addr);
+
+                               s.Bind (new IPEndPoint (IPAddress.Any, 1901));
+                               s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
+                                       option);
+                               s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
+                                       option);
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               [Category ("NotWorking")]
+               public void SetSocketOption3_DropMembershipIPv4_Socket_NotBound ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
+
+                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+                       try {
+                               s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
+                                       new MulticastOption (mcast_addr));
+                               Assert.Fail ("#1");
+                       } catch (SocketException ex) {
+                               // An invalid argument was supplied
+                               Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                               Assert.AreEqual (10022, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
+#if NET_2_0
+                               Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
+#endif
+                       } finally {
+                               s.Close ();
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_DropMembershipIPv6_IPv6MulticastOption ()
+               {
+#if NET_2_0
+                       if (!Socket.OSSupportsIPv6)
+#else
+                       if (!Socket.SupportsIPv6)
+#endif
+                               Assert.Ignore ("IPv6 not enabled.");
+
+                       using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
+                               IPv6MulticastOption option = new IPv6MulticastOption (
+                                       IPAddress.Parse ("ff02::1"));
+
+                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
+                               s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
+                                       option);
+                               s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
+                                       option);
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_DropMembershipIPv6_MulticastOption ()
+               {
+#if NET_2_0
+                       if (!Socket.OSSupportsIPv6)
+#else
+                       if (!Socket.SupportsIPv6)
+#endif
+                               Assert.Ignore ("IPv6 not enabled.");
+
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+
+                       using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
+                               s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
+                               s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
+                                       new IPv6MulticastOption (mcast_addr));
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
+                                               new MulticastOption (mcast_addr));
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentException ex) {
+                                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+#if NET_2_0
+                                       // The specified value is not a valid 'IPv6MulticastOption'
+                                       Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#6");
+#else
+                                       Assert.AreEqual ("optionValue", ex.Message, "#5");
+                                       Assert.IsNull (ex.ParamName, "#6");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               [Category ("NotWorking")]
+               public void SetSocketOption3_DropMembershipIPv6_Socket_NotBound ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+
+                       Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
+                       try {
+                               s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
+                                       new IPv6MulticastOption (mcast_addr));
+                               Assert.Fail ("#1");
+                       } catch (SocketException ex) {
+                               // An invalid argument was supplied
+                               Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                               Assert.AreEqual (10022, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
+#if NET_2_0
+                               Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
+#endif
+                       } finally {
+                               s.Close ();
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_OptionValue_Null ()
                {
                        using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
-                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, new LingerOption (true, 1000));
+                               try {
+                                       s.SetSocketOption (SocketOptionLevel.Socket,
+                                               SocketOptionName.Linger, (object) null);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentNullException ex) {
+                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("optionValue", ex.ParamName, "#5");
+                               }
+                       }
+               }
+
+               [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
+               public void SetSocketOption3_Socket_Closed ()
+               {
+                       Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       s.Close ();
+                       try {
+                               s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
+                                       new LingerOption (false, 0));
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               // Cannot access a disposed object
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
                        }
                }
        }
 }
-
index f7c9805459fe39641dba92daeab754eed888d010..1b1c30b55db2899cc9ecf853ac6c19d0d1988e2a 100644 (file)
 //
 // Authors:
 //     Chris Bacon <chris.bacon@docobo.co.uk>
+//     Gert Driesen <drieseng@users.sourceforge.net>
 //
 
-
 using System;
 using System.Net;
 using System.Net.Sockets;
 using System.Threading;
+
 using NUnit.Framework;
 
 namespace MonoTests.System.Net.Sockets {
 #if TARGET_JVM
-    [Ignore("UdpClient is not supported - since UDP sockets are not supported")]
+       [Ignore("UdpClient is not supported - since UDP sockets are not supported")]
 #endif
-    [TestFixture]
+       [TestFixture]
        public class UdpClientTest {
+               [Test] // .ctor ()
+               public void Constructor1 ()
+               {
+                       MyUdpClient client;
+                       Socket s;
+
+                       client = new MyUdpClient ();
+                       s = client.Client;
+                       Assert.IsNotNull (s, "Client");
+                       Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "Client:AddressFamily");
+                       Assert.IsFalse (s.Connected, "Client:Connected");
+#if NET_2_0
+                       Assert.IsFalse (s.IsBound, "#A:Client:IsBound");
+#endif
+                       Assert.IsNull (s.LocalEndPoint, "Client:LocalEndPoint");
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "Client:ProtocolType");
+                       Assert.IsNull (s.RemoteEndPoint, "Client:RemoteEndPoint");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "Client:SocketType");
+                       Assert.IsFalse (client.Active, "Active");
+#if NET_2_0
+                       Assert.IsFalse (client.DontFragment, "DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "ExclusiveAddressUse");
+                       Assert.IsTrue (client.MulticastLoopback, "MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "Ttl");
+#endif
+               }
+
+               [Test] // .ctor (AddressFamily)
+               public void Constructor2 ()
+               {
+                       MyUdpClient client;
+                       Socket s;
+
+                       client = new MyUdpClient (AddressFamily.InterNetwork);
+                       s = client.Client;
+                       Assert.IsNotNull (s, "#A:Client");
+                       Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily");
+                       Assert.IsFalse (s.Connected, "#A:Client:Connected");
+#if NET_2_0
+                       Assert.IsFalse (s.IsBound, "#A:Client:IsBound");
+#endif
+                       Assert.IsNull (s.LocalEndPoint, "#A:Client:LocalEndPoint");
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType");
+                       Assert.IsNull (s.RemoteEndPoint, "#A:Client:RemoteEndPoint");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType");
+                       Assert.IsFalse (client.Active, "#A:Active");
+#if NET_2_0
+                       //Assert.IsFalse (client.DontFragment, "#A:DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse");
+                       Assert.IsTrue (client.MulticastLoopback, "#A:MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "#A:Ttl");
+#endif
+
+                       client = new MyUdpClient (AddressFamily.InterNetworkV6);
+                       s = client.Client;
+                       Assert.IsNotNull (s, "#B:Client");
+                       Assert.AreEqual (AddressFamily.InterNetworkV6, s.AddressFamily, "#B:Client:AddressFamily");
+                       Assert.IsFalse (s.Connected, "#B:Client:Connected");
+#if NET_2_0
+                       Assert.IsFalse (s.IsBound, "#A:Client:IsBound");
+#endif
+                       Assert.IsNull (s.LocalEndPoint, "#B:Client:LocalEndPoint");
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#B:Client:ProtocolType");
+                       Assert.IsNull (s.RemoteEndPoint, "#B:Client:RemoteEndPoint");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "#B:Client:SocketType");
+                       Assert.IsFalse (client.Active, "#B:Active");
+#if NET_2_0
+                       //Assert.IsFalse (client.DontFragment, "#B:DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "#B:EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "#B:ExclusiveAddressUse");
+                       Assert.IsTrue (client.MulticastLoopback, "#B:MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "#B:Ttl");
+#endif
+               }
+
+               [Test] // .ctor (AddressFamily)
+               public void Constructor2_Family_Invalid ()
+               {
+                       try {
+                               new UdpClient (AddressFamily.NetBios);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentException ex) {
+                               Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+#if NET_2_0
+                               // 'UDP' Client can only accept InterNetwork or InterNetworkV6
+                               // addresses
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("family", ex.ParamName, "#A5");
+#else
+                               Assert.AreEqual ("family", ex.Message, "#A4");
+                               Assert.IsNull (ex.ParamName, "#A5");
+#endif
+                       }
+
+                       try {
+                               new UdpClient ((AddressFamily) 666);
+                               Assert.Fail ("#B1");
+                       } catch (ArgumentException ex) {
+                               Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+#if NET_2_0
+                               Assert.IsNotNull (ex.Message, "#B4");
+                               Assert.AreEqual ("family", ex.ParamName, "#B5");
+#else
+                               Assert.AreEqual ("family", ex.Message, "#B4");
+                               Assert.IsNull (ex.ParamName, "#B5");
+#endif
+                       }
+               }
+
+               [Test] // .ctor (Int32)
+               public void Constructor3 ()
+               {
+                       MyUdpClient client;
+                       Socket s;
+                       IPEndPoint localEP;
+
+                       client = new MyUdpClient (IPEndPoint.MinPort);
+                       s = client.Client;
+                       Assert.IsNotNull (s, "#A:Client");
+                       Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily");
+                       Assert.IsFalse (s.Connected, "#A:Client:Connected");
+#if NET_2_0
+                       Assert.IsTrue (s.IsBound, "#A:Client:IsBound");
+#endif
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType");
+                       Assert.IsFalse (client.Active, "#A:Active");
+#if NET_2_0
+                       Assert.IsFalse (client.DontFragment, "#A:DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse");
+                       Assert.IsTrue (client.MulticastLoopback, "#A:MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "#A:Ttl");
+#endif
+                       localEP = s.LocalEndPoint as IPEndPoint;
+                       Assert.IsNotNull (localEP, "#A:Client:LocalEndpoint");
+                       Assert.AreEqual (IPAddress.Any, localEP.Address, "#A:Client:LocalEndPoint/Address");
+                       Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#A:Client:LocalEndPoint/AddressFamily");
+
+                       client = new MyUdpClient (IPEndPoint.MaxPort);
+                       s = client.Client;
+                       Assert.IsNotNull (s, "#B:Client");
+                       Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#B:Client:AddressFamily");
+                       Assert.IsFalse (s.Connected, "#B:Client:Connected");
+#if NET_2_0
+                       Assert.IsTrue (s.IsBound, "#B:Client:IsBound");
+#endif
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#B:Client:ProtocolType");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "#B:Client:SocketType");
+                       Assert.IsFalse (client.Active, "#B:Active");
+#if NET_2_0
+                       Assert.IsFalse (client.DontFragment, "#B:DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "#B:EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "#B:ExclusiveAddressUse");
+                       Assert.IsTrue (client.MulticastLoopback, "#B:MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "#B:Ttl");
+#endif
+                       localEP = s.LocalEndPoint as IPEndPoint;
+                       Assert.IsNotNull (localEP, "#B:Client:LocalEndpoint");
+                       Assert.AreEqual (IPAddress.Any, localEP.Address, "#B:Client:LocalEndPoint/Address");
+                       Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#B:Client:LocalEndPoint/AddressFamily");
+                       Assert.AreEqual (IPEndPoint.MaxPort, localEP.Port, "#B:Client:LocalEndPoint/Port");
+               }
+
+               [Test] // .ctor (Int32)
+               public void Constructor3_Port_OutOfRange ()
+               {
+                       try {
+                               new UdpClient (IPEndPoint.MaxPort + 1);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("port", ex.ParamName, "#A5");
+                       }
+
+                       try {
+                               new UdpClient (IPEndPoint.MinPort - 1);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("port", ex.ParamName, "#A5");
+                       }
+               }
+
+               [Test] // .ctor (IPEndPoint)
+               public void Constructor4 ()
+               {
+                       MyUdpClient client;
+                       Socket s;
+                       IPEndPoint localEP;
+                       IPEndPoint clientEP;
+
+                       clientEP = new IPEndPoint (IPAddress.Loopback, 8001);
+                       client = new MyUdpClient (clientEP);
+                       s = client.Client;
+                       Assert.IsNotNull (s, "#A:Client");
+                       Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily");
+                       Assert.IsFalse (s.Connected, "#A:Client:Connected");
+#if NET_2_0
+                       Assert.IsTrue (s.IsBound, "#A:Client:IsBound");
+#endif
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType");
+                       Assert.IsFalse (client.Active, "#A:Active");
+#if NET_2_0
+                       Assert.IsFalse (client.DontFragment, "#A:DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse");
+                       Assert.IsTrue (client.MulticastLoopback, "#A:MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "#A:Ttl");
+#endif
+                       localEP = s.LocalEndPoint as IPEndPoint;
+                       Assert.IsNotNull (localEP, "#A:Client:LocalEndpoint");
+                       Assert.IsFalse (object.ReferenceEquals (clientEP, localEP), "#A:Client:LocalEndPoint/ReferenceEquality");
+                       Assert.AreEqual (clientEP.Address, localEP.Address, "#A:Client:LocalEndPoint/Address");
+                       Assert.AreEqual (clientEP.AddressFamily, localEP.AddressFamily, "#A:Client:LocalEndPoint/AddressFamily");
+                       Assert.AreEqual (clientEP.Port, localEP.Port, "#A:Client:LocalEndPoint/Port");
+               }
+
+               [Test] // .ctor (IPEndPoint)
+               public void Constructor4_LocalEP_Null ()
+               {
+                       try {
+                               new UdpClient ((IPEndPoint) null);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("localEP", ex.ParamName, "#5");
+                       }
+               }
+
+               [Test] // .ctor (Int32, AddressFamily)
+               public void Constructor5 ()
+               {
+                       MyUdpClient client;
+                       Socket s;
+                       IPEndPoint localEP;
+
+                       client = new MyUdpClient (IPEndPoint.MinPort, AddressFamily.InterNetwork);
+                       s = client.Client;
+                       Assert.IsNotNull (s, "#A:Client");
+                       Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily");
+                       Assert.IsFalse (s.Connected, "#A:Client:Connected");
+#if NET_2_0
+                       Assert.IsTrue (s.IsBound, "#A:Client:IsBound");
+#endif
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType");
+                       Assert.IsFalse (client.Active, "#A:Active");
+#if NET_2_0
+                       //Assert.IsFalse (client.DontFragment, "#A:DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse");
+                       Assert.IsTrue (client.MulticastLoopback, "#A:MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "#A:Ttl");
+#endif
+                       localEP = s.LocalEndPoint as IPEndPoint;
+                       Assert.IsNotNull (localEP, "#A:Client:LocalEndpoint");
+                       Assert.AreEqual (IPAddress.Any, localEP.Address, "#A:Client:LocalEndPoint/Address");
+                       Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#A:Client:LocalEndPoint/AddressFamily");
+
+                       client = new MyUdpClient (IPEndPoint.MaxPort, AddressFamily.InterNetworkV6);
+                       s = client.Client;
+                       Assert.IsNotNull (s, "#B:Client");
+                       Assert.AreEqual (AddressFamily.InterNetworkV6, s.AddressFamily, "#B:Client:AddressFamily");
+                       Assert.IsFalse (s.Connected, "#B:Client:Connected");
+#if NET_2_0
+                       Assert.IsTrue (s.IsBound, "#B:Client:IsBound");
+#endif
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#B:Client:ProtocolType");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "#B:Client:SocketType");
+                       Assert.IsFalse (client.Active, "#B:Active");
+#if NET_2_0
+                       //Assert.IsFalse (client.DontFragment, "#B:DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "#B:EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "#B:ExclusiveAddressUse");
+                       Assert.IsTrue (client.MulticastLoopback, "#B:MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "#B:Ttl");
+#endif
+                       localEP = s.LocalEndPoint as IPEndPoint;
+                       Assert.IsNotNull (localEP, "#B:Client:LocalEndpoint");
+                       Assert.AreEqual (IPAddress.IPv6Any, localEP.Address, "#B:Client:LocalEndPoint/Address");
+                       Assert.AreEqual (AddressFamily.InterNetworkV6, localEP.AddressFamily, "#B:Client:LocalEndPoint/AddressFamily");
+                       Assert.AreEqual (IPEndPoint.MaxPort, localEP.Port, "#B:Client:LocalEndPoint/Port");
+               }
+
+               [Test] // .ctor (Int32, AddressFamily)
+               public void Constructor5_Family_Invalid ()
+               {
+                       try {
+                               new UdpClient (80, AddressFamily.NetBios);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentException ex) {
+                               // family
+                               Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+#if NET_2_0
+                               // 'UDP' Client can only accept InterNetwork or InterNetworkV6
+                               // addresses
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("family", ex.ParamName, "#A5");
+#else
+                               Assert.AreEqual ("family", ex.Message, "#A4");
+                               Assert.IsNull (ex.ParamName, "#A5");
+#endif
+                       }
+
+                       try {
+                               new UdpClient (80, (AddressFamily) 666);
+                               Assert.Fail ("#B1");
+                       } catch (ArgumentException ex) {
+                               // family
+                               Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+#if NET_2_0
+                               // 'UDP' Client can only accept InterNetwork or InterNetworkV6
+                               // addresses
+                               Assert.IsNotNull (ex.Message, "#B4");
+                               Assert.AreEqual ("family", ex.ParamName, "#B5");
+#else
+                               Assert.AreEqual ("family", ex.Message, "#B4");
+                               Assert.IsNull (ex.ParamName, "#B5");
+#endif
+                       }
+               }
+
+               [Test] // .ctor (Int32, AddressFamily)
+               public void Constructor5_Port_OutOfRange ()
+               {
+                       try {
+                               new UdpClient (IPEndPoint.MaxPort + 1, AddressFamily.InterNetwork);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("port", ex.ParamName, "#A5");
+                       }
+
+                       try {
+                               new UdpClient (IPEndPoint.MinPort - 1, AddressFamily.InterNetwork);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("port", ex.ParamName, "#A5");
+                       }
+               }
+
+               [Test] // .ctor (String, Int32)
+               public void Constructor6 ()
+               {
+                       MyUdpClient client;
+                       Socket s;
+                       IPEndPoint localEP;
+
+                       client = new MyUdpClient ("localhost", IPEndPoint.MinPort);
+                       s = client.Client;
+                       Assert.IsNotNull (s, "#A:Client");
+                       Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily");
+                       Assert.IsTrue (s.Connected, "#A:Client:Connected");
+#if NET_2_0
+                       Assert.IsTrue (s.IsBound, "#A:Client:IsBound");
+#endif
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType");
+                       Assert.IsTrue (client.Active, "#A:Active");
+#if NET_2_0
+                       Assert.IsFalse (client.DontFragment, "#A:DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse");
+                       //Assert.IsFalse (client.MulticastLoopback, "#A:MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "#A:Ttl");
+#endif
+                       localEP = s.LocalEndPoint as IPEndPoint;
+                       Assert.IsNotNull (localEP, "#A:Client:LocalEndpoint");
+                       Assert.AreEqual (IPAddress.Loopback, localEP.Address, "#A:Client:LocalEndPoint/Address");
+                       Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#A:Client:LocalEndPoint/AddressFamily");
+
+                       client = new MyUdpClient ("localhost", IPEndPoint.MaxPort);
+                       s = client.Client;
+                       Assert.IsNotNull (s, "#B:Client");
+                       Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#B:Client:AddressFamily");
+                       Assert.IsTrue (s.Connected, "#B:Client:Connected");
+#if NET_2_0
+                       Assert.IsTrue (s.IsBound, "#B:Client:IsBound");
+#endif
+                       Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#B:Client:ProtocolType");
+                       Assert.AreEqual (SocketType.Dgram, s.SocketType, "#B:Client:SocketType");
+                       Assert.IsTrue (client.Active, "#B:Active");
+#if NET_2_0
+                       Assert.IsFalse (client.DontFragment, "#B:DontFragment");
+                       Assert.IsFalse (client.EnableBroadcast, "#B:EnableBroadcast");
+                       //Assert.IsFalse (client.ExclusiveAddressUse, "#B:ExclusiveAddressUse");
+                       //Assert.IsFalse (client.MulticastLoopback, "#B:MulticastLoopback");
+                       //Assert.AreEqual (32, client.Ttl, "#B:Ttl");
+#endif
+                       localEP = s.LocalEndPoint as IPEndPoint;
+                       Assert.IsNotNull (localEP, "#B:Client:LocalEndpoint");
+                       Assert.AreEqual (IPAddress.Loopback, localEP.Address, "#B:Client:LocalEndPoint/Address");
+                       Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#B:Client:LocalEndPoint/AddressFamily");
+               }
+
+               [Test] // .ctor (String, Int32)
+               public void Constructor6_HostName_Null ()
+               {
+                       try {
+                               new UdpClient ((string) null, int.MaxValue);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentNullException ex) {
+                               Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual ("hostname", ex.ParamName, "#5");
+                       }
+               }
+
+               [Test] // .ctor (String, Int32)
+               public void Constructor6_Port_OutOfRange ()
+               {
+                       try {
+                               new UdpClient ("local", IPEndPoint.MaxPort + 1);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("port", ex.ParamName, "#A5");
+                       }
+
+                       try {
+                               new UdpClient ("local", IPEndPoint.MinPort - 1);
+                               Assert.Fail ("#A1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               // Specified argument was out of the range of valid values
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                               Assert.IsNull (ex.InnerException, "#A3");
+                               Assert.IsNotNull (ex.Message, "#A4");
+                               Assert.AreEqual ("port", ex.ParamName, "#A5");
+                       }
+               }
+
                [Test]
                public void UdpClientBroadcastTest () 
                {
-                       bool exThrown = false;
                        UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234));
                        byte[] bytes = new byte[] {10, 11, 12, 13};
 
                        try {
                                client.Send (bytes, bytes.Length, new IPEndPoint (IPAddress.Broadcast, 1235));
-                       } catch (SocketException) {
-                               exThrown = true;
+                       } finally {
+                               client.Close ();
                        }
-                       Assert.IsFalse(exThrown, "UdpClient Broadcast #1");
+               }
 
+               [Test] // JoinMulticastGroup (IPAddress)
+               public void JoinMulticastGroup1_IPv4 ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23");
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) {
+                               client.JoinMulticastGroup (mcast_addr);
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress)
+               public void JoinMulticastGroup1_IPv6 ()
+               {
+#if NET_2_0
+                       if (!Socket.OSSupportsIPv6)
+#else
+                       if (!Socket.SupportsIPv6)
+#endif
+                               Assert.Ignore ("IPv6 not enabled.");
+
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) {
+                               client.JoinMulticastGroup (mcast_addr);
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress)
+               public void JoinMulticastGroup1_MulticastAddr_Null ()
+               {
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) {
+                               try {
+                                       client.JoinMulticastGroup ((IPAddress) null);
+                                       Assert.Fail ("#1");
+#if NET_2_0
+                               } catch (ArgumentNullException ex) {
+                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("multicastAddr", ex.ParamName, "#5");
+                               }
+#else
+                               } catch (NullReferenceException ex) {
+                                       Assert.AreEqual (typeof (NullReferenceException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+                               }
+#endif
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress)
+               public void JoinMulticastGroup1_Socket_Closed ()
+               {
+                       IPAddress mcast_addr = null;
+
+                       UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234));
                        client.Close ();
+                       try {
+                               client.JoinMulticastGroup (mcast_addr);
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               // Cannot access a disposed object
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (UdpClient).FullName, ex.ObjectName, "#5");
+                       }
                }
 
+               [Test] // JoinMulticastGroup (IPAddress)
+               [Category ("NotWorking")]
+               public void JoinMulticastGroup1_Socket_NotBound ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23");
+
+                       UdpClient client = new UdpClient (AddressFamily.InterNetwork);
+                       try {
+                               client.JoinMulticastGroup (mcast_addr);
+                               Assert.Fail ("#1");
+                       } catch (SocketException ex) {
+                               // An invalid argument was supplied
+                               Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                               Assert.AreEqual (10022, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
 #if NET_2_0
+                               Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
+#endif
+                       } finally {
+                               client.Close ();
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (In32, IPAddress)
+               public void JoinMulticastGroup2_IPv4 ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23");
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) {
+                               try {
+                                       client.JoinMulticastGroup (0, mcast_addr);
+                                       Assert.Fail ("#1");
+                               } catch (SocketException ex) {
+                                       // The attempted operation is not supported for the type of
+                                       // object referenced
+                                       Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                                       Assert.AreEqual (10045, ex.ErrorCode, "#3");
+                                       Assert.IsNull (ex.InnerException, "#4");
+                                       Assert.IsNotNull (ex.Message, "#5");
+                                       Assert.AreEqual (10045, ex.NativeErrorCode, "#6");
+#if NET_2_0
+                                       Assert.AreEqual (SocketError.OperationNotSupported, ex.SocketErrorCode, "#7");
+#endif
+                               }
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (In32, IPAddress)
+               public void JoinMulticastGroup2_IPv6 ()
+               {
+#if NET_2_0
+                       if (!Socket.OSSupportsIPv6)
+#else
+                       if (!Socket.SupportsIPv6)
+#endif
+                               Assert.Ignore ("IPv6 not enabled.");
+
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) {
+                               client.JoinMulticastGroup (0, mcast_addr);
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (Int32, IPAddress)
+               public void JoinMulticastGroup2_MulticastAddr_Null ()
+               {
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) {
+                               try {
+                                       client.JoinMulticastGroup (0, (IPAddress) null);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentNullException ex) {
+                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("multicastAddr", ex.ParamName, "#5");
+                               }
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (Int32, IPAddress)
+               public void JoinMulticastGroup2_Socket_Closed ()
+               {
+                       IPAddress mcast_addr = null;
+
+                       UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234));
+                       client.Close ();
+                       try {
+                               client.JoinMulticastGroup (0, mcast_addr);
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               // Cannot access a disposed object
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (UdpClient).FullName, ex.ObjectName, "#5");
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (Int32, IPAddress)
+               [Category ("NotWorking")]
+               public void JoinMulticastGroup2_Socket_NotBound ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+
+                       UdpClient client = new UdpClient (AddressFamily.InterNetworkV6);
+                       try {
+                               client.JoinMulticastGroup (0, mcast_addr);
+                               Assert.Fail ("#1");
+                       } catch (SocketException ex) {
+                               // An invalid argument was supplied
+                               Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                               Assert.AreEqual (10022, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
+#if NET_2_0
+                               Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
+#endif
+                       } finally {
+                               client.Close ();
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, Int32)
+               public void JoinMulticastGroup3_IPv4 ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23");
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) {
+                               client.JoinMulticastGroup (mcast_addr, 0);
+                       }
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) {
+                               client.JoinMulticastGroup (mcast_addr, 255);
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, Int32)
+               public void JoinMulticastGroup3_IPv6 ()
+               {
+#if NET_2_0
+                       if (!Socket.OSSupportsIPv6)
+#else
+                       if (!Socket.SupportsIPv6)
+#endif
+                               Assert.Ignore ("IPv6 not enabled.");
+
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) {
+                               client.JoinMulticastGroup (mcast_addr, 0);
+                       }
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) {
+                               client.JoinMulticastGroup (mcast_addr, 255);
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, Int32)
+               public void JoinMulticastGroup3_MulticastAddr_Null ()
+               {
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) {
+                               try {
+                                       client.JoinMulticastGroup ((IPAddress) null, int.MaxValue);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentNullException ex) {
+                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("multicastAddr", ex.ParamName, "#5");
+                               }
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, Int32)
+               public void JoinMulticastGroup3_Socket_Closed ()
+               {
+                       IPAddress mcast_addr = null;
+
+                       UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234));
+                       client.Close ();
+                       try {
+                               client.JoinMulticastGroup (mcast_addr, 0);
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               // Cannot access a disposed object
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (UdpClient).FullName, ex.ObjectName, "#5");
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, Int32)
+               [Category ("NotWorking")]
+               public void JoinMulticastGroup3_Socket_NotBound ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23");
+
+                       UdpClient client = new UdpClient (AddressFamily.InterNetwork);
+                       try {
+                               client.JoinMulticastGroup (mcast_addr, 5);
+                               Assert.Fail ("#1");
+                       } catch (SocketException ex) {
+                               // An invalid argument was supplied
+                               Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                               Assert.AreEqual (10022, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
+#if NET_2_0
+                               Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
+#endif
+                       } finally {
+                               client.Close ();
+                       }
+               }
+
+#if NET_2_0
+               [Test] // JoinMulticastGroup (IPAddress, IPAddress)
+               public void JoinMulticastGroup4_IPv4 ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23");
+                       IPAddress local_addr = IPAddress.Any;
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) {
+                               client.JoinMulticastGroup (mcast_addr, local_addr);
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, IPAddress)
+               public void JoinMulticastGroup4_IPv6 ()
+               {
+                       if (!Socket.OSSupportsIPv6)
+                               Assert.Ignore ("IPv6 not enabled.");
+
+                       IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
+                       IPAddress local_addr = IPAddress.IPv6Any;
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) {
+                               try {
+                                       client.JoinMulticastGroup (mcast_addr, local_addr);
+                                       Assert.Fail ("#1");
+                               } catch (SocketException ex) {
+                                       // The attempted operation is not supported for the type of
+                                       // object referenced
+                                       Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                                       Assert.AreEqual (10045, ex.ErrorCode, "#3");
+                                       Assert.IsNull (ex.InnerException, "#4");
+                                       Assert.IsNotNull (ex.Message, "#5");
+                                       Assert.AreEqual (10045, ex.NativeErrorCode, "#6");
+                                       Assert.AreEqual (SocketError.OperationNotSupported, ex.SocketErrorCode, "#7");
+                               }
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, IPAddress)
+               public void JoinMulticastGroup4_LocalAddress_Null ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23");
+
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) {
+                               try {
+                                       client.JoinMulticastGroup (mcast_addr, (IPAddress) null);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentNullException ex) {
+                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("mcint", ex.ParamName, "#5");
+                               }
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, IPAddress)
+               public void JoinMulticastGroup4_MulticastAddr_Null ()
+               {
+                       using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) {
+                               try {
+                                       client.JoinMulticastGroup ((IPAddress) null, IPAddress.Loopback);
+                                       Assert.Fail ("#1");
+                               } catch (ArgumentNullException ex) {
+                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
+                                       Assert.IsNull (ex.InnerException, "#3");
+                                       Assert.IsNotNull (ex.Message, "#4");
+                                       Assert.AreEqual ("group", ex.ParamName, "#5");
+                               }
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, IPAddress)
+               public void JoinMulticastGroup4_Socket_Closed ()
+               {
+                       IPAddress mcast_addr = null;
+                       IPAddress local_addr = null;
+
+                       UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234));
+                       client.Close ();
+                       try {
+                               client.JoinMulticastGroup (mcast_addr, local_addr);
+                               Assert.Fail ("#1");
+                       } catch (ObjectDisposedException ex) {
+                               // Cannot access a disposed object
+                               Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.IsNotNull (ex.Message, "#4");
+                               Assert.AreEqual (typeof (UdpClient).FullName, ex.ObjectName, "#5");
+                       }
+               }
+
+               [Test] // JoinMulticastGroup (IPAddress, IPAddress)
+               [Category ("NotWorking")]
+               public void JoinMulticastGroup4_Socket_NotBound ()
+               {
+                       IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23");
+                       IPAddress local_addr = Dns.GetHostEntry (string.Empty).AddressList [0];
+
+                       UdpClient client = new UdpClient (AddressFamily.InterNetwork);
+                       try {
+                               client.JoinMulticastGroup (mcast_addr, local_addr);
+                               Assert.Fail ("#1");
+                       } catch (SocketException ex) {
+                               // An invalid argument was supplied
+                               Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
+                               Assert.AreEqual (10022, ex.ErrorCode, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
+                               Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
+                       } finally {
+                               client.Close ();
+                       }
+               }
+
                [Test]
                public void CloseInReceive ()
                {
@@ -56,33 +917,6 @@ namespace MonoTests.System.Net.Sockets {
                        Assert.IsTrue (got_exc);
                }
 
-               [Test]
-               public void JoinMulticastGroup ()
-               {
-                       UdpClient client = new UdpClient ();
-                       IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23");
-                       IPAddress local_addr = Dns.GetHostEntry ("").AddressList[0];
-                       bool exThrown = false;
-                       
-                       /* So much for the documented note "You cannot
-                        * call JoinMulticastGroup on a UdpClient
-                        * constructed without a specific local port
-                        * (that is, using the UdpClient or
-                        * UdpClient(AddressFamily) constructor).
-                        */
-                       try {
-                               client.JoinMulticastGroup (mcast_addr,
-                                                          local_addr);
-                       } catch (Exception) {
-                               exThrown = true;
-                       } finally {
-                               client.Close ();
-                       }
-                       
-                       Assert.IsFalse (exThrown,
-                                       "UdpClient JoinMulticastGroup #1");
-               }
-               
                // Test for bug 324033
                [Test]
                public void JoinMulticastGroupWithLocal ()
@@ -90,19 +924,12 @@ namespace MonoTests.System.Net.Sockets {
                        UdpClient client = new UdpClient (9001);
                        IPAddress mcast_addr = IPAddress.Parse ("224.0.0.24");
                        IPAddress local_addr = IPAddress.Any;
-                       
-                       bool exThrown = false;
-                       
+
                        try {
-                               client.JoinMulticastGroup (mcast_addr,
-                                                          local_addr);
-                       } catch (Exception) {
-                               exThrown = true;
+                               client.JoinMulticastGroup (mcast_addr, local_addr);
                        } finally {
                                client.Close ();
                        }
-                       
-                       Assert.IsFalse (exThrown, "UdpClient JoinMulticastGroupWithLocal #1");
                }
                
                [Test]
@@ -110,9 +937,7 @@ namespace MonoTests.System.Net.Sockets {
                public void BeginSendNull ()
                {
                        UdpClient client = new UdpClient ();
-                       
                        client.BeginSend (null, 0, null, null);
-
                        client.Close ();
                }
                
@@ -152,7 +977,7 @@ namespace MonoTests.System.Net.Sockets {
                                                 "BeginSend #4");
                        }
 
-                       IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry ("").AddressList[0], 1236);
+                       IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry (string.Empty).AddressList[0], 1236);
                        
                        BSCalledBack.Reset ();
                        
@@ -193,7 +1018,7 @@ namespace MonoTests.System.Net.Sockets {
                        
                        client.BeginReceive (BRCallback, client);
 
-                       IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry ("").AddressList[0], 1237);
+                       IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry (string.Empty).AddressList[0], 1237);
                        byte[] send_bytes = new byte[] {10, 11, 12, 13};
                        client.Send (send_bytes, send_bytes.Length, ep);
 
@@ -213,7 +1038,7 @@ namespace MonoTests.System.Net.Sockets {
                public void Available ()
                {
                        UdpClient client = new UdpClient (1238);
-                       IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry ("").AddressList[0], 1238);
+                       IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry (string.Empty).AddressList[0], 1238);
                        byte[] bytes = new byte[] {10, 11, 12, 13};
                        
                        client.Send (bytes, bytes.Length, ep);
@@ -289,5 +1114,50 @@ namespace MonoTests.System.Net.Sockets {
                
                /* No test for Ttl default as it is platform dependent */
 #endif
+
+               class MyUdpClient : UdpClient
+               {
+                       public MyUdpClient ()
+                       {
+                       }
+
+                       public MyUdpClient (AddressFamily family)
+                               : base (family)
+                       {
+                       }
+
+                       public MyUdpClient (Int32 port)
+                               : base (port)
+                       {
+                       }
+
+
+                       public MyUdpClient (IPEndPoint localEP)
+                               : base (localEP)
+                       {
+                       }
+
+                       public MyUdpClient (int port, AddressFamily family)
+                               : base (port, family)
+                       {
+                       }
+
+                       public MyUdpClient (string hostname, int port)
+                               : base (hostname, port)
+                       {
+                       }
+
+                       public new bool Active {
+                               get { return base.Active; }
+                               set { base.Active = value; }
+                       }
+
+#if ONLY_1_1
+                       public new Socket Client {
+                               get { return base.Client; }
+                               set { base.Client = value; }
+                       }
+#endif
+               }
        }
 }