1 /*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 * of conditions and the following disclaimer in the documentation and/or other materials
13 * provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 * to endorse or promote products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31 #include "It_posix_queue.h"
32
PthreadF01(VOID * arg)33 static VOID *PthreadF01(VOID *arg)
34 {
35 INT32 ret;
36 CHAR msgRcd[MQUEUE_STANDARD_NAME_LENGTH] = {0};
37 struct timespec rcdTimeout = { 0 };
38 rcdTimeout.tv_sec = 0xffff;
39
40 LOS_AtomicInc(&g_testCount);
41
42 ret = mq_timedreceive(g_messageQId, msgRcd, MQUEUE_STANDARD_NAME_LENGTH, NULL, &rcdTimeout);
43 ICUNIT_GOTO_EQUAL(ret, MSGLEN, ret, NOK);
44 ICUNIT_GOTO_STRING_EQUAL(msgRcd, g_mqueueMsessage[2], msgRcd, NOK); // 2, g_mqueueMsessage buffer index.
45
46 LOS_AtomicInc(&g_testCount);
47
48 NOK:
49 return NULL;
50 }
51
PthreadF02(VOID * arg)52 static VOID *PthreadF02(VOID *arg)
53 {
54 INT32 ret;
55 CHAR msgRcd[MQUEUE_STANDARD_NAME_LENGTH] = {0};
56 struct timespec rcdTimeout = { 0 };
57 rcdTimeout.tv_sec = 0xffff;
58
59 LOS_AtomicInc(&g_testCount);
60
61 ret = mq_timedreceive(g_messageQId, msgRcd, MQUEUE_STANDARD_NAME_LENGTH, NULL, &rcdTimeout);
62 ICUNIT_GOTO_EQUAL(ret, MSGLEN, ret, NOK);
63 ICUNIT_GOTO_STRING_EQUAL(msgRcd, g_mqueueMsessage[1], msgRcd, NOK);
64
65 LOS_AtomicInc(&g_testCount);
66
67 NOK:
68 return NULL;
69 }
70
Testcase(VOID)71 static UINT32 Testcase(VOID)
72 {
73 UINT32 ret;
74
75 pthread_t threadA;
76 pthread_attr_t attrA;
77 struct sched_param spA;
78
79 pthread_t threadB;
80 pthread_attr_t attrB;
81 struct sched_param spB;
82
83 struct mq_attr msgAttr = { 0 };
84 CHAR qName[MQUEUE_STANDARD_NAME_LENGTH] = "";
85
86 msgAttr.mq_msgsize = MQUEUE_STANDARD_NAME_LENGTH;
87 msgAttr.mq_maxmsg = MQUEUE_STANDARD_NAME_LENGTH;
88
89 g_testCount = 0;
90
91 (void)snprintf_s(qName, MQUEUE_STANDARD_NAME_LENGTH, MQUEUE_STANDARD_NAME_LENGTH - 1, \
92 "/mq170_%d", LosCurTaskIDGet());
93
94 g_messageQId = mq_open(qName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &msgAttr);
95 ICUNIT_GOTO_NOT_EQUAL(g_messageQId, (mqd_t)-1, g_messageQId, EXIT1);
96
97 ret = pthread_attr_init(&attrA);
98 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT1);
99
100 spA.sched_priority = MQUEUE_PTHREAD_PRIORITY_TEST2;
101 ret = pthread_attr_setschedparam(&attrA, &spA);
102 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT2);
103
104 ret = pthread_create(&threadA, &attrA, PthreadF02, NULL);
105 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT2);
106
107 ret = pthread_attr_init(&attrB);
108 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT3);
109
110 spB.sched_priority = 8; // 8, Queue pthread priority.
111 ret = pthread_attr_setschedparam(&attrB, &spB);
112 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT3);
113
114 ret = pthread_create(&threadB, &attrB, PthreadF01, NULL);
115 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT3);
116
117 ret = mq_send(g_messageQId, g_mqueueMsessage[1], MSGLEN, 0);
118 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT3);
119
120 ret = mq_send(g_messageQId, g_mqueueMsessage[2], MSGLEN, 0); // 2, g_mqueueMsessage buffer index.
121 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT3);
122
123 TestExtraTaskDelay(2); // 2, Set delay time.
124 ICUNIT_GOTO_EQUAL(g_testCount, 4, g_testCount, EXIT3); // 4, Here, assert the g_testCount.
125
126 ret = pthread_join(threadB, NULL);
127 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT3);
128
129 ret = pthread_attr_destroy(&attrB);
130 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT3);
131
132 ret = pthread_join(threadA, NULL);
133 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT2);
134
135 ret = pthread_attr_destroy(&attrA);
136 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT2);
137
138 ret = mq_close(g_messageQId);
139 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT1);
140
141 ret = mq_unlink(qName);
142 ICUNIT_GOTO_EQUAL(ret, MQUEUE_NO_ERROR, ret, EXIT1);
143
144 return MQUEUE_NO_ERROR;
145 EXIT3:
146 PosixPthreadDestroy(&attrB, threadB);
147 EXIT2:
148 PosixPthreadDestroy(&attrA, threadA);
149 EXIT1:
150 mq_close(g_messageQId);
151 mq_unlink(qName);
152 return MQUEUE_NO_ERROR;
153 }
154
ItPosixQueue133(VOID)155 VOID ItPosixQueue133(VOID) // IT_Layer_ModuleORFeature_No
156 {
157 TEST_ADD_CASE("IT_POSIX_QUEUE_133", Testcase, TEST_POSIX, TEST_QUE, TEST_LEVEL2, TEST_FUNCTION);
158 }
159