• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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