From 993198deb3a0e3311e7a062451d141c5c410406c Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Fri, 7 Nov 2014 01:23:27 +0900 Subject: [PATCH] tests: add a test for decoding and dumping of recvmmsg/sendmmsg * 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 Signed-off-by: Dmitry V. Levin --- configure.ac | 1 + tests/.gitignore | 1 + tests/Makefile.am | 3 ++ tests/mmsg.c | 74 +++++++++++++++++++++++++++++++++++++++++++++ tests/mmsg.expected | 19 ++++++++++++ tests/mmsg.test | 31 +++++++++++++++++++ 6 files changed, 129 insertions(+) create mode 100644 tests/mmsg.c create mode 100644 tests/mmsg.expected create mode 100755 tests/mmsg.test diff --git a/configure.ac b/configure.ac index 7862f65d..f55af46f 100644 --- a/configure.ac +++ b/configure.ac @@ -219,6 +219,7 @@ AC_CHECK_FUNCS(m4_normalize([ process_vm_readv pwritev sendmsg + sendmmsg sigaction stpcpy strerror diff --git a/tests/.gitignore b/tests/.gitignore index dc408c9a..aa808c20 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 541a0c46..aef6a56e 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 \ @@ -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 index 00000000..496111bf --- /dev/null +++ b/tests/mmsg.c @@ -0,0 +1,74 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include +#include +#include +#include + +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 index 00000000..a170718c --- /dev/null +++ b/tests/mmsg.expected @@ -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 index 00000000..ad5c659c --- /dev/null +++ b/tests/mmsg.test @@ -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 -- 2.40.0