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