diff options
Diffstat (limited to 'tests/sys/mqueue')
-rw-r--r-- | tests/sys/mqueue/Makefile | 17 | ||||
-rw-r--r-- | tests/sys/mqueue/Makefile.depend | 19 | ||||
-rw-r--r-- | tests/sys/mqueue/mqtest1.c | 52 | ||||
-rw-r--r-- | tests/sys/mqueue/mqtest2.c | 96 | ||||
-rw-r--r-- | tests/sys/mqueue/mqtest3.c | 113 | ||||
-rw-r--r-- | tests/sys/mqueue/mqtest4.c | 115 | ||||
-rw-r--r-- | tests/sys/mqueue/mqtest5.c | 123 | ||||
-rw-r--r-- | tests/sys/mqueue/mqueue_test.sh | 80 |
8 files changed, 615 insertions, 0 deletions
diff --git a/tests/sys/mqueue/Makefile b/tests/sys/mqueue/Makefile new file mode 100644 index 000000000000..743c82ecc954 --- /dev/null +++ b/tests/sys/mqueue/Makefile @@ -0,0 +1,17 @@ +TESTSDIR= ${TESTSBASE}/sys/mqueue + +ATF_TESTS_SH= mqueue_test + +BINDIR= ${TESTSDIR} + +CFLAGS+= -I${SRCTOP}/tests + +PROGS+= mqtest1 +PROGS+= mqtest2 +PROGS+= mqtest3 +PROGS+= mqtest4 +PROGS+= mqtest5 + +LIBADD+= rt + +.include <bsd.test.mk> diff --git a/tests/sys/mqueue/Makefile.depend b/tests/sys/mqueue/Makefile.depend new file mode 100644 index 000000000000..fd5dbd04cba7 --- /dev/null +++ b/tests/sys/mqueue/Makefile.depend @@ -0,0 +1,19 @@ +# Autogenerated - do NOT edit! + +DIRDEPS = \ + gnu/lib/csu \ + include \ + include/xlocale \ + lib/${CSU_DIR} \ + lib/atf/libatf-c \ + lib/libc \ + lib/libcompiler_rt \ + lib/librt \ + lib/libthr \ + + +.include <dirdeps.mk> + +.if ${DEP_RELDIR} == ${_DEP_RELDIR} +# local dependencies - needed for -jN in clean tree +.endif diff --git a/tests/sys/mqueue/mqtest1.c b/tests/sys/mqueue/mqtest1.c new file mode 100644 index 000000000000..7f4ee74f9e8d --- /dev/null +++ b/tests/sys/mqueue/mqtest1.c @@ -0,0 +1,52 @@ + +#include <err.h> +#include <errno.h> +#include <fcntl.h> +#include <mqueue.h> +#include <signal.h> +#include <stdio.h> + +#define MQNAME "/mytstqueue1" + +int +main(void) +{ + struct mq_attr attr, attr2; + struct sigevent sigev; + mqd_t mq; + int status; + + attr.mq_maxmsg = 2; + attr.mq_msgsize = 100; + mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr); + if (mq == (mqd_t)-1) + err(1, "mq_open"); + status = mq_unlink(MQNAME); + if (status) + err(1, "mq_unlink"); + status = mq_getattr(mq, &attr2); + if (status) + err(1, "mq_getattr"); + if (attr.mq_maxmsg != attr2.mq_maxmsg) + err(1, "mq_maxmsg changed"); + if (attr.mq_msgsize != attr2.mq_msgsize) + err(1, "mq_msgsize changed"); + + sigev.sigev_notify = SIGEV_SIGNAL; + sigev.sigev_signo = SIGRTMIN; + status = mq_notify(mq, &sigev); + if (status) + err(1, "mq_notify"); + status = mq_notify(mq, &sigev); + if (status == 0) + err(1, "mq_notify 2"); + else if (errno != EBUSY) + err(1, "mq_notify 3"); + status = mq_notify(mq, NULL); + if (status) + err(1, "mq_notify 4"); + status = mq_close(mq); + if (status) + err(1, "mq_close"); + return (0); +} diff --git a/tests/sys/mqueue/mqtest2.c b/tests/sys/mqueue/mqtest2.c new file mode 100644 index 000000000000..efdca42eb37e --- /dev/null +++ b/tests/sys/mqueue/mqtest2.c @@ -0,0 +1,96 @@ + +#include <sys/types.h> +#include <sys/wait.h> +#include <err.h> +#include <fcntl.h> +#include <mqueue.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#define MQNAME "/mytstqueue2" +#define LOOPS 1000 +#define PRIO 10 + +static void +alarmhandler(int sig __unused) +{ + write(1, "timeout\n", 8); + _exit(1); +} + +int +main(void) +{ + struct mq_attr attr; + mqd_t mq; + int status; + pid_t pid; + + mq_unlink(MQNAME); + + attr.mq_maxmsg = 5; + attr.mq_msgsize = 128; + mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr); + if (mq == (mqd_t)-1) + err(1, "mq_open"); + status = mq_getattr(mq, &attr); + if (status) + err(1, "mq_getattr"); + pid = fork(); + if (pid == 0) { /* child */ + char *buf; + int j, i; + unsigned int prio; + + mq_close(mq); + + signal(SIGALRM, alarmhandler); + + mq = mq_open(MQNAME, O_RDWR); + if (mq == (mqd_t)-1) + err(1, "child: mq_open"); + buf = malloc(attr.mq_msgsize); + for (j = 0; j < LOOPS; ++j) { + alarm(3); + status = mq_receive(mq, buf, attr.mq_msgsize, &prio); + if (status == -1) + err(2, "child: mq_receive"); + for (i = 0; i < attr.mq_msgsize; ++i) + if (buf[i] != i) + err(3, "child: message data corrupted"); + if (prio != PRIO) + err(4, "child: priority is incorrect: %d", + prio); + } + alarm(0); + free(buf); + mq_close(mq); + return (0); + } else if (pid == -1) { + err(1, "fork()"); + } else { + char *buf; + int i, j; + + signal(SIGALRM, alarmhandler); + buf = malloc(attr.mq_msgsize); + for (j = 0; j < LOOPS; ++j) { + for (i = 0; i < attr.mq_msgsize; ++i) + buf[i] = i; + alarm(3); + status = mq_send(mq, buf, attr.mq_msgsize, PRIO); + if (status) + err(1, "mq_send"); + } + alarm(3); + wait(&status); + alarm(0); + } + status = mq_close(mq); + if (status) + err(1, "mq_close"); + mq_unlink(MQNAME); + return (0); +} diff --git a/tests/sys/mqueue/mqtest3.c b/tests/sys/mqueue/mqtest3.c new file mode 100644 index 000000000000..b2c9155c37ba --- /dev/null +++ b/tests/sys/mqueue/mqtest3.c @@ -0,0 +1,113 @@ + +#include <sys/types.h> +#include <sys/select.h> +#include <sys/wait.h> +#include <err.h> +#include <fcntl.h> +#include <mqueue.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#define MQNAME "/mytstqueue3" +#define LOOPS 1000 +#define PRIO 10 + +static void +sighandler(int sig __unused) +{ + write(1, "timeout\n", 8); + _exit(1); +} + +int +main(void) +{ + fd_set set; + struct mq_attr attr; + int status; + mqd_t mq; + pid_t pid; + + mq_unlink(MQNAME); + + attr.mq_maxmsg = 5; + attr.mq_msgsize = 128; + mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr); + if (mq == (mqd_t)-1) + err(1, "mq_open()"); + status = mq_getattr(mq, &attr); + if (status) + err(1, "mq_getattr()"); + + pid = fork(); + if (pid == 0) { /* child */ + char *buf; + int j, i; + unsigned int prio; + + mq_close(mq); + + signal(SIGALRM, sighandler); + + mq = mq_open(MQNAME, O_RDWR); + if (mq == (mqd_t)-1) + err(1, "child process: mq_open"); + buf = malloc(attr.mq_msgsize); + for (j = 0; j < LOOPS; ++j) { + FD_ZERO(&set); + FD_SET(mq_getfd_np(mq), &set); + alarm(3); + status = select(mq_getfd_np(mq) + 1, &set, NULL, + NULL, NULL); + if (status != 1) + err(1, "child process: select()"); + status = mq_receive(mq, buf, attr.mq_msgsize, &prio); + if (status == -1) + err(2, "child process: mq_receive"); + for (i = 0; i < attr.mq_msgsize; ++i) + if (buf[i] != i) + err(3, "message data corrupted"); + if (prio != PRIO) + err(4, "priority is incorrect: %d", prio); + } + alarm(0); + free(buf); + mq_close(mq); + return (0); + } else if (pid == -1) { + err(1, "fork()"); + } else { + char *buf; + int i, j; + + signal(SIGALRM, sighandler); + buf = malloc(attr.mq_msgsize); + for (j = 0; j < LOOPS; ++j) { + for (i = 0; i < attr.mq_msgsize; ++i) { + buf[i] = i; + } + alarm(3); + FD_ZERO(&set); + FD_SET(mq_getfd_np(mq), &set); + status = select(mq_getfd_np(mq) + 1, NULL, &set, + NULL, NULL); + if (status != 1) + err(1, "select()"); + status = mq_send(mq, buf, attr.mq_msgsize, PRIO); + if (status) { + kill(pid, SIGKILL); + err(2, "mq_send()"); + } + } + alarm(3); + wait(&status); + alarm(0); + } + status = mq_close(mq); + if (status) + err(1, "mq_close"); + mq_unlink(MQNAME); + return (0); +} diff --git a/tests/sys/mqueue/mqtest4.c b/tests/sys/mqueue/mqtest4.c new file mode 100644 index 000000000000..68648b01a9e4 --- /dev/null +++ b/tests/sys/mqueue/mqtest4.c @@ -0,0 +1,115 @@ + +#include <sys/types.h> +#include <sys/event.h> +#include <sys/select.h> +#include <sys/wait.h> +#include <err.h> +#include <fcntl.h> +#include <mqueue.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#define MQNAME "/mytstqueue4" +#define LOOPS 1000 +#define PRIO 10 + +static void +sighandler(int sig __unused) +{ + write(1, "timeout\n", 8); + _exit(1); +} + +int +main(void) +{ + struct kevent kev; + struct mq_attr attr; + mqd_t mq; + int kq, status; + pid_t pid; + + mq_unlink(MQNAME); + + attr.mq_maxmsg = 5; + attr.mq_msgsize = 128; + mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr); + if (mq == (mqd_t) -1) + err(1, "mq_open()"); + status = mq_getattr(mq, &attr); + if (status) + err(1, "mq_getattr()"); + pid = fork(); + if (pid == 0) { /* child */ + char *buf; + int j, i; + unsigned int prio; + + mq_close(mq); + kq = kqueue(); + mq = mq_open(MQNAME, O_RDWR); + if (mq == (mqd_t)-1) + err(1, "child: mq_open"); + EV_SET(&kev, mq_getfd_np(mq), EVFILT_READ, EV_ADD, 0, 0, 0); + status = kevent(kq, &kev, 1, NULL, 0, NULL); + if (status == -1) + err(1, "child: kevent"); + buf = malloc(attr.mq_msgsize); + for (j = 0; j < LOOPS; ++j) { + alarm(3); + status = kevent(kq, NULL, 0, &kev, 1, NULL); + if (status != 1) + err(1, "child: kevent 2"); + status = mq_receive(mq, buf, attr.mq_msgsize, &prio); + if (status == -1) + err(2, "child: mq_receive"); + for (i = 0; i < attr.mq_msgsize; ++i) + if (buf[i] != i) + err(3, "child: message data corrupted"); + if (prio != PRIO) + err(4, "child: priority is incorrect: %d", + prio); + } + alarm(0); + free(buf); + mq_close(mq); + return (0); + } else if (pid == -1) { + err(1, "fork()"); + } else { + char *buf; + int i, j; + + signal(SIGALRM, sighandler); + kq = kqueue(); + EV_SET(&kev, mq_getfd_np(mq), EVFILT_WRITE, EV_ADD, 0, 0, 0); + status = kevent(kq, &kev, 1, NULL, 0, NULL); + if (status == -1) + err(1, "kevent"); + buf = malloc(attr.mq_msgsize); + for (j = 0; j < LOOPS; ++j) { + for (i = 0; i < attr.mq_msgsize; ++i) { + buf[i] = i; + } + alarm(3); + status = kevent(kq, NULL, 0, &kev, 1, NULL); + if (status != 1) + err(1, "child: kevent 2"); + status = mq_send(mq, buf, attr.mq_msgsize, PRIO); + if (status) { + err(2, "mq_send()"); + } + } + free(buf); + alarm(3); + wait(&status); + alarm(0); + } + status = mq_close(mq); + if (status) + err(1, "mq_close"); + mq_unlink(MQNAME); + return (0); +} diff --git a/tests/sys/mqueue/mqtest5.c b/tests/sys/mqueue/mqtest5.c new file mode 100644 index 000000000000..6671839829bf --- /dev/null +++ b/tests/sys/mqueue/mqtest5.c @@ -0,0 +1,123 @@ + +#include <sys/types.h> +#include <sys/event.h> +#include <sys/select.h> +#include <sys/wait.h> +#include <err.h> +#include <fcntl.h> +#include <mqueue.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#define MQNAME "/mytstqueue5" +#define LOOPS 1000 +#define PRIO 10 + +static void +sighandler(int sig __unused) +{ + write(1, "timeout\n", 8); + _exit(1); +} + +int +main(void) +{ + int status; + struct mq_attr attr; + struct sigaction sa; + sigset_t set; + siginfo_t info; + mqd_t mq; + pid_t pid; + + mq_unlink(MQNAME); + + sigemptyset(&set); + sigaddset(&set, SIGRTMIN); + sigprocmask(SIG_BLOCK, &set, NULL); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = (void *) SIG_DFL; + sigaction(SIGRTMIN, &sa, NULL); + + attr.mq_maxmsg = 5; + attr.mq_msgsize = 128; + mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr); + if (mq == (mqd_t)-1) + err(1, "mq_open()"); + status = mq_getattr(mq, &attr); + if (status) + err(1, "mq_getattr()"); + pid = fork(); + if (pid == 0) { /* child */ + int prio, j, i; + char *buf; + struct sigevent sigev; + + signal(SIGALRM, sighandler); + + sigev.sigev_notify = SIGEV_SIGNAL; + sigev.sigev_signo = SIGRTMIN; + sigev.sigev_value.sival_int = 2; + + mq_close(mq); + mq = mq_open(MQNAME, O_RDWR | O_NONBLOCK); + if (mq == (mqd_t)-1) + err(1, "child: mq_open"); + buf = malloc(attr.mq_msgsize); + for (j = 0; j < LOOPS; ++j) { + alarm(3); + status = mq_notify(mq, &sigev); + if (status) + err(1, "child: mq_notify"); + status = sigwaitinfo(&set, &info); + if (status == -1) + err(1, "child: sigwaitinfo"); + if (info.si_value.sival_int != 2) + err(1, "child: sival_int"); + status = mq_receive(mq, buf, attr.mq_msgsize, &prio); + if (status == -1) + err(2, "child: mq_receive"); + for (i = 0; i < attr.mq_msgsize; ++i) + if (buf[i] != i) + err(3, "child: message data corrupted"); + if (prio != PRIO) + err(4, "child: priority is incorrect: %d", + prio); + } + alarm(0); + free(buf); + mq_close(mq); + return (0); + } else if (pid == -1) { + err(1, "fork()"); + } else { + char *buf; + int i, j; + + signal(SIGALRM, sighandler); + buf = malloc(attr.mq_msgsize); + for (j = 0; j < LOOPS; ++j) { + for (i = 0; i < attr.mq_msgsize; ++i) { + buf[i] = i; + } + alarm(3); + status = mq_send(mq, buf, attr.mq_msgsize, PRIO); + if (status) { + kill(pid, SIGKILL); + err(2, "mq_send()"); + } + } + alarm(3); + wait(&status); + alarm(0); + } + status = mq_close(mq); + if (status) + err(1, "mq_close"); + mq_unlink(MQNAME); + return (0); +} diff --git a/tests/sys/mqueue/mqueue_test.sh b/tests/sys/mqueue/mqueue_test.sh new file mode 100644 index 000000000000..4f947dc260ed --- /dev/null +++ b/tests/sys/mqueue/mqueue_test.sh @@ -0,0 +1,80 @@ +# +# Copyright (c) 2015 EMC / Isilon Storage Division +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# + +mqtest1_head() +{ + atf_set require.kmods mqueuefs +} +mqtest1_body() +{ + atf_check -s exit:0 -x $(atf_get_srcdir)/mqtest1 +} + +mqtest2_head() +{ + atf_set require.kmods mqueuefs +} +mqtest2_body() +{ + atf_check -s exit:0 -x $(atf_get_srcdir)/mqtest2 +} + +mqtest3_head() +{ + atf_set require.kmods mqueuefs +} +mqtest3_body() +{ + atf_check -s exit:0 -x $(atf_get_srcdir)/mqtest3 +} + +mqtest4_head() +{ + atf_set require.kmods mqueuefs +} +mqtest4_body() +{ + atf_check -s exit:0 -x $(atf_get_srcdir)/mqtest4 +} + +mqtest5_head() +{ + atf_set require.kmods mqueuefs +} +mqtest5_body() +{ + atf_check -s exit:0 -x $(atf_get_srcdir)/mqtest5 +} + +atf_init_test_cases() +{ + atf_add_test_case mqtest1 + atf_add_test_case mqtest2 + atf_add_test_case mqtest3 + atf_add_test_case mqtest4 + atf_add_test_case mqtest5 +} |