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