[PATCHv4] Add a test case for "-e write=n -e read=m" option for sendmmsg/recvmsg system calls

Masatake YAMATO yamato at redhat.com
Mon Nov 10 02:46:32 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.

Changes in v3 patch: Rewritten as suggsted by ldv.

Changes in v4 patch (suggested by ldv):

* tests/Makefile.am (EXTRA_DIST): add mmsg.expected.

* tests/mmsg.c (main): Check HAVE_STRUCT_MMSGHDR, too.
  (main): Use file descriptor 0 for reading, and
  1 for writing.
  (main): The size specifier for iovec and mmsghdr arrays are
  omitted.
  (n_mmh): define this macro after definition of mmh array.
  (main): ensure that all standard descriptors are
  already in use before this socketpair call.
  (main): Remove all whitespace after function name in function call.
  (fcntl.h): include for use open(2).

* tests/mmsg.test: Use file descriptor 0 for reading, and
  1 for writing.
  Trim unnessary white spaces.
  Simplify the test for availability of mmsg.expected file.
  Remove unnessary semicolon at the end of line.
  Reorder the arguments for diff command.

Signed-off-by: Masatake YAMATO <yamato at redhat.com>
---
 tests/.gitignore    |  1 +
 tests/Makefile.am   |  3 +++
 tests/mmsg.c        | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/mmsg.expected | 19 ++++++++++++++
 tests/mmsg.test     | 33 ++++++++++++++++++++++++
 5 files changed, 130 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..aef6a56 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 0000000..1972c72
--- /dev/null
+++ b/tests/mmsg.c
@@ -0,0 +1,74 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <sys/socket.h>
+#include <unistd.h>
+#include <assert.h>
+#include <fcntl.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 purpose. */
+	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 0000000..a170718
--- /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 0000000..c2a63bc
--- /dev/null
+++ b/tests/mmsg.test
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+# Check how iovecs in struct mmsghdr are decoded.
+
+. "${srcdir=.}/init.sh"
+
+mmsg_expected=${srcdir}/mmsg.expected
+
+check_prog diff
+
+./mmsg || {
+	if [ $? -eq 77 ]; then
+		framework_skip_ 'sendmmsg/recvmmsg syscalls are not available'
+	else
+		fail_ 'mmsg failed'
+	fi
+}
+
+cat "$mmsg_expected" > /dev/null ||
+	fail_ "$mmsg_expected is not available"
+
+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
-- 
1.9.3





More information about the Strace-devel mailing list