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