diff options
author | Steffen Kieß <s-kiess@web.de> | 2016-01-26 21:46:38 +0300 |
---|---|---|
committer | Steffen Kieß <s-kiess@web.de> | 2016-01-26 21:46:38 +0300 |
commit | 343fc2253d2e7041cdb966224561bd1a63f5573c (patch) | |
tree | 236eea0d135ef237d94499f66a92299044cf5d88 /mcs/class/Mono.Posix | |
parent | a87f458b483087b645ef4353b9393e79934ed257 (diff) |
[Mono.Posix] Fix the SocketTest.ControlMsg() test on OSX
Unlike Linux, OSX does not allow multiple SCM_RIGHTS control messages in
sendmsg().
The SocketTest.ControlMsg() test is split into two tests, one which sends
only a single control message (containing two FDs), and another one which
sends two control messages (each containing one FD). The second test is not
executed on OSX.
Diffstat (limited to 'mcs/class/Mono.Posix')
-rw-r--r-- | mcs/class/Mono.Posix/Test/Mono.Unix.Native/SocketTest.cs | 88 |
1 files changed, 62 insertions, 26 deletions
diff --git a/mcs/class/Mono.Posix/Test/Mono.Unix.Native/SocketTest.cs b/mcs/class/Mono.Posix/Test/Mono.Unix.Native/SocketTest.cs index 0e3dae15ff3..3ec10f916ce 100644 --- a/mcs/class/Mono.Posix/Test/Mono.Unix.Native/SocketTest.cs +++ b/mcs/class/Mono.Posix/Test/Mono.Unix.Native/SocketTest.cs @@ -731,35 +731,57 @@ namespace MonoTests.Mono.Unix.Native }); } - [Test] - [Category ("NotOnMac")] - public unsafe void ControlMsg () + public unsafe void ControlMsg (bool useMultipleControlMessages) { // Create two socket pairs and send inner_so1 and inner_so2 over the other socket pair using SCM_RIGHTS WithSocketPair ((inner_so1, inner_so2) => { WithSocketPair ((so1, so2) => { - // Create two SCM_RIGHTS control messages - var cmsg = new byte[2 * Syscall.CMSG_SPACE (sizeof (int))]; - var hdr = new Cmsghdr { - cmsg_len = (long) Syscall.CMSG_LEN (sizeof (int)), - cmsg_level = UnixSocketProtocol.SOL_SOCKET, - cmsg_type = UnixSocketControlMessage.SCM_RIGHTS, - }; - var msghdr1 = new Msghdr { - msg_control = cmsg, - msg_controllen = cmsg.Length, - }; - long offset = 0; - hdr.WriteToBuffer (msghdr1, offset); - var dataOffset = Syscall.CMSG_DATA (msghdr1, offset); - fixed (byte* ptr = msghdr1.msg_control) { - ((int*) (ptr + dataOffset))[0] = inner_so1; - } - offset = (long) Syscall.CMSG_SPACE (sizeof (int)); - hdr.WriteToBuffer (msghdr1, offset); - dataOffset = Syscall.CMSG_DATA (msghdr1, offset); - fixed (byte* ptr = msghdr1.msg_control) { - ((int*) (ptr + dataOffset))[0] = inner_so2; + byte[] cmsg; + Msghdr msghdr1; + long offset; + if (useMultipleControlMessages) { + // Create two SCM_RIGHTS control messages + cmsg = new byte[2 * Syscall.CMSG_SPACE (sizeof (int))]; + var hdr = new Cmsghdr { + cmsg_len = (long) Syscall.CMSG_LEN (sizeof (int)), + cmsg_level = UnixSocketProtocol.SOL_SOCKET, + cmsg_type = UnixSocketControlMessage.SCM_RIGHTS, + }; + msghdr1 = new Msghdr { + msg_control = cmsg, + msg_controllen = cmsg.Length, + }; + offset = 0; + hdr.WriteToBuffer (msghdr1, offset); + var dataOffset = Syscall.CMSG_DATA (msghdr1, offset); + fixed (byte* ptr = msghdr1.msg_control) { + ((int*) (ptr + dataOffset))[0] = inner_so1; + } + offset = (long) Syscall.CMSG_SPACE (sizeof (int)); + hdr.WriteToBuffer (msghdr1, offset); + dataOffset = Syscall.CMSG_DATA (msghdr1, offset); + fixed (byte* ptr = msghdr1.msg_control) { + ((int*) (ptr + dataOffset))[0] = inner_so2; + } + } else { + // Create one SCM_RIGHTS control message + cmsg = new byte[Syscall.CMSG_SPACE (2 * sizeof (int))]; + var hdr = new Cmsghdr { + cmsg_len = (long) Syscall.CMSG_LEN (2 * sizeof (int)), + cmsg_level = UnixSocketProtocol.SOL_SOCKET, + cmsg_type = UnixSocketControlMessage.SCM_RIGHTS, + }; + msghdr1 = new Msghdr { + msg_control = cmsg, + msg_controllen = cmsg.Length, + }; + offset = 0; + hdr.WriteToBuffer (msghdr1, offset); + var dataOffset = Syscall.CMSG_DATA (msghdr1, offset); + fixed (byte* ptr = msghdr1.msg_control) { + ((int*) (ptr + dataOffset))[0] = inner_so1; + ((int*) (ptr + dataOffset))[1] = inner_so2; + } } long ret; @@ -799,7 +821,8 @@ namespace MonoTests.Mono.Unix.Native if (ret < 0) UnixMarshal.ThrowExceptionForLastError (); - Assert.IsTrue ((msghdr2.msg_flags & MessageFlags.MSG_CTRUNC) != 0); // Control message has been truncated + if (useMultipleControlMessages) // This assertion fails on OSX for some reason + Assert.IsTrue ((msghdr2.msg_flags & MessageFlags.MSG_CTRUNC) != 0); // Control message has been truncated Assert.AreEqual (buffer1.Length, ret); for (int i = 0; i < buffer1.Length; i++) @@ -883,6 +906,19 @@ namespace MonoTests.Mono.Unix.Native }); }); } + + [Test] + public unsafe void ControlMsgOneCmsg () + { + ControlMsg (useMultipleControlMessages: false); + } + + [Test] + [Category ("NotOnMac")] + public unsafe void ControlMsgMultipleCMsgs () + { + ControlMsg (useMultipleControlMessages: true); + } } } |