• 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 LITE_TEST_SUIT(IPC, SemApi, IpcSemApiXtsTestSuite);
34 
IpcSemApiXtsTestSuiteSetUp(void)35 static BOOL IpcSemApiXtsTestSuiteSetUp(void)
36 {
37     return TRUE;
38 }
39 
IpcSemApiXtsTestSuiteTearDown(void)40 static BOOL IpcSemApiXtsTestSuiteTearDown(void)
41 {
42     return TRUE;
43 }
44 
45 /**
46  * @tc.number   SUB_KERNEL_IPC_SEM_INIT_0100
47  * @tc.name     Use sem_init initialize the semaphore with 0
48  * @tc.desc     [C- SOFTWARE -0200]
49  */
50 LITE_TEST_CASE(IpcSemApiXtsTestSuite, testSemInitA, Function | MediumTest | Level2)
51 {
52     int ret;
53     sem_t sem;
54     int semValue = 0;
55     int testValue = 0;
56 
57     ret = sem_init(&sem, 0, testValue);
58     ICUNIT_ASSERT_NOT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
59 
60     ret = sem_getvalue(&sem, &semValue);
61     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
62 
63     ICUNIT_ASSERT_EQUAL(semValue, testValue, semValue);
64 
65     ret = sem_destroy(&sem);
66     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
67     return 0;
68 }
69 
70 /**
71  * @tc.number   SUB_KERNEL_IPC_SEM_INIT_0110
72  * @tc.name     Use sem_init initialize the semaphore with 1
73  * @tc.desc     [C- SOFTWARE -0200]
74  */
75 LITE_TEST_CASE(IpcSemApiXtsTestSuite, testSemInitB, Function | MediumTest | Level2)
76 {
77     int ret;
78     sem_t sem;
79     int semValue = 0;
80     int testValue = 1; /* 1, common data for test, no special meaning */
81 
82     ret = sem_init(&sem, 0, testValue);
83     ICUNIT_ASSERT_NOT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
84 
85     ret = sem_getvalue(&sem, &semValue);
86     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
87 
88     ICUNIT_ASSERT_EQUAL(semValue, testValue, semValue);
89 
90     ret = sem_destroy(&sem);
91     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
92     return 0;
93 }
94 
95 /**
96  * @tc.number   SUB_KERNEL_IPC_SEM_INIT_0120
97  * @tc.name     Use sem_init initialize the semaphore with 100
98  * @tc.desc     [C- SOFTWARE -0200]
99  */
100 LITE_TEST_CASE(IpcSemApiXtsTestSuite, testSemInitC, Function | MediumTest | Level2)
101 {
102     int ret;
103     sem_t sem;
104     int semValue = 0;
105     int testValue = 10; /* 10, common data for test, no special meaning */
106 
107     ret = sem_init(&sem, 0, testValue);
108     ICUNIT_ASSERT_NOT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
109 
110     ret = sem_getvalue(&sem, &semValue);
111     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
112 
113     ICUNIT_ASSERT_EQUAL(semValue, testValue, semValue);
114 
115     ret = sem_destroy(&sem);
116     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
117     return 0;
118 }
119 
120 /**
121  * @tc.number   SUB_KERNEL_IPC_SEM_POST_0100
122  * @tc.name     sem_post increases the semaphore count
123  * @tc.desc     [C- SOFTWARE -0200]
124  */
125 LITE_TEST_CASE(IpcSemApiXtsTestSuite, testSemPost, Function | MediumTest | Level2)
126 {
127     int ret;
128     sem_t sem;
129     int semValue = 0;
130 
131     ret = sem_init(&sem, 0, 0);
132     ICUNIT_ASSERT_NOT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
133 
134     ret = sem_getvalue(&sem, &semValue);
135     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
136     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
137 
138     ret = sem_post(&sem);
139     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
140 
141     ret = sem_getvalue(&sem, &semValue);
142     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
143     ICUNIT_ASSERT_EQUAL(semValue, 1, semValue); /* 1, common data for test, no special meaning */
144 
145     ret = sem_post(&sem);
146     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
147     ret = sem_post(&sem);
148     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
149     ret = sem_getvalue(&sem, &semValue);
150     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
151     ICUNIT_ASSERT_EQUAL(semValue, 3, semValue); /* 3, common data for test, no special meaning */
152 
153     ret = sem_destroy(&sem);
154     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
155     return 0;
156 }
157 
158 /**
159  * @tc.number   SUB_KERNEL_IPC_SEM_WAIT_0100
160  * @tc.name     sem_wait get semaphore
161  * @tc.desc     [C- SOFTWARE -0200]
162  */
163 LITE_TEST_CASE(IpcSemApiXtsTestSuite, testSemWait, Function | MediumTest | Level2)
164 {
165     int ret;
166     sem_t sem;
167     int semValue = 0;
168 
169     ret = sem_init(&sem, 0, 3); /* 3, common data for test, no special meaning */
170     ICUNIT_ASSERT_NOT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
171 
172     ret = sem_getvalue(&sem, &semValue);
173     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
174     ICUNIT_ASSERT_EQUAL(semValue, 3, semValue); /* 3, common data for test, no special meaning */
175 
176     ret = sem_wait(&sem);
177     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
178     ret = sem_getvalue(&sem, &semValue);
179     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
180     ICUNIT_ASSERT_EQUAL(semValue, 2, semValue); /* 2, common data for test, no special meaning */
181 
182     ret = sem_wait(&sem);
183     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
184 
185     ret = sem_wait(&sem);
186     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
187     ret = sem_getvalue(&sem, &semValue);
188     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
189     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
190 
191     ret = sem_destroy(&sem);
192     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
193     return 0;
194 }
195 
196 /**
197  * @tc.number   SUB_KERNEL_IPC_SEM_DESTROY_0100
198  * @tc.name     check sem_destroy function
199  * @tc.desc     [C- SOFTWARE -0200]
200  */
201 LITE_TEST_CASE(IpcSemApiXtsTestSuite, testSemdestroy, Function | MediumTest | Level3)
202 {
203     int ret;
204     sem_t sem;
205 
206     ret = sem_init(&sem, 0, 0);
207     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
208 
209     ret = sem_destroy(&sem);
210     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
211     return 0;
212 }
213 
ThreadChatF01(void * arg)214 void *ThreadChatF01(void *arg)
215 {
216     int ret;
217     sem_t *sem = (sem_t*)arg;
218     int semValue = 0;
219 
220     ret = sem_getvalue(sem, &semValue);
221     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
222     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
223     ret = sem_wait(sem);
224     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
225     return NULL;
226 }
227 
228 /**
229  * @tc.number   SUB_KERNEL_IPC_SEM_CHAT_0100
230  * @tc.name     Inter-thread communication, check sem_wait function
231  * @tc.desc     [C- SOFTWARE -0200]
232  */
233 LITE_TEST_CASE(IpcSemApiXtsTestSuite, testThreadChat, Function | MediumTest | Level3)
234 {
235     pthread_t tid;
236     sem_t sem;
237     int reInt;
238     int semValue = 0;
239 
240     reInt = sem_init(&sem, 0, 0);
241     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
242 
243     reInt = pthread_create(&tid, NULL, ThreadChatF01, (void*)&sem);
244     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
245 
246     usleep(20); /* 20, common data for test, no special meaning */
247     reInt = sem_getvalue(&sem, &semValue);
248     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
249     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
250 
251     reInt = sem_post(&sem);
252     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
253     reInt = sem_post(&sem);
254     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
255 
256     usleep(20); /* 20, common data for test, no special meaning */
257     reInt = sem_getvalue(&sem, &semValue);
258     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
259     ICUNIT_ASSERT_EQUAL(semValue, 1, semValue); /* 1, common data for test, no special meaning */
260 
261     reInt = pthread_join(tid, NULL);
262     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
263     reInt = sem_destroy(&sem);
264     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
265     return 0;
266 }
267 
ThreadSemTimedWait(void * arg)268 void *ThreadSemTimedWait(void *arg)
269 {
270     int ret;
271     struct timespec ts = {0};
272     sem_t *sem = (sem_t*)arg;
273     int semValue = 0;
274 
275     ret = sem_getvalue(sem, &semValue);
276     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
277     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
278 
279     clock_gettime(CLOCK_REALTIME, &ts);
280     ts.tv_sec = ts.tv_sec + (ts.tv_nsec + KERNEL_100MS_BY_NS) / KERNEL_NS_PER_SECOND;
281     ts.tv_nsec = (ts.tv_nsec + KERNEL_100MS_BY_NS) % KERNEL_NS_PER_SECOND;
282     usleep(50); /* 50, common data for test, no special meaning */
283     ret = sem_timedwait(sem, &ts);
284     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
285     ret = sem_getvalue(sem, &semValue);
286     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
287 
288     usleep(100); /* 100, common data for test, no special meaning */
289     ICUNIT_ASSERT_EQUAL(semValue, 1, semValue); /* 1, common data for test, no special meaning */
290     return NULL;
291 }
292 
293 /**
294  * @tc.number   SUB_KERNEL_IPC_SEM_CHAT_0300
295  * @tc.name     Inter-thread communication, check sem_timedwait function
296  * @tc.desc     [C- SOFTWARE -0200]
297  */
298 LITE_TEST_CASE(IpcSemApiXtsTestSuite, testThreadSemTimedWait, Function | MediumTest | Level3)
299 {
300     int ret;
301     pthread_t tid;
302     sem_t sem;
303     int reInt;
304     int semValue = 0;
305 
306     reInt = sem_init(&sem, 0, 0);
307     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
308 
309     reInt = pthread_create(&tid, NULL, ThreadSemTimedWait, (void*)&sem);
310     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
311 
312     usleep(10); /* 10, common data for test, no special meaning */
313     ret = sem_getvalue(&sem, &semValue);
314     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
315     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
316     ret = sem_post(&sem);
317     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
318     ret = sem_post(&sem);
319     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
320 
321     reInt = pthread_join(tid, NULL);
322     ret = sem_getvalue(&sem, &semValue);
323     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
324     ICUNIT_ASSERT_EQUAL(semValue, 1, semValue); /* 1, common data for test, no special meaning */
325     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
326     ret = sem_destroy(&sem);
327     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
328     return 0;
329 }
330 
ThreadNThreadWaitF01(void * arg)331 void *ThreadNThreadWaitF01(void *arg)
332 {
333     int ret;
334     sem_t *sem = (sem_t*)arg;
335     int semValue = 0;
336 
337     usleep(100); /* 100, common data for test, no special meaning */
338     ret = sem_getvalue(sem, &semValue);
339     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
340     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
341     ret = sem_wait(sem);
342     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
343     return NULL;
344 }
345 
ThreadNThreadWaitF02(void * arg)346 void *ThreadNThreadWaitF02(void *arg)
347 {
348     int ret;
349     sem_t *sem = (sem_t*)arg;
350     int semValue = 0;
351 
352     ret = sem_getvalue(sem, &semValue);
353     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
354     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
355 
356     usleep(300); /* 300, common data for test, no special meaning */
357     ret = sem_getvalue(sem, &semValue);
358     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
359     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
360 
361     usleep(200); /* 200, common data for test, no special meaning */
362     ret = sem_getvalue(sem, &semValue);
363     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
364     ICUNIT_ASSERT_EQUAL(semValue, 1, semValue); /* 1, common data for test, no special meaning */
365     ret = sem_wait(sem);
366     ICUNIT_ASSERT_EQUAL(ret, 0, ret);
367     return NULL;
368 }
369 
370 /**
371  * @tc.number   SUB_KERNEL_IPC_SEM_CHAT_0400
372  * @tc.name     N threads wait, main thread post
373  * @tc.desc     [C- SOFTWARE -0200]
374  */
375 LITE_TEST_CASE(IpcSemApiXtsTestSuite, testNThreadWait, Function | MediumTest | Level4)
376 {
377     pthread_t tid1;
378     pthread_t tid2;
379     sem_t sem;
380     int reInt;
381     int semValue = 0;
382 
383     reInt = sem_init(&sem, 0, 0);
384     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
385 
386     reInt = pthread_create(&tid1, NULL, ThreadNThreadWaitF01, (void*)&sem);
387     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
388 
389     reInt = pthread_create(&tid2, NULL, ThreadNThreadWaitF02, (void*)&sem);
390     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
391 
392     usleep(200); /* 200, common data for test, no special meaning */
393     reInt = sem_getvalue(&sem, &semValue);
394     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
395     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
396     reInt = sem_post(&sem);
397     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
398 
399     usleep(20); /* 20, common data for test, no special meaning */
400     reInt = sem_getvalue(&sem, &semValue);
401     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
402     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
403 
404     usleep(200); /* 200, common data for test, no special meaning */
405     reInt = sem_getvalue(&sem, &semValue);
406     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
407     ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
408     reInt = sem_post(&sem);
409     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
410 
411     usleep(20); /* 20, common data for test, no special meaning */
412     reInt = sem_getvalue(&sem, &semValue);
413     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
414     ICUNIT_ASSERT_EQUAL(semValue, 1, semValue); /* 1, common data for test, no special meaning */
415 
416     reInt = pthread_join(tid1, NULL);
417     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
418     reInt = pthread_join(tid2, NULL);
419     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
420     reInt = sem_destroy(&sem);
421     ICUNIT_ASSERT_EQUAL(reInt, 0, reInt);
422     return 0;
423 }
424 
425 RUN_TEST_SUITE(IpcSemApiXtsTestSuite);
426 
PosixSemXtsFuncTest()427 void PosixSemXtsFuncTest()
428 {
429     RUN_ONE_TESTCASE(testSemInitA);
430     RUN_ONE_TESTCASE(testSemInitB);
431     RUN_ONE_TESTCASE(testSemInitC);
432     RUN_ONE_TESTCASE(testSemPost);
433     RUN_ONE_TESTCASE(testSemWait);
434     RUN_ONE_TESTCASE(testSemdestroy);
435     RUN_ONE_TESTCASE(testThreadChat);
436 }
437