[PATCHv3 2/2] Add a test case for "-e write=n -e read=m" option for sendmmsg/recvmsg system calls
Masatake YAMATO
yamato at redhat.com
Fri Nov 7 11:16:03 UTC 2014
* tests/Makefile.am: Add mmsg to CHECK_PROGRAMS. Add mmsg.test to TESTS.
* tests/mmsg.test: New file.
* tests/mmsg.c: New target program to be traced by testes strace.
* tests/mmsg.expected: Expected output file used in mmsg.test.
* .gitignore (mmsg): New file.
In v3 patch: Rewritten as suggsted by ldv.
Signed-off-by: Masatake YAMATO <yamato at redhat.com>
---
tests/.gitignore | 1 +
tests/Makefile.am | 2 ++
tests/mmsg.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/mmsg.expected | 19 ++++++++++++++++
tests/mmsg.test | 40 +++++++++++++++++++++++++++++++++
5 files changed, 126 insertions(+)
create mode 100644 tests/mmsg.c
create mode 100644 tests/mmsg.expected
create mode 100755 tests/mmsg.test
diff --git a/tests/.gitignore b/tests/.gitignore
index dc408c9..aa808c2 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -1,4 +1,5 @@
inet-accept-connect-send-recv
+mmsg
net-accept-connect
netlink_inet_diag
scm_rights
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 541a0c4..0d92776 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -4,6 +4,7 @@ AM_CFLAGS = $(WARN_CFLAGS)
check_PROGRAMS = \
inet-accept-connect-send-recv \
+ mmsg \
net-accept-connect \
netlink_inet_diag \
scm_rights \
@@ -27,6 +28,7 @@ TESTS = \
sigaction.test \
stat.test \
statfs.test \
+ mmsg.test \
net.test \
net-fd.test \
net-yy.test \
diff --git a/tests/mmsg.c b/tests/mmsg.c
new file mode 100644
index 0000000..3fb1323
--- /dev/null
+++ b/tests/mmsg.c
@@ -0,0 +1,64 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <sys/socket.h>
+#include <unistd.h>
+#include <assert.h>
+
+int
+main(void)
+{
+#if defined(HAVE_SENDMMSG)
+ const int W = 0, R = 1;
+ int sv[2];
+ char one[] = "one";
+ char two[] = "two";
+ char three[] = "three";
+
+ struct iovec iov[3] = {
+ {
+ .iov_base = one,
+ .iov_len = sizeof(one) - 1
+ }, {
+ .iov_base = two,
+ .iov_len = sizeof(two) - 1
+ }, {
+ .iov_base = three,
+ .iov_len = sizeof(three) - 1
+ }
+ };
+
+#define n_mmh (sizeof (mmh)/sizeof (mmh[0]))
+ struct mmsghdr mmh[2] = {
+ {
+ .msg_hdr = {
+ .msg_iov = iov + 0,
+ .msg_iovlen = 2,
+ }
+
+ }, {
+ .msg_hdr = {
+ .msg_iov = iov + 2,
+ .msg_iovlen = 1,
+
+ }
+ }
+
+ };
+
+ assert (socketpair (AF_UNIX, SOCK_DGRAM, 0, sv) == 0);
+
+ assert (dup2 (sv[W], W) == W);
+ assert (close (sv[W]) == 0);
+ assert (sendmmsg (W, mmh, n_mmh, 0) == n_mmh);
+ assert (close (W) == 0);
+
+ assert (dup2 (sv[R], R) == R);
+ assert (close (sv[R]) == 0);
+ assert (recvmmsg(R, mmh, n_mmh, 0, NULL) == n_mmh);
+ assert (close (R) == 0);
+ return 0;
+#else
+ return 77;
+#endif
+}
diff --git a/tests/mmsg.expected b/tests/mmsg.expected
new file mode 100644
index 0000000..7fe433c
--- /dev/null
+++ b/tests/mmsg.expected
@@ -0,0 +1,19 @@
+sendmmsg(0, {{{msg_name(0)=NULL, msg_iov(2)=[{"one", 3}, {"two", 3}], msg_controllen=0, msg_flags=0}, 6}, {{msg_name(0)=NULL, msg_iov(1)=[{"three", 5}], msg_controllen=0, msg_flags=0}, 5}}, 2, 0) = 2
+ = 2 buffers in vector 0
+ * 3 bytes in buffer 0
+ | 00000 6f 6e 65 one |
+ * 3 bytes in buffer 1
+ | 00000 74 77 6f two |
+ = 1 buffers in vector 1
+ * 5 bytes in buffer 0
+ | 00000 74 68 72 65 65 three |
+recvmmsg(1, {{{msg_name(0)=NULL, msg_iov(2)=[{"one", 3}, {"two", 3}], msg_controllen=0, msg_flags=0}, 6}, {{msg_name(0)=NULL, msg_iov(1)=[{"three", 5}], msg_controllen=0, msg_flags=0}, 5}}, 2, 0, NULL) = 2 (left NULL)
+ = 2 buffers in vector 0
+ * 3 bytes in buffer 0
+ | 00000 6f 6e 65 one |
+ * 3 bytes in buffer 1
+ | 00000 74 77 6f two |
+ = 1 buffers in vector 1
+ * 5 bytes in buffer 0
+ | 00000 74 68 72 65 65 three |
++++ exited with 0 +++
diff --git a/tests/mmsg.test b/tests/mmsg.test
new file mode 100755
index 0000000..417bb53
--- /dev/null
+++ b/tests/mmsg.test
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+# Check how iovecs in struct mmsghdr are decoded.
+
+. "${srcdir=.}/init.sh"
+
+mmsg_expected=mmsg.expected
+
+check_prog diff
+
+./mmsg || {
+ if [ $? -eq 77 ]; then
+ framework_skip_ 'sendmmsg/recvmmsg syscalls are not available'
+ else
+ fail_ 'mmsg failed'
+ fi
+}
+
+[ -f ${mmsg_expected} ] || {
+ fail_ "cannot find expected output file: ${mmsg_expected}"
+}
+
+[ -r ${mmsg_expected} ] || {
+ fail_ "cannot read expected output file: ${mmsg_expected}"
+}
+
+rm -f $LOG.*
+
+args="-e trace=recvmmsg,sendmmsg -e read=1 -e write=0 -o $LOG ./mmsg"
+$STRACE $args || {
+ cat $LOG;
+ fail_ "$STRACE $args failed"
+}
+
+
+diff $LOG ${mmsg_expected} || {
+ fail_ "$STRACE $args failed to decode mmsghdr properly"
+}
+
+exit 0
--
1.9.3
More information about the Strace-devel
mailing list