t_mqueue.c revision 290913
1272343Sngie/*	$NetBSD: t_mqueue.c,v 1.4 2014/03/02 19:56:48 jmmv Exp $ */
2272343Sngie
3272343Sngie/*
4272343Sngie * Test for POSIX message queue priority handling.
5272343Sngie *
6272343Sngie * This file is in the Public Domain.
7272343Sngie */
8272343Sngie
9290913Sngie#ifdef __FreeBSD__
10290913Sngie#include <sys/stat.h>
11290913Sngie#include <fcntl.h>
12290913Sngie
13290913Sngie#include "freebsd_test_suite/macros.h"
14290913Sngie#endif
15290913Sngie
16272343Sngie#include <atf-c.h>
17272343Sngie
18272343Sngie#include <stdio.h>
19272343Sngie#include <stdlib.h>
20272343Sngie#include <string.h>
21272343Sngie#include <errno.h>
22272343Sngie#include <unistd.h>
23272343Sngie
24272343Sngie#include <mqueue.h>
25272343Sngie
26272343Sngie#define	MQ_PRIO_BASE	24
27272343Sngie
28272343Sngiestatic void
29272343Sngiesend_msgs(mqd_t mqfd)
30272343Sngie{
31272343Sngie	char msg[2];
32272343Sngie
33272343Sngie	msg[1] = '\0';
34272343Sngie
35272343Sngie	msg[0] = 'a';
36272343Sngie	ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE) != -1,
37272343Sngie	    "mq_send 1 failed: %d", errno);
38272343Sngie
39272343Sngie	msg[0] = 'b';
40272343Sngie	ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE + 1) != -1,
41272343Sngie	    "mq_send 2 failed: %d", errno);
42272343Sngie
43272343Sngie	msg[0] = 'c';
44272343Sngie	ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE) != -1,
45272343Sngie	    "mq_send 3 failed: %d", errno);
46272343Sngie
47272343Sngie	msg[0] = 'd';
48272343Sngie	ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE - 1) != -1,
49272343Sngie	    "mq_send 4 failed: %d", errno);
50272343Sngie
51272343Sngie	msg[0] = 'e';
52272343Sngie	ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), 0) != -1,
53272343Sngie	    "mq_send 5 failed: %d", errno);
54272343Sngie
55272343Sngie	msg[0] = 'f';
56272343Sngie	ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE + 1) != -1,
57272343Sngie	    "mq_send 6 failed: %d", errno);
58272343Sngie}
59272343Sngie
60272343Sngiestatic void
61272343Sngiereceive_msgs(mqd_t mqfd)
62272343Sngie{
63272343Sngie	struct mq_attr mqa;
64272343Sngie	char *m;
65272343Sngie	unsigned p;
66272343Sngie	int len;
67272343Sngie
68272343Sngie	ATF_REQUIRE_MSG(mq_getattr(mqfd, &mqa) != -1, "mq_getattr failed %d",
69272343Sngie	    errno);
70272343Sngie
71272343Sngie	len = mqa.mq_msgsize;
72272343Sngie	m = calloc(1, len);
73272343Sngie	ATF_REQUIRE_MSG(m != NULL, "calloc failed");
74272343Sngie
75272343Sngie	ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1,
76272343Sngie	    "mq_receive 1 failed: %d", errno);
77272343Sngie	ATF_REQUIRE_MSG(p == (MQ_PRIO_BASE + 1) && m[0] == 'b',
78272343Sngie	    "mq_receive 1 prio/data mismatch");
79272343Sngie
80272343Sngie	ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1,
81272343Sngie	    "mq_receive 2 failed: %d", errno);
82272343Sngie	ATF_REQUIRE_MSG(p == (MQ_PRIO_BASE + 1) && m[0] == 'f',
83272343Sngie	    "mq_receive 2 prio/data mismatch");
84272343Sngie
85272343Sngie	ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1,
86272343Sngie	    "mq_receive 3 failed: %d", errno);
87272343Sngie	ATF_REQUIRE_MSG(p == MQ_PRIO_BASE && m[0] == 'a',
88272343Sngie	    "mq_receive 3 prio/data mismatch");
89272343Sngie
90272343Sngie	ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1,
91272343Sngie	    "mq_receive 4 failed: %d", errno);
92272343Sngie	ATF_REQUIRE_MSG(p == MQ_PRIO_BASE && m[0] == 'c',
93272343Sngie	    "mq_receive 4 prio/data mismatch");
94272343Sngie
95272343Sngie	ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1,
96272343Sngie	    "mq_receive 5 failed: %d", errno);
97272343Sngie	ATF_REQUIRE_MSG(p == (MQ_PRIO_BASE - 1) && m[0] == 'd',
98272343Sngie	    "mq_receive 5 prio/data mismatch");
99272343Sngie
100272343Sngie	ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1,
101272343Sngie	    "mq_receive 6 failed: %d", errno);
102272343Sngie	ATF_REQUIRE_MSG(p == 0 && m[0] == 'e',
103272343Sngie	    "mq_receive 6 prio/data mismatch");
104272343Sngie}
105272343Sngie
106272343SngieATF_TC(mqueue);
107272343SngieATF_TC_HEAD(mqueue, tc)
108272343Sngie{
109272343Sngie
110272343Sngie	atf_tc_set_md_var(tc, "timeout", "3");
111272343Sngie	atf_tc_set_md_var(tc, "descr", "Checks mqueue send/receive");
112272343Sngie}
113272343Sngie
114272343SngieATF_TC_BODY(mqueue, tc)
115272343Sngie{
116272343Sngie	int status;
117272343Sngie	char *tmpdir;
118272343Sngie	char template[32];
119272343Sngie	char mq_name[64];
120272343Sngie
121290913Sngie#ifdef __FreeBSD__
122290913Sngie	ATF_REQUIRE_KERNEL_MODULE("mqueuefs");
123290913Sngie#endif
124290913Sngie
125272343Sngie	strlcpy(template, "./t_mqueue.XXXXXX", sizeof(template));
126272343Sngie	tmpdir = mkdtemp(template);
127272343Sngie	ATF_REQUIRE_MSG(tmpdir != NULL, "mkdtemp failed: %d", errno);
128290913Sngie#ifdef __FreeBSD__
129290913Sngie	snprintf(mq_name, sizeof(mq_name), "/t_mqueue");
130290913Sngie#else
131272343Sngie	snprintf(mq_name, sizeof(mq_name), "%s/mq", tmpdir);
132290913Sngie#endif
133272343Sngie
134272343Sngie	mqd_t mqfd;
135272343Sngie
136272343Sngie	mqfd = mq_open(mq_name, O_RDWR | O_CREAT,
137272343Sngie	    S_IRUSR | S_IRWXG | S_IROTH, NULL);
138290913Sngie#ifdef __FreeBSD__
139290913Sngie	ATF_REQUIRE_MSG(mqfd != (mqd_t)-1, "mq_open failed: %d", errno);
140290913Sngie#else
141272343Sngie	ATF_REQUIRE_MSG(mqfd != -1, "mq_open failed: %d", errno);
142290913Sngie#endif
143272343Sngie
144272343Sngie	send_msgs(mqfd);
145272343Sngie	receive_msgs(mqfd);
146272343Sngie
147272343Sngie	status = mq_close(mqfd);
148272343Sngie	ATF_REQUIRE_MSG(status == 0, "mq_close failed: %d", errno);
149272343Sngie}
150272343Sngie
151272343SngieATF_TP_ADD_TCS(tp)
152272343Sngie{
153272343Sngie	ATF_TP_ADD_TC(tp, mqueue);
154272343Sngie
155272343Sngie	return atf_no_error();
156272343Sngie}
157