tests: add a test for decoding and dumping of recvmmsg/sendmmsg
authorMasatake YAMATO <yamato@redhat.com>
Thu, 6 Nov 2014 16:23:27 +0000 (01:23 +0900)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 11 Nov 2014 15:45:26 +0000 (15:45 +0000)
* configure (AC_CHECK_FUNCS): Add sendmmsg.
* tests/mmsg.c: New file.
* tests/mmsg.expected: New file.
* tests/mmsg.test: New test.
* tests/.gitignore: Add mmsg.
* tests/Makefile.am (CHECK_PROGRAMS): Add mmsg.
(TESTS): Add mmsg.test.
(EXTRA_DIST): Add mmsg.expected.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
configure.ac
tests/.gitignore
tests/Makefile.am
tests/mmsg.c [new file with mode: 0644]
tests/mmsg.expected [new file with mode: 0644]
tests/mmsg.test [new file with mode: 0755]

index 7862f65dbb9d392d8e4c99aa71c6eefd644fb39d..f55af46f7e3868f9692f536e0cc6ede2ea2aea81 100644 (file)
@@ -219,6 +219,7 @@ AC_CHECK_FUNCS(m4_normalize([
        process_vm_readv
        pwritev
        sendmsg
+       sendmmsg
        sigaction
        stpcpy
        strerror
index dc408c9aa0bb8ddcae41526d7c92b51feb63b990..aa808c20d278ccadb8badaf0520fc899587b86df 100644 (file)
@@ -1,4 +1,5 @@
 inet-accept-connect-send-recv
+mmsg
 net-accept-connect
 netlink_inet_diag
 scm_rights
index 541a0c4669853558280fbdd3018d378bfbd34de8..aef6a56e50c94cb6f253af64f6167cfa8ac0cfa3 100644 (file)
@@ -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 \
@@ -43,6 +45,7 @@ TEST_LOG_COMPILER = $(srcdir)/run.sh
 
 EXTRA_DIST = init.sh run.sh \
             getdents.awk \
+            mmsg.expected \
             net-yy-accept.awk \
             net-yy-connect.awk \
             sigaction.awk \
diff --git a/tests/mmsg.c b/tests/mmsg.c
new file mode 100644 (file)
index 0000000..496111b
--- /dev/null
@@ -0,0 +1,74 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <sys/socket.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <assert.h>
+
+int
+main(void)
+{
+#if defined(HAVE_SENDMMSG) && defined(HAVE_STRUCT_MMSGHDR)
+       const int R = 0, W = 1;
+       int fd;
+       int sv[2];
+       char one[] = "one";
+       char two[] = "two";
+       char three[] = "three";
+
+       struct iovec iov[] = {
+               {
+                       .iov_base = one,
+                       .iov_len = sizeof(one) - 1
+               }, {
+                       .iov_base = two,
+                       .iov_len = sizeof(two) - 1
+               }, {
+                       .iov_base = three,
+                       .iov_len = sizeof(three) - 1
+               }
+       };
+
+       struct mmsghdr mmh[] = {
+               {
+                       .msg_hdr = {
+                               .msg_iov = iov + 0,
+                               .msg_iovlen = 2,
+                       }
+               }, {
+                       .msg_hdr = {
+                               .msg_iov = iov + 2,
+                               .msg_iovlen = 1,
+                       }
+               }
+       };
+#define n_mmh (sizeof(mmh)/sizeof(mmh[0]))
+
+       /*
+        * Following open/dup2/close calls make the output of strace
+        * more predictable, so we can just compare the output and
+        * expected output (mmsg.expected) for testing purposes.
+        */
+       while ((fd = open("/dev/null", O_RDWR)) < 3)
+               assert(fd >= 0);
+       (void) close(3);
+
+       assert(socketpair(AF_UNIX, SOCK_DGRAM, 0, sv) == 0);
+
+       assert(dup2(sv[W], W) == W);
+       assert(close(sv[W]) == 0);
+       assert(dup2(sv[R], R) == R);
+       assert(close(sv[R]) == 0);
+
+       assert(sendmmsg(W, mmh, n_mmh, 0) == n_mmh);
+       assert(close(W) == 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 (file)
index 0000000..a170718
--- /dev/null
@@ -0,0 +1,19 @@
+sendmmsg(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) = 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(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, 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 (executable)
index 0000000..ad5c659
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+# Check how iovecs in struct mmsghdr are decoded.
+
+. "${srcdir=.}/init.sh"
+
+mmsg_expected="${srcdir=.}/mmsg.expected"
+
+check_prog diff
+
+cat "$mmsg_expected" > /dev/null ||
+       fail_ "$mmsg_expected is not available"
+
+./mmsg || {
+       if [ $? -eq 77 ]; then
+               framework_skip_ 'sendmmsg/recvmmsg syscalls are not available'
+       else
+               fail_ 'mmsg failed'
+       fi
+}
+
+args="-e trace=recvmmsg,sendmmsg -e read=0 -e write=1 -o $LOG ./mmsg"
+$STRACE $args || {
+       cat $LOG
+       fail_ "$STRACE $args failed"
+}
+
+diff "$mmsg_expected" $LOG ||
+       fail_ "$STRACE $args failed to decode mmsghdr properly"
+
+exit 0