1570af302Sopenharmony_ci/**
2570af302Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4570af302Sopenharmony_ci * you may not use this file except in compliance with the License.
5570af302Sopenharmony_ci * You may obtain a copy of the License at
6570af302Sopenharmony_ci *
7570af302Sopenharmony_ci *   http://www.apache.org/licenses/LICENSE-2.0
8570af302Sopenharmony_ci *
9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12570af302Sopenharmony_ci * See the License for the specific language governing permissions and
13570af302Sopenharmony_ci * limitations under the License.
14570af302Sopenharmony_ci */
15570af302Sopenharmony_ci
16570af302Sopenharmony_ci#include <dlfcn.h>
17570af302Sopenharmony_ci#include <errno.h>
18570af302Sopenharmony_ci#include <stdio.h>
19570af302Sopenharmony_ci#include <string.h>
20570af302Sopenharmony_ci
21570af302Sopenharmony_ci#include "dlns_test.h"
22570af302Sopenharmony_ci#include "functionalext.h"
23570af302Sopenharmony_ci
24570af302Sopenharmony_ci
25570af302Sopenharmony_ci/**
26570af302Sopenharmony_ci * @tc.name      : dlns_inherit_0100
27570af302Sopenharmony_ci * @tc.desc      : Under the INI configuration file, when shared_libs in dlns_inherit is empty,
28570af302Sopenharmony_ci *                      all the libraries of the inheritor can be shared by it
29570af302Sopenharmony_ci * @tc.level     : Level 1
30570af302Sopenharmony_ci */
31570af302Sopenharmony_civoid dlns_inherit_0100(void)
32570af302Sopenharmony_ci{
33570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB;
34570af302Sopenharmony_ci    dlns_init(&dlnsA, "for_inherit_A");
35570af302Sopenharmony_ci    dlns_init(&dlnsB, "inherited_class");
36570af302Sopenharmony_ci
37570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0100", dlns_inherit(&dlnsA, &dlnsB, NULL), EOK);
38570af302Sopenharmony_ci
39570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlnsA, dllName, RTLD_LAZY);
40570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0100", handle);
41570af302Sopenharmony_ci    dlclose(handle);
42570af302Sopenharmony_ci
43570af302Sopenharmony_ci    void* handle1 = dlopen_ns(&dlnsA, sharedLib, RTLD_LAZY);
44570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0100", handle1);
45570af302Sopenharmony_ci    dlclose(handle1);
46570af302Sopenharmony_ci}
47570af302Sopenharmony_ci
48570af302Sopenharmony_ci/**
49570af302Sopenharmony_ci * @tc.name      : dlns_inherit_0200
50570af302Sopenharmony_ci * @tc.desc      : Under the INI configuration file, when shared_libs in dlns_inherit is set, the set shared library
51570af302Sopenharmony_ci *                      name can be shared, and other than the shared library name, it will not be shared
52570af302Sopenharmony_ci * @tc.level     : Level 2
53570af302Sopenharmony_ci */
54570af302Sopenharmony_civoid dlns_inherit_0200(void)
55570af302Sopenharmony_ci{
56570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB;
57570af302Sopenharmony_ci    dlns_init(&dlnsA, "for_inherit_A");
58570af302Sopenharmony_ci    dlns_init(&dlnsB, "inherited_class");
59570af302Sopenharmony_ci
60570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0200", dlns_inherit(&dlnsA, &dlnsB, dllName), EOK);
61570af302Sopenharmony_ci
62570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlnsA, dllName, RTLD_LAZY);
63570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0200", handle);
64570af302Sopenharmony_ci    dlclose(handle);
65570af302Sopenharmony_ci
66570af302Sopenharmony_ci    void* handle1 = dlopen_ns(&dlnsA, sharedLib, RTLD_LAZY);
67570af302Sopenharmony_ci    EXPECT_FALSE("dlns_inherit_0200", handle1);
68570af302Sopenharmony_ci}
69570af302Sopenharmony_ci
70570af302Sopenharmony_ci/**
71570af302Sopenharmony_ci * @tc.name      : dlns_inherit_0300
72570af302Sopenharmony_ci * @tc.desc      : Under the INI configuration file, the library that cannot be opened
73570af302Sopenharmony_ci *                      by itself is opened through inheritance
74570af302Sopenharmony_ci * @tc.level     : Level 1
75570af302Sopenharmony_ci */
76570af302Sopenharmony_civoid dlns_inherit_0300(void)
77570af302Sopenharmony_ci{
78570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB;
79570af302Sopenharmony_ci    dlns_init(&dlnsA, "inherit_A");
80570af302Sopenharmony_ci    dlns_init(&dlnsB, "inherited_class");
81570af302Sopenharmony_ci
82570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0300", dlns_create(&dlnsA, NULL), EOK);
83570af302Sopenharmony_ci
84570af302Sopenharmony_ci    void* handle1 = dlopen_ns(&dlnsA, dllName_inh_003, RTLD_LAZY);
85570af302Sopenharmony_ci    EXPECT_FALSE("dlns_inherit_0300", handle1);
86570af302Sopenharmony_ci
87570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0300", dlns_inherit(&dlnsA, &dlnsB, dllName_inh_003), EOK);
88570af302Sopenharmony_ci
89570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlnsA, dllName_inh_003, RTLD_LAZY);
90570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0300", handle);
91570af302Sopenharmony_ci    dlclose(handle);
92570af302Sopenharmony_ci}
93570af302Sopenharmony_ci
94570af302Sopenharmony_ci/**
95570af302Sopenharmony_ci * @tc.name      : dlns_inherit_0400
96570af302Sopenharmony_ci * @tc.desc      : In the INI configuration file, inheritance cannot be passed, and cannot be opened after generation
97570af302Sopenharmony_ci * @tc.level     : Level 2
98570af302Sopenharmony_ci */
99570af302Sopenharmony_civoid dlns_inherit_0400(void)
100570af302Sopenharmony_ci{
101570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsAA, dlnsB;
102570af302Sopenharmony_ci    dlns_init(&dlnsA, "for_inherit_A");
103570af302Sopenharmony_ci    dlns_init(&dlnsAA, "for_inherit_AA");
104570af302Sopenharmony_ci    dlns_init(&dlnsB, "inherited_class");
105570af302Sopenharmony_ci
106570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0400", dlns_inherit(&dlnsA, &dlnsB, dllName), EOK);
107570af302Sopenharmony_ci
108570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlnsA, dllName, RTLD_LAZY);
109570af302Sopenharmony_ci    EXPECT_PTRNE("dlns_inherit_0400", handle, NULL);
110570af302Sopenharmony_ci    dlclose(handle);
111570af302Sopenharmony_ci
112570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0400", dlns_inherit(&dlnsAA, &dlnsA, NULL), EOK);
113570af302Sopenharmony_ci
114570af302Sopenharmony_ci    void* handle1 = dlopen_ns(&dlnsAA, dllName, RTLD_LAZY);
115570af302Sopenharmony_ci    EXPECT_FALSE("dlns_inherit_0400", handle1);
116570af302Sopenharmony_ci}
117570af302Sopenharmony_ci
118570af302Sopenharmony_ci/**
119570af302Sopenharmony_ci * @tc.name      : dlns_inherit_0500
120570af302Sopenharmony_ci * @tc.desc      : Create ns through the interface, when shared_libs in dlns_inherit is empty,
121570af302Sopenharmony_ci *                  all the libraries of the inheritor can be shared by it
122570af302Sopenharmony_ci * @tc.level     : Level 1
123570af302Sopenharmony_ci */
124570af302Sopenharmony_civoid dlns_inherit_0500(void)
125570af302Sopenharmony_ci{
126570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB;
127570af302Sopenharmony_ci    dlns_init(&dlnsA, "dlns_inherit_0500_A");
128570af302Sopenharmony_ci    dlns_init(&dlnsB, "dlns_inherit_0500_B");
129570af302Sopenharmony_ci
130570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0500", dlns_create(&dlnsA, NULL), EOK);
131570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0500", dlns_create(&dlnsB, path), EOK);
132570af302Sopenharmony_ci
133570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0500", dlns_set_namespace_separated("dlns_inherit_0500_A", true), EOK);
134570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0500", dlns_set_namespace_separated("dlns_inherit_0500_B", true), EOK);
135570af302Sopenharmony_ci
136570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0500", dlns_inherit(&dlnsA, &dlnsB, NULL), EOK);
137570af302Sopenharmony_ci
138570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlnsA, dllName, RTLD_LAZY);
139570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0500", handle);
140570af302Sopenharmony_ci    dlclose(handle);
141570af302Sopenharmony_ci
142570af302Sopenharmony_ci    handle = dlopen_ns(&dlnsA, sharedLib, RTLD_LAZY);
143570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0500", handle);
144570af302Sopenharmony_ci    dlclose(handle);
145570af302Sopenharmony_ci}
146570af302Sopenharmony_ci
147570af302Sopenharmony_ci/**
148570af302Sopenharmony_ci * @tc.name      : dlns_inherit_0600
149570af302Sopenharmony_ci * @tc.desc      : Create ns through the interface, when shared_libs in dlns_inherit is set, the set shared
150570af302Sopenharmony_ci *                  library name can be shared, other than the shared library name, it will not be shared
151570af302Sopenharmony_ci * @tc.level     : Level 2
152570af302Sopenharmony_ci */
153570af302Sopenharmony_civoid dlns_inherit_0600(void)
154570af302Sopenharmony_ci{
155570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB;
156570af302Sopenharmony_ci    dlns_init(&dlnsA, "dlns_inherit_0600_A");
157570af302Sopenharmony_ci    dlns_init(&dlnsB, "dlns_inherit_0600_B");
158570af302Sopenharmony_ci
159570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0600", dlns_create(&dlnsA, NULL), EOK);
160570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0600", dlns_create(&dlnsB, path), EOK);
161570af302Sopenharmony_ci
162570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0600", dlns_set_namespace_separated("dlns_inherit_0600_A", true), EOK);
163570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0600", dlns_set_namespace_separated("dlns_inherit_0600_B", true), EOK);
164570af302Sopenharmony_ci
165570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0600", dlns_inherit(&dlnsA, &dlnsB, dllName), EOK);
166570af302Sopenharmony_ci
167570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlnsA, dllName, RTLD_LAZY);
168570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0600", handle);
169570af302Sopenharmony_ci    dlclose(handle);
170570af302Sopenharmony_ci
171570af302Sopenharmony_ci    handle = dlopen_ns(&dlnsA, sharedLib, RTLD_LAZY);
172570af302Sopenharmony_ci    EXPECT_FALSE("dlns_inherit_0600", handle);
173570af302Sopenharmony_ci}
174570af302Sopenharmony_ci
175570af302Sopenharmony_ci/**
176570af302Sopenharmony_ci * @tc.name      : dlns_inherit_0700
177570af302Sopenharmony_ci * @tc.desc      : Create ns through interfaces, and open libraries that cannot be
178570af302Sopenharmony_ci *                  opened by themselves through inheritance.
179570af302Sopenharmony_ci * @tc.level     : Level 2
180570af302Sopenharmony_ci */
181570af302Sopenharmony_civoid dlns_inherit_0700(void)
182570af302Sopenharmony_ci{
183570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB;
184570af302Sopenharmony_ci    dlns_init(&dlnsA, "dlns_inherit_0700_A");
185570af302Sopenharmony_ci    dlns_init(&dlnsB, "dlns_inherit_0700_B");
186570af302Sopenharmony_ci
187570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0700", dlns_create(&dlnsA, NULL), EOK);
188570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0700", dlns_create(&dlnsB, path), EOK);
189570af302Sopenharmony_ci
190570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0700", dlns_set_namespace_separated("dlns_inherit_0700_A", true), EOK);
191570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0700", dlns_set_namespace_separated("dlns_inherit_0700_B", true), EOK);
192570af302Sopenharmony_ci
193570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0700", dlns_set_namespace_allowed_libs("dlns_inherit_0700_A", dllName2), EOK);
194570af302Sopenharmony_ci
195570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlnsA, dllName_inh_007, RTLD_LAZY);
196570af302Sopenharmony_ci    EXPECT_FALSE("dlns_inherit_0700", handle);
197570af302Sopenharmony_ci
198570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0700", dlns_inherit(&dlnsA, &dlnsB, NULL), EOK);
199570af302Sopenharmony_ci
200570af302Sopenharmony_ci    handle = dlopen_ns(&dlnsA, dllName_inh_007, RTLD_LAZY);
201570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0700", handle);
202570af302Sopenharmony_ci    dlclose(handle);
203570af302Sopenharmony_ci}
204570af302Sopenharmony_ci
205570af302Sopenharmony_ci/**
206570af302Sopenharmony_ci * @tc.name      : dlns_inherit_0800
207570af302Sopenharmony_ci * @tc.desc      : Create ns through an interface, inheritance cannot be passed,
208570af302Sopenharmony_ci *                      and cannot be opened between generations.
209570af302Sopenharmony_ci * @tc.level     : Level 2
210570af302Sopenharmony_ci */
211570af302Sopenharmony_civoid dlns_inherit_0800(void)
212570af302Sopenharmony_ci{
213570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB, dlnsC;
214570af302Sopenharmony_ci    dlns_init(&dlnsA, "dlns_inherit_0800_A");
215570af302Sopenharmony_ci    dlns_init(&dlnsB, "dlns_inherit_0800_B");
216570af302Sopenharmony_ci    dlns_init(&dlnsC, "dlns_inherit_0800_C");
217570af302Sopenharmony_ci
218570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0800", dlns_create(&dlnsA, NULL), EOK);
219570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0800", dlns_create(&dlnsB, NULL), EOK);
220570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0800", dlns_create(&dlnsC, path), EOK);
221570af302Sopenharmony_ci
222570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0800", dlns_set_namespace_separated("dlns_inherit_0800_A", true), EOK);
223570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0800", dlns_set_namespace_separated("dlns_inherit_0800_B", true), EOK);
224570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0800", dlns_set_namespace_separated("dlns_inherit_0800_C", true), EOK);
225570af302Sopenharmony_ci
226570af302Sopenharmony_ci    // A继承B, B继承C
227570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0800", dlns_inherit(&dlnsB, &dlnsC, NULL), EOK);
228570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0800", dlns_inherit(&dlnsA, &dlnsB, NULL), EOK);
229570af302Sopenharmony_ci
230570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlnsB, dllName_inh_008, RTLD_LAZY);
231570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0800", handle);
232570af302Sopenharmony_ci    dlclose(handle);
233570af302Sopenharmony_ci
234570af302Sopenharmony_ci    handle = dlopen_ns(&dlnsA, dllName_inh_008, RTLD_LAZY);
235570af302Sopenharmony_ci    EXPECT_FALSE("dlns_inherit_0800", handle);
236570af302Sopenharmony_ci}
237570af302Sopenharmony_ci
238570af302Sopenharmony_ci/**
239570af302Sopenharmony_ci * @tc.name      : dlns_inherit_0900
240570af302Sopenharmony_ci * @tc.desc      : Inherit multiple namespaces
241570af302Sopenharmony_ci * @tc.level     : Level 2
242570af302Sopenharmony_ci */
243570af302Sopenharmony_civoid dlns_inherit_0900(void)
244570af302Sopenharmony_ci{
245570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB, dlnsC, dlnsD;
246570af302Sopenharmony_ci    dlns_init(&dlnsA, "dlns_inherit_0900_A");
247570af302Sopenharmony_ci    dlns_init(&dlnsB, "dlns_inherit_0900_B");
248570af302Sopenharmony_ci    dlns_init(&dlnsC, "dlns_inherit_0900_C");
249570af302Sopenharmony_ci    dlns_init(&dlnsD, "dlns_inherit_0900_D");
250570af302Sopenharmony_ci
251570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_create(&dlnsA, NULL), EOK);
252570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_create(&dlnsB, pathB), EOK);
253570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_create(&dlnsC, pathC), EOK);
254570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_create(&dlnsD, pathD), EOK);
255570af302Sopenharmony_ci
256570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_set_namespace_separated("dlns_inherit_0900_A", true), EOK);
257570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_set_namespace_separated("dlns_inherit_0900_B", true), EOK);
258570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_set_namespace_separated("dlns_inherit_0900_C", true), EOK);
259570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_set_namespace_separated("dlns_inherit_0900_D", true), EOK);
260570af302Sopenharmony_ci
261570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_inherit(&dlnsA, &dlnsB, NULL), EOK);
262570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_inherit(&dlnsA, &dlnsC, NULL), EOK);
263570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_0900", dlns_inherit(&dlnsA, &dlnsD, NULL), EOK);
264570af302Sopenharmony_ci
265570af302Sopenharmony_ci    void* handle1 = dlopen_ns(&dlnsA, libB, RTLD_LAZY);
266570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0900", handle1);
267570af302Sopenharmony_ci    dlclose(handle1);
268570af302Sopenharmony_ci
269570af302Sopenharmony_ci    void* handle2 = dlopen_ns(&dlnsA, libC, RTLD_LAZY);
270570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0900", handle2);
271570af302Sopenharmony_ci    dlclose(handle2);
272570af302Sopenharmony_ci
273570af302Sopenharmony_ci    void* handle3 = dlopen_ns(&dlnsA, libD, RTLD_LAZY);
274570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_0900", handle3);
275570af302Sopenharmony_ci    dlclose(handle3);
276570af302Sopenharmony_ci}
277570af302Sopenharmony_ci
278570af302Sopenharmony_ci/**
279570af302Sopenharmony_ci * @tc.name      : dlns_inherit_1000
280570af302Sopenharmony_ci * @tc.desc      : Inherited by multiple namespaces
281570af302Sopenharmony_ci * @tc.level     : Level 2
282570af302Sopenharmony_ci */
283570af302Sopenharmony_civoid dlns_inherit_1000(void)
284570af302Sopenharmony_ci{
285570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB, dlnsC, dlnsD;
286570af302Sopenharmony_ci    dlns_init(&dlnsA, "dlns_inherit_1000_A");
287570af302Sopenharmony_ci    dlns_init(&dlnsB, "dlns_inherit_1000_B");
288570af302Sopenharmony_ci    dlns_init(&dlnsC, "dlns_inherit_1000_C");
289570af302Sopenharmony_ci    dlns_init(&dlnsD, "dlns_inherit_1000_D");
290570af302Sopenharmony_ci
291570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_create(&dlnsA, path), EOK);
292570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_create(&dlnsB, NULL), EOK);
293570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_create(&dlnsC, NULL), EOK);
294570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_create(&dlnsD, NULL), EOK);
295570af302Sopenharmony_ci
296570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_set_namespace_separated("dlns_inherit_1000_A", true), EOK);
297570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_set_namespace_separated("dlns_inherit_1000_B", true), EOK);
298570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_set_namespace_separated("dlns_inherit_1000_C", true), EOK);
299570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_set_namespace_separated("dlns_inherit_1000_D", true), EOK);
300570af302Sopenharmony_ci
301570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_inherit(&dlnsB, &dlnsA, NULL), EOK);
302570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_inherit(&dlnsC, &dlnsA, NULL), EOK);
303570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1000", dlns_inherit(&dlnsD, &dlnsA, NULL), EOK);
304570af302Sopenharmony_ci
305570af302Sopenharmony_ci    void* handle1 = dlopen_ns(&dlnsB, dllName, RTLD_LAZY);
306570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_1000", handle1);
307570af302Sopenharmony_ci    dlclose(handle1);
308570af302Sopenharmony_ci
309570af302Sopenharmony_ci    void* handle2 = dlopen_ns(&dlnsC, dllName, RTLD_LAZY);
310570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_1000", handle2);
311570af302Sopenharmony_ci    dlclose(handle2);
312570af302Sopenharmony_ci
313570af302Sopenharmony_ci    void* handle3 = dlopen_ns(&dlnsD, dllName, RTLD_LAZY);
314570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_1000", handle3);
315570af302Sopenharmony_ci    dlclose(handle3);
316570af302Sopenharmony_ci}
317570af302Sopenharmony_ci
318570af302Sopenharmony_ci/**
319570af302Sopenharmony_ci * @tc.name      : dlns_inherit_1100
320570af302Sopenharmony_ci * @tc.desc      : When repeating inheritance, replace the original inheritance relationship
321570af302Sopenharmony_ci * @tc.level     : Level 2
322570af302Sopenharmony_ci */
323570af302Sopenharmony_civoid dlns_inherit_1100(void)
324570af302Sopenharmony_ci{
325570af302Sopenharmony_ci    Dl_namespace dlnsA, dlnsB;
326570af302Sopenharmony_ci    dlns_init(&dlnsA, "dlns_inherit_1100_A");
327570af302Sopenharmony_ci    dlns_init(&dlnsB, "dlns_inherit_1100_B");
328570af302Sopenharmony_ci
329570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1100", dlns_create(&dlnsA, NULL), EOK);
330570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1100", dlns_create(&dlnsB, NULL), EOK);
331570af302Sopenharmony_ci
332570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1100", dlns_set_namespace_separated("dlns_inherit_1100_A", true), EOK);
333570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1100", dlns_set_namespace_separated("dlns_inherit_1100_B", true), EOK);
334570af302Sopenharmony_ci
335570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1100", dlns_inherit(&dlnsA, &dlnsB, NULL), EOK);
336570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlnsA, dllName_inh_011, RTLD_LAZY);
337570af302Sopenharmony_ci    EXPECT_FALSE("dlns_inherit_1100", handle);
338570af302Sopenharmony_ci
339570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1100", dlns_set_namespace_allowed_libs("dlns_inherit_1100_B", dllName_inh_011), EOK);
340570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1100", dlns_set_namespace_permitted_paths("dlns_inherit_1100_B", dllNamePath), EOK);
341570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1100", dlns_set_namespace_lib_path("dlns_inherit_1100_B", path), EOK);
342570af302Sopenharmony_ci
343570af302Sopenharmony_ci    // AGIN
344570af302Sopenharmony_ci    EXPECT_EQ("dlns_inherit_1100", dlns_inherit(&dlnsA, &dlnsB, NULL), EOK);
345570af302Sopenharmony_ci
346570af302Sopenharmony_ci    handle = dlopen_ns(&dlnsA, dllName_inh_011, RTLD_LAZY);
347570af302Sopenharmony_ci    EXPECT_TRUE("dlns_inherit_1100", handle);
348570af302Sopenharmony_ci    dlclose(handle);
349570af302Sopenharmony_ci}
350570af302Sopenharmony_ci
351570af302Sopenharmony_ciTEST_FUN G_Fun_Array[] = {
352570af302Sopenharmony_ci    dlns_inherit_0100,
353570af302Sopenharmony_ci    dlns_inherit_0200,
354570af302Sopenharmony_ci    dlns_inherit_0300,
355570af302Sopenharmony_ci    dlns_inherit_0400,
356570af302Sopenharmony_ci    dlns_inherit_0500,
357570af302Sopenharmony_ci    dlns_inherit_0600,
358570af302Sopenharmony_ci    dlns_inherit_0700,
359570af302Sopenharmony_ci    dlns_inherit_0800,
360570af302Sopenharmony_ci    dlns_inherit_0900,
361570af302Sopenharmony_ci    dlns_inherit_1000,
362570af302Sopenharmony_ci    dlns_inherit_1100,
363570af302Sopenharmony_ci};
364570af302Sopenharmony_ciint main(void)
365570af302Sopenharmony_ci{
366570af302Sopenharmony_ci    int num = sizeof(G_Fun_Array)/sizeof(TEST_FUN);
367570af302Sopenharmony_ci    for (int pos = 0; pos < num; ++pos) {
368570af302Sopenharmony_ci        G_Fun_Array[pos]();
369570af302Sopenharmony_ci    }
370570af302Sopenharmony_ci
371570af302Sopenharmony_ci    return t_status;
372570af302Sopenharmony_ci}