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