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 
16 #include <stdlib.h>
17 #include <search.h>
18 
19 #include "gtest/gtest.h"
20 #include "log.h"
21 #include "utils.h"
22 
23 using namespace testing::ext;
24 
25 class ActsUtilDataStructApiTest : public testing::Test {
26 protected:
27     // SetUpTestCase: Testsuit setup, run before 1st testcase
SetUpTestCase(void)28     static void SetUpTestCase(void)
29     {
30     }
31     // TearDownTestCase: Testsuit teardown, run after last testcase
TearDownTestCase(void)32     static void TearDownTestCase(void)
33     {
34     }
35     // Testcase setup
SetUp()36     virtual void SetUp()
37     {
38     }
39     // Testcase teardown
TearDown()40     virtual void TearDown()
41     {
42     }
43 };
44 
45 /* comparison function */
NumCompare(const void *p1, const void *p2)46 static int NumCompare(const void *p1, const void *p2)
47 {
48     return ((*(int *)p1) - (*(int *)p2));
49 }
50 
51 /**
52 * @tc.number     SUB_KERNEL_UTIL_DATASTRUCT_BSEARCH_0100
53 * @tc.name       test bsearch api with key in array
54 * @tc.desc       [C- SOFTWARE -0200]
55 */
HWTEST_F(ActsUtilDataStructApiTest, testBsearch0100, Function | MediumTest | Level1)56 HWTEST_F(ActsUtilDataStructApiTest, testBsearch0100, Function | MediumTest | Level1) {
57     int numArray[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
58     int *itemPtr = nullptr;
59     int keyVal;
60 
61     keyVal = 5;
62     itemPtr = (int *)bsearch(&keyVal, numArray, sizeof(numArray) / sizeof(numArray[0]),
63         sizeof(int), (int (*)(const void *, const void *))NumCompare);
64     ASSERT_TRUE(&numArray[5] == itemPtr) << "ErrInfo: bsearch  returnVal:='" << *itemPtr << "'";
65 }
66 
67 /**
68 * @tc.number     SUB_KERNEL_UTIL_DATASTRUCT_BSEARCH_0200
69 * @tc.name       test bsearch api with key not in array
70 * @tc.desc       [C- SOFTWARE -0200]
71 */
HWTEST_F(ActsUtilDataStructApiTest, testBsearch0200, Function | MediumTest | Level1)72 HWTEST_F(ActsUtilDataStructApiTest, testBsearch0200, Function | MediumTest | Level1) {
73     int numArray[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
74     int *itemPtr = nullptr;
75     int keyVal;
76 
77     keyVal = 10;
78     itemPtr = (int *)bsearch(&keyVal, numArray, sizeof(numArray) / sizeof(numArray[0]),
79         sizeof(int), (int (*)(const void *, const void *))NumCompare);
80     ASSERT_TRUE(nullptr == itemPtr) << "ErrInfo: bsearch  returnVal:='" << *itemPtr << "'";
81 }
82 
83 /**
84 * @tc.number     SUB_KERNEL_UTIL_DATASTRUCT_HCREATE_0300
85 * @tc.name       test hcreate api with key and value in hash
86 * @tc.desc       [C- SOFTWARE -0200]
87 */
HWTEST_F(ActsUtilDataStructApiTest, testHcreate0300, Function | MediumTest | Level1)88 HWTEST_F(ActsUtilDataStructApiTest, testHcreate0300, Function | MediumTest | Level1) {
89     int createResult;
90     size_t netVal = 10;
91     ENTRY item;
92     ENTRY *searchResult = nullptr;
93     char hashKey[10] = "key1";
94     char hashValue[10] = "value1";
95 
96     createResult = hcreate(netVal);
97     LOGD("    hcreate createResult:='%d'\n", createResult);
98     ASSERT_TRUE(createResult != 0) << "ErrInfo: hcreate returnVal:='" << createResult << "'";
99 
100     item.key = hashKey;
101     item.data = hashValue;
102 
103     searchResult = hsearch(item, ENTER);
104     ASSERT_TRUE(searchResult != nullptr) << "ErrInfo: hsearch searchResult:='" << searchResult << "'";
105 
106     item.key = hashKey;
107     searchResult = hsearch(item, FIND);
108     LOGD("    hsearch searchResult->data:='%s'\n", searchResult->data);
109     ASSERT_TRUE(searchResult != nullptr && strcmp((const char *)searchResult->data, "value1") == 0)
110          << "ErrInfo: hsearch searchResult->data:='" << searchResult->data << "'";
111 
112     hdestroy();
113 }
114 
115 /**
116 * @tc.number     SUB_KERNEL_UTIL_DATASTRUCT_HCREATE_0400
117 * @tc.name       test hcreate api with key and value not in hash
118 * @tc.desc       [C- SOFTWARE -0200]
119 */
HWTEST_F(ActsUtilDataStructApiTest, testHcreate0400, Function | MediumTest | Level1)120 HWTEST_F(ActsUtilDataStructApiTest, testHcreate0400, Function | MediumTest | Level1) {
121     int createResult;
122     size_t netVal = 10;
123     ENTRY item;
124     ENTRY *searchResult = nullptr;
125     char hashKey[10] = "key1";
126 
127     createResult = hcreate(netVal);
128     LOGD("    hcreate createResult:='%d'\n", createResult);
129     ASSERT_TRUE(createResult != 0) << "ErrInfo: hcreate returnVal:='" << createResult << "'";
130 
131     item.key = hashKey;
132     searchResult = hsearch(item, FIND);
133     ASSERT_TRUE(searchResult == nullptr)
134          << "ErrInfo: hsearch searchResult:='" << searchResult << "'";
135 
136     hdestroy();
137 }
138 
139 /**
140 * @tc.number     SUB_KERNEL_UTIL_DATASTRUCT_HCREATE_R_0500
141 * @tc.name       test hcreate_r api with key and value in hash
142 * @tc.desc       [C- SOFTWARE -0200]
143 */
HWTEST_F(ActsUtilDataStructApiTest, testHcreateR0500, Function | MediumTest | Level1)144 HWTEST_F(ActsUtilDataStructApiTest, testHcreateR0500, Function | MediumTest | Level1) {
145     int createResult;
146     int returnVal = 0;
147     size_t netVal = 10;
148     ENTRY item;
149     ENTRY *searchResult = nullptr;
150     char hashKey[10] = "key1";
151     char hashValue[10] = "value1";
152     struct hsearch_data hTab = {0};
153 
154     createResult = hcreate_r(netVal, &hTab);
155     LOGD("    hcreate_r createResult:='%d'\n", createResult);
156     ASSERT_TRUE(createResult != 0) << "ErrInfo: hcreate_r returnVal:='" << createResult << "'";
157 
158     item.key = hashKey;
159     item.data = hashValue;
160 
161     returnVal = hsearch_r(item, ENTER, &searchResult, &hTab);
162     ASSERT_TRUE(returnVal != 0) << "ErrInfo: hsearch_r searchResult:='" << searchResult << "'";
163 
164     item.key = hashKey;
165     returnVal = hsearch_r(item, FIND, &searchResult, &hTab);
166     LOGD("    hsearch_r searchResult->data:='%s'\n", searchResult->data);
167     ASSERT_TRUE(returnVal != 0 && strcmp((const char *)searchResult->data, "value1") == 0)
168          << "ErrInfo: hsearch_r searchResult->data:='" << searchResult->data << "'";
169 
170     hdestroy_r(&hTab);
171 }
172 
173 /**
174 * @tc.number     SUB_KERNEL_UTIL_DATASTRUCT_HCREATE_R_0600
175 * @tc.name       test hcreate_r api with key and value not in hash
176 * @tc.desc       [C- SOFTWARE -0200]
177 */
HWTEST_F(ActsUtilDataStructApiTest, testHcreateR0600, Function | MediumTest | Level1)178 HWTEST_F(ActsUtilDataStructApiTest, testHcreateR0600, Function | MediumTest | Level1) {
179     int createResult;
180     int returnVal = 0;
181     size_t netVal = 10;
182     ENTRY item;
183     ENTRY *searchResult = nullptr;
184     char hashKey[10] = "key1";
185     struct hsearch_data hTab = {0};
186     createResult = hcreate_r(netVal, &hTab);
187     LOGD("    hcreate_r createResult:='%d'\n", createResult);
188     ASSERT_TRUE(createResult != 0) << "ErrInfo: hcreate_r returnVal:='" << createResult << "'";
189 
190     item.key = hashKey;
191     returnVal = hsearch_r(item, FIND, &searchResult, &hTab);
192     LOGD("    hsearch_r searchResult='%s'\n", searchResult);
193     ASSERT_TRUE(0 == returnVal) << "ErrInfo: hsearch_r searchResult:='" << searchResult << "'";
194 
195     hdestroy_r(&hTab);
196 }
197