1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "IpcMqTest.h"
17 #include <mqueue.h>
18 #include <fcntl.h>
19 #include <sys/stat.h>
20 #include <sys/types.h>
21 #include <sys/wait.h>
22 #include "log.h"
23 #include "utils.h"
24 #include "KernelConstants.h"
25 #include <securec.h>
26
27 using namespace testing::ext;
28
29 /* *
30 * @tc.number SUB_KERNEL_IPC_MQ_0100
31 * @tc.name mq_send and mq_receive function test
32 * @tc.desc [C- SOFTWARE -0200]
33 */
34 HWTEST_F(IpcMqTest, testMqOneLevelCom, Function | MediumTest | Level0)
35 {
36 mqd_t queue;
37 unsigned int prio;
38 struct mq_attr getAttr = { 0 };
39 struct mq_attr setAttr = { 0 };
40 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
41
42 sprintf_s(qName, sizeof(qName), "testMqOneLevelCom_%d", GetRandom(10000));
43 setAttr.mq_msgsize = MQ_MSG_SIZE;
44 setAttr.mq_maxmsg = MQ_MAX_MSG;
45 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
46 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
47 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
48
49 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
50 EXPECT_TRUE(getAttr.mq_msgsize == MQ_MSG_SIZE) << "getAttr.mq_msgsize != MQ_MSG_SIZE, "
51 << "getAttr.mq_msgsize = " << getAttr.mq_msgsize;
52 EXPECT_TRUE(getAttr.mq_maxmsg == MQ_MAX_MSG) << "getAttr.mq_maxmsg != MQ_MAX_MSG, "
53 << "getAttr.mq_maxmsg = " << getAttr.mq_maxmsg;
54
55 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
56 EXPECT_TRUE(prio == 0) << "ERROR: prio != 0, prio = " << prio;
57 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
58 rMsg;
59 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
60 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
61 }
62
63 /* *
64 * @tc.number SUB_KERNEL_IPC_MQ_0200
65 * @tc.name mq_timedsend and mq_timedreceive function test
66 * @tc.desc [C- SOFTWARE -0200]
67 */
68 HWTEST_F(IpcMqTest, testMqTimedOneLevelCom, Function | MediumTest | Level1)
69 {
70 mqd_t queue;
71 unsigned int prio;
72 struct timespec tts = { 0 }, rts = { 0 };
73 struct mq_attr getAttr = { 0 };
74 struct mq_attr setAttr = { 0 };
75 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
76
77 sprintf_s(qName, sizeof(qName), "testMqTimedOneLevelCom_%d", GetRandom(10000));
78 setAttr.mq_msgsize = MQ_MSG_SIZE;
79 setAttr.mq_maxmsg = MQ_MAX_MSG;
80 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
81 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
82
83 tts.tv_sec = time(NULL) + 1;
84 tts.tv_nsec = 0;
85 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
86
87 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
88 EXPECT_TRUE(getAttr.mq_msgsize == MQ_MSG_SIZE) << "getAttr.mq_msgsize != MQ_MSG_SIZE, "
89 << "getAttr.mq_msgsize = " << getAttr.mq_msgsize;
90 EXPECT_TRUE(getAttr.mq_maxmsg == MQ_MAX_MSG) << "getAttr.mq_maxmsg != MQ_MAX_MSG, "
91 << "getAttr.mq_maxmsg = " << getAttr.mq_maxmsg;
92 rts.tv_sec = time(NULL) + 1;
93 rts.tv_nsec = 0;
94 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
95 "ERROR: mq_timedreceive() == -1";
96 EXPECT_TRUE(prio == 0) << "ERROR: prio != 0, prio = " << prio;
97 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
98 rMsg;
99 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
100 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
101 }
102
103 /* *
104 * @tc.number SUB_KERNEL_IPC_MQ_0300
105 * @tc.name all send and all receive function test
106 * @tc.desc [C- SOFTWARE -0200]
107 */
108 HWTEST_F(IpcMqTest, testMqAllOneLevelCom, Function | MediumTest | Level2)
109 {
110 mqd_t queue;
111 unsigned int prio;
112 struct timespec tts { 0 }, rts = { 0 };
113 struct mq_attr getAttr = { 0 };
114 struct mq_attr setAttr = { 0 };
115 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
116
117 sprintf_s(qName, sizeof(qName), "testMqAllOneLevelCom_%d", GetRandom(10000));
118
119 memset_s(&getAttr, sizeof(getAttr), 0, sizeof(getAttr));
120 memset_s(&setAttr, sizeof(setAttr), 0, sizeof(setAttr));
121 setAttr.mq_msgsize = MQ_MSG_SIZE;
122 setAttr.mq_maxmsg = MQ_MAX_MSG;
123 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
124 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
125
126 EXPECT_TRUE(mq_getattr(queue, &setAttr) == 0) << "ERROR: mq_getattr() != 0";
127 setAttr.mq_msgsize = MQ_MSG_SIZE;
128 setAttr.mq_maxmsg = MQ_MAX_MSG;
129 EXPECT_TRUE(mq_setattr(queue, &setAttr, NULL) == 0) << "ERROR: mq_setattr() != 0";
130 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
131
132 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
133 EXPECT_TRUE(getAttr.mq_msgsize == setAttr.mq_msgsize) << "ERROR: getAttr.mq_msgsize != setAttr.mq_msgsize,"
134 " getAttr.mq_msgsize = " <<
135 getAttr.mq_msgsize << " setAttr.mq_msgsize = " << setAttr.mq_msgsize;
136 EXPECT_TRUE(getAttr.mq_maxmsg == setAttr.mq_maxmsg) << "ERROR: getAttr.mq_maxmsg != setAttr.mq_maxmsg,"
137 " getAttr.mq_maxmsg = " <<
138 getAttr.mq_maxmsg << " setAttr.mq_maxmsg = " << setAttr.mq_maxmsg;
139 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1, getAttr.mq_curmsgs = " <<
140 getAttr.mq_curmsgs;
141
142 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
143 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
144 rMsg;
145
146 tts.tv_sec = time(NULL) + 1;
147 tts.tv_nsec = 0;
148 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
149
150 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
151 EXPECT_TRUE(getAttr.mq_msgsize == setAttr.mq_msgsize) << "ERROR: getAttr.mq_msgsize != setAttr.mq_msgsize";
152 EXPECT_TRUE(getAttr.mq_maxmsg == setAttr.mq_maxmsg) << "ERROR: getAttr.mq_maxmsg != setAttr.mq_maxmsg";
153 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1";
154
155 rts.tv_sec = time(NULL) + 1;
156 rts.tv_nsec = 0;
157 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
158 "ERROR: mq_timedreceive() == -1";
159 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
160 rMsg;
161
162 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
163 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0"
164 << " errno = " << errno << " strerror(errno) = " << strerror(errno);
165 }
166
167 /* *
168 * @tc.number SUB_KERNEL_IPC_MQ_0400
169 * @tc.name mq_send and mq_receive function test in child and parent process
170 * @tc.desc [C- SOFTWARE -0200]
171 */
172 HWTEST_F(IpcMqTest, testMqTwoLevelCom, Function | MediumTest | Level1)
173 {
174 mqd_t queue;
175 pid_t pid;
176 unsigned int prio;
177 struct mq_attr getAttr = { 0 };
178 struct mq_attr setAttr = { 0 };
179 char qName[MQ_NAME_LEN], rMsg[MAX_MQ_MSG_SIZE], sMsg[MAX_MQ_MSG_SIZE];
180
181 for (int i = 0; i < MAX_MQ_MSG_SIZE; i++) {
182 sMsg[i] = 0x36;
183 rMsg[i] = 0x00;
184 }
185
186 sprintf_s(qName, sizeof(qName), "testMqMaxLenTwoLevelCom_%d", GetRandom(10000));
187 setAttr.mq_msgsize = MAX_MQ_MSG_SIZE;
188 setAttr.mq_maxmsg = MQ_MAX_MSG;
189 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
190 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
191
192 pid = fork();
193 if (pid < 0) {
194 goto FINISH;
195 } else if (pid == 0) {
196 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
197 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
198 EXPECT_TRUE(prio == 0) << "ERROR: prio != 0, prio = " << prio;
199 EXPECT_TRUE(strncmp(sMsg, rMsg, MAX_MQ_MSG_SIZE) == 0) << "sent != received: sent = " << sMsg <<
200 ", received = " << rMsg;
201 EXPECT_TRUE(mq_send(queue, sMsg, MAX_MQ_MSG_SIZE, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
202 exit(0);
203 } else {
204 int status;
205 EXPECT_TRUE(mq_send(queue, sMsg, MAX_MQ_MSG_SIZE, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
206
207 pid = waitpid(pid, &status, 0);
208 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
209 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
210 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
211 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
212 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
213 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
214 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
215 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
216 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
217 EXPECT_TRUE(strncmp(sMsg, rMsg, MAX_MQ_MSG_SIZE) == 0) << "sent != received: sent = " << sMsg <<
218 ", received = " << rMsg;
219 }
220
221 FINISH:
222 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
223 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
224 }
225
226 /* *
227 * @tc.number SUB_KERNEL_IPC_MQ_0500
228 * @tc.name mq_timedsend and mq_timedreceive function test in child and parent process
229 * @tc.desc [C- SOFTWARE -0200]
230 */
231 HWTEST_F(IpcMqTest, testMqTimedTwoLevelCom, Function | MediumTest | Level1)
232 {
233 mqd_t queue;
234 pid_t pid;
235 unsigned int prio;
236 struct timespec tts { 0 }, rts = { 0 };
237 struct mq_attr getAttr = { 0 };
238 struct mq_attr setAttr = { 0 };
239 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
240
241 sprintf_s(qName, sizeof(qName), "testMqTimedTwoLevelCom_%d", GetRandom(10000));
242 setAttr.mq_msgsize = MQ_MSG_SIZE;
243 setAttr.mq_maxmsg = MQ_MAX_MSG;
244 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
245 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
246
247 pid = fork();
248 if (pid < 0) {
249 goto FINISH;
250 } else if (pid == 0) {
251 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
252 rts.tv_sec = time(NULL) + 3;
253 rts.tv_nsec = 0;
254 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
255 "ERROR: mq_timedreceive() == -1";
256 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != 0, prio = " << prio;
257 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
258 ", received = " << rMsg;
259
260 tts.tv_sec = time(NULL) + 3;
261 tts.tv_nsec = 0;
262 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
263 exit(0);
264 } else {
265 int status;
266 tts.tv_sec = time(NULL) + 3;
267 tts.tv_nsec = 0;
268 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
269
270 pid = waitpid(pid, &status, 0);
271 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
272 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
273 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
274 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
275 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
276 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
277 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
278 rts.tv_sec = time(NULL) + 3;
279 rts.tv_nsec = 0;
280 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
281 "ERROR: mq_timedreceive() == -1";
282 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != 0, prio = " << prio;
283 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
284 ", received = " << rMsg;
285 }
286
287 FINISH:
288 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
289 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
290 }
291
292 /* *
293 * @tc.number SUB_KERNEL_IPC_MQ_0600
294 * @tc.name all send and all receive function test in child and parent process
295 * @tc.desc [C- SOFTWARE -0200]
296 */
297 HWTEST_F(IpcMqTest, testMqAllTwoLevelCom, Function | MediumTest | Level1)
298 {
299 mqd_t queue;
300 pid_t pid;
301 unsigned int prio;
302 struct timespec tts { 0 }, rts = { 0 };
303 struct mq_attr getAttr = { 0 };
304 struct mq_attr setAttr = { 0 };
305 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
306
307 sprintf_s(qName, sizeof(qName), "testMqAllTwoLevelCom_%d", GetRandom(10000));
308 setAttr.mq_msgsize = MQ_MSG_SIZE;
309 setAttr.mq_maxmsg = MQ_MAX_MSG;
310 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
311 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
312
313 pid = fork();
314 if (pid < 0) {
315 goto FINISH;
316 } else if (pid == 0) {
317 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
318 rts.tv_sec = time(NULL) + 1;
319 rts.tv_nsec = 0;
320 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
321 "ERROR: mq_timedreceive() == -1";
322 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
323 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
324 ", received = " << rMsg;
325
326 tts.tv_sec = time(NULL) + 1;
327 tts.tv_nsec = 0;
328 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
329 exit(0);
330 } else {
331 int status;
332 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
333
334 pid = waitpid(pid, &status, 0);
335 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
336 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
337 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
338 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
339 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
340 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
341 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
342 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
343 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
344 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
345 ", received = " << rMsg;
346 }
347
348 FINISH:
349 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
350 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
351 }
352
PthreadCom(void * arg)353 static void *PthreadCom(void *arg)
354 {
355 mqd_t queue;
356 unsigned int prio;
357 struct mq_attr getAttr = { 0 };
358 char rMsg[MQ_RX_LEN];
359
360 queue = (mqd_t)arg;
361 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
362 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
363 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != 0, prio = " << prio;
364 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
365 rMsg;
366 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
367
368 return nullptr;
369 }
370
371 /* *
372 * @tc.number SUB_KERNEL_IPC_MQ_0700
373 * @tc.name mq_send and mq_receive function test in thread and process
374 * @tc.desc [C- SOFTWARE -0200]
375 */
376 HWTEST_F(IpcMqTest, testMqTwoThreadCom, Function | MediumTest | Level1)
377 {
378 mqd_t queue;
379 pthread_t tid;
380 unsigned int prio;
381 struct mq_attr getAttr = { 0 };
382 struct mq_attr setAttr = { 0 };
383 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
384
385 sprintf_s(qName, sizeof(qName), "testMqTwoLevelCom_%d", GetRandom(10000));
386 setAttr.mq_msgsize = MQ_MSG_SIZE;
387 setAttr.mq_maxmsg = MQ_MAX_MSG;
388 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
389 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
390
391 EXPECT_TRUE(pthread_create(&tid, NULL, PthreadCom, (void *)queue) != -1) << "ERROR: pthread_create() == -1";
392
393 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
394 EXPECT_TRUE(pthread_join(tid, NULL) == 0) << "ERROR: pthread_join() != 0";
395
396 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
397 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
398 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
399 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
400 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != 0, prio = " << prio;
401 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
402 rMsg;
403
404 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
405 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
406 }
407
PthreadTimedCom(void * arg)408 static void *PthreadTimedCom(void *arg)
409 {
410 mqd_t queue;
411 unsigned int prio;
412 struct timespec tts { 0 }, rts = { 0 };
413 struct mq_attr getAttr = { 0 };
414 char rMsg[MQ_RX_LEN];
415
416 queue = (mqd_t)arg;
417 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
418 rts.tv_sec = time(NULL) + 1;
419 rts.tv_nsec = 0;
420 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
421 "ERROR: mq_timedreceive() == -1";
422 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
423 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
424 rMsg;
425
426 tts.tv_sec = time(NULL) + 1;
427 tts.tv_nsec = 0;
428 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
429
430 return nullptr;
431 }
432
433 /* *
434 * @tc.number SUB_KERNEL_IPC_MQ_0800
435 * @tc.name mq_timedsend and mq_timedreceive function test in thread and process
436 * @tc.desc [C- SOFTWARE -0200]
437 */
438 HWTEST_F(IpcMqTest, testMqTimedTwoThreadCom, Function | MediumTest | Level1)
439 {
440 mqd_t queue;
441 pthread_t tid;
442 unsigned int prio;
443 struct timespec tts { 0 }, rts = { 0 };
444 struct mq_attr getAttr = { 0 };
445 struct mq_attr setAttr = { 0 };
446 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
447
448 sprintf_s(qName, sizeof(qName), "testMqTimedTwoThreadCom_%d", GetRandom(10000));
449 setAttr.mq_msgsize = MQ_MSG_SIZE;
450 setAttr.mq_maxmsg = MQ_MAX_MSG;
451 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
452 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
453
454 EXPECT_TRUE(pthread_create(&tid, NULL, PthreadTimedCom, (void *)queue) != -1) << "ERROR: pthread_create() == -1";
455
456 tts.tv_sec = time(NULL) + 1;
457 tts.tv_nsec = 0;
458 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
459 EXPECT_TRUE(pthread_join(tid, NULL) == 0) << "ERROR: pthread_join() != 0";
460
461 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
462 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
463 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
464 rts.tv_sec = time(NULL) + 1;
465 rts.tv_nsec = 0;
466 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
467 "ERROR: mq_timedreceive() == -1";
468 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
469 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
470 rMsg;
471
472 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
473 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
474 }
475
PthreadAllCom(void * arg)476 static void *PthreadAllCom(void *arg)
477 {
478 mqd_t queue;
479 unsigned int prio;
480 struct timespec tts { 0 }, rts = { 0 };
481 struct mq_attr getAttr = { 0 };
482 char rMsg[MQ_RX_LEN];
483
484 queue = (mqd_t)arg;
485 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
486 rts.tv_sec = time(NULL) + 1;
487 rts.tv_nsec = 0;
488 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
489 "ERROR: mq_timedreceive() == -1";
490 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
491 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
492 rMsg;
493 tts.tv_sec = time(NULL) + 1;
494 tts.tv_nsec = 0;
495 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
496
497 return nullptr;
498 }
499
500 /* *
501 * @tc.number SUB_KERNEL_IPC_MQ_0900
502 * @tc.name all send and all receive function test in thread and process
503 * @tc.desc [C- SOFTWARE -0200]
504 */
505 HWTEST_F(IpcMqTest, testMqAllTwoThreadCom, Function | MediumTest | Level1)
506 {
507 mqd_t queue;
508 pthread_t tid;
509 unsigned int prio;
510 struct mq_attr getAttr = { 0 };
511 struct mq_attr setAttr = { 0 };
512 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
513
514 sprintf_s(qName, sizeof(qName), "testMqAllTwoThreadCom_%d", GetRandom(10000));
515 setAttr.mq_msgsize = MQ_MSG_SIZE;
516 setAttr.mq_maxmsg = MQ_MAX_MSG;
517 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
518 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
519
520 EXPECT_TRUE(pthread_create(&tid, NULL, PthreadAllCom, (void *)queue) != -1) << "ERROR: pthread_create() == -1";
521
522 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
523 EXPECT_TRUE(pthread_join(tid, NULL) == 0) << "ERROR: pthread_join() != 0";
524
525 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
526 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
527 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
528 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
529 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
530 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
531 rMsg;
532
533 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
534 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
535 }
536
537 /* *
538 * @tc.number SUB_KERNEL_IPC_MQ_1000
539 * @tc.name all send and all receive function test in more process
540 * @tc.desc [C- SOFTWARE -0200]
541 */
542 HWTEST_F(IpcMqTest, testMqThreeLevelCom, Function | MediumTest | Level2)
543 {
544 mqd_t queue;
545 pid_t pid;
546 unsigned int prio;
547 struct timespec tts { 0 }, rts = { 0 };
548 struct mq_attr getAttr = { 0 };
549 struct mq_attr setAttr = { 0 };
550 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
551
552 sprintf_s(qName, sizeof(qName), "testMqThreeLevelCom_%d", GetRandom(10000));
553 setAttr.mq_msgsize = MQ_MSG_SIZE;
554 setAttr.mq_maxmsg = MQ_MAX_MSG;
555 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
556 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
557
558 pid = fork();
559 if (pid < 0) {
560 goto FINISH;
561 } else if (pid == 0) {
562 pid = fork();
563 if (pid == 0) {
564 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
565 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1"
566 << " errno = " << errno <<
567 " strerror(errno) = " << strerror(errno);
568 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
569 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
570 ", received = " << rMsg;
571 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
572 } else {
573 int status;
574
575 pid = waitpid(pid, &status, 0);
576 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
577 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
578 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
579 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
580
581 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
582 rts.tv_sec = time(NULL) + 1;
583 rts.tv_nsec = 0;
584 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
585 "ERROR: mq_timedreceive() == -1";
586 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
587 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
588 ", received = " << rMsg;
589
590 tts.tv_sec = time(NULL) + 1;
591 tts.tv_nsec = 0;
592 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) <<
593 "ERROR: mq_timedsend() != 0";
594 }
595 exit(0);
596 } else {
597 int status;
598 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
599
600 pid = waitpid(pid, &status, 0);
601 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
602 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
603 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
604 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
605
606 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
607 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
608 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
609 rts.tv_sec = time(NULL) + 1;
610 rts.tv_nsec = 0;
611 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
612 "ERROR: mq_timedreceive() == -1";
613 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
614 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
615 ", received = " << rMsg;
616 }
617
618 FINISH:
619 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
620 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
621 }
622
623 /* *
624 * @tc.number SUB_KERNEL_IPC_MQ_1100
625 * @tc.name mq_send and mq_receive max packet function test
626 * @tc.desc [C- SOFTWARE -0200]
627 */
628 HWTEST_F(IpcMqTest, testMqMinMaxLen, Function | MediumTest | Level2)
629 {
630 mqd_t queue;
631 unsigned int prio;
632 struct mq_attr getAttr = { 0 };
633 struct mq_attr setAttr = { 0 };
634 char qName[MQ_NAME_LEN], rMsg[MAX_MQ_MSG_SIZE], sMsg[MAX_MQ_MSG_SIZE];
635
636 for (int i = 0; i < MAX_MQ_MSG_SIZE; i++) {
637 sMsg[i] = 0x36;
638 rMsg[i] = 0x00;
639 }
640
641 sprintf_s(qName, sizeof(qName), "testMqMaxLen_%d", GetRandom(10000));
642 setAttr.mq_msgsize = MAX_MQ_MSG_SIZE;
643 setAttr.mq_maxmsg = MQ_MAX_MSG;
644 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
645 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1"
646 << " errno = " << errno << " strerror(errno) = " << strerror(errno);
647 EXPECT_TRUE(mq_send(queue, sMsg, MAX_MQ_MSG_SIZE, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
648 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
649 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
650 EXPECT_TRUE(strncmp(sMsg, rMsg, MAX_MQ_MSG_SIZE) == 0) << "sent != received: sent = " << sMsg << ", received = " <<
651 rMsg;
652 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
653 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
654 }
655
656 /* *
657 * @tc.number SUB_KERNEL_IPC_MQ_1200
658 * @tc.name mq_setattr set and clean mq_flags for O_NONBLOCK function test
659 * @tc.desc [C- SOFTWARE -0200]
660 */
661 HWTEST_F(IpcMqTest, testMqSetGetAttr, Function | MediumTest | Level1)
662 {
663 mqd_t queue;
664 struct mq_attr getAttr = { 0 };
665 struct mq_attr setAttr = { 0 };
666 char qName[MQ_NAME_LEN];
667
668 sprintf_s(qName, sizeof(qName), "testMqFunction_%d", GetRandom(10000));
669
670 memset_s(&setAttr, sizeof(setAttr), 0, sizeof(setAttr));
671 setAttr.mq_msgsize = MQ_MSG_SIZE;
672 setAttr.mq_maxmsg = MQ_MAX_MSG;
673 setAttr.mq_flags = O_NONBLOCK;
674 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
675 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
676
677 memset_s(&getAttr, sizeof(getAttr), 0, sizeof(getAttr));
678 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
679 EXPECT_TRUE((getAttr.mq_flags & O_NONBLOCK) == O_NONBLOCK);
680
681 setAttr.mq_flags &= ~O_NONBLOCK;
682 EXPECT_TRUE(mq_setattr(queue, &setAttr, NULL) == 0) << "ERROR: mq_setattr() != 0";
683
684 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
685 LOG("setAttr.mq_flags = 0x%08x, getAttr.mq_flags = 0x%08x ", setAttr.mq_flags, getAttr.mq_flags);
686 EXPECT_TRUE((getAttr.mq_flags & O_NONBLOCK) == 0) << "ERROR: getAttr.mq_flags & O_NONBLOCK != 0,"
687 " getAttr.mq_flags = " <<
688 getAttr.mq_flags << " setAttr.mq_flags = " << setAttr.mq_flags;
689 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
690 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0"
691 << " errno = " << errno << " strerror(errno) = " << strerror(errno);
692 }
693