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 */
HWTEST_F(SemAbnormalTest, testSemInitAbnormalSemvaluemax, Function | MediumTest | Level3)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 */
HWTEST_F(SemAbnormalTest, testSemInitAbnormalGtsemvaluemax, Function | MediumTest | Level3)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 */
HWTEST_F(SemAbnormalTest, testSemInitAbnormalInitTwice, Function | MediumTest | Level3)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 */
HWTEST_F(SemAbnormalTest, testSemPostAbnormal, Function | MediumTest | Level3)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 */
HWTEST_F(SemAbnormalTest, testSemTimedwaitAbnormalA, Function | MediumTest | Level3)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 */
HWTEST_F(SemAbnormalTest, testSemTimedwaitAbnormalB, Function | MediumTest | Level3)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 */
HWTEST_F(SemAbnormalTest, testSemTryWaitEagain, Function | MediumTest | Level2)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