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