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 <pthread.h>
19f6603c60Sopenharmony_ci#include <gtest/gtest.h>
20f6603c60Sopenharmony_ci#include "utils.h"
21f6603c60Sopenharmony_ci#include "log.h"
22f6603c60Sopenharmony_ci#include "KernelConstants.h"
23f6603c60Sopenharmony_ci#include "FutexTest.h"
24f6603c60Sopenharmony_ci#include "mt_utils.h"
25f6603c60Sopenharmony_ci
26f6603c60Sopenharmony_ciusing namespace testing::ext;
27f6603c60Sopenharmony_ci
28f6603c60Sopenharmony_ci/**
29f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_COND_INIT_0100
30f6603c60Sopenharmony_ci * @tc.name     pthread_cond_init initializes condition variables
31f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
32f6603c60Sopenharmony_ci */
33f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondInit, Function | MediumTest | Level2)
34f6603c60Sopenharmony_ci{
35f6603c60Sopenharmony_ci    pthread_condattr_t condattr;
36f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_init(&condattr), 0);
37f6603c60Sopenharmony_ci    pthread_cond_t cond1;
38f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_init(&cond1, &condattr), 0);
39f6603c60Sopenharmony_ci
40f6603c60Sopenharmony_ci    pthread_cond_t cond2;
41f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_init(&cond2, nullptr), 0);
42f6603c60Sopenharmony_ci}
43f6603c60Sopenharmony_ci
44f6603c60Sopenharmony_ci/**
45f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_COND_DESTROY_0100
46f6603c60Sopenharmony_ci * @tc.name     pthread_cond_destroy destroy condition variables
47f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
48f6603c60Sopenharmony_ci */
49f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondDestroy, Function | MediumTest | Level3)
50f6603c60Sopenharmony_ci{
51f6603c60Sopenharmony_ci    pthread_condattr_t condattr;
52f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_init(&condattr), 0);
53f6603c60Sopenharmony_ci    pthread_cond_t cond1;
54f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_init(&cond1, &condattr), 0);
55f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_destroy(&cond1), 0);
56f6603c60Sopenharmony_ci
57f6603c60Sopenharmony_ci    pthread_cond_t cond2;
58f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_init(&cond2, nullptr), 0);
59f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_destroy(&cond2), 0);
60f6603c60Sopenharmony_ci
61f6603c60Sopenharmony_ci    pthread_cond_t cond3 = PTHREAD_COND_INITIALIZER;
62f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_destroy(&cond3), 0);
63f6603c60Sopenharmony_ci}
64f6603c60Sopenharmony_ci
65f6603c60Sopenharmony_ci/**
66f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CONDATTR_INIT_0100
67f6603c60Sopenharmony_ci * @tc.name     Init and destroy operations
68f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
69f6603c60Sopenharmony_ci */
70f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondattrInit, Function | MediumTest | Level2)
71f6603c60Sopenharmony_ci{
72f6603c60Sopenharmony_ci    pthread_condattr_t condattr;
73f6603c60Sopenharmony_ci
74f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_init(&condattr), 0) << "> return errno";
75f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_destroy(&condattr), 0) << "> return errno";
76f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_init(&condattr), 0) << "> return errno";
77f6603c60Sopenharmony_ci}
78f6603c60Sopenharmony_ci
79f6603c60Sopenharmony_ci/**
80f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CONDATTR_SETCLOCK_0100
81f6603c60Sopenharmony_ci * @tc.name     Set and get the clock selection variable properties of the condition variable properties
82f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
83f6603c60Sopenharmony_ci */
84f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondattrSetclock, Function | MediumTest | Level3)
85f6603c60Sopenharmony_ci{
86f6603c60Sopenharmony_ci    clockid_t clk;
87f6603c60Sopenharmony_ci    const int invalidClock = -100;
88f6603c60Sopenharmony_ci    pthread_condattr_t condattr;
89f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_init(&condattr), 0);
90f6603c60Sopenharmony_ci
91f6603c60Sopenharmony_ci    // default
92f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_getclock(&condattr, &clk), 0) << "> return errno";
93f6603c60Sopenharmony_ci    EXPECT_EQ(clk, DEF_PROCESS_CONDATTR_CLOCK);
94f6603c60Sopenharmony_ci
95f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_setclock(&condattr, CLOCK_REALTIME), 0) << "> return errno";
96f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_getclock(&condattr, &clk), 0) << "> return errno";
97f6603c60Sopenharmony_ci    EXPECT_EQ(clk, CLOCK_REALTIME);
98f6603c60Sopenharmony_ci
99f6603c60Sopenharmony_ci    struct timespec ts = {0};
100f6603c60Sopenharmony_ci    EXPECT_EQ(clock_getres(CLOCK_MONOTONIC, &ts), 0) << "> return errno";
101f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC), 0) << "> return errno";
102f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_getclock(&condattr, &clk), 0) << "> return errno";
103f6603c60Sopenharmony_ci    EXPECT_EQ(clk, CLOCK_MONOTONIC);
104f6603c60Sopenharmony_ci
105f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_condattr_setclock(&condattr, invalidClock), EINVAL) << "> return errno";
106f6603c60Sopenharmony_ci}
107f6603c60Sopenharmony_ci
108f6603c60Sopenharmony_cipthread_mutex_t g_mtx1 = PTHREAD_MUTEX_INITIALIZER;
109f6603c60Sopenharmony_cipthread_cond_t g_cond1 = PTHREAD_COND_INITIALIZER;
110f6603c60Sopenharmony_ci
111f6603c60Sopenharmony_ci// pthread_cond_signal
112f6603c60Sopenharmony_civoid *ThreadPthreadCondSignalBefore1(void *arg)
113f6603c60Sopenharmony_ci{
114f6603c60Sopenharmony_ci    Msleep(20);
115f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx1), 0);
116f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(2));
117f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_signal(&g_cond1), 0);
118f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(3));
119f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx1), 0);
120f6603c60Sopenharmony_ci    return arg;
121f6603c60Sopenharmony_ci}
122f6603c60Sopenharmony_ci
123f6603c60Sopenharmony_ci// pthread_cond_wait
124f6603c60Sopenharmony_civoid *ThreadPthreadCondSignalBefore2(void *arg)
125f6603c60Sopenharmony_ci{
126f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx1), 0);
127f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_wait(&g_cond1, &g_mtx1), 0);
128f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(4));
129f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx1), 0);
130f6603c60Sopenharmony_ci    return arg;
131f6603c60Sopenharmony_ci}
132f6603c60Sopenharmony_ci
133f6603c60Sopenharmony_ci/**
134f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_COND_SIGNAL_0100
135f6603c60Sopenharmony_ci * @tc.name     Use pthread_cond_signal to release the conditional semaphore, pthread_cond_signal front
136f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
137f6603c60Sopenharmony_ci */
138f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondSignalBefore, Function | MediumTest | Level3)
139f6603c60Sopenharmony_ci{
140f6603c60Sopenharmony_ci    pthread_t tid[2];
141f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(1));
142f6603c60Sopenharmony_ci
143f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid[0], nullptr, ThreadPthreadCondSignalBefore1, nullptr), 0) << "> return errno";
144f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid[1], nullptr, ThreadPthreadCondSignalBefore2, nullptr), 0) << "> return errno";
145f6603c60Sopenharmony_ci
146f6603c60Sopenharmony_ci    Msleep(100);
147f6603c60Sopenharmony_ci    pthread_join(tid[0], nullptr);
148f6603c60Sopenharmony_ci    pthread_join(tid[1], nullptr);
149f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_destroy(&g_cond1), 0);
150f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_destroy(&g_mtx1), 0);
151f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(5), (uint64_t)0x12345);
152f6603c60Sopenharmony_ci}
153f6603c60Sopenharmony_ci
154f6603c60Sopenharmony_cipthread_mutex_t g_mtx2 = PTHREAD_MUTEX_INITIALIZER;
155f6603c60Sopenharmony_cipthread_cond_t g_cond2 = PTHREAD_COND_INITIALIZER;
156f6603c60Sopenharmony_ci
157f6603c60Sopenharmony_ci// pthread_cond_signal
158f6603c60Sopenharmony_civoid *ThreadTestCondSignalWaitAfter1(void *arg)
159f6603c60Sopenharmony_ci{
160f6603c60Sopenharmony_ci    Msleep(20);
161f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx2), 0);
162f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(2));
163f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx2), 0);
164f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_signal(&g_cond2), 0);
165f6603c60Sopenharmony_ci    return arg;
166f6603c60Sopenharmony_ci}
167f6603c60Sopenharmony_ci
168f6603c60Sopenharmony_ci// pthread_cond_wait
169f6603c60Sopenharmony_civoid *ThreadTestCondSignalWaitAfter2(void *arg)
170f6603c60Sopenharmony_ci{
171f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx2), 0);
172f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_wait(&g_cond2, &g_mtx2), 0);
173f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(3));
174f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx2), 0);
175f6603c60Sopenharmony_ci    return arg;
176f6603c60Sopenharmony_ci}
177f6603c60Sopenharmony_ci
178f6603c60Sopenharmony_ci/**
179f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_COND_SIGNAL_0200
180f6603c60Sopenharmony_ci * @tc.name     Use pthread_cond_signal to release the conditional semaphore, pthread_cond_signal in the back
181f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
182f6603c60Sopenharmony_ci */
183f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondSignalAfter, Function | MediumTest | Level3)
184f6603c60Sopenharmony_ci{
185f6603c60Sopenharmony_ci    pthread_t tid[2];
186f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(1));
187f6603c60Sopenharmony_ci
188f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid[0], nullptr, ThreadTestCondSignalWaitAfter1, nullptr), 0) << "> return errno";
189f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid[1], nullptr, ThreadTestCondSignalWaitAfter2, nullptr), 0) << "> return errno";
190f6603c60Sopenharmony_ci
191f6603c60Sopenharmony_ci    Msleep(100);
192f6603c60Sopenharmony_ci    pthread_join(tid[0], nullptr);
193f6603c60Sopenharmony_ci    pthread_join(tid[1], nullptr);
194f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_destroy(&g_cond2), 0);
195f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_destroy(&g_mtx2), 0);
196f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(4), (uint64_t)0x1234);
197f6603c60Sopenharmony_ci}
198f6603c60Sopenharmony_ci
199f6603c60Sopenharmony_cipthread_mutex_t g_mtx3 = PTHREAD_MUTEX_INITIALIZER;
200f6603c60Sopenharmony_cipthread_cond_t g_cond3 = PTHREAD_COND_INITIALIZER;
201f6603c60Sopenharmony_ci
202f6603c60Sopenharmony_ci// pthread_cond_broadcast
203f6603c60Sopenharmony_civoid *ThreadPthreadCondBroadcast1(void *arg)
204f6603c60Sopenharmony_ci{
205f6603c60Sopenharmony_ci    int *testIntP = (int *)arg;
206f6603c60Sopenharmony_ci    Msleep(20);
207f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx3), 0);
208f6603c60Sopenharmony_ci    *testIntP = 10;
209f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_broadcast(&g_cond3), 0);
210f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx3), 0);
211f6603c60Sopenharmony_ci    return arg;
212f6603c60Sopenharmony_ci}
213f6603c60Sopenharmony_ci
214f6603c60Sopenharmony_ci// pthread_cond_wait
215f6603c60Sopenharmony_civoid *ThreadPthreadCondBroadcast2(void *arg)
216f6603c60Sopenharmony_ci{
217f6603c60Sopenharmony_ci    int *testIntP = (int *)arg;
218f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx3), 0);
219f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_wait(&g_cond3, &g_mtx3), 0);
220f6603c60Sopenharmony_ci    (*testIntP)++;
221f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx3), 0);
222f6603c60Sopenharmony_ci    return arg;
223f6603c60Sopenharmony_ci}
224f6603c60Sopenharmony_ci
225f6603c60Sopenharmony_ci/**
226f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_COND_BROADCAST_0100
227f6603c60Sopenharmony_ci * @tc.name     Use pthread_cond_broadcast to release conditional semaphore
228f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
229f6603c60Sopenharmony_ci */
230f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondBroadcast, Function | MediumTest | Level3)
231f6603c60Sopenharmony_ci{
232f6603c60Sopenharmony_ci    pthread_t tid[3];
233f6603c60Sopenharmony_ci    int testInt = 0;
234f6603c60Sopenharmony_ci
235f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid[0], nullptr, ThreadPthreadCondBroadcast1, (void*)&testInt), 0) << "> return errno";
236f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid[1], nullptr, ThreadPthreadCondBroadcast2, (void*)&testInt), 0) << "> return errno";
237f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid[2], nullptr, ThreadPthreadCondBroadcast2, (void*)&testInt), 0) << "> return errno";
238f6603c60Sopenharmony_ci
239f6603c60Sopenharmony_ci    Msleep(100);
240f6603c60Sopenharmony_ci    pthread_join(tid[0], nullptr);
241f6603c60Sopenharmony_ci    pthread_join(tid[1], nullptr);
242f6603c60Sopenharmony_ci    pthread_join(tid[2], nullptr);
243f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_destroy(&g_cond3), 0);
244f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_destroy(&g_mtx3), 0);
245f6603c60Sopenharmony_ci    EXPECT_EQ(testInt, 12);
246f6603c60Sopenharmony_ci}
247f6603c60Sopenharmony_ci
248f6603c60Sopenharmony_cipthread_mutex_t g_mtx4 = PTHREAD_MUTEX_INITIALIZER;
249f6603c60Sopenharmony_cipthread_cond_t g_cond4 = PTHREAD_COND_INITIALIZER;
250f6603c60Sopenharmony_ci
251f6603c60Sopenharmony_ci// pthread_cond_signal
252f6603c60Sopenharmony_civoid *ThreadPthreadCondTimedwait1(void *arg)
253f6603c60Sopenharmony_ci{
254f6603c60Sopenharmony_ci    Msleep(50);
255f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx4), 0);
256f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(2));
257f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx4), 0);
258f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_signal(&g_cond4), 0);
259f6603c60Sopenharmony_ci    return arg;
260f6603c60Sopenharmony_ci}
261f6603c60Sopenharmony_ci
262f6603c60Sopenharmony_ci// pthread_cond_timedwait
263f6603c60Sopenharmony_civoid *ThreadPthreadCondTimedwait2(void *arg)
264f6603c60Sopenharmony_ci{
265f6603c60Sopenharmony_ci    const unsigned int nsecPerSec = 1000000000;
266f6603c60Sopenharmony_ci    const unsigned int nsecPer100Ms = 100000000;
267f6603c60Sopenharmony_ci    struct timespec ts = {0};
268f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx4), 0);
269f6603c60Sopenharmony_ci
270f6603c60Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &ts);
271f6603c60Sopenharmony_ci    ts.tv_sec = ts.tv_sec + (ts.tv_nsec + nsecPer100Ms) / nsecPerSec;
272f6603c60Sopenharmony_ci    ts.tv_nsec = (ts.tv_nsec + nsecPer100Ms) % nsecPerSec;
273f6603c60Sopenharmony_ci
274f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_timedwait(&g_cond4, &g_mtx4,  &ts), 0);
275f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(3));
276f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx4), 0);
277f6603c60Sopenharmony_ci    return arg;
278f6603c60Sopenharmony_ci}
279f6603c60Sopenharmony_ci
280f6603c60Sopenharmony_ci/**
281f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_COND_TIMEDWAIT_0100
282f6603c60Sopenharmony_ci * @tc.name     Use pthread_cond_timedwait to get conditional semaphore
283f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
284f6603c60Sopenharmony_ci */
285f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondTimedwait, Function | MediumTest | Level3)
286f6603c60Sopenharmony_ci{
287f6603c60Sopenharmony_ci    pthread_t tid1;
288f6603c60Sopenharmony_ci    pthread_t tid2;
289f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(1));
290f6603c60Sopenharmony_ci
291f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid1, nullptr, ThreadPthreadCondTimedwait1, nullptr), 0) << "> return errno";
292f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid2, nullptr, ThreadPthreadCondTimedwait2, nullptr), 0) << "> return errno";
293f6603c60Sopenharmony_ci
294f6603c60Sopenharmony_ci    Msleep(100);
295f6603c60Sopenharmony_ci    pthread_join(tid1, nullptr);
296f6603c60Sopenharmony_ci    pthread_join(tid2, nullptr);
297f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_destroy(&g_cond4), 0);
298f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_destroy(&g_mtx4), 0);
299f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(4), (uint64_t)0x1234);
300f6603c60Sopenharmony_ci}
301f6603c60Sopenharmony_ci
302f6603c60Sopenharmony_cipthread_mutex_t g_mtx5 = PTHREAD_MUTEX_INITIALIZER;
303f6603c60Sopenharmony_cipthread_cond_t g_cond5 = PTHREAD_COND_INITIALIZER;
304f6603c60Sopenharmony_ci
305f6603c60Sopenharmony_ci// pthread_cond_timedwait
306f6603c60Sopenharmony_civoid *ThreadPthreadCondTimedwaitOut(void *arg)
307f6603c60Sopenharmony_ci{
308f6603c60Sopenharmony_ci    struct timespec ts = {0};
309f6603c60Sopenharmony_ci    struct timespec tsNow = {0};
310f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx5), 0);
311f6603c60Sopenharmony_ci
312f6603c60Sopenharmony_ci    GetDelayedTime(&ts, 100);
313f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_timedwait(&g_cond5, &g_mtx5, &ts), ETIMEDOUT) << "> return should errno";
314f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(2));
315f6603c60Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &tsNow);
316f6603c60Sopenharmony_ci
317f6603c60Sopenharmony_ci    int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different
318f6603c60Sopenharmony_ci    EXPECT_GE(timeDiff, 0);
319f6603c60Sopenharmony_ci    EXPECT_LE(timeDiff, 20);
320f6603c60Sopenharmony_ci
321f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx5), 0);
322f6603c60Sopenharmony_ci    return arg;
323f6603c60Sopenharmony_ci}
324f6603c60Sopenharmony_ci
325f6603c60Sopenharmony_ci/**
326f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_COND_TIMEDWAIT_0200
327f6603c60Sopenharmony_ci * @tc.name     Use pthread_cond_timedwait to time out time measurement
328f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
329f6603c60Sopenharmony_ci */
330f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondTimedwaitOut, Function | MediumTest | Level3)
331f6603c60Sopenharmony_ci{
332f6603c60Sopenharmony_ci    pthread_t tid;
333f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(1));
334f6603c60Sopenharmony_ci
335f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCondTimedwaitOut, nullptr), 0) << "> return errno";
336f6603c60Sopenharmony_ci
337f6603c60Sopenharmony_ci    Msleep(200);
338f6603c60Sopenharmony_ci    pthread_join(tid, nullptr);
339f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_destroy(&g_cond5), 0);
340f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_destroy(&g_mtx5), 0);
341f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123);
342f6603c60Sopenharmony_ci}
343f6603c60Sopenharmony_ci
344f6603c60Sopenharmony_cipthread_mutex_t g_mtx6 = PTHREAD_MUTEX_INITIALIZER;
345f6603c60Sopenharmony_cipthread_cond_t g_cond6 = PTHREAD_COND_INITIALIZER;
346f6603c60Sopenharmony_ci
347f6603c60Sopenharmony_ci// pthread_cond_timedwait
348f6603c60Sopenharmony_civoid *ThreadPthreadCondTimedwaitEinval(void *arg)
349f6603c60Sopenharmony_ci{
350f6603c60Sopenharmony_ci    const long einvalNsec = 1000000000;
351f6603c60Sopenharmony_ci    struct timespec ts = {0};
352f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_lock(&g_mtx6), 0);
353f6603c60Sopenharmony_ci
354f6603c60Sopenharmony_ci    ts.tv_sec = 1;
355f6603c60Sopenharmony_ci    ts.tv_nsec = einvalNsec;
356f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_timedwait(&g_cond6, &g_mtx6, &ts), EINVAL) << "> return should errno";
357f6603c60Sopenharmony_ci    CheckStep(2);
358f6603c60Sopenharmony_ci
359f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_unlock(&g_mtx6), 0);
360f6603c60Sopenharmony_ci    return arg;
361f6603c60Sopenharmony_ci}
362f6603c60Sopenharmony_ci
363f6603c60Sopenharmony_ci/**
364f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_COND_TIMEDWAIT_0300
365f6603c60Sopenharmony_ci * @tc.name     test pthread_cond_timedwait EINVAL
366f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
367f6603c60Sopenharmony_ci */
368f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondTimedwaitEinval, Function | MediumTest | Level3)
369f6603c60Sopenharmony_ci{
370f6603c60Sopenharmony_ci    pthread_t tid;
371f6603c60Sopenharmony_ci    CheckStep(1);
372f6603c60Sopenharmony_ci
373f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCondTimedwaitEinval, nullptr), 0) << "> return errno";
374f6603c60Sopenharmony_ci
375f6603c60Sopenharmony_ci    Msleep(200);
376f6603c60Sopenharmony_ci    pthread_join(tid, nullptr);
377f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cond_destroy(&g_cond6), 0);
378f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_mutex_destroy(&g_mtx6), 0);
379f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123);
380f6603c60Sopenharmony_ci}