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