• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }