1 /*
2 * Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without modification,
5 * are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice, this list of
8 * conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 *
14 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without specific prior written
16 * permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include "xts_ipc.h"
32
33 LITE_TEST_SUIT(IPC, SemAbnormalTestSuite, SemAbnormalTestSuite);
34
SemAbnormalTestSuiteSetUp(void)35 static BOOL SemAbnormalTestSuiteSetUp(void)
36 {
37 return TRUE;
38 }
39
SemAbnormalTestSuiteTearDown(void)40 static BOOL SemAbnormalTestSuiteTearDown(void)
41 {
42 return TRUE;
43 }
44
45 /**
46 * @tc.number SUB_KERNEL_IPC_SEM_INIT_0200
47 * @tc.name Use sem_init initialized value when value is SEM_VALUE_MAX
48 * @tc.desc [C- SOFTWARE -0200]
49 */
50 LITE_TEST_CASE(SemAbnormalTestSuite, testSemInitAbnormalSemvaluemax, Function | MediumTest | Level3)
51 {
52 int ret;
53 sem_t sem;
54 int semValue = 0;
55
56 ret = sem_init(&sem, 0, SEM_VALUE_MAX);
57 ICUNIT_ASSERT_NOT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
58
59 ret = sem_getvalue(&sem, &semValue);
60 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
61
62 ICUNIT_ASSERT_EQUAL(SEM_VALUE_MAX, semValue, SEM_VALUE_MAX);
63
64 ret = sem_destroy(&sem);
65 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
66 return 0;
67 }
68
69 /**
70 * @tc.number SUB_KERNEL_IPC_SEM_INIT_0210
71 * @tc.name Use sem_init initialized value when value is greater than SEM_VALUE_MAX
72 * @tc.desc [C- SOFTWARE -0200]
73 */
74 LITE_TEST_CASE(SemAbnormalTestSuite, testSemInitAbnormalGtsemvaluemax, Function | MediumTest | Level3)
75 {
76 int ret;
77 sem_t sem;
78 unsigned int gtSemMax = (unsigned int)SEM_VALUE_MAX + 1; /* 1, common data for test, no special meaning */
79
80 ret = sem_init(&sem, 0, gtSemMax);
81 ICUNIT_GOTO_EQUAL(ret, -1, ret, EXIT); /* -1, common data for test, no special meaning */
82 ICUNIT_ASSERT_EQUAL(errno, EINVAL, errno);
83 EXIT:
84 return 0;
85 }
86
87 /**
88 * @tc.number SUB_KERNEL_IPC_SEM_INIT_0220
89 * @tc.name Use sem_init initialized value twice
90 * @tc.desc [C- SOFTWARE -0200]
91 */
92 LITE_TEST_CASE(SemAbnormalTestSuite, testSemInitAbnormalInitTwice, Function | MediumTest | Level3)
93 {
94 int ret;
95 sem_t sem;
96
97 ret = sem_init(&sem, 0, 1); /* 1, common data for test, no special meaning */
98 ICUNIT_ASSERT_NOT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
99
100 ret = sem_destroy(&sem);
101 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
102 return 0;
103 }
104
105 /**
106 * @tc.number SUB_KERNEL_IPC_SEM_POST_0200
107 * @tc.name sem_post increases the semaphore count near the maximum value
108 * @tc.desc [C- SOFTWARE -0200]
109 */
110 LITE_TEST_CASE(SemAbnormalTestSuite, testSemPostAbnormal, Function | MediumTest | Level3)
111 {
112 int ret;
113 sem_t sem;
114
115 ret = sem_init(&sem, 0, SEM_VALUE_MAX);
116 ICUNIT_ASSERT_NOT_EQUAL(ret, -1, ret); /* -1, common data for test, no special meaning */
117
118 ret = sem_post(&sem);
119 ICUNIT_GOTO_EQUAL(ret, -1, ret, EXIT);
120 ICUNIT_GOTO_EQUAL(errno, EOVERFLOW, errno, EXIT); /* -1, common data for test, no special meaning */
121
122 EXIT:
123 ret = sem_destroy(&sem);
124 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
125 return 0;
126 }
127
128 /**
129 * @tc.number SUB_KERNEL_IPC_SEM_TIMEDWAIT_0200
130 * @tc.name sem_timedwait get semaphore, wait time abnormal, tv_nsec less than 0
131 * @tc.desc [C- SOFTWARE -0200]
132 */
133 LITE_TEST_CASE(SemAbnormalTestSuite, testSemTimedwaitAbnormalA, Function | MediumTest | Level3)
134 {
135 int ret;
136 struct timespec ts = {0};
137 sem_t sem;
138 int semValue = 0;
139
140 ret = sem_init(&sem, 0, 0);
141 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
142
143 ts.tv_sec = time(NULL);
144 ts.tv_nsec = -2; /* -2, common data for test, no special meaning */
145 ret = sem_timedwait(&sem, &ts);
146 ICUNIT_GOTO_EQUAL(ret, -1, ret, EXIT); /* -1, common data for test, no special meaning */
147 ICUNIT_GOTO_EQUAL(errno, EINVAL, errno, EXIT);
148
149 EXIT:
150 ret = sem_getvalue(&sem, &semValue);
151 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
152 ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
153 ret = sem_destroy(&sem);
154 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
155 return 0;
156 }
157
158 /**
159 * @tc.number SUB_KERNEL_IPC_SEM_TIMEDWAIT_0300
160 * @tc.name sem_timedwait get semaphore, wait time abnormal
161 * @tc.desc [C- SOFTWARE -0200]
162 */
163 LITE_TEST_CASE(SemAbnormalTestSuite, testSemTimedwaitAbnormalB, Function | MediumTest | Level3)
164 {
165 int ret;
166 struct timespec ts = {0};
167 sem_t sem;
168 int semValue = 0;
169
170 ret = sem_init(&sem, 0, 0);
171 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
172
173 ts.tv_sec = time(NULL);
174 ts.tv_nsec = KERNEL_NS_PER_SECOND;
175 ret = sem_timedwait(&sem, &ts);
176 ICUNIT_GOTO_EQUAL(ret, -1, ret, EXIT); /* -1, common data for test, no special meaning */
177 ICUNIT_GOTO_EQUAL(errno, EINVAL, errno, EXIT);
178 EXIT:
179 ret = sem_getvalue(&sem, &semValue);
180 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
181 ICUNIT_ASSERT_EQUAL(semValue, 0, semValue);
182 ret = sem_destroy(&sem);
183 ICUNIT_ASSERT_EQUAL(ret, 0, ret);
184 return 0;
185 }
186
187 RUN_TEST_SUITE(SemAbnormalTestSuite);
188
PosixSemAbnFuncTest()189 void PosixSemAbnFuncTest()
190 {
191 RUN_ONE_TESTCASE(testSemInitAbnormalSemvaluemax);
192 RUN_ONE_TESTCASE(testSemInitAbnormalInitTwice);
193 RUN_ONE_TESTCASE(testSemTimedwaitAbnormalA);
194 RUN_ONE_TESTCASE(testSemTimedwaitAbnormalB);
195 }
196