1570af302Sopenharmony_ci/*
2570af302Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4570af302Sopenharmony_ci * you may not use this file except in compliance with the License.
5570af302Sopenharmony_ci * You may obtain a copy of the License at
6570af302Sopenharmony_ci *
7570af302Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8570af302Sopenharmony_ci *
9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12570af302Sopenharmony_ci * See the License for the specific language governing permissions and
13570af302Sopenharmony_ci * limitations under the License.
14570af302Sopenharmony_ci */
15570af302Sopenharmony_ci#include <errno.h>
16570af302Sopenharmony_ci#include <pthread.h>
17570af302Sopenharmony_ci#include "pthread_util.h"
18570af302Sopenharmony_ci
19570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
20570af302Sopenharmony_ci
21570af302Sopenharmony_cistatic void *PthreadClocklockOutRealTime(void *arg)
22570af302Sopenharmony_ci{
23570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
24570af302Sopenharmony_ci    struct timespec ts = {0};
25570af302Sopenharmony_ci    struct timespec tsNow = {0};
26570af302Sopenharmony_ci
27570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
28570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_REALTIME);
29570af302Sopenharmony_ci    TEST(pthread_mutex_clocklock(mtx, CLOCK_REALTIME, &ts) == ETIMEDOUT);
30570af302Sopenharmony_ci
31570af302Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &tsNow);
32570af302Sopenharmony_ci    int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different
33570af302Sopenharmony_ci    TEST(timeDiff < 20);
34570af302Sopenharmony_ci    return arg;
35570af302Sopenharmony_ci}
36570af302Sopenharmony_ci
37570af302Sopenharmony_ci/**
38570af302Sopenharmony_ci * @tc.name     : pthread_mutex_clocklock_0010
39570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_clocklock whith timeout by CLOCK_REALTIME
40570af302Sopenharmony_ci * @tc.level    : Level 0
41570af302Sopenharmony_ci */
42570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0010(void)
43570af302Sopenharmony_ci{
44570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
45570af302Sopenharmony_ci    pthread_t tid;
46570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadClocklockOutRealTime, (void*)&mtx) == 0);
47570af302Sopenharmony_ci
48570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
49570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
50570af302Sopenharmony_ci    Msleep(SLEEP_100_MS);
51570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
52570af302Sopenharmony_ci
53570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
54570af302Sopenharmony_ci}
55570af302Sopenharmony_ci
56570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
57570af302Sopenharmony_ci
58570af302Sopenharmony_cistatic void *PthreadClocklockNoOutRealTime(void *arg)
59570af302Sopenharmony_ci{
60570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
61570af302Sopenharmony_ci    struct timespec ts = {0};
62570af302Sopenharmony_ci
63570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
64570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_REALTIME);
65570af302Sopenharmony_ci    TEST(pthread_mutex_clocklock(mtx, CLOCK_REALTIME, &ts) == 0);
66570af302Sopenharmony_ci    return arg;
67570af302Sopenharmony_ci}
68570af302Sopenharmony_ci
69570af302Sopenharmony_ci/**
70570af302Sopenharmony_ci * @tc.name     : pthread_mutex_clocklock_0020
71570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_clocklock with no timeout by CLOCK_REALTIME
72570af302Sopenharmony_ci * @tc.level    : Level 0
73570af302Sopenharmony_ci */
74570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0020(void)
75570af302Sopenharmony_ci{
76570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
77570af302Sopenharmony_ci    pthread_t tid;
78570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadClocklockNoOutRealTime, (void*)&mtx) == 0);
79570af302Sopenharmony_ci
80570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
81570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
82570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
83570af302Sopenharmony_ci
84570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
85570af302Sopenharmony_ci}
86570af302Sopenharmony_ci
87570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
88570af302Sopenharmony_ci
89570af302Sopenharmony_cistatic void *PthreadClocklockOutMonoTime(void *arg)
90570af302Sopenharmony_ci{
91570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
92570af302Sopenharmony_ci    struct timespec ts = {0};
93570af302Sopenharmony_ci    struct timespec tsNow = {0};
94570af302Sopenharmony_ci
95570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
96570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC);
97570af302Sopenharmony_ci    TEST(pthread_mutex_clocklock(mtx, CLOCK_MONOTONIC, &ts) == ETIMEDOUT);
98570af302Sopenharmony_ci
99570af302Sopenharmony_ci    clock_gettime(CLOCK_MONOTONIC, &tsNow);
100570af302Sopenharmony_ci    int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different
101570af302Sopenharmony_ci    TEST(timeDiff < 20);
102570af302Sopenharmony_ci    return arg;
103570af302Sopenharmony_ci}
104570af302Sopenharmony_ci
105570af302Sopenharmony_ci/**
106570af302Sopenharmony_ci * @tc.name     : pthread_mutex_clocklock_0030
107570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_clocklock whith timeout by CLOCK_MONOTONIC
108570af302Sopenharmony_ci * @tc.level    : Level 0
109570af302Sopenharmony_ci */
110570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0030(void)
111570af302Sopenharmony_ci{
112570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
113570af302Sopenharmony_ci    pthread_t tid;
114570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadClocklockOutMonoTime, (void*)&mtx) == 0);
115570af302Sopenharmony_ci
116570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
117570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
118570af302Sopenharmony_ci    Msleep(SLEEP_100_MS);
119570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
120570af302Sopenharmony_ci
121570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
122570af302Sopenharmony_ci}
123570af302Sopenharmony_ci
124570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
125570af302Sopenharmony_ci
126570af302Sopenharmony_cistatic void *PthreadClocklockNoOutMonoTime(void *arg)
127570af302Sopenharmony_ci{
128570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
129570af302Sopenharmony_ci    struct timespec ts = {0};
130570af302Sopenharmony_ci
131570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
132570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC);
133570af302Sopenharmony_ci    TEST(pthread_mutex_clocklock(mtx, CLOCK_MONOTONIC, &ts) == 0);
134570af302Sopenharmony_ci    return arg;
135570af302Sopenharmony_ci}
136570af302Sopenharmony_ci
137570af302Sopenharmony_ci/**
138570af302Sopenharmony_ci * @tc.name     : pthread_mutex_clocklock_0040
139570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_clocklock with no timeout by CLOCK_MONOTONIC
140570af302Sopenharmony_ci * @tc.level    : Level 0
141570af302Sopenharmony_ci */
142570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0040(void)
143570af302Sopenharmony_ci{
144570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
145570af302Sopenharmony_ci    pthread_t tid;
146570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadClocklockNoOutMonoTime, (void*)&mtx) == 0);
147570af302Sopenharmony_ci
148570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
149570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
150570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
151570af302Sopenharmony_ci
152570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
153570af302Sopenharmony_ci}
154570af302Sopenharmony_ci
155570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
156570af302Sopenharmony_ci
157570af302Sopenharmony_cistatic void *PthreadClocklockOutRealTime2(void *arg)
158570af302Sopenharmony_ci{
159570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
160570af302Sopenharmony_ci    struct timespec ts = {0};
161570af302Sopenharmony_ci    struct timespec tsNow = {0};
162570af302Sopenharmony_ci
163570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
164570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_REALTIME);
165570af302Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &tsNow);
166570af302Sopenharmony_ci    tsNow.tv_sec += 1;
167570af302Sopenharmony_ci    clock_settime(CLOCK_REALTIME, &tsNow);
168570af302Sopenharmony_ci    TEST(pthread_mutex_clocklock(mtx, CLOCK_REALTIME, &ts) == ETIMEDOUT);
169570af302Sopenharmony_ci
170570af302Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &tsNow);
171570af302Sopenharmony_ci    tsNow.tv_sec -= 1;
172570af302Sopenharmony_ci    clock_settime(CLOCK_REALTIME, &tsNow);
173570af302Sopenharmony_ci
174570af302Sopenharmony_ci    return arg;
175570af302Sopenharmony_ci}
176570af302Sopenharmony_ci
177570af302Sopenharmony_ci/**
178570af302Sopenharmony_ci * @tc.name     : pthread_mutex_clocklock_0050
179570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_clocklock whith timeout by CLOCK_REALTIME
180570af302Sopenharmony_ci * @tc.level    : Level 2
181570af302Sopenharmony_ci */
182570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0050(void)
183570af302Sopenharmony_ci{
184570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
185570af302Sopenharmony_ci    pthread_t tid;
186570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadClocklockOutRealTime2, (void*)&mtx) == 0);
187570af302Sopenharmony_ci
188570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
189570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
190570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
191570af302Sopenharmony_ci
192570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
193570af302Sopenharmony_ci}
194570af302Sopenharmony_ci
195570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
196570af302Sopenharmony_ci
197570af302Sopenharmony_cistatic void *PthreadClocklockNoOutMonoTime2(void *arg)
198570af302Sopenharmony_ci{
199570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
200570af302Sopenharmony_ci    struct timespec ts = {0};
201570af302Sopenharmony_ci
202570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
203570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC);
204570af302Sopenharmony_ci    TEST(pthread_mutex_clocklock(mtx, CLOCK_MONOTONIC, &ts) == 0);
205570af302Sopenharmony_ci    return arg;
206570af302Sopenharmony_ci}
207570af302Sopenharmony_ci
208570af302Sopenharmony_ci/**
209570af302Sopenharmony_ci * @tc.name     : pthread_mutex_clocklock_0060
210570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_clocklock whith timeout by CLOCK_REALTIME
211570af302Sopenharmony_ci * @tc.level    : Level 2
212570af302Sopenharmony_ci */
213570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0060(void)
214570af302Sopenharmony_ci{
215570af302Sopenharmony_ci    struct timespec tsNow = {0};
216570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
217570af302Sopenharmony_ci    pthread_t tid;
218570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadClocklockNoOutMonoTime2, (void*)&mtx) == 0);
219570af302Sopenharmony_ci
220570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
221570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
222570af302Sopenharmony_ci    clock_gettime(CLOCK_MONOTONIC, &tsNow);
223570af302Sopenharmony_ci    tsNow.tv_sec += 1;
224570af302Sopenharmony_ci    clock_settime(CLOCK_REALTIME, &tsNow);
225570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
226570af302Sopenharmony_ci
227570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
228570af302Sopenharmony_ci
229570af302Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &tsNow);
230570af302Sopenharmony_ci    tsNow.tv_sec -= 1;
231570af302Sopenharmony_ci    clock_settime(CLOCK_REALTIME, &tsNow);
232570af302Sopenharmony_ci}
233570af302Sopenharmony_ci
234570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
235570af302Sopenharmony_ci
236570af302Sopenharmony_cistatic void *PthreadTimedlockMonotonicNPOut(void *arg)
237570af302Sopenharmony_ci{
238570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
239570af302Sopenharmony_ci    struct timespec ts = {0};
240570af302Sopenharmony_ci    struct timespec tsNow = {0};
241570af302Sopenharmony_ci
242570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
243570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC);
244570af302Sopenharmony_ci    TEST(pthread_mutex_timedlock_monotonic_np(mtx, &ts) == ETIMEDOUT);
245570af302Sopenharmony_ci
246570af302Sopenharmony_ci    clock_gettime(CLOCK_MONOTONIC, &tsNow);
247570af302Sopenharmony_ci    int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different
248570af302Sopenharmony_ci    TEST(timeDiff < 20);
249570af302Sopenharmony_ci    return arg;
250570af302Sopenharmony_ci}
251570af302Sopenharmony_ci
252570af302Sopenharmony_ci/**
253570af302Sopenharmony_ci * @tc.name     : pthread_mutex_timedlock_monotonic_np_0010
254570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_timedlock_monotonic_np whith timeout by CLOCK_MONOTONIC
255570af302Sopenharmony_ci * @tc.level    : Level 0
256570af302Sopenharmony_ci */
257570af302Sopenharmony_cistatic void pthread_mutex_timedlock_monotonic_np_0010(void)
258570af302Sopenharmony_ci{
259570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
260570af302Sopenharmony_ci    pthread_t tid;
261570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadTimedlockMonotonicNPOut, (void*)&mtx) == 0);
262570af302Sopenharmony_ci
263570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
264570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
265570af302Sopenharmony_ci    Msleep(SLEEP_100_MS);
266570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
267570af302Sopenharmony_ci
268570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
269570af302Sopenharmony_ci}
270570af302Sopenharmony_ci
271570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
272570af302Sopenharmony_ci
273570af302Sopenharmony_cistatic void *PthreadTimedlockMonotonicNPNoOut(void *arg)
274570af302Sopenharmony_ci{
275570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
276570af302Sopenharmony_ci    struct timespec ts = {0};
277570af302Sopenharmony_ci
278570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
279570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC);
280570af302Sopenharmony_ci    TEST(pthread_mutex_timedlock_monotonic_np(mtx, &ts) == 0);
281570af302Sopenharmony_ci    return arg;
282570af302Sopenharmony_ci}
283570af302Sopenharmony_ci
284570af302Sopenharmony_ci/**
285570af302Sopenharmony_ci * @tc.name     : pthread_mutex_timedlock_monotonic_np_0020
286570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_timedlock_monotonic_np with no timeout by CLOCK_MONOTONIC
287570af302Sopenharmony_ci * @tc.level    : Level 0
288570af302Sopenharmony_ci */
289570af302Sopenharmony_cistatic void pthread_mutex_timedlock_monotonic_np_0020(void)
290570af302Sopenharmony_ci{
291570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
292570af302Sopenharmony_ci    pthread_t tid;
293570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadTimedlockMonotonicNPNoOut, (void*)&mtx) == 0);
294570af302Sopenharmony_ci
295570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
296570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
297570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
298570af302Sopenharmony_ci
299570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
300570af302Sopenharmony_ci}
301570af302Sopenharmony_ci
302570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
303570af302Sopenharmony_ci
304570af302Sopenharmony_ci/**
305570af302Sopenharmony_ci * @tc.name     : pthread_mutex_timedlock_monotonic_np_0030
306570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_timedlock_monotonic_np_0030 with invalid args
307570af302Sopenharmony_ci * @tc.level    : Level 2
308570af302Sopenharmony_ci */
309570af302Sopenharmony_cistatic void pthread_mutex_timedlock_monotonic_np_0030(void)
310570af302Sopenharmony_ci{
311570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t *)NULL;
312570af302Sopenharmony_ci    struct timespec ts = {0};
313570af302Sopenharmony_ci    EXPECT_EQ(pthread_mutex_timedlock_monotonic_np(mtx, &ts), EINVAL);
314570af302Sopenharmony_ci}
315570af302Sopenharmony_ci
316570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
317570af302Sopenharmony_ci
318570af302Sopenharmony_cistatic void *PthreadLockTimeoutNPOut(void *arg)
319570af302Sopenharmony_ci{
320570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
321570af302Sopenharmony_ci    unsigned ms = DELAY_TIME_100_MS;
322570af302Sopenharmony_ci    struct timespec ts = {0};
323570af302Sopenharmony_ci    struct timespec tsNow = {0};
324570af302Sopenharmony_ci
325570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
326570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, ms, CLOCK_MONOTONIC);
327570af302Sopenharmony_ci    TEST(pthread_mutex_lock_timeout_np(mtx, ms) == ETIMEDOUT);
328570af302Sopenharmony_ci
329570af302Sopenharmony_ci    clock_gettime(CLOCK_MONOTONIC, &tsNow);
330570af302Sopenharmony_ci    int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different
331570af302Sopenharmony_ci    TEST(timeDiff < 20);
332570af302Sopenharmony_ci    return arg;
333570af302Sopenharmony_ci}
334570af302Sopenharmony_ci
335570af302Sopenharmony_ci/**
336570af302Sopenharmony_ci * @tc.name     : pthread_mutex_lock_timeout_np_0010
337570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_lock_timeout_np whith timeout by CLOCK_MONOTONIC
338570af302Sopenharmony_ci * @tc.level    : Level 0
339570af302Sopenharmony_ci */
340570af302Sopenharmony_cistatic void pthread_mutex_lock_timeout_np_0010(void)
341570af302Sopenharmony_ci{
342570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
343570af302Sopenharmony_ci    pthread_t tid;
344570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadLockTimeoutNPOut, (void*)&mtx) == 0);
345570af302Sopenharmony_ci
346570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
347570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
348570af302Sopenharmony_ci    Msleep(SLEEP_100_MS);
349570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
350570af302Sopenharmony_ci
351570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
352570af302Sopenharmony_ci}
353570af302Sopenharmony_ci
354570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/
355570af302Sopenharmony_ci
356570af302Sopenharmony_cistatic void *PthreadLockTimeoutNPNoOut(void *arg)
357570af302Sopenharmony_ci{
358570af302Sopenharmony_ci    pthread_mutex_t *mtx = (pthread_mutex_t*)arg;
359570af302Sopenharmony_ci    unsigned ms = DELAY_TIME_100_MS;
360570af302Sopenharmony_ci    struct timespec ts = {0};
361570af302Sopenharmony_ci
362570af302Sopenharmony_ci    Msleep(SLEEP_20_MS);
363570af302Sopenharmony_ci    GetDelayedTimeByClockid(&ts, ms, CLOCK_MONOTONIC);
364570af302Sopenharmony_ci    TEST(pthread_mutex_lock_timeout_np(mtx, ms) == 0);
365570af302Sopenharmony_ci    return arg;
366570af302Sopenharmony_ci}
367570af302Sopenharmony_ci
368570af302Sopenharmony_ci/**
369570af302Sopenharmony_ci * @tc.name     : pthread_mutex_lock_timeout_np_0020
370570af302Sopenharmony_ci * @tc.desc     : test pthread_mutex_lock_timeout_np with no timeout by CLOCK_MONOTONIC
371570af302Sopenharmony_ci * @tc.level    : Level 0
372570af302Sopenharmony_ci */
373570af302Sopenharmony_cistatic void pthread_mutex_lock_timeout_np_0020(void)
374570af302Sopenharmony_ci{
375570af302Sopenharmony_ci    pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
376570af302Sopenharmony_ci    pthread_t tid;
377570af302Sopenharmony_ci    TEST(pthread_create(&tid, NULL, PthreadLockTimeoutNPNoOut, (void*)&mtx) == 0);
378570af302Sopenharmony_ci
379570af302Sopenharmony_ci    TEST(pthread_mutex_lock(&mtx) == 0);
380570af302Sopenharmony_ci    Msleep(SLEEP_50_MS);
381570af302Sopenharmony_ci    TEST(pthread_mutex_unlock(&mtx) == 0);
382570af302Sopenharmony_ci
383570af302Sopenharmony_ci    TEST(pthread_join(tid, NULL) == 0);
384570af302Sopenharmony_ci}
385570af302Sopenharmony_ci
386570af302Sopenharmony_ciint main(void)
387570af302Sopenharmony_ci{
388570af302Sopenharmony_ci    pthread_mutex_clocklock_0010();
389570af302Sopenharmony_ci    pthread_mutex_clocklock_0020();
390570af302Sopenharmony_ci    pthread_mutex_clocklock_0030();
391570af302Sopenharmony_ci    pthread_mutex_clocklock_0040();
392570af302Sopenharmony_ci    pthread_mutex_clocklock_0050();
393570af302Sopenharmony_ci    pthread_mutex_clocklock_0060();
394570af302Sopenharmony_ci    pthread_mutex_timedlock_monotonic_np_0010();
395570af302Sopenharmony_ci    pthread_mutex_timedlock_monotonic_np_0020();
396570af302Sopenharmony_ci    pthread_mutex_timedlock_monotonic_np_0030();
397570af302Sopenharmony_ci    pthread_mutex_lock_timeout_np_0010();
398570af302Sopenharmony_ci    pthread_mutex_lock_timeout_np_0020();
399570af302Sopenharmony_ci
400570af302Sopenharmony_ci    return t_status;
401570af302Sopenharmony_ci}