• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include <stdio.h>
16 #include <string.h>
17 #include <limits.h>
18 #include <semaphore.h>
19 #include <pthread.h>
20 #include <gtest/gtest.h>
21 #include "utils.h"
22 #include "log.h"
23 
24 using namespace testing::ext;
25 
26 static const unsigned int KERNEL_NS_PER_SECOND = 1000000000;
27 
28 class SemAbnormalTest : public::testing::Test {
29 };
30 
31 /**
32  * @tc.number   SUB_KERNEL_IPC_SEM_INIT_0200
33  * @tc.name     Use sem_init initialized value when value is SEM_VALUE_MAX
34  * @tc.desc     [C- SOFTWARE -0200]
35  */
36 HWTEST_F(SemAbnormalTest, testSemInitAbnormalSemvaluemax, Function | MediumTest | Level3)
37 {
38     sem_t sem;
39     int semValue = 0;
40     LOG("> SEM_VALUE_MAX = %d", SEM_VALUE_MAX);
41 
42     EXPECT_NE(sem_init(&sem, 0, SEM_VALUE_MAX), -1) << "> sem_init errno = " << errno;
43     EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
44     EXPECT_EQ(semValue, SEM_VALUE_MAX);
45     EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
46 }
47 
48 /**
49  * @tc.number   SUB_KERNEL_IPC_SEM_INIT_0210
50  * @tc.name     Use sem_init initialized value when value is greater than SEM_VALUE_MAX
51  * @tc.desc     [C- SOFTWARE -0200]
52  */
53 HWTEST_F(SemAbnormalTest, testSemInitAbnormalGtsemvaluemax, Function | MediumTest | Level3)
54 {
55     sem_t sem;
56     unsigned int gtSemMax = (unsigned int)SEM_VALUE_MAX + 1;
57     LOG("> SEM_VALUE_MAX = %d", SEM_VALUE_MAX);
58 
59     if (sem_init(&sem, 0, gtSemMax) == -1) {
60         EXPECT_EQ(errno, EINVAL) << "> sem_init errno = " << errno;
61     } else {
62         LOG("> sem_init return unexpected");
63         ADD_FAILURE();
64     }
65 }
66 
67 /**
68  * @tc.number   SUB_KERNEL_IPC_SEM_INIT_0220
69  * @tc.name     Use sem_init initialized value twice
70  * @tc.desc     [C- SOFTWARE -0200]
71  */
72 HWTEST_F(SemAbnormalTest, testSemInitAbnormalInitTwice, Function | MediumTest | Level3)
73 {
74     sem_t sem;
75     EXPECT_NE(sem_init(&sem, 0, 1), -1) << "> sem_init errno = " << errno;
76     EXPECT_NE(sem_init(&sem, 0, 1), -1) << "> sem_init errno = " << errno;
77     EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
78 }
79 
80 /**
81  * @tc.number   SUB_KERNEL_IPC_SEM_POST_0200
82  * @tc.name     sem_post increases the semaphore count near the maximum value
83  * @tc.desc     [C- SOFTWARE -0200]
84  */
85 HWTEST_F(SemAbnormalTest, testSemPostAbnormal, Function | MediumTest | Level3)
86 {
87     sem_t sem;
88     int semValue = 0;
89 
90     // = SEM_VALUE_MAX
91     EXPECT_NE(sem_init(&sem, 0, SEM_VALUE_MAX), -1) << "> sem_init errno = " << errno;
92     if (sem_post(&sem) == -1) {
93         EXPECT_EQ(errno, EOVERFLOW) << "> sem_post errno = " << errno;
94     } else {
95         LOG("> sem_post return unexpected");
96         ADD_FAILURE();
97     }
98     EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
99     EXPECT_EQ(semValue, SEM_VALUE_MAX);
100 
101     EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
102 }
103 
104 /**
105  * @tc.number   SUB_KERNEL_IPC_SEM_TIMEDWAIT_0200
106  * @tc.name     sem_timedwait get semaphore, wait time abnormal, tv_nsec less than 0
107  * @tc.desc     [C- SOFTWARE -0200]
108  */
109 HWTEST_F(SemAbnormalTest, testSemTimedwaitAbnormalA, Function | MediumTest | Level3)
110 {
111     struct timespec ts = {0};
112     sem_t sem;
113     int semValue = 0;
114 
115     ASSERT_EQ(sem_init(&sem, 0, 0), 0) << "> sem_init errno = " << errno;
116 
117     ts.tv_sec = time(nullptr);
118     ts.tv_nsec = -2;
119     if (sem_timedwait(&sem, &ts) == -1) {
120         EXPECT_EQ(errno, EINVAL) << "> sem_timedwait errno = " << errno;
121     } else {
122         LOG("> sem_timedwait return unexpected");
123         ADD_FAILURE();
124     }
125 
126     EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
127     EXPECT_EQ(semValue, 0);
128     EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
129 }
130 
131 /**
132  * @tc.number   SUB_KERNEL_IPC_SEM_TIMEDWAIT_0300
133  * @tc.name     sem_timedwait get semaphore, wait time abnormal
134  * @tc.desc     [C- SOFTWARE -0200]
135  */
136 HWTEST_F(SemAbnormalTest, testSemTimedwaitAbnormalB, Function | MediumTest | Level3)
137 {
138     struct timespec ts = {0};
139     sem_t sem;
140     int semValue = 0;
141 
142     ASSERT_EQ(sem_init(&sem, 0, 0), 0) << "> sem_init errno = " << errno;
143 
144     ts.tv_sec = time(nullptr);
145     ts.tv_nsec = KERNEL_NS_PER_SECOND;
146     if (sem_timedwait(&sem, &ts) == -1) {
147         EXPECT_EQ(errno, EINVAL) << "> sem_timedwait errno = " << errno;
148     } else {
149         LOG("> sem_timedwait return unexpected");
150         ADD_FAILURE();
151     }
152 
153     EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
154     EXPECT_EQ(semValue, 0);
155     EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
156 }
157 
158 /**
159  * @tc.number   SUB_KERNEL_IPC_SEM_TRYWAIT_0110
160  * @tc.name     test sem_trywait with EAGAIN
161  * @tc.desc     [C- SOFTWARE -0200]
162  */
163 HWTEST_F(SemAbnormalTest, testSemTryWaitEagain, Function | MediumTest | Level2)
164 {
165     sem_t sem;
166     int semValue = 0;
167 
168     ASSERT_NE(sem_init(&sem, 0, 0), -1) << "> sem_init errno = " << errno;
169     EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
170     EXPECT_EQ(semValue, 0);
171 
172     EXPECT_EQ(sem_trywait(&sem), -1) << "> sem_trywait no err";
173     EXPECT_EQ(errno, EAGAIN) << "> errno = " << errno;
174 
175     EXPECT_EQ(sem_getvalue(&sem, &semValue), 0) << "> sem_getvalue errno = " << errno;
176     EXPECT_EQ(semValue, 0);
177 
178     EXPECT_EQ(sem_destroy(&sem), 0) << "> sem_destroy errno = " << errno;
179 }
180