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 "PthreadTest.h"
24f6603c60Sopenharmony_ci#include "mt_utils.h"
25f6603c60Sopenharmony_ci
26f6603c60Sopenharmony_ciusing namespace testing::ext;
27f6603c60Sopenharmony_ci
28f6603c60Sopenharmony_civoid *ThreadPthreadCreateBasic(void *arg)
29f6603c60Sopenharmony_ci{
30f6603c60Sopenharmony_ci    char *s = (char*)arg;
31f6603c60Sopenharmony_ci    EXPECT_STREQ(s, "1234567890 !@#$%^&*()_= ZXCVBNM [];'./>?:\" +-*/qwertyuiopasdfghjklzxcvbnm");
32f6603c60Sopenharmony_ci    return arg;
33f6603c60Sopenharmony_ci}
34f6603c60Sopenharmony_ci
35f6603c60Sopenharmony_ci/**
36f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CREATE_0100
37f6603c60Sopenharmony_ci * @tc.name     pthread_create create a thread
38f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
39f6603c60Sopenharmony_ci */
40f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadCreateBasic, Function | MediumTest | Level2)
41f6603c60Sopenharmony_ci{
42f6603c60Sopenharmony_ci    pthread_t tid;
43f6603c60Sopenharmony_ci    char str[] = "1234567890 !@#$%^&*()_= ZXCVBNM [];'./>?:\" +-*/qwertyuiopasdfghjklzxcvbnm";
44f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCreateBasic, (void*)str), 0) << "> return errno";
45f6603c60Sopenharmony_ci
46f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, nullptr), 0) << "> return errno";
47f6603c60Sopenharmony_ci}
48f6603c60Sopenharmony_ci
49f6603c60Sopenharmony_civoid *ThreadPthreadJoinWait(void *arg)
50f6603c60Sopenharmony_ci{
51f6603c60Sopenharmony_ci    Msleep(20);
52f6603c60Sopenharmony_ci    CheckStep(2);
53f6603c60Sopenharmony_ci    return arg;
54f6603c60Sopenharmony_ci}
55f6603c60Sopenharmony_ci
56f6603c60Sopenharmony_ci/**
57f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_JOIN_0100
58f6603c60Sopenharmony_ci * @tc.name     Test the waiting function of pthread_join
59f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
60f6603c60Sopenharmony_ci */
61f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadJoinWait, Function | MediumTest | Level2)
62f6603c60Sopenharmony_ci{
63f6603c60Sopenharmony_ci    pthread_t tid;
64f6603c60Sopenharmony_ci    CheckStep(1);
65f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadJoinWait, nullptr), 0) << "> return errno";
66f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, nullptr), 0) << "> return errno";
67f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123) << "pthread_join no wait";
68f6603c60Sopenharmony_ci}
69f6603c60Sopenharmony_ci
70f6603c60Sopenharmony_ci/**
71f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_JOIN_0200
72f6603c60Sopenharmony_ci * @tc.name     Test the function of pthread_join to get the return value
73f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
74f6603c60Sopenharmony_ci */
75f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testJoinReturn, Function | MediumTest | Level3)
76f6603c60Sopenharmony_ci{
77f6603c60Sopenharmony_ci    pthread_t tid;
78f6603c60Sopenharmony_ci    int num = 4;
79f6603c60Sopenharmony_ci    void *joinRe = nullptr;
80f6603c60Sopenharmony_ci
81f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPublic, (void*)&num), 0) << "> return errno";
82f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, &joinRe), 0) << "> return errno";
83f6603c60Sopenharmony_ci
84f6603c60Sopenharmony_ci    int *p = (int*)joinRe;
85f6603c60Sopenharmony_ci    EXPECT_TRUE(&num == p);
86f6603c60Sopenharmony_ci}
87f6603c60Sopenharmony_ci
88f6603c60Sopenharmony_ci/**
89f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_JOIN_0300
90f6603c60Sopenharmony_ci * @tc.name     Test the function about pthread_join, but child thread Exited
91f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
92f6603c60Sopenharmony_ci */
93f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testJoinExited, Function | MediumTest | Level3)
94f6603c60Sopenharmony_ci{
95f6603c60Sopenharmony_ci    pthread_t tid;
96f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPublic, nullptr), 0) << "> return errno";
97f6603c60Sopenharmony_ci    Msleep(50);
98f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, nullptr), 0) << "> return errno";
99f6603c60Sopenharmony_ci}
100f6603c60Sopenharmony_ci
101f6603c60Sopenharmony_civoid *ThreadPthreadExitThread(void *arg)
102f6603c60Sopenharmony_ci{
103f6603c60Sopenharmony_ci    pthread_exit(arg);
104f6603c60Sopenharmony_ci    return nullptr;
105f6603c60Sopenharmony_ci}
106f6603c60Sopenharmony_ci
107f6603c60Sopenharmony_ci/**
108f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_EXIT_0100
109f6603c60Sopenharmony_ci * @tc.name     Test the return function of pthread_exit in the child thread
110f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
111f6603c60Sopenharmony_ci */
112f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadExitThread, Function | MediumTest | Level3)
113f6603c60Sopenharmony_ci{
114f6603c60Sopenharmony_ci    pthread_t tid;
115f6603c60Sopenharmony_ci    int num = 4;
116f6603c60Sopenharmony_ci    void *joinRe = nullptr;
117f6603c60Sopenharmony_ci
118f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadExitThread, (void*)&num), 0) << "> return errno";
119f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, &joinRe), 0) << "> return errno";
120f6603c60Sopenharmony_ci    int *p = (int*)joinRe;
121f6603c60Sopenharmony_ci    EXPECT_TRUE(&num == p);
122f6603c60Sopenharmony_ci}
123f6603c60Sopenharmony_ci
124f6603c60Sopenharmony_civoid FunPthreadExit(void *arg)
125f6603c60Sopenharmony_ci{
126f6603c60Sopenharmony_ci    pthread_exit(arg);
127f6603c60Sopenharmony_ci}
128f6603c60Sopenharmony_ci
129f6603c60Sopenharmony_civoid *ThreadPthreadExitFunction(void *arg)
130f6603c60Sopenharmony_ci{
131f6603c60Sopenharmony_ci    FunPthreadExit(arg);
132f6603c60Sopenharmony_ci    return nullptr;
133f6603c60Sopenharmony_ci}
134f6603c60Sopenharmony_ci
135f6603c60Sopenharmony_ci/**
136f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_EXIT_0200
137f6603c60Sopenharmony_ci * @tc.name     Test the return function of pthread_exit in the child thread function
138f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
139f6603c60Sopenharmony_ci */
140f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadExitFunction, Function | MediumTest | Level3)
141f6603c60Sopenharmony_ci{
142f6603c60Sopenharmony_ci    pthread_t tid;
143f6603c60Sopenharmony_ci    int num = 4;
144f6603c60Sopenharmony_ci    void *joinRe = nullptr;
145f6603c60Sopenharmony_ci
146f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadExitFunction, (void*)&num), 0) << "> return errno";
147f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, &joinRe), 0) << "> return errno";
148f6603c60Sopenharmony_ci    int *p = (int*)joinRe;
149f6603c60Sopenharmony_ci    EXPECT_TRUE(&num == p);
150f6603c60Sopenharmony_ci}
151f6603c60Sopenharmony_ci
152f6603c60Sopenharmony_ci/**
153f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_DETACH_0100
154f6603c60Sopenharmony_ci * @tc.name     Use pthread_detach to detach child threads
155f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
156f6603c60Sopenharmony_ci */
157f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadDetach, Function | MediumTest | Level3)
158f6603c60Sopenharmony_ci{
159f6603c60Sopenharmony_ci    pthread_t tid;
160f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPublic, nullptr), 0) << "> return errno";
161f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_detach(tid), 0) << "> return errno";
162f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, nullptr), EINVAL) << "> return errno";
163f6603c60Sopenharmony_ci}
164f6603c60Sopenharmony_ci
165f6603c60Sopenharmony_civoid *ThreadPthreadEqual(void *arg)
166f6603c60Sopenharmony_ci{
167f6603c60Sopenharmony_ci    pthread_t *tid = (pthread_t*)arg;
168f6603c60Sopenharmony_ci    EXPECT_NE(pthread_equal(*tid, pthread_self()), 0) << "pthread_equal should be equal";
169f6603c60Sopenharmony_ci    Msleep(10);
170f6603c60Sopenharmony_ci    return arg;
171f6603c60Sopenharmony_ci}
172f6603c60Sopenharmony_ci
173f6603c60Sopenharmony_ci/**
174f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_EQUAL_0100
175f6603c60Sopenharmony_ci * @tc.name     Use pthread_equal checks process equality
176f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
177f6603c60Sopenharmony_ci */
178f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadEqual, Function | MediumTest | Level3)
179f6603c60Sopenharmony_ci{
180f6603c60Sopenharmony_ci    pthread_t tid;
181f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadEqual, (void*)&tid), 0) << "> return errno";
182f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_equal(tid, pthread_self()), 0) << "pthread_equal should be no equal";
183f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, nullptr), 0) << "> return errno";
184f6603c60Sopenharmony_ci}
185f6603c60Sopenharmony_ci
186f6603c60Sopenharmony_ci/**
187f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_KEY_CREATE_0100
188f6603c60Sopenharmony_ci * @tc.name     Check the parameter PTHREAD_KEYS_MAX of pthread_key_create
189f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
190f6603c60Sopenharmony_ci */
191f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadKeysMax, Function | MediumTest | Level3)
192f6603c60Sopenharmony_ci{
193f6603c60Sopenharmony_ci    int creatCnt = -1;
194f6603c60Sopenharmony_ci    pid_t pid = fork();
195f6603c60Sopenharmony_ci    ASSERT_TRUE(pid >= 0) << "> parent: fork errno = " << errno;
196f6603c60Sopenharmony_ci    if (pid == 0) {
197f6603c60Sopenharmony_ci        int re;
198f6603c60Sopenharmony_ci        int exitCode = 0;
199f6603c60Sopenharmony_ci        pthread_key_t keys[PTHREAD_KEYS_MAX];
200f6603c60Sopenharmony_ci        for (int i = 0; i < PTHREAD_KEYS_MAX; i++) {
201f6603c60Sopenharmony_ci            re = pthread_key_create(&keys[i], nullptr);
202f6603c60Sopenharmony_ci            if (re == EAGAIN) {
203f6603c60Sopenharmony_ci                LOG("pthread_key_create %d errno = %d", i, re);
204f6603c60Sopenharmony_ci                creatCnt = i;
205f6603c60Sopenharmony_ci                break;
206f6603c60Sopenharmony_ci            } else if (re != 0) {
207f6603c60Sopenharmony_ci                LOG("pthread_key_create %d errno = %d", i, re);
208f6603c60Sopenharmony_ci                exitCode = 1;
209f6603c60Sopenharmony_ci                creatCnt = i;
210f6603c60Sopenharmony_ci                break;
211f6603c60Sopenharmony_ci            }
212f6603c60Sopenharmony_ci        }
213f6603c60Sopenharmony_ci
214f6603c60Sopenharmony_ci        if (creatCnt == -1) {
215f6603c60Sopenharmony_ci            creatCnt = PTHREAD_KEYS_MAX;
216f6603c60Sopenharmony_ci        }
217f6603c60Sopenharmony_ci
218f6603c60Sopenharmony_ci        for (int i = 0; i < creatCnt; i++) {
219f6603c60Sopenharmony_ci            re = pthread_key_delete(keys[i]);
220f6603c60Sopenharmony_ci            if (re != 0) {
221f6603c60Sopenharmony_ci                LOG("pthread_key_delete %d errno = %d", i, re);
222f6603c60Sopenharmony_ci                exitCode = 1;
223f6603c60Sopenharmony_ci                break;
224f6603c60Sopenharmony_ci            }
225f6603c60Sopenharmony_ci        }
226f6603c60Sopenharmony_ci        exit(exitCode);
227f6603c60Sopenharmony_ci    }
228f6603c60Sopenharmony_ci    WaitProcExitedOK(pid);
229f6603c60Sopenharmony_ci}
230f6603c60Sopenharmony_ci
231f6603c60Sopenharmony_ci/**
232f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_GETSPECIFIC_0100
233f6603c60Sopenharmony_ci * @tc.name     Use pthread_getspecific to get the value corresponding to the parameter key
234f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
235f6603c60Sopenharmony_ci */
236f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadGetspecific, Function | MediumTest | Level3)
237f6603c60Sopenharmony_ci{
238f6603c60Sopenharmony_ci    pthread_key_t keys;
239f6603c60Sopenharmony_ci    int testInt = 100;
240f6603c60Sopenharmony_ci    void *testVoidP = (void*)&testInt;
241f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_key_create(&keys, nullptr), 0) << "> return errno";
242f6603c60Sopenharmony_ci
243f6603c60Sopenharmony_ci    void *reVoidP = pthread_getspecific(keys);
244f6603c60Sopenharmony_ci    EXPECT_EQ(reVoidP, nullptr);
245f6603c60Sopenharmony_ci
246f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setspecific(keys, testVoidP), 0) << "> return errno";
247f6603c60Sopenharmony_ci
248f6603c60Sopenharmony_ci    reVoidP = pthread_getspecific(keys);
249f6603c60Sopenharmony_ci    EXPECT_EQ(reVoidP, testVoidP);
250f6603c60Sopenharmony_ci
251f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_key_delete(keys), 0) << "> return errno";
252f6603c60Sopenharmony_ci
253f6603c60Sopenharmony_ci    reVoidP = pthread_getspecific(keys);
254f6603c60Sopenharmony_ci    EXPECT_EQ(reVoidP, nullptr);
255f6603c60Sopenharmony_ci}
256f6603c60Sopenharmony_ci
257f6603c60Sopenharmony_cipthread_key_t g_keys;
258f6603c60Sopenharmony_cipthread_once_t g_once = PTHREAD_ONCE_INIT;
259f6603c60Sopenharmony_ciint g_intPthreadSpecificAll = 0;
260f6603c60Sopenharmony_ci
261f6603c60Sopenharmony_ci// Destructor function, excute after ThreadPthreadSpecificAll
262f6603c60Sopenharmony_civoid DestructorPthreadSpecificAll(void *param)
263f6603c60Sopenharmony_ci{
264f6603c60Sopenharmony_ci    int *p = (int*)param;
265f6603c60Sopenharmony_ci    *p += 1;
266f6603c60Sopenharmony_ci}
267f6603c60Sopenharmony_ci
268f6603c60Sopenharmony_civoid OnceFunc()
269f6603c60Sopenharmony_ci{
270f6603c60Sopenharmony_ci    // DestructorPthreadSpecificAll() execute twice
271f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_key_create(&g_keys, DestructorPthreadSpecificAll), 0) << "> return errno";
272f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_getspecific(g_keys), nullptr);
273f6603c60Sopenharmony_ci    // execute once
274f6603c60Sopenharmony_ci    g_intPthreadSpecificAll++;
275f6603c60Sopenharmony_ci    EXPECT_EQ(g_intPthreadSpecificAll, 1);
276f6603c60Sopenharmony_ci}
277f6603c60Sopenharmony_ci
278f6603c60Sopenharmony_civoid *ThreadPthreadSpecificAll(void *arg)
279f6603c60Sopenharmony_ci{
280f6603c60Sopenharmony_ci    // OnceFunc() execute once
281f6603c60Sopenharmony_ci    int reInt = pthread_once(&g_once, OnceFunc);
282f6603c60Sopenharmony_ci    EXPECT_TRUE((reInt == 0) || (reInt == 2));
283f6603c60Sopenharmony_ci
284f6603c60Sopenharmony_ci    if (pthread_getspecific(g_keys) == nullptr) {
285f6603c60Sopenharmony_ci        // execute twice
286f6603c60Sopenharmony_ci        g_intPthreadSpecificAll++;
287f6603c60Sopenharmony_ci        EXPECT_EQ(pthread_setspecific(g_keys, (void*)&g_intPthreadSpecificAll), 0) << "> return errno";
288f6603c60Sopenharmony_ci    }
289f6603c60Sopenharmony_ci    // only 2 or 4
290f6603c60Sopenharmony_ci    EXPECT_GE(g_intPthreadSpecificAll, 2);
291f6603c60Sopenharmony_ci    EXPECT_NE(g_intPthreadSpecificAll, 3);
292f6603c60Sopenharmony_ci    EXPECT_LE(g_intPthreadSpecificAll, 4);
293f6603c60Sopenharmony_ci    return arg;
294f6603c60Sopenharmony_ci}
295f6603c60Sopenharmony_ci
296f6603c60Sopenharmony_civoid DestructorPthreadSpecificAllDelete(void *param)
297f6603c60Sopenharmony_ci{
298f6603c60Sopenharmony_ci    int *p = (int*)param;
299f6603c60Sopenharmony_ci    *p += 1;
300f6603c60Sopenharmony_ci}
301f6603c60Sopenharmony_ci
302f6603c60Sopenharmony_civoid *ThreadPthreadSpecificAllDelete(void *arg)
303f6603c60Sopenharmony_ci{
304f6603c60Sopenharmony_ci    pthread_key_t keys;
305f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_key_create(&keys, DestructorPthreadSpecificAllDelete), 0) << "> return errno";
306f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_getspecific(keys), nullptr);
307f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setspecific(keys, arg), 0) << "> return errno";
308f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_getspecific(keys), arg);
309f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_key_delete(keys), 0) << "> return errno";
310f6603c60Sopenharmony_ci    return arg;
311f6603c60Sopenharmony_ci}
312f6603c60Sopenharmony_ci
313f6603c60Sopenharmony_ci/**
314f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_SPECIFIC_ALL_0200
315f6603c60Sopenharmony_ci * @tc.name     Delete the key before the child thread exits
316f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
317f6603c60Sopenharmony_ci */
318f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadSpecificAllDelete, Function | MediumTest | Level3)
319f6603c60Sopenharmony_ci{
320f6603c60Sopenharmony_ci    int data = 1;
321f6603c60Sopenharmony_ci    pthread_t tid;
322f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadSpecificAllDelete, (void*)&data), 0) << "> return errno";
323f6603c60Sopenharmony_ci    Msleep(100);
324f6603c60Sopenharmony_ci    pthread_join(tid, nullptr);
325f6603c60Sopenharmony_ci    EXPECT_EQ(data, 1);
326f6603c60Sopenharmony_ci}
327f6603c60Sopenharmony_ci
328f6603c60Sopenharmony_civoid TestPushHandler1(void *arg)
329f6603c60Sopenharmony_ci{
330f6603c60Sopenharmony_ci    CheckStep(3);
331f6603c60Sopenharmony_ci}
332f6603c60Sopenharmony_ci
333f6603c60Sopenharmony_civoid TestPushHandler2(void *arg)
334f6603c60Sopenharmony_ci{
335f6603c60Sopenharmony_ci    CheckStep(2);
336f6603c60Sopenharmony_ci}
337f6603c60Sopenharmony_ci
338f6603c60Sopenharmony_civoid *ThreadTestPush(void *arg)
339f6603c60Sopenharmony_ci{
340f6603c60Sopenharmony_ci    pthread_cleanup_push(TestPushHandler1, nullptr);
341f6603c60Sopenharmony_ci    pthread_cleanup_push(TestPushHandler2, nullptr);
342f6603c60Sopenharmony_ci    pthread_cleanup_pop(1);
343f6603c60Sopenharmony_ci    pthread_cleanup_pop(1);
344f6603c60Sopenharmony_ci    return arg;
345f6603c60Sopenharmony_ci}
346f6603c60Sopenharmony_ci
347f6603c60Sopenharmony_ci/**
348f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CLEANUP_ALL_0100
349f6603c60Sopenharmony_ci * @tc.name     pthread_cleanup_push and pthread_cleanup_pop basic test
350f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
351f6603c60Sopenharmony_ci */
352f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadCleanupPushPopBasic, Function | MediumTest | Level3)
353f6603c60Sopenharmony_ci{
354f6603c60Sopenharmony_ci    pthread_t tid;
355f6603c60Sopenharmony_ci    CheckStep(1);
356f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadTestPush, nullptr), 0) << "> return errno";
357f6603c60Sopenharmony_ci    Msleep(100);
358f6603c60Sopenharmony_ci    pthread_join(tid, nullptr);
359f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(4), (uint64_t)0x1234);
360f6603c60Sopenharmony_ci}
361f6603c60Sopenharmony_ci
362f6603c60Sopenharmony_civoid TestPushParamHandler(void *arg)
363f6603c60Sopenharmony_ci{
364f6603c60Sopenharmony_ci    int *testInt = (int*)arg;
365f6603c60Sopenharmony_ci    EXPECT_EQ(*testInt, 1);
366f6603c60Sopenharmony_ci    CheckStep(2);
367f6603c60Sopenharmony_ci}
368f6603c60Sopenharmony_ci
369f6603c60Sopenharmony_civoid *ThreadTestPushParam(void *arg)
370f6603c60Sopenharmony_ci{
371f6603c60Sopenharmony_ci    int testInt = 1;
372f6603c60Sopenharmony_ci    pthread_cleanup_push(TestPushParamHandler, (void*)&testInt);
373f6603c60Sopenharmony_ci    pthread_cleanup_pop(1);
374f6603c60Sopenharmony_ci    return arg;
375f6603c60Sopenharmony_ci}
376f6603c60Sopenharmony_ci
377f6603c60Sopenharmony_ci/**
378f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CLEANUP_ALL_0200
379f6603c60Sopenharmony_ci * @tc.name     pthread_cleanup_push and pthread_cleanup_pop test with param
380f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
381f6603c60Sopenharmony_ci */
382f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadCleanupPushPopParam, Function | MediumTest | Level3)
383f6603c60Sopenharmony_ci{
384f6603c60Sopenharmony_ci    pthread_t tid;
385f6603c60Sopenharmony_ci    CheckStep(1);
386f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadTestPushParam, nullptr), 0) << "> return errno";
387f6603c60Sopenharmony_ci    Msleep(100);
388f6603c60Sopenharmony_ci    pthread_join(tid, nullptr);
389f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123);
390f6603c60Sopenharmony_ci}
391f6603c60Sopenharmony_ci
392f6603c60Sopenharmony_civoid TestPopHandler1(void *arg)
393f6603c60Sopenharmony_ci{
394f6603c60Sopenharmony_ci    CheckStep(2);
395f6603c60Sopenharmony_ci}
396f6603c60Sopenharmony_ci
397f6603c60Sopenharmony_civoid TestPopHandler2(void *arg)
398f6603c60Sopenharmony_ci{
399f6603c60Sopenharmony_ci    // unreachable
400f6603c60Sopenharmony_ci    LOG("step = %lx", CheckStep(10));
401f6603c60Sopenharmony_ci}
402f6603c60Sopenharmony_ci
403f6603c60Sopenharmony_cistatic void *ThreadTestop(void *arg)
404f6603c60Sopenharmony_ci{
405f6603c60Sopenharmony_ci    pthread_cleanup_push(TestPopHandler1, nullptr);
406f6603c60Sopenharmony_ci    pthread_cleanup_push(TestPopHandler2, nullptr);
407f6603c60Sopenharmony_ci    pthread_cleanup_pop(0);
408f6603c60Sopenharmony_ci    pthread_cleanup_pop(1);
409f6603c60Sopenharmony_ci    return arg;
410f6603c60Sopenharmony_ci}
411f6603c60Sopenharmony_ci
412f6603c60Sopenharmony_ci/**
413f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CLEANUP_ALL_0300
414f6603c60Sopenharmony_ci * @tc.name     pthread_cleanup_pop use different parameters
415f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
416f6603c60Sopenharmony_ci */
417f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPop, Function | MediumTest | Level3)
418f6603c60Sopenharmony_ci{
419f6603c60Sopenharmony_ci    pthread_t tid;
420f6603c60Sopenharmony_ci    CheckStep(1);
421f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadTestop, nullptr), 0) << "> return errno";
422f6603c60Sopenharmony_ci    Msleep(100);
423f6603c60Sopenharmony_ci    pthread_join(tid, nullptr);
424f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123);
425f6603c60Sopenharmony_ci}
426f6603c60Sopenharmony_ci
427f6603c60Sopenharmony_ci/**
428f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_BARRIER_INIT_0100
429f6603c60Sopenharmony_ci * @tc.name     basic test of pthread_barrier_init
430f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
431f6603c60Sopenharmony_ci */
432f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testBarrierInit, Function | MediumTest | Level2)
433f6603c60Sopenharmony_ci{
434f6603c60Sopenharmony_ci    pthread_barrier_t barrier;
435f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_barrier_init(&barrier, nullptr, 0), EINVAL) << "> return errno";
436f6603c60Sopenharmony_ci}
437f6603c60Sopenharmony_ci
438f6603c60Sopenharmony_ci/**
439f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_BARRIERATTR_INIT_0100
440f6603c60Sopenharmony_ci * @tc.name     basic test with pthread_barrierattr_init
441f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
442f6603c60Sopenharmony_ci */
443f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testBarrierattrInit, Function | MediumTest | Level3)
444f6603c60Sopenharmony_ci{
445f6603c60Sopenharmony_ci    pthread_barrierattr_t barrierAttr;
446f6603c60Sopenharmony_ci    pthread_barrier_t barrier;
447f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_barrierattr_init(&barrierAttr), 0);
448f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_barrierattr_destroy(&barrierAttr), 0);
449f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_barrier_init(&barrier, &barrierAttr, 1), 0) << "> return errno";
450f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_barrier_destroy(&barrier), 0) << "> return errno";
451f6603c60Sopenharmony_ci}
452f6603c60Sopenharmony_ci
453f6603c60Sopenharmony_cistatic pthread_barrier_t g_barrier;
454f6603c60Sopenharmony_civoid *ThreadTestBarrierWait1(void *arg)
455f6603c60Sopenharmony_ci{
456f6603c60Sopenharmony_ci    int *intP = (int*)arg;
457f6603c60Sopenharmony_ci    int reInt = pthread_barrier_wait(&g_barrier);
458f6603c60Sopenharmony_ci    if (reInt == PTHREAD_BARRIER_SERIAL_THREAD) {
459f6603c60Sopenharmony_ci        CheckStep(2);
460f6603c60Sopenharmony_ci    } else if (reInt == 0) {
461f6603c60Sopenharmony_ci        Msleep(30);
462f6603c60Sopenharmony_ci        *intP += 1;
463f6603c60Sopenharmony_ci    } else {
464f6603c60Sopenharmony_ci        ADD_FAILURE();
465f6603c60Sopenharmony_ci    }
466f6603c60Sopenharmony_ci    return arg;
467f6603c60Sopenharmony_ci}
468f6603c60Sopenharmony_ci
469f6603c60Sopenharmony_civoid *ThreadTestBarrierWait2(void *arg)
470f6603c60Sopenharmony_ci{
471f6603c60Sopenharmony_ci    int *intP = (int*)arg;
472f6603c60Sopenharmony_ci    int reInt = pthread_barrier_wait(&g_barrier);
473f6603c60Sopenharmony_ci    if (reInt == PTHREAD_BARRIER_SERIAL_THREAD) {
474f6603c60Sopenharmony_ci        CheckStep(2);
475f6603c60Sopenharmony_ci    } else if (reInt == 0) {
476f6603c60Sopenharmony_ci        Msleep(20);
477f6603c60Sopenharmony_ci        *intP += 1;
478f6603c60Sopenharmony_ci    } else {
479f6603c60Sopenharmony_ci        ADD_FAILURE();
480f6603c60Sopenharmony_ci    }
481f6603c60Sopenharmony_ci    return arg;
482f6603c60Sopenharmony_ci}
483f6603c60Sopenharmony_ci
484f6603c60Sopenharmony_ci/**
485f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_BARRIER_ALL_0100
486f6603c60Sopenharmony_ci * @tc.name     test pthread_barrier_wait return value
487f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
488f6603c60Sopenharmony_ci */
489f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testBarrierWait, Function | MediumTest | Level3)
490f6603c60Sopenharmony_ci{
491f6603c60Sopenharmony_ci    pthread_t tid;
492f6603c60Sopenharmony_ci    pthread_t tid1;
493f6603c60Sopenharmony_ci    CheckStep(1);
494f6603c60Sopenharmony_ci    int intParam = 0;
495f6603c60Sopenharmony_ci
496f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_barrier_init(&g_barrier, nullptr, 3), 0) << "> return errno";
497f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadTestBarrierWait1, (void*)&intParam), 0) << "> return errno";
498f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid1, nullptr, ThreadTestBarrierWait2, (void*)&intParam), 0) << "> return errno";
499f6603c60Sopenharmony_ci    int reInt = pthread_barrier_wait(&g_barrier);
500f6603c60Sopenharmony_ci    if (reInt == PTHREAD_BARRIER_SERIAL_THREAD) {
501f6603c60Sopenharmony_ci        CheckStep(2);
502f6603c60Sopenharmony_ci    } else if (reInt == 0) {
503f6603c60Sopenharmony_ci        Msleep(10);
504f6603c60Sopenharmony_ci        intParam++;
505f6603c60Sopenharmony_ci    } else {
506f6603c60Sopenharmony_ci        ADD_FAILURE();
507f6603c60Sopenharmony_ci    }
508f6603c60Sopenharmony_ci    Msleep(50);
509f6603c60Sopenharmony_ci    pthread_join(tid, nullptr);
510f6603c60Sopenharmony_ci    pthread_join(tid1, nullptr);
511f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_barrier_destroy(&g_barrier), 0) << "> return errno";
512f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123);
513f6603c60Sopenharmony_ci    EXPECT_EQ(intParam, 2);
514f6603c60Sopenharmony_ci}
515f6603c60Sopenharmony_ci
516f6603c60Sopenharmony_civoid *ThreadTestBarrierAlwaysWait(void *arg)
517f6603c60Sopenharmony_ci{
518f6603c60Sopenharmony_ci    pthread_barrier_t *barrier = (pthread_barrier_t*)arg;
519f6603c60Sopenharmony_ci    int reInt = pthread_barrier_wait(barrier);
520f6603c60Sopenharmony_ci    if ((reInt != PTHREAD_BARRIER_SERIAL_THREAD) && (reInt != 0)) {
521f6603c60Sopenharmony_ci        ADD_FAILURE();
522f6603c60Sopenharmony_ci    }
523f6603c60Sopenharmony_ci    CheckStep(3);
524f6603c60Sopenharmony_ci    return arg;
525f6603c60Sopenharmony_ci}
526f6603c60Sopenharmony_ci
527f6603c60Sopenharmony_ci/**
528f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_BARRIER_ALL_0200
529f6603c60Sopenharmony_ci * @tc.name     Comprehensive test with barrier properties, always waiting
530f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
531f6603c60Sopenharmony_ci */
532f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testBarrierAlwaysWait, Function | MediumTest | Level3)
533f6603c60Sopenharmony_ci{
534f6603c60Sopenharmony_ci    pthread_t tid;
535f6603c60Sopenharmony_ci    pthread_t tid1;
536f6603c60Sopenharmony_ci    pthread_barrier_t barrier;
537f6603c60Sopenharmony_ci    CheckStep(1);
538f6603c60Sopenharmony_ci
539f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_barrier_init(&barrier, nullptr, 3), 0) << "> return errno";
540f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadTestBarrierAlwaysWait, (pthread_barrier_t*)&barrier), 0)
541f6603c60Sopenharmony_ci        << "> return errno";
542f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid1, nullptr, ThreadTestBarrierAlwaysWait, (pthread_barrier_t*)&barrier), 0)
543f6603c60Sopenharmony_ci        << "> return errno";
544f6603c60Sopenharmony_ci
545f6603c60Sopenharmony_ci    Msleep(100);
546f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(2), (uint64_t)0x12);  // childs threads always waiting
547f6603c60Sopenharmony_ci    int reInt = pthread_barrier_wait(&barrier);
548f6603c60Sopenharmony_ci    if ((reInt != PTHREAD_BARRIER_SERIAL_THREAD) && (reInt != 0)) {
549f6603c60Sopenharmony_ci        ADD_FAILURE();
550f6603c60Sopenharmony_ci    }
551f6603c60Sopenharmony_ci    pthread_join(tid, nullptr);
552f6603c60Sopenharmony_ci    pthread_join(tid1, nullptr);
553f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_barrier_destroy(&barrier), 0) << "> return errno";
554f6603c60Sopenharmony_ci}
555f6603c60Sopenharmony_ci
556f6603c60Sopenharmony_ci/**
557f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_SETCANCELSTATE_0100
558f6603c60Sopenharmony_ci * @tc.name     basic test about pthread_setcancelstate
559f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
560f6603c60Sopenharmony_ci */
561f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadSetcancelstate, Function | MediumTest | Level3)
562f6603c60Sopenharmony_ci{
563f6603c60Sopenharmony_ci    int oldState = 0;
564f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState), 0) << "> return errno";
565f6603c60Sopenharmony_ci    EXPECT_EQ(oldState, PTHREAD_CANCEL_ENABLE);
566f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldState), 0) << "> return errno";
567f6603c60Sopenharmony_ci    EXPECT_EQ(oldState, PTHREAD_CANCEL_DISABLE);
568f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, nullptr), 0) << "> return errno";
569f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr), 0) << "> return errno";
570f6603c60Sopenharmony_ci}
571f6603c60Sopenharmony_ci
572f6603c60Sopenharmony_ci/**
573f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_SETCANCELTYPE_0100
574f6603c60Sopenharmony_ci * @tc.name     basic test about pthread_setcanceltype
575f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
576f6603c60Sopenharmony_ci */
577f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadSetcanceltype, Function | MediumTest | Level3)
578f6603c60Sopenharmony_ci{
579f6603c60Sopenharmony_ci    int oldState = 0;
580f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldState), 0) << "> return errno";
581f6603c60Sopenharmony_ci    EXPECT_EQ(oldState, PTHREAD_CANCEL_DEFERRED);
582f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldState), 0) << "> return errno";
583f6603c60Sopenharmony_ci    EXPECT_EQ(oldState, PTHREAD_CANCEL_ASYNCHRONOUS);
584f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr), 0) << "> return errno";
585f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, nullptr), 0) << "> return errno";
586f6603c60Sopenharmony_ci}
587f6603c60Sopenharmony_ci
588f6603c60Sopenharmony_civoid *ThreadPthreadNoCancelPoint(void *arg)
589f6603c60Sopenharmony_ci{
590f6603c60Sopenharmony_ci    CheckStep(2);
591f6603c60Sopenharmony_ci    KeepRun(50);
592f6603c60Sopenharmony_ci    CheckStep(3);
593f6603c60Sopenharmony_ci    return arg;
594f6603c60Sopenharmony_ci}
595f6603c60Sopenharmony_ci
596f6603c60Sopenharmony_ci/**
597f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CANCEL_0100
598f6603c60Sopenharmony_ci * @tc.name     test pthread_cancel with no cancel point
599f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
600f6603c60Sopenharmony_ci */
601f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadNoCancelPoint, Function | MediumTest | Level3)
602f6603c60Sopenharmony_ci{
603f6603c60Sopenharmony_ci    pthread_t tid;
604f6603c60Sopenharmony_ci    CheckStep(1);
605f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadNoCancelPoint, nullptr), 0) << "> return errno";
606f6603c60Sopenharmony_ci    Msleep(10);
607f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cancel(tid), 0);
608f6603c60Sopenharmony_ci    Msleep(100);
609f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, NULL), 0);
610f6603c60Sopenharmony_ci}
611f6603c60Sopenharmony_ci
612f6603c60Sopenharmony_civoid *ThreadPthreadCancelPoint(void *arg)
613f6603c60Sopenharmony_ci{
614f6603c60Sopenharmony_ci    CheckStep(2);
615f6603c60Sopenharmony_ci    KeepRun(50);
616f6603c60Sopenharmony_ci    pthread_testcancel();
617f6603c60Sopenharmony_ci
618f6603c60Sopenharmony_ci    // unreachable
619f6603c60Sopenharmony_ci    CheckStep(3);
620f6603c60Sopenharmony_ci    return arg;
621f6603c60Sopenharmony_ci}
622f6603c60Sopenharmony_ci
623f6603c60Sopenharmony_ci/**
624f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CANCEL_0200
625f6603c60Sopenharmony_ci * @tc.name     test pthread_cancel with cancel point
626f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
627f6603c60Sopenharmony_ci */
628f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadCancelPoint, Function | MediumTest | Level3)
629f6603c60Sopenharmony_ci{
630f6603c60Sopenharmony_ci    pthread_t tid;
631f6603c60Sopenharmony_ci    CheckStep(1);
632f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCancelPoint, nullptr), 0) << "> return errno";
633f6603c60Sopenharmony_ci    Msleep(20);
634f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cancel(tid), 0);
635f6603c60Sopenharmony_ci    Msleep(100);
636f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, NULL), 0);
637f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123);
638f6603c60Sopenharmony_ci}
639f6603c60Sopenharmony_ci
640f6603c60Sopenharmony_civoid *ThreadPthreadCancelDisable(void *arg)
641f6603c60Sopenharmony_ci{
642f6603c60Sopenharmony_ci    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, nullptr);
643f6603c60Sopenharmony_ci    CheckStep(2);
644f6603c60Sopenharmony_ci    Msleep(50);
645f6603c60Sopenharmony_ci    pthread_testcancel();
646f6603c60Sopenharmony_ci    CheckStep(3);
647f6603c60Sopenharmony_ci    return arg;
648f6603c60Sopenharmony_ci}
649f6603c60Sopenharmony_ci
650f6603c60Sopenharmony_ci/**
651f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CANCEL_ALL_0100
652f6603c60Sopenharmony_ci * @tc.name     test pthread_cancel with PTHREAD_CANCEL_DISABLE
653f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
654f6603c60Sopenharmony_ci */
655f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadCancelDisable, Function | MediumTest | Level3)
656f6603c60Sopenharmony_ci{
657f6603c60Sopenharmony_ci    pthread_t tid;
658f6603c60Sopenharmony_ci    CheckStep(1);
659f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCancelDisable, nullptr), 0) << "> return errno";
660f6603c60Sopenharmony_ci    Msleep(10);
661f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cancel(tid), 0);
662f6603c60Sopenharmony_ci    Msleep(100);
663f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, NULL), 0);
664f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(4), (uint64_t)0x1234);
665f6603c60Sopenharmony_ci}
666f6603c60Sopenharmony_ci
667f6603c60Sopenharmony_civoid *ThreadPthreadCancelAsynchronous(void *arg)
668f6603c60Sopenharmony_ci{
669f6603c60Sopenharmony_ci    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr);
670f6603c60Sopenharmony_ci    CheckStep(2);
671f6603c60Sopenharmony_ci    KeepRun(50);
672f6603c60Sopenharmony_ci
673f6603c60Sopenharmony_ci    // unreachable
674f6603c60Sopenharmony_ci    CheckStep(3);
675f6603c60Sopenharmony_ci    return arg;
676f6603c60Sopenharmony_ci}
677f6603c60Sopenharmony_ci
678f6603c60Sopenharmony_ci/**
679f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CANCEL_ALL_0200
680f6603c60Sopenharmony_ci * @tc.name     test pthread_cancel with PTHREAD_CANCEL_ASYNCHRONOUS
681f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
682f6603c60Sopenharmony_ci */
683f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadCancelAsynchronous, Function | MediumTest | Level3)
684f6603c60Sopenharmony_ci{
685f6603c60Sopenharmony_ci    pthread_t tid;
686f6603c60Sopenharmony_ci    CheckStep(1);
687f6603c60Sopenharmony_ci
688f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCancelAsynchronous, nullptr), 0) << "> return errno";
689f6603c60Sopenharmony_ci    Msleep(10);
690f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cancel(tid), 0);
691f6603c60Sopenharmony_ci    Msleep(100);
692f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, NULL), 0);
693f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123);
694f6603c60Sopenharmony_ci}
695f6603c60Sopenharmony_ci
696f6603c60Sopenharmony_civoid *ThreadPthreadCancelDeferred(void *arg)
697f6603c60Sopenharmony_ci{
698f6603c60Sopenharmony_ci    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, nullptr);
699f6603c60Sopenharmony_ci    CheckStep(2);
700f6603c60Sopenharmony_ci    KeepRun(50);
701f6603c60Sopenharmony_ci    CheckStep(3);
702f6603c60Sopenharmony_ci    Msleep(100);
703f6603c60Sopenharmony_ci    return arg;
704f6603c60Sopenharmony_ci}
705f6603c60Sopenharmony_ci
706f6603c60Sopenharmony_ci/**
707f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CANCEL_ALL_0300
708f6603c60Sopenharmony_ci * @tc.name     test pthread_cancel with PTHREAD_CANCEL_DEFERRED
709f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
710f6603c60Sopenharmony_ci */
711f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadCancelDeferred, Function | MediumTest | Level3)
712f6603c60Sopenharmony_ci{
713f6603c60Sopenharmony_ci    pthread_t tid;
714f6603c60Sopenharmony_ci    CheckStep(1);
715f6603c60Sopenharmony_ci
716f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCancelDeferred, nullptr), 0) << "> return errno";
717f6603c60Sopenharmony_ci    Msleep(10);
718f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cancel(tid), 0);
719f6603c60Sopenharmony_ci    Msleep(100);
720f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, NULL), 0);
721f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(4), (uint64_t)0x1234);
722f6603c60Sopenharmony_ci}
723f6603c60Sopenharmony_ci
724f6603c60Sopenharmony_civoid *ThreadPthreadCancelEnable(void *arg)
725f6603c60Sopenharmony_ci{
726f6603c60Sopenharmony_ci    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr);
727f6603c60Sopenharmony_ci    CheckStep(2);
728f6603c60Sopenharmony_ci    Msleep(50);
729f6603c60Sopenharmony_ci    pthread_testcancel();
730f6603c60Sopenharmony_ci    // unreachable
731f6603c60Sopenharmony_ci    CheckStep(3);
732f6603c60Sopenharmony_ci    return arg;
733f6603c60Sopenharmony_ci}
734f6603c60Sopenharmony_ci
735f6603c60Sopenharmony_ci/**
736f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_CANCEL_ALL_0400
737f6603c60Sopenharmony_ci * @tc.name     test pthread_cancel with PTHREAD_CANCEL_ENABLE
738f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
739f6603c60Sopenharmony_ci */
740f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadCancelEnable, Function | MediumTest | Level3)
741f6603c60Sopenharmony_ci{
742f6603c60Sopenharmony_ci    pthread_t tid;
743f6603c60Sopenharmony_ci    CheckStep(1);
744f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCancelEnable, nullptr), 0) << "> return errno";
745f6603c60Sopenharmony_ci    Msleep(10);
746f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_cancel(tid), 0);
747f6603c60Sopenharmony_ci    Msleep(100);
748f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid, NULL), 0);
749f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123);
750f6603c60Sopenharmony_ci}
751f6603c60Sopenharmony_ci
752f6603c60Sopenharmony_civoid PreparePthreadAtfork(void)
753f6603c60Sopenharmony_ci{
754f6603c60Sopenharmony_ci    CheckStep(2);
755f6603c60Sopenharmony_ci}
756f6603c60Sopenharmony_ci
757f6603c60Sopenharmony_civoid ParentPthreadAtfork(void)
758f6603c60Sopenharmony_ci{
759f6603c60Sopenharmony_ci    Msleep(20);
760f6603c60Sopenharmony_ci    CheckStep(5);
761f6603c60Sopenharmony_ci}
762f6603c60Sopenharmony_ci
763f6603c60Sopenharmony_civoid ChildPthreadAtfork(void)
764f6603c60Sopenharmony_ci{
765f6603c60Sopenharmony_ci    CheckStep(3);
766f6603c60Sopenharmony_ci}
767f6603c60Sopenharmony_ci
768f6603c60Sopenharmony_ci/**
769f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_ATFORK_0100
770f6603c60Sopenharmony_ci * @tc.name     Basic test about pthread_atfork whit one thread
771f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
772f6603c60Sopenharmony_ci */
773f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadAtfork, Function | MediumTest | Level3)
774f6603c60Sopenharmony_ci{
775f6603c60Sopenharmony_ci    pid_t pid = fork();
776f6603c60Sopenharmony_ci    ASSERT_TRUE(pid >= 0) << "> fork errno = " << errno;
777f6603c60Sopenharmony_ci    if (pid == 0) {
778f6603c60Sopenharmony_ci        CheckStep(1);
779f6603c60Sopenharmony_ci        if (pthread_atfork(PreparePthreadAtfork, ParentPthreadAtfork, ChildPthreadAtfork) != 0) {
780f6603c60Sopenharmony_ci            exit(1);
781f6603c60Sopenharmony_ci        }
782f6603c60Sopenharmony_ci
783f6603c60Sopenharmony_ci        pid_t pid = fork();
784f6603c60Sopenharmony_ci        if (pid < 0){
785f6603c60Sopenharmony_ci            exit(1);
786f6603c60Sopenharmony_ci        } else if (pid == 0) {
787f6603c60Sopenharmony_ci            if (CheckStep(4) != 0x1234) {
788f6603c60Sopenharmony_ci                exit(1);
789f6603c60Sopenharmony_ci            }
790f6603c60Sopenharmony_ci            exit(0);
791f6603c60Sopenharmony_ci        }
792f6603c60Sopenharmony_ci        if (CheckStep(6) != 0x123456) {
793f6603c60Sopenharmony_ci            exit(1);
794f6603c60Sopenharmony_ci        }
795f6603c60Sopenharmony_ci
796f6603c60Sopenharmony_ci        // check child-child exit
797f6603c60Sopenharmony_ci        int exitCode;
798f6603c60Sopenharmony_ci        int procStat = CheckProcStatus(pid, &exitCode, 0);
799f6603c60Sopenharmony_ci        if (procStat != 1) {
800f6603c60Sopenharmony_ci            exit(1);
801f6603c60Sopenharmony_ci        }
802f6603c60Sopenharmony_ci        if (exitCode != 0) {
803f6603c60Sopenharmony_ci            LOG("> target process should exited 0");
804f6603c60Sopenharmony_ci            exit(1);
805f6603c60Sopenharmony_ci        }
806f6603c60Sopenharmony_ci        exit(0);
807f6603c60Sopenharmony_ci    }
808f6603c60Sopenharmony_ci    WaitProcExitedOK(pid);
809f6603c60Sopenharmony_ci}
810f6603c60Sopenharmony_ci
811f6603c60Sopenharmony_civoid PrepareNPthreadAtfork(void)
812f6603c60Sopenharmony_ci{
813f6603c60Sopenharmony_ci    CheckStep(2);
814f6603c60Sopenharmony_ci}
815f6603c60Sopenharmony_ci
816f6603c60Sopenharmony_civoid ParentNPthreadAtfork(void)
817f6603c60Sopenharmony_ci{
818f6603c60Sopenharmony_ci    Msleep(20);
819f6603c60Sopenharmony_ci    CheckStep(5);
820f6603c60Sopenharmony_ci}
821f6603c60Sopenharmony_ci
822f6603c60Sopenharmony_civoid ChildNPthreadAtfork(void)
823f6603c60Sopenharmony_ci{
824f6603c60Sopenharmony_ci    CheckStep(3);
825f6603c60Sopenharmony_ci}
826f6603c60Sopenharmony_ci
827f6603c60Sopenharmony_civoid *ThreadNPthreadAtfork(void *arg)
828f6603c60Sopenharmony_ci{
829f6603c60Sopenharmony_ci    CheckStep(1);
830f6603c60Sopenharmony_ci    if (pthread_atfork(PrepareNPthreadAtfork, ParentNPthreadAtfork, ChildNPthreadAtfork) != 0) {
831f6603c60Sopenharmony_ci        exit(1);
832f6603c60Sopenharmony_ci    }
833f6603c60Sopenharmony_ci    pid_t pid = fork();
834f6603c60Sopenharmony_ci    if (pid < 0) {
835f6603c60Sopenharmony_ci        LOG("> fork errno = %d", errno);
836f6603c60Sopenharmony_ci        exit(1);
837f6603c60Sopenharmony_ci    } else if (pid == 0) {
838f6603c60Sopenharmony_ci        if (CheckStep(4) != 0x1234) {
839f6603c60Sopenharmony_ci            exit(1);
840f6603c60Sopenharmony_ci        }
841f6603c60Sopenharmony_ci        exit(0);
842f6603c60Sopenharmony_ci    }
843f6603c60Sopenharmony_ci
844f6603c60Sopenharmony_ci    if (CheckStep(6) != 0x123456) {
845f6603c60Sopenharmony_ci        exit(1);
846f6603c60Sopenharmony_ci    }
847f6603c60Sopenharmony_ci    // check child-child exit
848f6603c60Sopenharmony_ci    int exitCode;
849f6603c60Sopenharmony_ci    int procStat = CheckProcStatus(pid, &exitCode, 0);
850f6603c60Sopenharmony_ci    if (procStat != 1) {
851f6603c60Sopenharmony_ci        exit(1);
852f6603c60Sopenharmony_ci    }
853f6603c60Sopenharmony_ci    if (exitCode != 0) {
854f6603c60Sopenharmony_ci        LOG("> target process should exited 0");
855f6603c60Sopenharmony_ci        exit(1);
856f6603c60Sopenharmony_ci    }
857f6603c60Sopenharmony_ci    exit(0);
858f6603c60Sopenharmony_ci    return arg;
859f6603c60Sopenharmony_ci}
860f6603c60Sopenharmony_ci
861f6603c60Sopenharmony_ci/**
862f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_PTHREAD_ATFORK_0200
863f6603c60Sopenharmony_ci * @tc.name     Basic test about pthread_atfork whit two thread
864f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
865f6603c60Sopenharmony_ci */
866f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testNPthreadAtfork, Function | MediumTest | Level3)
867f6603c60Sopenharmony_ci{
868f6603c60Sopenharmony_ci    pid_t pid = fork();
869f6603c60Sopenharmony_ci    ASSERT_TRUE(pid >= 0) << "> fork errno = " << errno;
870f6603c60Sopenharmony_ci    if (pid == 0) {
871f6603c60Sopenharmony_ci        pthread_t tid;
872f6603c60Sopenharmony_ci        if (pthread_create(&tid, nullptr, ThreadNPthreadAtfork, nullptr) != 0) {
873f6603c60Sopenharmony_ci            exit(1);
874f6603c60Sopenharmony_ci        }
875f6603c60Sopenharmony_ci        if (pthread_join(tid, nullptr) != 0) {
876f6603c60Sopenharmony_ci            exit(1);
877f6603c60Sopenharmony_ci        }
878f6603c60Sopenharmony_ci        exit(0);
879f6603c60Sopenharmony_ci    }
880f6603c60Sopenharmony_ci    WaitProcExitedOK(pid);
881f6603c60Sopenharmony_ci}
882f6603c60Sopenharmony_ci
883f6603c60Sopenharmony_civoid FunOnce(void)
884f6603c60Sopenharmony_ci{
885f6603c60Sopenharmony_ci    CheckStep(2);
886f6603c60Sopenharmony_ci}
887f6603c60Sopenharmony_ci
888f6603c60Sopenharmony_civoid *ThreadOnce(void *arg)
889f6603c60Sopenharmony_ci{
890f6603c60Sopenharmony_ci    pthread_once_t *once = (pthread_once_t*)arg;
891f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_once(once, FunOnce), 0);
892f6603c60Sopenharmony_ci    return arg;
893f6603c60Sopenharmony_ci}
894f6603c60Sopenharmony_ci
895f6603c60Sopenharmony_ci/**
896f6603c60Sopenharmony_ci * @tc.number     SUB_KERNEL_PTHREAD_ONCE_0100
897f6603c60Sopenharmony_ci * @tc.name       pthread_once basic test
898f6603c60Sopenharmony_ci * @tc.desc       [C- SOFTWARE -0200]
899f6603c60Sopenharmony_ci */
900f6603c60Sopenharmony_ciHWTEST_F(PthreadTest, testPthreadOnce, Function | MediumTest | Level3)
901f6603c60Sopenharmony_ci{
902f6603c60Sopenharmony_ci    pthread_once_t once = PTHREAD_ONCE_INIT;
903f6603c60Sopenharmony_ci    pthread_t tid[2];
904f6603c60Sopenharmony_ci    CheckStep(1);
905f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid[0], nullptr, ThreadOnce, (void*)&once), 0) << "> return errno";
906f6603c60Sopenharmony_ci    ASSERT_EQ(pthread_create(&tid[1], nullptr, ThreadOnce, (void*)&once), 0) << "> return errno";
907f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid[0], nullptr), 0) << "> return errno";
908f6603c60Sopenharmony_ci    EXPECT_EQ(pthread_join(tid[1], nullptr), 0) << "> return errno";
909f6603c60Sopenharmony_ci    EXPECT_EQ(CheckStep(3), (uint64_t)0x123);
910f6603c60Sopenharmony_ci}
911