1 /*
2 * Copyright (c) 2025 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 <dlfcn.h>
17 #include <gtest/gtest.h>
18
19 #include "dynamic_loader.h"
20
21 using namespace testing;
22 using namespace testing::ext;
23
24 namespace OHOS {
25 namespace EtsEnv {
26 class DynamicLoaderTest : public testing::Test {
27 public:
DynamicLoaderTest()28 DynamicLoaderTest()
29 {}
~DynamicLoaderTest()30 ~DynamicLoaderTest()
31 {}
32 static void SetUpTestCase(void);
33 static void TearDownTestCase(void);
34 void SetUp() override;
35 void TearDown() override;
36
37 static constexpr const char* TEST_LIB = "libc.so";
38 static constexpr const char* TEST_SYMBOL = "printf";
39 };
40
SetUpTestCase(void)41 void DynamicLoaderTest::SetUpTestCase(void)
42 {
43 Dl_namespace ns;
44 DynamicInitNamespace(&ns, nullptr, "", "ets_app");
45 }
46
TearDownTestCase(void)47 void DynamicLoaderTest::TearDownTestCase(void)
48 {}
49
SetUp(void)50 void DynamicLoaderTest::SetUp(void)
51 {
52 char* errorBuf = const_cast<char*>(DynamicGetError());
53 if (errorBuf != nullptr) {
54 errorBuf[0] = '\0';
55 }
56 (void)dlerror();
57 }
58
TearDown(void)59 void DynamicLoaderTest::TearDown(void)
60 {}
61
62 /**
63 * @tc.name: DynamicLoaderTestLoadLibrary_0100
64 * @tc.desc: DynamicLoaderTest test for dynamic_load_library.
65 * @tc.type: FUNC
66 */
67 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestLoadLibrary_0100, TestSize.Level1)
68 {
69 Dl_namespace ns;
70 DynamicInitNamespace(&ns, nullptr, "", "test_namespace");
71
72 void* handle = DynamicLoadLibrary(&ns, TEST_LIB, RTLD_LAZY);
73 EXPECT_NE(handle, nullptr);
74 EXPECT_STREQ(DynamicGetError(), "");
75
76 if (handle) {
77 DynamicFreeLibrary(handle);
78 }
79 }
80
81 /**
82 * @tc.name: DynamicLoaderTestLoadLibrary_0200
83 * @tc.desc: DynamicLoaderTest test for dynamic_load_library.
84 * @tc.type: FUNC
85 */
86 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestLoadLibrary_0200, TestSize.Level1)
87 {
88 Dl_namespace ns;
89 DynamicInitNamespace(&ns, nullptr, "", "test_namespace");
90
91 void* handle = DynamicLoadLibrary(&ns, "invalid_lib.so", RTLD_LAZY);
92 EXPECT_EQ(handle, nullptr);
93 EXPECT_STRNE(DynamicGetError(), "");
94 }
95
96 /**
97 * @tc.name: DynamicLoaderTestLoadLibrary_0300
98 * @tc.desc: DynamicLoaderTest test for dynamic_load_library.
99 * @tc.type: FUNC
100 */
101 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestLoadLibrary_0300, TestSize.Level1)
102 {
103 void* handle = DynamicLoadLibrary(nullptr, TEST_LIB, RTLD_LAZY);
104 EXPECT_NE(handle, nullptr);
105 EXPECT_STREQ(DynamicGetError(), "");
106
107 if (handle) {
108 DynamicFreeLibrary(handle);
109 }
110 }
111
112 /**
113 * @tc.name: DynamicLoaderTestFindSymbol_0100
114 * @tc.desc: DynamicLoaderTest test for dynamic_find_symbol.
115 * @tc.type: FUNC
116 */
117 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestFindSymbol_0100, TestSize.Level1)
118 {
119 void* handle = DynamicLoadLibrary(nullptr, TEST_LIB, RTLD_LAZY);
120 ASSERT_NE(handle, nullptr);
121
122 void* symbol = DynamicFindSymbol(handle, TEST_SYMBOL);
123 EXPECT_NE(symbol, nullptr);
124 EXPECT_STREQ(DynamicGetError(), "");
125
126 DynamicFreeLibrary(handle);
127 }
128
129 /**
130 * @tc.name: DynamicLoaderTestFindSymbol_0200
131 * @tc.desc: DynamicLoaderTest test for dynamic_find_symbol.
132 * @tc.type: FUNC
133 */
134 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestFindSymbol_0200, TestSize.Level1)
135 {
136 void* handle = DynamicLoadLibrary(nullptr, TEST_LIB, RTLD_LAZY);
137 ASSERT_NE(handle, nullptr);
138
139 void* symbol = DynamicFindSymbol(handle, "invalid_symbol");
140 EXPECT_EQ(symbol, nullptr);
141
142 DynamicFreeLibrary(handle);
143 }
144
145 /**
146 * @tc.name: DynamicLoaderTestGetError_0100
147 * @tc.desc: DynamicLoaderTest test for dynamic_get_error.
148 * @tc.type: FUNC
149 */
150 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestGetError_0100, TestSize.Level1)
151 {
152 void* handle = DynamicLoadLibrary(nullptr, "invalid_lib.so", RTLD_LAZY);
153 EXPECT_EQ(handle, nullptr);
154
155 const char* error = DynamicGetError();
156 EXPECT_NE(error, nullptr);
157 EXPECT_GT(std::strlen(error), 0);
158 }
159
160 /**
161 * @tc.name: DynamicLoaderTestGetError_0200
162 * @tc.desc: DynamicLoaderTest test for dynamic_get_error.
163 * @tc.type: FUNC
164 */
165 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestGetError_0200, TestSize.Level1)
166 {
167 void* handle = DynamicLoadLibrary(nullptr, TEST_LIB, RTLD_LAZY);
168 ASSERT_NE(handle, nullptr);
169 EXPECT_STREQ(DynamicGetError(), "");
170
171 DynamicFreeLibrary(handle);
172 }
173
174 /**
175 * @tc.name: DynamicLoaderTestFreeLibrary_0100
176 * @tc.desc: DynamicLoaderTest test for DynamicFreeLibrary.
177 * @tc.type: FUNC
178 */
179 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestFreeLibrary_0100, TestSize.Level1)
180 {
181 void* handle = DynamicLoadLibrary(nullptr, TEST_LIB, RTLD_LAZY);
182 ASSERT_NE(handle, nullptr);
183
184 DynamicFreeLibrary(handle);
185
186 void* newHandle = DynamicLoadLibrary(nullptr, TEST_LIB, RTLD_LAZY);
187 EXPECT_NE(newHandle, nullptr);
188 EXPECT_STREQ(DynamicGetError(), "");
189
190 if (newHandle) {
191 DynamicFreeLibrary(newHandle);
192 }
193 }
194
195 /**
196 * @tc.name: DynamicLoaderTestInitNamespace_0100
197 * @tc.desc: DynamicLoaderTest test for dynamic_init_namespace.
198 * @tc.type: FUNC
199 */
200 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestInitNamespace_0100, TestSize.Level1)
201 {
202 Dl_namespace ns;
203 const char* name = "test_namespace";
204
205 DynamicInitNamespace(&ns, nullptr, TEST_LIB, name);
206 EXPECT_STREQ(DynamicGetError(), "");
207 }
208
209 /**
210 * @tc.name: DynamicLoaderTestInitNamespace_0200
211 * @tc.desc: DynamicLoaderTest test for dynamic_init_namespace.
212 * @tc.type: FUNC
213 */
214 HWTEST_F(DynamicLoaderTest, DynamicLoaderTestInitNamespace_0200, TestSize.Level1)
215 {
216 Dl_namespace ns;
217 const char* name = "duplicate_namespace";
218
219 DynamicInitNamespace(&ns, nullptr, TEST_LIB, name);
220 EXPECT_STREQ(DynamicGetError(), "");
221
222 DynamicInitNamespace(&ns, nullptr, TEST_LIB, name);
223 EXPECT_STREQ(DynamicGetError(), "");
224 }
225 } // namespace EtsEnv
226 } // namespace OHOS