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