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