Home | History | Annotate | Download | only in mq_timedsend
      1 /*
      2  * Copyright (c) 2003, Intel Corporation. All rights reserved.
      3  * Created by:  julie.n.fleischer REMOVE-THIS AT intel DOT com
      4  * This file is licensed under the GPL license.  For the full content
      5  * of this license, see the COPYING file at the top level of this
      6  * source tree.
      7  */
      8 
      9 /*
     10  * Test that mq_timedsend() inserts messages into the message queue according
     11  * to the priority given.  Specifically, test that messages with equal
     12  * priority values are placed after previously sent messages.
     13  *
     14  * Test similar to 3-1.c; however, messages 3 and 4 will have equal priority
     15  * order, but 3 will be sent first.
     16  *
     17  * 3/13/03 - Added fix from Gregoire Pichon for specifying an attr
     18  *           with a mq_maxmsg >= BUFFER.
     19  *
     20  */
     21 
     22 #include <stdio.h>
     23 #include <mqueue.h>
     24 #include <fcntl.h>
     25 #include <sys/stat.h>
     26 #include <sys/types.h>
     27 #include <unistd.h>
     28 #include <string.h>
     29 #include <time.h>
     30 #include "posixtest.h"
     31 
     32 #define NAMESIZE 50
     33 #define MSG1 "1234567890"
     34 #define PRI1 10
     35 #define MSG2 "234567890"
     36 #define PRI2 8
     37 #define MSG3 "34567890"
     38 #define PRI3 2
     39 #define MSG4 "4567890"
     40 #define PRI4 2
     41 #define MSG5 "567890"
     42 #define PRI5 1
     43 #define BUFFER 40
     44 #define MAXMSG 10
     45 
     46 int main(void)
     47 {
     48 	char qname[NAMESIZE], msgrcd[BUFFER];
     49 	const char *msgptr1 = MSG1;
     50 	const char *msgptr2 = MSG2;
     51 	const char *msgptr3 = MSG3;
     52 	const char *msgptr4 = MSG4;
     53 	const char *msgptr5 = MSG5;
     54 	struct timespec ts;
     55 	mqd_t queue;
     56 	struct mq_attr attr;
     57 	int unresolved = 0, failure = 0;
     58 	unsigned pri;
     59 
     60 	sprintf(qname, "/mq_timedsend_3-2_%d", getpid());
     61 
     62 	attr.mq_msgsize = BUFFER;
     63 	attr.mq_maxmsg = BUFFER;
     64 	queue = mq_open(qname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &attr);
     65 	if (queue == (mqd_t) - 1) {
     66 		perror("mq_open() did not return success");
     67 		return PTS_UNRESOLVED;
     68 	}
     69 
     70 	ts.tv_sec = time(NULL) + 1;
     71 	ts.tv_nsec = 0;
     72 	if (mq_timedsend(queue, msgptr3, strlen(msgptr3), PRI3, &ts) != 0) {
     73 		perror("mq_timedsend() did not return success");
     74 		printf("error sending %s\n", msgptr3);
     75 		failure = 1;
     76 	}
     77 
     78 	ts.tv_sec++;
     79 	if (mq_timedsend(queue, msgptr1, strlen(msgptr1), PRI1, &ts) != 0) {
     80 		perror("mq_timedsend() did not return success");
     81 		printf("error sending %s\n", msgptr1);
     82 		failure = 1;
     83 	}
     84 
     85 	ts.tv_sec++;
     86 	if (mq_timedsend(queue, msgptr4, strlen(msgptr4), PRI4, &ts) != 0) {
     87 		perror("mq_timedsend() did not return success");
     88 		printf("error sending %s\n", msgptr4);
     89 		failure = 1;
     90 	}
     91 
     92 	ts.tv_sec++;
     93 	if (mq_timedsend(queue, msgptr2, strlen(msgptr2), PRI2, &ts) != 0) {
     94 		perror("mq_timedsend() did not return success");
     95 		printf("error sending %s\n", msgptr2);
     96 		failure = 1;
     97 	}
     98 
     99 	ts.tv_sec++;
    100 	if (mq_timedsend(queue, msgptr5, strlen(msgptr5), PRI5, &ts) != 0) {
    101 		perror("mq_timedsend() did not return success");
    102 		printf("error sending %s\n", msgptr5);
    103 		failure = 1;
    104 	}
    105 
    106 	if (mq_receive(queue, msgrcd, BUFFER, &pri) == -1) {
    107 		perror("mq_receive() returned failure");
    108 		unresolved = 1;
    109 	}
    110 
    111 	if (strncmp(msgptr1, msgrcd, strlen(msgptr1)) != 0) {
    112 		printf("FAIL:  sent %s received %s\n", msgptr1, msgrcd);
    113 		failure = 1;
    114 	}
    115 
    116 	if (mq_receive(queue, msgrcd, BUFFER, &pri) == -1) {
    117 		perror("mq_receive() returned failure");
    118 		unresolved = 1;
    119 	}
    120 
    121 	if (strncmp(msgptr2, msgrcd, strlen(msgptr2)) != 0) {
    122 		printf("FAIL:  sent %s received %s\n", msgptr2, msgrcd);
    123 		failure = 1;
    124 	}
    125 
    126 	if (mq_receive(queue, msgrcd, BUFFER, &pri) == -1) {
    127 		perror("mq_receive() returned failure");
    128 		unresolved = 1;
    129 	}
    130 
    131 	if (strncmp(msgptr3, msgrcd, strlen(msgptr3)) != 0) {
    132 		printf("FAIL:  sent %s received %s\n", msgptr3, msgrcd);
    133 		failure = 1;
    134 	}
    135 
    136 	if (mq_receive(queue, msgrcd, BUFFER, &pri) == -1) {
    137 		perror("mq_receive() returned failure");
    138 		unresolved = 1;
    139 	}
    140 
    141 	if (strncmp(msgptr4, msgrcd, strlen(msgptr4)) != 0) {
    142 		printf("FAIL:  sent %s received %s\n", msgptr4, msgrcd);
    143 		failure = 1;
    144 	}
    145 
    146 	if (mq_receive(queue, msgrcd, BUFFER, &pri) == -1) {
    147 		perror("mq_receive() returned failure");
    148 		unresolved = 1;
    149 	}
    150 
    151 	if (strncmp(msgptr5, msgrcd, strlen(msgptr5)) != 0) {
    152 		printf("FAIL:  sent %s received %s\n", msgptr5, msgrcd);
    153 		failure = 1;
    154 	}
    155 
    156 	if (mq_close(queue) != 0) {
    157 		perror("mq_close() did not return success");
    158 		unresolved = 1;
    159 	}
    160 
    161 	if (mq_unlink(qname) != 0) {
    162 		perror("mq_unlink() did not return success");
    163 		unresolved = 1;
    164 	}
    165 
    166 	if (failure == 1) {
    167 		printf("Test FAILED\n");
    168 		return PTS_FAIL;
    169 	}
    170 
    171 	if (unresolved == 1) {
    172 		printf("Test UNRESOLVED\n");
    173 		return PTS_UNRESOLVED;
    174 	}
    175 
    176 	printf("Test PASSED\n");
    177 	return PTS_PASS;
    178 }
    179