1f6603c60Sopenharmony_ci/*
2f6603c60Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License.
5f6603c60Sopenharmony_ci * You may obtain a copy of the License at
6f6603c60Sopenharmony_ci *
7f6603c60Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f6603c60Sopenharmony_ci *
9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and
13f6603c60Sopenharmony_ci * limitations under the License.
14f6603c60Sopenharmony_ci */
15f6603c60Sopenharmony_ci#include <stdio.h>
16f6603c60Sopenharmony_ci#include <string.h>
17f6603c60Sopenharmony_ci#include <limits.h>
18f6603c60Sopenharmony_ci#include <semaphore.h>
19f6603c60Sopenharmony_ci#include <pthread.h>
20f6603c60Sopenharmony_ci#include <gtest/gtest.h>
21f6603c60Sopenharmony_ci#include "utils.h"
22f6603c60Sopenharmony_ci#include "log.h"
23f6603c60Sopenharmony_ci
24f6603c60Sopenharmony_ciusing namespace testing::ext;
25f6603c60Sopenharmony_ci
26f6603c60Sopenharmony_cistatic const unsigned int KERNEL_NS_PER_SECOND = 1000000000;
27f6603c60Sopenharmony_cistatic const unsigned int KERNEL_100MS_BY_NS = 100000000;
28f6603c60Sopenharmony_ci
29f6603c60Sopenharmony_ciclass SemTest : public::testing::Test {
30f6603c60Sopenharmony_ci};
31f6603c60Sopenharmony_ci
32f6603c60Sopenharmony_ci/**
33f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_INIT_0100
34f6603c60Sopenharmony_ci * @tc.name     Use sem_init initialize the semaphore with 0
35f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
36f6603c60Sopenharmony_ci */
37f6603c60Sopenharmony_ciHWTEST_F(SemTest, testSemInitA, Function | MediumTest | Level2)
38f6603c60Sopenharmony_ci{
39f6603c60Sopenharmony_ci    sem_t sem;
40f6603c60Sopenharmony_ci    int semValue = 0;
41f6603c60Sopenharmony_ci    int testValue = 0;
42f6603c60Sopenharmony_ci
43f6603c60Sopenharmony_ci    EXPECT_NE(sem_init(&sem, 0, testValue), -1) << "> sem_init errno = " << errno;
44f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
45f6603c60Sopenharmony_ci    EXPECT_TRUE(semValue == testValue);
46f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
47f6603c60Sopenharmony_ci}
48f6603c60Sopenharmony_ci
49f6603c60Sopenharmony_ci/**
50f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_INIT_0110
51f6603c60Sopenharmony_ci * @tc.name     Use sem_init initialize the semaphore with 1
52f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
53f6603c60Sopenharmony_ci */
54f6603c60Sopenharmony_ciHWTEST_F(SemTest, testSemInitB, Function | MediumTest | Level2)
55f6603c60Sopenharmony_ci{
56f6603c60Sopenharmony_ci    sem_t sem;
57f6603c60Sopenharmony_ci    int semValue = 0;
58f6603c60Sopenharmony_ci    int testValue = 1;
59f6603c60Sopenharmony_ci
60f6603c60Sopenharmony_ci    EXPECT_NE(sem_init(&sem, 0, testValue), -1) << "> sem_init errno = " << errno;
61f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
62f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, testValue);
63f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
64f6603c60Sopenharmony_ci}
65f6603c60Sopenharmony_ci
66f6603c60Sopenharmony_ci/**
67f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_INIT_0120
68f6603c60Sopenharmony_ci * @tc.name     Use sem_init initialize the semaphore with 100
69f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
70f6603c60Sopenharmony_ci */
71f6603c60Sopenharmony_ciHWTEST_F(SemTest, testSemInitC, Function | MediumTest | Level2)
72f6603c60Sopenharmony_ci{
73f6603c60Sopenharmony_ci    sem_t sem;
74f6603c60Sopenharmony_ci    int semValue = 0;
75f6603c60Sopenharmony_ci    int testValue = 10;
76f6603c60Sopenharmony_ci
77f6603c60Sopenharmony_ci    EXPECT_NE(sem_init(&sem, 0, testValue), -1) << "> sem_init errno = " << errno;
78f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
79f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, testValue);
80f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
81f6603c60Sopenharmony_ci}
82f6603c60Sopenharmony_ci
83f6603c60Sopenharmony_ci/**
84f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_POST_0100
85f6603c60Sopenharmony_ci * @tc.name     sem_post increases the semaphore count
86f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
87f6603c60Sopenharmony_ci */
88f6603c60Sopenharmony_ciHWTEST_F(SemTest, testSemPost, Function | MediumTest | Level2)
89f6603c60Sopenharmony_ci{
90f6603c60Sopenharmony_ci    sem_t sem;
91f6603c60Sopenharmony_ci    int semValue = 0;
92f6603c60Sopenharmony_ci
93f6603c60Sopenharmony_ci    ASSERT_NE(sem_init(&sem, 0, 0), -1) << "> sem_init errno = " << errno;
94f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
95f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
96f6603c60Sopenharmony_ci
97f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "> sem_post errno = " << errno;
98f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
99f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 1);
100f6603c60Sopenharmony_ci
101f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "> sem_post errno = " << errno;
102f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "> sem_post errno = " << errno;
103f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
104f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 3);
105f6603c60Sopenharmony_ci
106f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
107f6603c60Sopenharmony_ci}
108f6603c60Sopenharmony_ci
109f6603c60Sopenharmony_ci/**
110f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_WAIT_0100
111f6603c60Sopenharmony_ci * @tc.name     sem_wait get semaphore
112f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
113f6603c60Sopenharmony_ci */
114f6603c60Sopenharmony_ciHWTEST_F(SemTest, testSemWait, Function | MediumTest | Level2)
115f6603c60Sopenharmony_ci{
116f6603c60Sopenharmony_ci    sem_t sem;
117f6603c60Sopenharmony_ci    int semValue = 0;
118f6603c60Sopenharmony_ci
119f6603c60Sopenharmony_ci    ASSERT_NE(sem_init(&sem, 0, 3), -1) << "> sem_init errno = " << errno;
120f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
121f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 3);
122f6603c60Sopenharmony_ci
123f6603c60Sopenharmony_ci    EXPECT_EQ(sem_wait(&sem), 0) << "> sem_wait errno = " << errno;
124f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
125f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 2);
126f6603c60Sopenharmony_ci
127f6603c60Sopenharmony_ci    EXPECT_EQ(sem_wait(&sem), 0) << "> sem_wait errno = " << errno;
128f6603c60Sopenharmony_ci    EXPECT_EQ(sem_wait(&sem), 0) << "> sem_wait errno = " << errno;
129f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
130f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
131f6603c60Sopenharmony_ci
132f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
133f6603c60Sopenharmony_ci}
134f6603c60Sopenharmony_ci
135f6603c60Sopenharmony_ci/**
136f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_TRYWAIT_0100
137f6603c60Sopenharmony_ci * @tc.name     sem_trywait get semaphore
138f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
139f6603c60Sopenharmony_ci */
140f6603c60Sopenharmony_ciHWTEST_F(SemTest, testSemTryWait, Function | MediumTest | Level2)
141f6603c60Sopenharmony_ci{
142f6603c60Sopenharmony_ci    sem_t sem;
143f6603c60Sopenharmony_ci    int semValue = 0;
144f6603c60Sopenharmony_ci
145f6603c60Sopenharmony_ci    ASSERT_NE(sem_init(&sem, 0, 3), -1) << "> sem_init errno = " << errno;
146f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
147f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 3);
148f6603c60Sopenharmony_ci
149f6603c60Sopenharmony_ci    EXPECT_EQ(sem_trywait(&sem), 0) << "> sem_trywait errno = " << errno;
150f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
151f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 2);
152f6603c60Sopenharmony_ci
153f6603c60Sopenharmony_ci    EXPECT_EQ(sem_trywait(&sem), 0) << "> sem_trywait errno = " << errno;
154f6603c60Sopenharmony_ci    EXPECT_EQ(sem_trywait(&sem), 0) << "> sem_trywait errno = " << errno;
155f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
156f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
157f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
158f6603c60Sopenharmony_ci}
159f6603c60Sopenharmony_ci
160f6603c60Sopenharmony_ci/**
161f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_DESTROY_0100
162f6603c60Sopenharmony_ci * @tc.name     check sem_destroy function
163f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
164f6603c60Sopenharmony_ci */
165f6603c60Sopenharmony_ciHWTEST_F(SemTest, testSemdestroy, Function | MediumTest | Level3)
166f6603c60Sopenharmony_ci{
167f6603c60Sopenharmony_ci    sem_t sem;
168f6603c60Sopenharmony_ci    ASSERT_EQ(sem_init(&sem, 0, 0), 0) << "> sem_init errno = " << errno;
169f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
170f6603c60Sopenharmony_ci}
171f6603c60Sopenharmony_ci
172f6603c60Sopenharmony_civoid *ThreadChat(void *arg)
173f6603c60Sopenharmony_ci{
174f6603c60Sopenharmony_ci    sem_t *sem = (sem_t*)arg;
175f6603c60Sopenharmony_ci    int semValue = 0;
176f6603c60Sopenharmony_ci
177f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
178f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
179f6603c60Sopenharmony_ci    EXPECT_EQ(sem_wait(sem), 0) << "sem_wait errno = " << errno;
180f6603c60Sopenharmony_ci    return nullptr;
181f6603c60Sopenharmony_ci}
182f6603c60Sopenharmony_ci
183f6603c60Sopenharmony_ci/**
184f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_CHAT_0100
185f6603c60Sopenharmony_ci * @tc.name     Inter-thread communication, check sem_wait function
186f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
187f6603c60Sopenharmony_ci */
188f6603c60Sopenharmony_ciHWTEST_F(SemTest, testThreadChat, Function | MediumTest | Level3)
189f6603c60Sopenharmony_ci{
190f6603c60Sopenharmony_ci    pthread_t tid;
191f6603c60Sopenharmony_ci    sem_t sem;
192f6603c60Sopenharmony_ci    int reInt = 0;
193f6603c60Sopenharmony_ci    int semValue = 0;
194f6603c60Sopenharmony_ci
195f6603c60Sopenharmony_ci    ASSERT_EQ(sem_init(&sem, 0, 0), 0) << "> sem_init errno = " << errno;
196f6603c60Sopenharmony_ci
197f6603c60Sopenharmony_ci    reInt = pthread_create(&tid, nullptr, ThreadChat, (void*)&sem);
198f6603c60Sopenharmony_ci    ASSERT_EQ(reInt, 0) << "> pthread_create errno, reInt = " << reInt;
199f6603c60Sopenharmony_ci
200f6603c60Sopenharmony_ci    Msleep(20);
201f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
202f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
203f6603c60Sopenharmony_ci
204f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "sem_post errno = " << errno;
205f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "sem_post errno = " << errno;
206f6603c60Sopenharmony_ci
207f6603c60Sopenharmony_ci    Msleep(20);
208f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
209f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 1);
210f6603c60Sopenharmony_ci
211f6603c60Sopenharmony_ci    reInt = pthread_join(tid, nullptr);
212f6603c60Sopenharmony_ci    EXPECT_EQ(reInt, 0) << "pthread_join failed, errno=" << reInt;
213f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
214f6603c60Sopenharmony_ci}
215f6603c60Sopenharmony_ci
216f6603c60Sopenharmony_civoid *ThreadSemTryWait(void *arg)
217f6603c60Sopenharmony_ci{
218f6603c60Sopenharmony_ci    sem_t *sem = (sem_t*)arg;
219f6603c60Sopenharmony_ci    int semValue = 0;
220f6603c60Sopenharmony_ci    int loop = 10;
221f6603c60Sopenharmony_ci
222f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
223f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
224f6603c60Sopenharmony_ci    for (int i = 0; i < loop; i++) {
225f6603c60Sopenharmony_ci        if (sem_trywait(sem) == 0) {
226f6603c60Sopenharmony_ci            break;
227f6603c60Sopenharmony_ci
228f6603c60Sopenharmony_ci        }
229f6603c60Sopenharmony_ci        Msleep(10);
230f6603c60Sopenharmony_ci    }
231f6603c60Sopenharmony_ci    return nullptr;
232f6603c60Sopenharmony_ci}
233f6603c60Sopenharmony_ci
234f6603c60Sopenharmony_ci/**
235f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_CHAT_0200
236f6603c60Sopenharmony_ci * @tc.name     basic function test : Inter-thread communication, check sem_trywait function
237f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
238f6603c60Sopenharmony_ci */
239f6603c60Sopenharmony_ciHWTEST_F(SemTest, testThreadSemTryWait, Function | MediumTest | Level3)
240f6603c60Sopenharmony_ci{
241f6603c60Sopenharmony_ci    sem_t sem;
242f6603c60Sopenharmony_ci    int reInt = 0;
243f6603c60Sopenharmony_ci    int semValue = 0;
244f6603c60Sopenharmony_ci
245f6603c60Sopenharmony_ci    ASSERT_EQ(sem_init(&sem, 0, 0), 0) << "> sem_init errno = " << errno;
246f6603c60Sopenharmony_ci
247f6603c60Sopenharmony_ci    pthread_t tid;
248f6603c60Sopenharmony_ci    reInt = pthread_create(&tid, nullptr, ThreadSemTryWait, (void*)&sem);
249f6603c60Sopenharmony_ci    ASSERT_EQ(reInt, 0) << "> pthread_create errno, reInt = " << reInt;
250f6603c60Sopenharmony_ci
251f6603c60Sopenharmony_ci    Msleep(20);
252f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
253f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
254f6603c60Sopenharmony_ci
255f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "sem_post errno = " << errno;
256f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "sem_post errno = " << errno;
257f6603c60Sopenharmony_ci
258f6603c60Sopenharmony_ci    reInt = pthread_join(tid, nullptr);
259f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
260f6603c60Sopenharmony_ci
261f6603c60Sopenharmony_ci    if (semValue == 1 || semValue == 2) {
262f6603c60Sopenharmony_ci        EXPECT_TRUE(true);
263f6603c60Sopenharmony_ci        LOG("semValue = %d", semValue);
264f6603c60Sopenharmony_ci    } else {
265f6603c60Sopenharmony_ci        EXPECT_TRUE(false);
266f6603c60Sopenharmony_ci        LOG("semValue errno, semValue = %d", semValue);
267f6603c60Sopenharmony_ci    }
268f6603c60Sopenharmony_ci
269f6603c60Sopenharmony_ci    EXPECT_EQ(reInt, 0) << "pthread_join failed, errno=" << reInt;
270f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
271f6603c60Sopenharmony_ci}
272f6603c60Sopenharmony_ci
273f6603c60Sopenharmony_civoid *ThreadSemTimedWait(void *arg)
274f6603c60Sopenharmony_ci{
275f6603c60Sopenharmony_ci    struct timespec ts = {0};
276f6603c60Sopenharmony_ci    sem_t *sem = (sem_t*)arg;
277f6603c60Sopenharmony_ci    int semValue = 0;
278f6603c60Sopenharmony_ci
279f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
280f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
281f6603c60Sopenharmony_ci
282f6603c60Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &ts);
283f6603c60Sopenharmony_ci    ts.tv_sec = ts.tv_sec + (ts.tv_nsec + KERNEL_100MS_BY_NS) / KERNEL_NS_PER_SECOND;
284f6603c60Sopenharmony_ci    ts.tv_nsec = (ts.tv_nsec + KERNEL_100MS_BY_NS) % KERNEL_NS_PER_SECOND;
285f6603c60Sopenharmony_ci    Msleep(50);
286f6603c60Sopenharmony_ci    EXPECT_EQ(sem_timedwait(sem, &ts), 0) << "sem_timedwait errno = " << errno;
287f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
288f6603c60Sopenharmony_ci
289f6603c60Sopenharmony_ci    Msleep(100);
290f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 1);
291f6603c60Sopenharmony_ci    return nullptr;
292f6603c60Sopenharmony_ci}
293f6603c60Sopenharmony_ci
294f6603c60Sopenharmony_ci/**
295f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_CHAT_0300
296f6603c60Sopenharmony_ci * @tc.name     Inter-thread communication, check sem_timedwait function
297f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
298f6603c60Sopenharmony_ci */
299f6603c60Sopenharmony_ciHWTEST_F(SemTest, testThreadSemTimedWait, Function | MediumTest | Level3)
300f6603c60Sopenharmony_ci{
301f6603c60Sopenharmony_ci    pthread_t tid;
302f6603c60Sopenharmony_ci    sem_t sem;
303f6603c60Sopenharmony_ci    int reInt = 0;
304f6603c60Sopenharmony_ci    int semValue = 0;
305f6603c60Sopenharmony_ci
306f6603c60Sopenharmony_ci    ASSERT_EQ(sem_init(&sem, 0, 0), 0) << "> sem_init errno = " << errno;
307f6603c60Sopenharmony_ci
308f6603c60Sopenharmony_ci    reInt = pthread_create(&tid, nullptr, ThreadSemTimedWait, (void*)&sem);
309f6603c60Sopenharmony_ci    ASSERT_EQ(reInt, 0) << "> pthread_create errno, reInt = " << reInt;
310f6603c60Sopenharmony_ci
311f6603c60Sopenharmony_ci    Msleep(10);
312f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
313f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
314f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "> sem_post errno = " << errno;
315f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "> sem_post errno = " << errno;
316f6603c60Sopenharmony_ci
317f6603c60Sopenharmony_ci    reInt = pthread_join(tid, nullptr);
318f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
319f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 1);
320f6603c60Sopenharmony_ci    EXPECT_EQ(reInt, 0) << "pthread_join failed, errno=" << reInt;
321f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
322f6603c60Sopenharmony_ci}
323f6603c60Sopenharmony_ci
324f6603c60Sopenharmony_civoid *ThreadNThreadWait1(void *arg)
325f6603c60Sopenharmony_ci{
326f6603c60Sopenharmony_ci    sem_t *sem = (sem_t*)arg;
327f6603c60Sopenharmony_ci    int semValue = 0;
328f6603c60Sopenharmony_ci
329f6603c60Sopenharmony_ci    Msleep(100);
330f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
331f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
332f6603c60Sopenharmony_ci    EXPECT_EQ(sem_wait(sem), 0) << "sem_wait errno = " << errno;
333f6603c60Sopenharmony_ci    return nullptr;
334f6603c60Sopenharmony_ci}
335f6603c60Sopenharmony_ci
336f6603c60Sopenharmony_civoid *ThreadNThreadWait2(void *arg)
337f6603c60Sopenharmony_ci{
338f6603c60Sopenharmony_ci    sem_t *sem = (sem_t*)arg;
339f6603c60Sopenharmony_ci    int semValue = 0;
340f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
341f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
342f6603c60Sopenharmony_ci
343f6603c60Sopenharmony_ci    Msleep(300);
344f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
345f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
346f6603c60Sopenharmony_ci
347f6603c60Sopenharmony_ci    Msleep(200);
348f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
349f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 1);
350f6603c60Sopenharmony_ci    EXPECT_EQ(sem_wait(sem), 0) << "sem_wait errno = " << errno;
351f6603c60Sopenharmony_ci    return nullptr;
352f6603c60Sopenharmony_ci}
353f6603c60Sopenharmony_ci
354f6603c60Sopenharmony_ci/**
355f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_CHAT_0400
356f6603c60Sopenharmony_ci * @tc.name     N threads wait, main thread post
357f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
358f6603c60Sopenharmony_ci */
359f6603c60Sopenharmony_ciHWTEST_F(SemTest, testNThreadWait, Function | MediumTest | Level4)
360f6603c60Sopenharmony_ci{
361f6603c60Sopenharmony_ci    pthread_t tid1;
362f6603c60Sopenharmony_ci    pthread_t tid2;
363f6603c60Sopenharmony_ci    sem_t sem;
364f6603c60Sopenharmony_ci    int reInt = 0;
365f6603c60Sopenharmony_ci    int semValue = 0;
366f6603c60Sopenharmony_ci
367f6603c60Sopenharmony_ci    ASSERT_EQ(sem_init(&sem, 0, 0), 0) << "> sem_init errno = " << errno;
368f6603c60Sopenharmony_ci
369f6603c60Sopenharmony_ci    reInt = pthread_create(&tid1, nullptr, ThreadNThreadWait1, (void*)&sem);
370f6603c60Sopenharmony_ci    ASSERT_EQ(reInt, 0) << "> pthread_create errno, reInt = " << reInt;
371f6603c60Sopenharmony_ci
372f6603c60Sopenharmony_ci    reInt = pthread_create(&tid2, nullptr, ThreadNThreadWait2, (void*)&sem);
373f6603c60Sopenharmony_ci    ASSERT_EQ(reInt, 0) << "> pthread_create errno, reInt = " << reInt;
374f6603c60Sopenharmony_ci
375f6603c60Sopenharmony_ci    Msleep(200);
376f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "sem_getvalue errno = " << errno;
377f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
378f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "sem_post errno = " << errno;
379f6603c60Sopenharmony_ci
380f6603c60Sopenharmony_ci    Msleep(20);
381f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "sem_getvalue errno = " << errno;
382f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
383f6603c60Sopenharmony_ci
384f6603c60Sopenharmony_ci    Msleep(200);
385f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "sem_getvalue errno = " << errno;
386f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
387f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(&sem), 0) << "sem_post errno = " << errno;
388f6603c60Sopenharmony_ci
389f6603c60Sopenharmony_ci    Msleep(20);
390f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "sem_getvalue errno = " << errno;
391f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 1);
392f6603c60Sopenharmony_ci
393f6603c60Sopenharmony_ci    reInt = pthread_join(tid1, nullptr);
394f6603c60Sopenharmony_ci    EXPECT_EQ(reInt, 0) << "pthread_join failed, errno=" << reInt;
395f6603c60Sopenharmony_ci    reInt = pthread_join(tid2, nullptr);
396f6603c60Sopenharmony_ci    EXPECT_EQ(reInt, 0) << "pthread_join failed, errno=" << reInt;
397f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
398f6603c60Sopenharmony_ci}
399f6603c60Sopenharmony_ci
400f6603c60Sopenharmony_civoid *ThreadNThreadPost1(void *arg)
401f6603c60Sopenharmony_ci{
402f6603c60Sopenharmony_ci    sem_t *sem = (sem_t*)arg;
403f6603c60Sopenharmony_ci    int semValue = 0;
404f6603c60Sopenharmony_ci
405f6603c60Sopenharmony_ci    Msleep(200);
406f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(sem), 0) << "sem_post errno = " << errno;
407f6603c60Sopenharmony_ci    Msleep(20);
408f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
409f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
410f6603c60Sopenharmony_ci    return nullptr;
411f6603c60Sopenharmony_ci}
412f6603c60Sopenharmony_ci
413f6603c60Sopenharmony_civoid *ThreadNThreadPost2(void *arg)
414f6603c60Sopenharmony_ci{
415f6603c60Sopenharmony_ci    sem_t *sem = (sem_t*)arg;
416f6603c60Sopenharmony_ci    int semValue = 0;
417f6603c60Sopenharmony_ci
418f6603c60Sopenharmony_ci    Msleep(300);
419f6603c60Sopenharmony_ci    EXPECT_EQ(sem_post(sem), 0) << "sem_post errno = " << errno;
420f6603c60Sopenharmony_ci    Msleep(20);
421f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(sem, &semValue), 0) << "sem_getvalue errno = " << errno;
422f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 1);
423f6603c60Sopenharmony_ci    return nullptr;
424f6603c60Sopenharmony_ci}
425f6603c60Sopenharmony_ci
426f6603c60Sopenharmony_ci/**
427f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_IPC_SEM_CHAT_0500
428f6603c60Sopenharmony_ci * @tc.name     N threads post, main thread wait
429f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
430f6603c60Sopenharmony_ci */
431f6603c60Sopenharmony_ciHWTEST_F(SemTest, testNThreadPost, Function | MediumTest | Level4)
432f6603c60Sopenharmony_ci{
433f6603c60Sopenharmony_ci    pthread_t tid1;
434f6603c60Sopenharmony_ci    pthread_t tid2;
435f6603c60Sopenharmony_ci    struct timespec ts = {0};
436f6603c60Sopenharmony_ci    sem_t sem;
437f6603c60Sopenharmony_ci    int reInt = 0;
438f6603c60Sopenharmony_ci    int semValue = 0;
439f6603c60Sopenharmony_ci
440f6603c60Sopenharmony_ci    ASSERT_EQ(sem_init(&sem, 0, 0), 0) << "> sem_init errno = " << errno;
441f6603c60Sopenharmony_ci
442f6603c60Sopenharmony_ci    reInt = pthread_create(&tid1, nullptr, ThreadNThreadPost1, (void*)&sem);
443f6603c60Sopenharmony_ci    ASSERT_EQ(reInt, 0) << "> pthread_create errno, reInt = " << reInt;
444f6603c60Sopenharmony_ci
445f6603c60Sopenharmony_ci    reInt = pthread_create(&tid2, nullptr, ThreadNThreadPost2, (void*)&sem);
446f6603c60Sopenharmony_ci    ASSERT_EQ(reInt, 0) << "> pthread_create errno, reInt = " << reInt;
447f6603c60Sopenharmony_ci
448f6603c60Sopenharmony_ci    Msleep(100);
449f6603c60Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &ts);
450f6603c60Sopenharmony_ci    ts.tv_sec = ts.tv_sec + 1;
451f6603c60Sopenharmony_ci    EXPECT_EQ(sem_timedwait(&sem, &ts), 0) << "> sem_timedwait errno = " << errno;
452f6603c60Sopenharmony_ci
453f6603c60Sopenharmony_ci    Msleep(400);
454f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "sem_getvalue errno = " << errno;
455f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 1);
456f6603c60Sopenharmony_ci    EXPECT_EQ(sem_trywait(&sem), 0) << "> sem_trywait errno = " << errno;
457f6603c60Sopenharmony_ci    EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "sem_getvalue errno = " << errno;
458f6603c60Sopenharmony_ci    EXPECT_EQ(semValue, 0);
459f6603c60Sopenharmony_ci
460f6603c60Sopenharmony_ci    reInt = pthread_join(tid1, nullptr);
461f6603c60Sopenharmony_ci    EXPECT_EQ(reInt, 0) << "pthread_join failed, errno=" << reInt;
462f6603c60Sopenharmony_ci    reInt = pthread_join(tid2, nullptr);
463f6603c60Sopenharmony_ci    EXPECT_EQ(reInt, 0) << "pthread_join failed, errno=" << reInt;
464f6603c60Sopenharmony_ci    EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
465f6603c60Sopenharmony_ci}
466