• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without modification,
5  * are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice, this list of
8  *    conditions and the following disclaimer.
9  *
10  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11  *    of conditions and the following disclaimer in the documentation and/or other materials
12  *    provided with the distribution.
13  *
14  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
15  *    to endorse or promote products derived from this software without specific prior written
16  *    permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include "xts_ipc.h"
32 
33 static int g_semTestStep = 0;
34 
35 LITE_TEST_SUIT(IPC, SemApi, IpcSemApiTestSuite);
36 
IpcSemApiTestSuiteSetUp(void)37 static BOOL IpcSemApiTestSuiteSetUp(void)
38 {
39     return TRUE;
40 }
41 
IpcSemApiTestSuiteTearDown(void)42 static BOOL IpcSemApiTestSuiteTearDown(void)
43 {
44     return TRUE;
45 }
46 
47 LITE_TEST_CASE(IpcSemApiTestSuite, testSemInit0100, Function | MediumTest | Level2)
48 {
49     int ret;
50     sem_t sem;
51     int testValue[3] = {0, 1, 10}; /* 3, 1, 10 common data for test, no special meaning */
52 
53     int index = (int)(sizeof(testValue) / sizeof(int));
54     for (int i = 0; i < index; i++) {
55 
56         ret = sem_init((sem_t *)&sem, 0, testValue[0]);
57         ICUNIT_ASSERT_EQUAL(ret, 0, ret);
58 
59         ret = sem_destroy(&sem);
60         ICUNIT_ASSERT_EQUAL(ret, 0, ret);
61     }
62     return 0;
63 }
64 
65 LITE_TEST_CASE(IpcSemApiTestSuite, testSemPost0100, Function | MediumTest | Level2)
66 {
67     int ret;
68     sem_t sem;
69 
70     ret = sem_init((sem_t *)&sem, 0, 0);
71     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
72 
73     ret = sem_post(&sem);
74     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
75 
76     ret = sem_post(&sem);
77     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
78 
79     ret = sem_post(&sem);
80     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
81 
82     ret = sem_destroy(&sem);
83     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
84     return 0;
85 }
86 
87 LITE_TEST_CASE(IpcSemApiTestSuite, testSemWait0100, Function | MediumTest | Level2)
88 {
89     int ret;
90     sem_t sem;
91 
92     ret = sem_init((sem_t *)&sem, 0, 3); /* 3, common data for test, no special meaning */
93     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
94 
95     ret = sem_wait(&sem);
96     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
97 
98     ret = sem_wait(&sem);
99     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
100 
101     ret = sem_wait(&sem);
102     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
103 
104     ret = sem_destroy(&sem);
105     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
106     return 0;
107 }
108 
ThreadChat(void * arg)109 void *ThreadChat(void *arg)
110 {
111     int ret;
112     sem_t *sem = (sem_t *)arg;
113 
114     ICUNIT_ASSERT_EQUAL(g_semTestStep, 0, g_semTestStep);
115 
116     g_semTestStep = 1; /* 1, common data for test, no special meaning */
117     ret = sem_wait(sem);
118     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
119 
120     g_semTestStep = 2; /* 2, common data for test, no special meaning */
121     return NULL;
122 }
123 
124 LITE_TEST_CASE(IpcSemApiTestSuite, testThreadChat0100, Function | MediumTest | Level3)
125 {
126     pthread_t tid;
127     sem_t sem;
128     int ret;
129     struct timespec req;
130     g_semTestStep = 0;
131 
132     ret = sem_init((sem_t *)&sem, 0, 0);
133     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
134 
135     ret = pthread_create(&tid, NULL, ThreadChat, (void *)&sem);
136     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
137 
138     req.tv_sec = 0;
139     req.tv_nsec = TEN_CONT * NANO_MS;
140     ret = nanosleep(&req, NULL);
141     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
142     ICUNIT_ASSERT_EQUAL(g_semTestStep, 1, g_semTestStep); /* 1, common data for test, no special meaning */
143 
144     ret = sem_post(&sem);
145     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
146 
147     ret = nanosleep(&req, NULL);
148     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
149     ICUNIT_ASSERT_EQUAL(g_semTestStep, 2, g_semTestStep); /* 2, common data for test, no special meaning */
150 
151     ret = sem_post(&sem);
152     ICUNIT_ASSERT_EQUAL(g_semTestStep, 2, g_semTestStep); /* 2, common data for test, no special meaning */
153 
154     ret = pthread_join(tid, NULL);
155     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
156 
157     ret = sem_destroy(&sem);
158     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
159     return 0;
160 }
161 
ThreadNThreadWait1(void * arg)162 void *ThreadNThreadWait1(void *arg)
163 {
164     int ret;
165     sem_t *sem = (sem_t *)arg;
166     struct timespec req;
167 
168     req.tv_sec = 0;
169     req.tv_nsec = HUNDRED_CONT * NANO_MS;
170 
171     ret = nanosleep(&req, NULL);
172     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
173     g_semTestStep = 1; /* 1, common data for test, no special meaning */
174     ret = sem_wait(sem);
175     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
176 
177     g_semTestStep = 2; /* 2, common data for test, no special meaning */
178     return NULL;
179 }
180 
ThreadNThreadWait2(void * arg)181 void *ThreadNThreadWait2(void *arg)
182 {
183     int ret;
184     sem_t *sem = (sem_t *)arg;
185     struct timespec req;
186 
187     req.tv_sec = 0;
188     req.tv_nsec = 300 * NANO_MS; /* 300, common data for test, no special meaning */
189     ret = nanosleep(&req, NULL);
190     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
191     g_semTestStep = 3; /* 3, common data for test, no special meaning */
192 
193     req.tv_nsec = 200 * NANO_MS; /* 200, common data for test, no special meaning */
194     ret = nanosleep(&req, NULL);
195     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
196     ret = sem_wait(sem);
197     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
198 
199     g_semTestStep = 4; /* 4, common data for test, no special meaning */
200     return NULL;
201 }
202 
203 LITE_TEST_CASE(IpcSemApiTestSuite, testThreadChat0400, Function | MediumTest | Level4)
204 {
205     pthread_t tid1;
206     pthread_t tid2;
207     sem_t sem;
208     int ret;
209     struct timespec req;
210 
211     req.tv_sec = 0;
212     req.tv_nsec = 200 * NANO_MS; /* 200, common data for test, no special meaning */
213     g_semTestStep = 0;
214 
215     ret = sem_init((sem_t *)&sem, 0, 0);
216     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
217 
218     ret = pthread_create(&tid1, NULL, ThreadNThreadWait1, (void *)&sem);
219     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
220 
221     ret = pthread_create(&tid2, NULL, ThreadNThreadWait2, (void *)&sem);
222     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
223 
224     ret = nanosleep(&req, NULL);
225     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
226     ICUNIT_ASSERT_EQUAL(g_semTestStep, 1, g_semTestStep); /* 1, common data for test, no special meaning */
227 
228     ret = sem_post(&sem);
229     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
230 
231     req.tv_nsec = 20 * NANO_MS; /* 20, common data for test, no special meaning */
232     ret = nanosleep(&req, NULL);
233     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
234     ICUNIT_ASSERT_EQUAL(g_semTestStep, 2, g_semTestStep); /* 2, common data for test, no special meaning */
235 
236     req.tv_nsec = 200 * NANO_MS; /* 200, common data for test, no special meaning */
237     ret = nanosleep(&req, NULL);
238     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
239     ICUNIT_ASSERT_EQUAL(g_semTestStep, 3, g_semTestStep); /* 3, common data for test, no special meaning */
240 
241     ret = sem_post(&sem);
242     req.tv_nsec = 20 * NANO_MS; /* 20, common data for test, no special meaning */
243     ret = nanosleep(&req, NULL);
244     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
245     ICUNIT_ASSERT_EQUAL(g_semTestStep, 3, g_semTestStep); /* 3, common data for test, no special meaning */
246 
247     ret = pthread_join(tid1, NULL);
248     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
249 
250     ret = pthread_join(tid2, NULL);
251     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
252 
253     ICUNIT_ASSERT_EQUAL(g_semTestStep, 4, g_semTestStep); /* 4, common data for test, no special meaning */
254 
255     ret = sem_destroy(&sem);
256     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
257     return 0;
258 }
259 
260 LITE_TEST_CASE(IpcSemApiTestSuite, testSemInitAbnormal0200, Function | MediumTest | Level3)
261 {
262     int ret;
263     sem_t sem;
264     unsigned int gtSemMax = (unsigned int)SEM_VALUE_MAX + 1; /* 1, common data for test, no special meaning */
265 
266     ret = sem_init(&sem, 0, SEM_VALUE_MAX);
267     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
268 
269     ret = sem_destroy(&sem);
270     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
271 
272     ret = sem_init(&sem, 0, gtSemMax);
273     ICUNIT_ASSERT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
274 
275     ICUNIT_ASSERT_EQUAL(errno, EINVAL, errno);
276 
277     ret = sem_init(&sem, 0, 1); /* 1, common data for test, no special meaning */
278     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
279 
280     ret = sem_destroy(&sem);
281     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
282     return 0;
283 }
284 
285 LITE_TEST_CASE(IpcSemApiTestSuite, testSemPostAbnormal, Function | MediumTest | Level3)
286 {
287     int ret;
288     sem_t sem;
289 
290     ret = sem_init(&sem, 0, SEM_VALUE_MAX);
291     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
292 
293     ret = sem_post(&sem);
294     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
295 
296     ret = sem_destroy(&sem);
297     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
298     return 0;
299 }
300 
301 LITE_TEST_CASE(IpcSemApiTestSuite, testSemTimedWaitAbnormalA, Function | MediumTest | Level3)
302 {
303     int ret;
304     struct timespec ts;
305     sem_t sem;
306 
307     ret = sem_init(&sem, 0, 0);
308     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
309 
310     ts.tv_sec = 0;
311     ts.tv_nsec = -2; /* -2, common data for test, no special meaning */
312     ret = sem_timedwait(&sem, &ts);
313     ICUNIT_ASSERT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
314 
315     ICUNIT_ASSERT_EQUAL(errno, EINVAL, errno);
316 
317     ret = sem_destroy(&sem);
318     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
319     return 0;
320 }
321 
322 LITE_TEST_CASE(IpcSemApiTestSuite, testSemTimedWaitAbnormalB, Function | MediumTest | Level3)
323 {
324     int ret;
325     struct timespec ts;
326     sem_t sem;
327 
328     ret = sem_init(&sem, 0, 0);
329     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
330 
331     ts.tv_sec = time(NULL);
332     ts.tv_nsec = NANO_S;
333     ret = sem_timedwait(&sem, &ts);
334     ICUNIT_ASSERT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
335 
336     ICUNIT_ASSERT_EQUAL(errno, EINVAL, errno);
337 
338     ret = sem_destroy(&sem);
339     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
340     return 0;
341 }
342 
343 RUN_TEST_SUITE(IpcSemApiTestSuite);
344 
PosixSemFuncTest()345 void PosixSemFuncTest()
346 {
347     RUN_ONE_TESTCASE(testSemInit0100);
348     RUN_ONE_TESTCASE(testSemPost0100);
349     RUN_ONE_TESTCASE(testSemWait0100);
350     RUN_ONE_TESTCASE(testThreadChat0100);
351     RUN_ONE_TESTCASE(testThreadChat0400);
352     RUN_ONE_TESTCASE(testSemInitAbnormal0200);
353     RUN_ONE_TESTCASE(testSemPostAbnormal);
354     RUN_ONE_TESTCASE(testSemTimedWaitAbnormalA);
355     RUN_ONE_TESTCASE(testSemTimedWaitAbnormalB);
356 }