1 #include <gtest/gtest.h> 2 #include <pthread.h> 3 #include <semaphore.h> 4 #include <threads.h> 5 6 using namespace testing::ext; 7 8 #define TS_PER_T 1000000000 9 10 class ThreadSemTest : public testing::Test { 11 protected: 12 sem_t sem_; 13 timespec ts_; 14 ThreadFn(void * arg)15 static void* ThreadFn(void* arg) 16 { 17 if (arg == nullptr) { 18 return nullptr; 19 } 20 sem_t& sem = *reinterpret_cast<sem_t*>(arg); 21 EXPECT_EQ(0, sem_wait(&sem)); 22 return nullptr; 23 } 24 SetUp()25 void SetUp() override 26 { 27 EXPECT_EQ(0, sem_init(&sem_, 0, 0)); 28 } 29 TearDown()30 void TearDown() override 31 { 32 EXPECT_EQ(0, sem_destroy(&sem_)); 33 } 34 }; 35 36 /** 37 * @tc.name: sem_wait_001 38 * @tc.desc: Verify whether the behavior of using semaphores for thread synchronization is correct in a multithreaded 39 * environment. 40 * @tc.type: FUNC 41 * */ 42 HWTEST_F(ThreadSemTest, sem_wait_001, TestSize.Level1) 43 { 44 pthread_t thread1, thread2; 45 EXPECT_EQ(0, pthread_create(&thread1, nullptr, ThreadFn, &sem_)); 46 EXPECT_EQ(0, pthread_create(&thread2, nullptr, ThreadFn, &sem_)); 47 48 EXPECT_EQ(0, sem_post(&sem_)); 49 EXPECT_EQ(0, sem_post(&sem_)); 50 51 EXPECT_EQ(0, pthread_join(thread1, nullptr)); 52 EXPECT_EQ(0, pthread_join(thread2, nullptr)); 53 } 54 55 /** 56 * @tc.name: sem_timedwait_001 57 * @tc.desc: Illegal waiting time has been set, such as changing Set tv_nsec to -1, set tv_nsec set to exceed 58 * TS_PER_T value, to verify is the sem_timedwait function handling illegal parameters correctly. 59 * @tc.type: FUNC 60 * */ 61 HWTEST_F(ThreadSemTest, sem_timedwait_001, TestSize.Level1) 62 { 63 EXPECT_EQ(0, clock_gettime(CLOCK_REALTIME, &ts_)); 64 EXPECT_EQ(-1, sem_timedwait(&sem_, &ts_)); 65 ts_.tv_nsec = -1; 66 EXPECT_EQ(-1, sem_timedwait(&sem_, &ts_)); 67 ts_.tv_nsec = TS_PER_T - 1; 68 ts_.tv_sec = -1; 69 EXPECT_EQ(-1, sem_timedwait(&sem_, &ts_)); 70 EXPECT_EQ(0, sem_destroy(&sem_)); 71 }