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 int memRet = -1;
112 unsigned int prio;
113 struct timespec tts { 0 }, rts = { 0 };
114 struct mq_attr getAttr = { 0 };
115 struct mq_attr setAttr = { 0 };
116 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
117
118 sprintf_s(qName, sizeof(qName), "testMqAllOneLevelCom_%d", GetRandom(10000));
119
120 memRet = memset_s(&getAttr, sizeof(getAttr), 0, sizeof(getAttr));
121 EXPECT_EQ(0, memRet);
122 memRet = memset_s(&setAttr, sizeof(setAttr), 0, sizeof(setAttr));
123 EXPECT_EQ(0, memRet);
124 setAttr.mq_msgsize = MQ_MSG_SIZE;
125 setAttr.mq_maxmsg = MQ_MAX_MSG;
126 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
127 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
128
129 EXPECT_TRUE(mq_getattr(queue, &setAttr) == 0) << "ERROR: mq_getattr() != 0";
130 setAttr.mq_msgsize = MQ_MSG_SIZE;
131 setAttr.mq_maxmsg = MQ_MAX_MSG;
132 EXPECT_TRUE(mq_setattr(queue, &setAttr, NULL) == 0) << "ERROR: mq_setattr() != 0";
133 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
134
135 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
136 EXPECT_TRUE(getAttr.mq_msgsize == setAttr.mq_msgsize) << "ERROR: getAttr.mq_msgsize != setAttr.mq_msgsize,"
137 " getAttr.mq_msgsize = " <<
138 getAttr.mq_msgsize << " setAttr.mq_msgsize = " << setAttr.mq_msgsize;
139 EXPECT_TRUE(getAttr.mq_maxmsg == setAttr.mq_maxmsg) << "ERROR: getAttr.mq_maxmsg != setAttr.mq_maxmsg,"
140 " getAttr.mq_maxmsg = " <<
141 getAttr.mq_maxmsg << " setAttr.mq_maxmsg = " << setAttr.mq_maxmsg;
142 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1, getAttr.mq_curmsgs = " <<
143 getAttr.mq_curmsgs;
144
145 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
146 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
147 rMsg;
148
149 tts.tv_sec = time(NULL) + 1;
150 tts.tv_nsec = 0;
151 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
152
153 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
154 EXPECT_TRUE(getAttr.mq_msgsize == setAttr.mq_msgsize) << "ERROR: getAttr.mq_msgsize != setAttr.mq_msgsize";
155 EXPECT_TRUE(getAttr.mq_maxmsg == setAttr.mq_maxmsg) << "ERROR: getAttr.mq_maxmsg != setAttr.mq_maxmsg";
156 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1";
157
158 rts.tv_sec = time(NULL) + 1;
159 rts.tv_nsec = 0;
160 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
161 "ERROR: mq_timedreceive() == -1";
162 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
163 rMsg;
164
165 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
166 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0"
167 << " errno = " << errno << " strerror(errno) = " << strerror(errno);
168 }
169
170 /* *
171 * @tc.number SUB_KERNEL_IPC_MQ_0400
172 * @tc.name mq_send and mq_receive function test in child and parent process
173 * @tc.desc [C- SOFTWARE -0200]
174 */
175 HWTEST_F(IpcMqTest, testMqTwoLevelCom, Function | MediumTest | Level1)
176 {
177 mqd_t queue;
178 pid_t pid;
179 unsigned int prio;
180 struct mq_attr getAttr = { 0 };
181 struct mq_attr setAttr = { 0 };
182 char qName[MQ_NAME_LEN], rMsg[MAX_MQ_MSG_SIZE], sMsg[MAX_MQ_MSG_SIZE];
183
184 for (int i = 0; i < MAX_MQ_MSG_SIZE; i++) {
185 sMsg[i] = 0x36;
186 rMsg[i] = 0x00;
187 }
188
189 sprintf_s(qName, sizeof(qName), "testMqMaxLenTwoLevelCom_%d", GetRandom(10000));
190 setAttr.mq_msgsize = MAX_MQ_MSG_SIZE;
191 setAttr.mq_maxmsg = MQ_MAX_MSG;
192 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
193 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
194
195 pid = fork();
196 if (pid < 0) {
197 goto FINISH;
198 } else if (pid == 0) {
199 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
200 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
201 EXPECT_TRUE(prio == 0) << "ERROR: prio != 0, prio = " << prio;
202 EXPECT_TRUE(strncmp(sMsg, rMsg, MAX_MQ_MSG_SIZE) == 0) << "sent != received: sent = " << sMsg <<
203 ", received = " << rMsg;
204 EXPECT_TRUE(mq_send(queue, sMsg, MAX_MQ_MSG_SIZE, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
205 exit(0);
206 } else {
207 int status;
208 EXPECT_TRUE(mq_send(queue, sMsg, MAX_MQ_MSG_SIZE, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
209
210 pid = waitpid(pid, &status, 0);
211 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
212 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
213 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
214 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
215 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
216 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
217 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
218 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
219 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
220 EXPECT_TRUE(strncmp(sMsg, rMsg, MAX_MQ_MSG_SIZE) == 0) << "sent != received: sent = " << sMsg <<
221 ", received = " << rMsg;
222 }
223
224 FINISH:
225 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
226 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
227 }
228
229 /* *
230 * @tc.number SUB_KERNEL_IPC_MQ_0500
231 * @tc.name mq_timedsend and mq_timedreceive function test in child and parent process
232 * @tc.desc [C- SOFTWARE -0200]
233 */
234 HWTEST_F(IpcMqTest, testMqTimedTwoLevelCom, Function | MediumTest | Level1)
235 {
236 mqd_t queue;
237 pid_t pid;
238 unsigned int prio;
239 struct timespec tts { 0 }, rts = { 0 };
240 struct mq_attr getAttr = { 0 };
241 struct mq_attr setAttr = { 0 };
242 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
243
244 sprintf_s(qName, sizeof(qName), "testMqTimedTwoLevelCom_%d", GetRandom(10000));
245 setAttr.mq_msgsize = MQ_MSG_SIZE;
246 setAttr.mq_maxmsg = MQ_MAX_MSG;
247 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
248 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
249
250 pid = fork();
251 if (pid < 0) {
252 goto FINISH;
253 } else if (pid == 0) {
254 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
255 rts.tv_sec = time(NULL) + 3;
256 rts.tv_nsec = 0;
257 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
258 "ERROR: mq_timedreceive() == -1";
259 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != 0, prio = " << prio;
260 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
261 ", received = " << rMsg;
262
263 tts.tv_sec = time(NULL) + 3;
264 tts.tv_nsec = 0;
265 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
266 exit(0);
267 } else {
268 int status;
269 tts.tv_sec = time(NULL) + 3;
270 tts.tv_nsec = 0;
271 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
272
273 pid = waitpid(pid, &status, 0);
274 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
275 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
276 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
277 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
278 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
279 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
280 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
281 rts.tv_sec = time(NULL) + 3;
282 rts.tv_nsec = 0;
283 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
284 "ERROR: mq_timedreceive() == -1";
285 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != 0, prio = " << prio;
286 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
287 ", received = " << rMsg;
288 }
289
290 FINISH:
291 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
292 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
293 }
294
295 /* *
296 * @tc.number SUB_KERNEL_IPC_MQ_0600
297 * @tc.name all send and all receive function test in child and parent process
298 * @tc.desc [C- SOFTWARE -0200]
299 */
300 HWTEST_F(IpcMqTest, testMqAllTwoLevelCom, Function | MediumTest | Level1)
301 {
302 mqd_t queue;
303 pid_t pid;
304 unsigned int prio;
305 struct timespec tts { 0 }, rts = { 0 };
306 struct mq_attr getAttr = { 0 };
307 struct mq_attr setAttr = { 0 };
308 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
309
310 sprintf_s(qName, sizeof(qName), "testMqAllTwoLevelCom_%d", GetRandom(10000));
311 setAttr.mq_msgsize = MQ_MSG_SIZE;
312 setAttr.mq_maxmsg = MQ_MAX_MSG;
313 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
314 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
315
316 pid = fork();
317 if (pid < 0) {
318 goto FINISH;
319 } else if (pid == 0) {
320 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
321 rts.tv_sec = time(NULL) + 1;
322 rts.tv_nsec = 0;
323 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
324 "ERROR: mq_timedreceive() == -1";
325 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
326 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
327 ", received = " << rMsg;
328
329 tts.tv_sec = time(NULL) + 1;
330 tts.tv_nsec = 0;
331 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
332 exit(0);
333 } else {
334 int status;
335 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
336
337 pid = waitpid(pid, &status, 0);
338 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
339 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
340 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
341 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
342 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
343 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
344 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
345 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
346 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
347 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
348 ", received = " << rMsg;
349 }
350
351 FINISH:
352 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
353 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
354 }
355
PthreadCom(void * arg)356 static void *PthreadCom(void *arg)
357 {
358 mqd_t queue;
359 unsigned int prio;
360 struct mq_attr getAttr = { 0 };
361 char rMsg[MQ_RX_LEN];
362
363 queue = (mqd_t)arg;
364 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
365 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
366 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != 0, prio = " << prio;
367 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
368 rMsg;
369 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
370
371 return nullptr;
372 }
373
374 /* *
375 * @tc.number SUB_KERNEL_IPC_MQ_0700
376 * @tc.name mq_send and mq_receive function test in thread and process
377 * @tc.desc [C- SOFTWARE -0200]
378 */
379 HWTEST_F(IpcMqTest, testMqTwoThreadCom, Function | MediumTest | Level1)
380 {
381 mqd_t queue;
382 pthread_t tid;
383 unsigned int prio;
384 struct mq_attr getAttr = { 0 };
385 struct mq_attr setAttr = { 0 };
386 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
387
388 sprintf_s(qName, sizeof(qName), "testMqTwoLevelCom_%d", GetRandom(10000));
389 setAttr.mq_msgsize = MQ_MSG_SIZE;
390 setAttr.mq_maxmsg = MQ_MAX_MSG;
391 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
392 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
393
394 EXPECT_TRUE(pthread_create(&tid, NULL, PthreadCom, (void *)queue) != -1) << "ERROR: pthread_create() == -1";
395
396 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
397 EXPECT_TRUE(pthread_join(tid, NULL) == 0) << "ERROR: pthread_join() != 0";
398
399 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
400 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
401 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
402 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
403 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != 0, prio = " << prio;
404 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
405 rMsg;
406
407 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
408 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
409 }
410
PthreadTimedCom(void * arg)411 static void *PthreadTimedCom(void *arg)
412 {
413 mqd_t queue;
414 unsigned int prio;
415 struct timespec tts { 0 }, rts = { 0 };
416 struct mq_attr getAttr = { 0 };
417 char rMsg[MQ_RX_LEN];
418
419 queue = (mqd_t)arg;
420 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
421 rts.tv_sec = time(NULL) + 1;
422 rts.tv_nsec = 0;
423 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
424 "ERROR: mq_timedreceive() == -1";
425 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
426 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
427 rMsg;
428
429 tts.tv_sec = time(NULL) + 1;
430 tts.tv_nsec = 0;
431 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
432
433 return nullptr;
434 }
435
436 /* *
437 * @tc.number SUB_KERNEL_IPC_MQ_0800
438 * @tc.name mq_timedsend and mq_timedreceive function test in thread and process
439 * @tc.desc [C- SOFTWARE -0200]
440 */
441 HWTEST_F(IpcMqTest, testMqTimedTwoThreadCom, Function | MediumTest | Level1)
442 {
443 mqd_t queue;
444 pthread_t tid;
445 unsigned int prio;
446 struct timespec tts { 0 }, rts = { 0 };
447 struct mq_attr getAttr = { 0 };
448 struct mq_attr setAttr = { 0 };
449 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
450
451 sprintf_s(qName, sizeof(qName), "testMqTimedTwoThreadCom_%d", GetRandom(10000));
452 setAttr.mq_msgsize = MQ_MSG_SIZE;
453 setAttr.mq_maxmsg = MQ_MAX_MSG;
454 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
455 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
456
457 EXPECT_TRUE(pthread_create(&tid, NULL, PthreadTimedCom, (void *)queue) != -1) << "ERROR: pthread_create() == -1";
458
459 tts.tv_sec = time(NULL) + 1;
460 tts.tv_nsec = 0;
461 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
462 EXPECT_TRUE(pthread_join(tid, NULL) == 0) << "ERROR: pthread_join() != 0";
463
464 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
465 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
466 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
467 rts.tv_sec = time(NULL) + 1;
468 rts.tv_nsec = 0;
469 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
470 "ERROR: mq_timedreceive() == -1";
471 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
472 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
473 rMsg;
474
475 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
476 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
477 }
478
PthreadAllCom(void * arg)479 static void *PthreadAllCom(void *arg)
480 {
481 mqd_t queue;
482 unsigned int prio;
483 struct timespec tts { 0 }, rts = { 0 };
484 struct mq_attr getAttr = { 0 };
485 char rMsg[MQ_RX_LEN];
486
487 queue = (mqd_t)arg;
488 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
489 rts.tv_sec = time(NULL) + 1;
490 rts.tv_nsec = 0;
491 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
492 "ERROR: mq_timedreceive() == -1";
493 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
494 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
495 rMsg;
496 tts.tv_sec = time(NULL) + 1;
497 tts.tv_nsec = 0;
498 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) << "ERROR: mq_timedsend() != 0";
499
500 return nullptr;
501 }
502
503 /* *
504 * @tc.number SUB_KERNEL_IPC_MQ_0900
505 * @tc.name all send and all receive function test in thread and process
506 * @tc.desc [C- SOFTWARE -0200]
507 */
508 HWTEST_F(IpcMqTest, testMqAllTwoThreadCom, Function | MediumTest | Level1)
509 {
510 mqd_t queue;
511 pthread_t tid;
512 unsigned int prio;
513 struct mq_attr getAttr = { 0 };
514 struct mq_attr setAttr = { 0 };
515 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
516
517 sprintf_s(qName, sizeof(qName), "testMqAllTwoThreadCom_%d", GetRandom(10000));
518 setAttr.mq_msgsize = MQ_MSG_SIZE;
519 setAttr.mq_maxmsg = MQ_MAX_MSG;
520 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
521 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
522
523 EXPECT_TRUE(pthread_create(&tid, NULL, PthreadAllCom, (void *)queue) != -1) << "ERROR: pthread_create() == -1";
524
525 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
526 EXPECT_TRUE(pthread_join(tid, NULL) == 0) << "ERROR: pthread_join() != 0";
527
528 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
529 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
530 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
531 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
532 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
533 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG << ", received = " <<
534 rMsg;
535
536 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
537 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
538 }
539
540 /* *
541 * @tc.number SUB_KERNEL_IPC_MQ_1000
542 * @tc.name all send and all receive function test in more process
543 * @tc.desc [C- SOFTWARE -0200]
544 */
545 HWTEST_F(IpcMqTest, testMqThreeLevelCom, Function | MediumTest | Level2)
546 {
547 mqd_t queue;
548 pid_t pid;
549 unsigned int prio;
550 struct timespec tts { 0 }, rts = { 0 };
551 struct mq_attr getAttr = { 0 };
552 struct mq_attr setAttr = { 0 };
553 char qName[MQ_NAME_LEN], rMsg[MQ_RX_LEN];
554
555 sprintf_s(qName, sizeof(qName), "testMqThreeLevelCom_%d", GetRandom(10000));
556 setAttr.mq_msgsize = MQ_MSG_SIZE;
557 setAttr.mq_maxmsg = MQ_MAX_MSG;
558 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
559 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
560
561 pid = fork();
562 if (pid < 0) {
563 goto FINISH;
564 } else if (pid == 0) {
565 pid = fork();
566 if (pid == 0) {
567 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
568 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1"
569 << " errno = " << errno <<
570 " strerror(errno) = " << strerror(errno);
571 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
572 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
573 ", received = " << rMsg;
574 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
575 } else {
576 int status;
577
578 pid = waitpid(pid, &status, 0);
579 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
580 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
581 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
582 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
583
584 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
585 rts.tv_sec = time(NULL) + 1;
586 rts.tv_nsec = 0;
587 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
588 "ERROR: mq_timedreceive() == -1";
589 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
590 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
591 ", received = " << rMsg;
592
593 tts.tv_sec = time(NULL) + 1;
594 tts.tv_nsec = 0;
595 EXPECT_TRUE(mq_timedsend(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO, &tts) == 0) <<
596 "ERROR: mq_timedsend() != 0";
597 }
598 exit(0);
599 } else {
600 int status;
601 EXPECT_TRUE(mq_send(queue, MQ_MSG, MQ_MSG_LEN, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
602
603 pid = waitpid(pid, &status, 0);
604 EXPECT_TRUE(pid != 0) << "ERROR: pid == 0";
605 EXPECT_TRUE(WIFEXITED(status) != 0) << "ERROR: WIFEXITED(status) == 0";
606 EXPECT_TRUE(WEXITSTATUS(status) == 0) << "ERROR: WEXITSTATUS(status) != 0"
607 << ", WEXITSTATUS(status) = " << WEXITSTATUS(status);
608
609 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
610 EXPECT_TRUE(getAttr.mq_curmsgs == 1) << "ERROR: getAttr.mq_curmsgs != 1"
611 << ", getAttr.mq_curmsgs = " << getAttr.mq_curmsgs;
612 rts.tv_sec = time(NULL) + 1;
613 rts.tv_nsec = 0;
614 EXPECT_TRUE(mq_timedreceive(queue, rMsg, getAttr.mq_msgsize, &prio, &rts) != -1) <<
615 "ERROR: mq_timedreceive() == -1";
616 EXPECT_TRUE(prio == MQ_MSG_PRIO) << "ERROR: prio != MQ_MSG_PRIO, prio = " << prio;
617 EXPECT_TRUE(strncmp(MQ_MSG, rMsg, MQ_MSG_LEN) == 0) << "sent != received: sent = " << MQ_MSG <<
618 ", received = " << rMsg;
619 }
620
621 FINISH:
622 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
623 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
624 }
625
626 /* *
627 * @tc.number SUB_KERNEL_IPC_MQ_1100
628 * @tc.name mq_send and mq_receive max packet function test
629 * @tc.desc [C- SOFTWARE -0200]
630 */
631 HWTEST_F(IpcMqTest, testMqMinMaxLen, Function | MediumTest | Level2)
632 {
633 mqd_t queue;
634 unsigned int prio;
635 struct mq_attr getAttr = { 0 };
636 struct mq_attr setAttr = { 0 };
637 char qName[MQ_NAME_LEN], rMsg[MAX_MQ_MSG_SIZE], sMsg[MAX_MQ_MSG_SIZE];
638
639 for (int i = 0; i < MAX_MQ_MSG_SIZE; i++) {
640 sMsg[i] = 0x36;
641 rMsg[i] = 0x00;
642 }
643
644 sprintf_s(qName, sizeof(qName), "testMqMaxLen_%d", GetRandom(10000));
645 setAttr.mq_msgsize = MAX_MQ_MSG_SIZE;
646 setAttr.mq_maxmsg = MQ_MAX_MSG;
647 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
648 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1"
649 << " errno = " << errno << " strerror(errno) = " << strerror(errno);
650 EXPECT_TRUE(mq_send(queue, sMsg, MAX_MQ_MSG_SIZE, MQ_MSG_PRIO) == 0) << "ERROR: mq_send() != 0";
651 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
652 EXPECT_TRUE(mq_receive(queue, rMsg, getAttr.mq_msgsize, &prio) != -1) << "ERROR: mq_receive() == -1";
653 EXPECT_TRUE(strncmp(sMsg, rMsg, MAX_MQ_MSG_SIZE) == 0) << "sent != received: sent = " << sMsg << ", received = " <<
654 rMsg;
655 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
656 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0";
657 }
658
659 /* *
660 * @tc.number SUB_KERNEL_IPC_MQ_1200
661 * @tc.name mq_setattr set and clean mq_flags for O_NONBLOCK function test
662 * @tc.desc [C- SOFTWARE -0200]
663 */
664 HWTEST_F(IpcMqTest, testMqSetGetAttr, Function | MediumTest | Level1)
665 {
666 mqd_t queue;
667 struct mq_attr getAttr = { 0 };
668 struct mq_attr setAttr = { 0 };
669 char qName[MQ_NAME_LEN];
670 int memRet = -1;
671
672 sprintf_s(qName, sizeof(qName), "testMqFunction_%d", GetRandom(10000));
673
674 memRet = memset_s(&setAttr, sizeof(setAttr), 0, sizeof(setAttr));
675 EXPECT_EQ(0, memRet);
676 setAttr.mq_msgsize = MQ_MSG_SIZE;
677 setAttr.mq_maxmsg = MQ_MAX_MSG;
678 setAttr.mq_flags = O_NONBLOCK;
679 queue = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &setAttr);
680 ASSERT_TRUE(queue != (mqd_t)-1) << "ERROR: mq_open() == (mqd_t)-1";
681
682 memRet = memset_s(&getAttr, sizeof(getAttr), 0, sizeof(getAttr));
683 EXPECT_EQ(0, memRet);
684 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
685 EXPECT_TRUE((getAttr.mq_flags & O_NONBLOCK) == O_NONBLOCK);
686
687 setAttr.mq_flags &= ~O_NONBLOCK;
688 EXPECT_TRUE(mq_setattr(queue, &setAttr, NULL) == 0) << "ERROR: mq_setattr() != 0";
689
690 EXPECT_TRUE(mq_getattr(queue, &getAttr) == 0) << "ERROR: mq_getattr() != 0";
691 LOG("setAttr.mq_flags = 0x%08x, getAttr.mq_flags = 0x%08x ", setAttr.mq_flags, getAttr.mq_flags);
692 EXPECT_TRUE((getAttr.mq_flags & O_NONBLOCK) == 0) << "ERROR: getAttr.mq_flags & O_NONBLOCK != 0,"
693 " getAttr.mq_flags = " <<
694 getAttr.mq_flags << " setAttr.mq_flags = " << setAttr.mq_flags;
695 EXPECT_TRUE(mq_close(queue) == 0) << "ERROR: mq_close() != 0";
696 ASSERT_TRUE(mq_unlink(qName) == 0) << "ERROR: mq_unlink() != 0"
697 << " errno = " << errno << " strerror(errno) = " << strerror(errno);
698 }
699