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