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 : dlopen_0100 27570af302Sopenharmony_ci * @tc.desc : Enter a valid path, dlopen compatibility test 28570af302Sopenharmony_ci * @tc.level : Level 0 29570af302Sopenharmony_ci */ 30570af302Sopenharmony_civoid dlopen_0100(void) 31570af302Sopenharmony_ci{ 32570af302Sopenharmony_ci void* handle = dlopen(dllNamePath, RTLD_LAZY); 33570af302Sopenharmony_ci EXPECT_TRUE("dlopen_0100", handle); 34570af302Sopenharmony_ci dlclose(handle); 35570af302Sopenharmony_ci} 36570af302Sopenharmony_ci 37570af302Sopenharmony_ci 38570af302Sopenharmony_ci/** 39570af302Sopenharmony_ci * @tc.name : dlopen_0200 40570af302Sopenharmony_ci * @tc.desc : Enter invalid path, dlopen compatibility test 41570af302Sopenharmony_ci * @tc.level : Level 2 42570af302Sopenharmony_ci */ 43570af302Sopenharmony_civoid dlopen_0200(void) 44570af302Sopenharmony_ci{ 45570af302Sopenharmony_ci void* handle = dlopen(errPath_ns, RTLD_LAZY); 46570af302Sopenharmony_ci EXPECT_FALSE("dlopen_0200", handle); 47570af302Sopenharmony_ci} 48570af302Sopenharmony_ci 49570af302Sopenharmony_ci/** 50570af302Sopenharmony_ci * @tc.name : dlns_init_0100 51570af302Sopenharmony_ci * @tc.desc : Use a string less than 255 bytes as the dlns_init parameter 52570af302Sopenharmony_ci * @tc.level : Level 1 53570af302Sopenharmony_ci */ 54570af302Sopenharmony_civoid dlns_init_0100(void) 55570af302Sopenharmony_ci{ 56570af302Sopenharmony_ci Dl_namespace dlns; 57570af302Sopenharmony_ci char n[] = "dlns_init_0100"; 58570af302Sopenharmony_ci dlns_init(&dlns, n); 59570af302Sopenharmony_ci EXPECT_EQ("dlns_init_0100", strcmp(dlns.name, n), 0); 60570af302Sopenharmony_ci} 61570af302Sopenharmony_ci 62570af302Sopenharmony_ci/** 63570af302Sopenharmony_ci * @tc.name : dlns_init_0200 64570af302Sopenharmony_ci * @tc.desc : Use very long strings as dlns_init parameters 65570af302Sopenharmony_ci * @tc.level : Level 2 66570af302Sopenharmony_ci */ 67570af302Sopenharmony_civoid dlns_init_0200(void) 68570af302Sopenharmony_ci{ 69570af302Sopenharmony_ci Dl_namespace dlns; 70570af302Sopenharmony_ci int size = 256; 71570af302Sopenharmony_ci char n[] = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 \ 72570af302Sopenharmony_ci 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 \ 73570af302Sopenharmony_ci 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 \ 74570af302Sopenharmony_ci 012345678901234567890123456789"; 75570af302Sopenharmony_ci int len = strlen(n); 76570af302Sopenharmony_ci dlns_init(&dlns, n); 77570af302Sopenharmony_ci EXPECT_TRUE("dlns_init_0200", size < len); 78570af302Sopenharmony_ci 79570af302Sopenharmony_ci int dlnslen = strlen(dlns.name); 80570af302Sopenharmony_ci EXPECT_TRUE("dlns_init_0200", size > dlnslen); 81570af302Sopenharmony_ci} 82570af302Sopenharmony_ci 83570af302Sopenharmony_ci/** 84570af302Sopenharmony_ci * @tc.name : dlns_create_0100 85570af302Sopenharmony_ci * @tc.desc : Using dlns_create, create a new namespace 86570af302Sopenharmony_ci * @tc.level : Level 1 87570af302Sopenharmony_ci */ 88570af302Sopenharmony_civoid dlns_create_0100(void) 89570af302Sopenharmony_ci{ 90570af302Sopenharmony_ci Dl_namespace dlns; 91570af302Sopenharmony_ci dlns_init(&dlns, "dlns_create_0100"); 92570af302Sopenharmony_ci 93570af302Sopenharmony_ci EXPECT_EQ("dlns_create_0100", dlns_create(&dlns, path), EOK); 94570af302Sopenharmony_ci} 95570af302Sopenharmony_ci 96570af302Sopenharmony_ci/** 97570af302Sopenharmony_ci * @tc.name : dlns_create_0200 98570af302Sopenharmony_ci * @tc.desc : Using dlns_create, create a new namespace 99570af302Sopenharmony_ci * @tc.level : Level 2 100570af302Sopenharmony_ci */ 101570af302Sopenharmony_civoid dlns_create_0200(void) 102570af302Sopenharmony_ci{ 103570af302Sopenharmony_ci // ns_no_allowed_libs already exists 104570af302Sopenharmony_ci Dl_namespace dlns; 105570af302Sopenharmony_ci dlns_init(&dlns, "ns_no_allowed_libs"); 106570af302Sopenharmony_ci 107570af302Sopenharmony_ci dlns_create(&dlns, NULL); 108570af302Sopenharmony_ci EXPECT_EQ("dlns_create_0200", dlns_create(&dlns, NULL), EEXIST); 109570af302Sopenharmony_ci} 110570af302Sopenharmony_ci 111570af302Sopenharmony_ci/** 112570af302Sopenharmony_ci * @tc.name : dlns_create_0300 113570af302Sopenharmony_ci * @tc.desc : After creating a new namespace, check lib_path validity 114570af302Sopenharmony_ci * @tc.level : Level 1 115570af302Sopenharmony_ci */ 116570af302Sopenharmony_civoid dlns_create_0300(void) 117570af302Sopenharmony_ci{ 118570af302Sopenharmony_ci // ns_no_allowed_libs already exists 119570af302Sopenharmony_ci Dl_namespace dlns; 120570af302Sopenharmony_ci dlns_init(&dlns, "dlns_create_0300"); 121570af302Sopenharmony_ci 122570af302Sopenharmony_ci EXPECT_EQ("dlns_create_0300", dlns_create(&dlns, path), EOK); 123570af302Sopenharmony_ci 124570af302Sopenharmony_ci void* handle = dlopen_ns(&dlns, dllName, RTLD_LAZY); 125570af302Sopenharmony_ci EXPECT_TRUE("dlns_create_0300", handle); 126570af302Sopenharmony_ci dlclose(handle); 127570af302Sopenharmony_ci} 128570af302Sopenharmony_ci 129570af302Sopenharmony_ci/** 130570af302Sopenharmony_ci * @tc.name : dlns_create_0400 131570af302Sopenharmony_ci * @tc.desc : Namespace creation when dlns=NULL 132570af302Sopenharmony_ci * @tc.level : Level 2 133570af302Sopenharmony_ci */ 134570af302Sopenharmony_civoid dlns_create_0400(void) 135570af302Sopenharmony_ci{ 136570af302Sopenharmony_ci EXPECT_EQ("dlns_create_0400", dlns_create(NULL, path), EINVAL); 137570af302Sopenharmony_ci} 138570af302Sopenharmony_ci 139570af302Sopenharmony_ci/** 140570af302Sopenharmony_ci * @tc.name : dlns_create_0500 141570af302Sopenharmony_ci * @tc.desc : Namespace creation when lib_path=NULL 142570af302Sopenharmony_ci * @tc.level : Level 2 143570af302Sopenharmony_ci */ 144570af302Sopenharmony_civoid dlns_create_0500(void) 145570af302Sopenharmony_ci{ 146570af302Sopenharmony_ci Dl_namespace dlns; 147570af302Sopenharmony_ci dlns_init(&dlns, "dlns_create_0500"); 148570af302Sopenharmony_ci 149570af302Sopenharmony_ci EXPECT_EQ("dlns_create_0500", dlns_create(&dlns, NULL), EOK); 150570af302Sopenharmony_ci} 151570af302Sopenharmony_ci 152570af302Sopenharmony_ci 153570af302Sopenharmony_ci/** 154570af302Sopenharmony_ci * @tc.name : dlopen_ns_0100 155570af302Sopenharmony_ci * @tc.desc : dlopen_ns valid full path test 156570af302Sopenharmony_ci * @tc.level : Level 1 157570af302Sopenharmony_ci */ 158570af302Sopenharmony_civoid dlopen_ns_0100(void) 159570af302Sopenharmony_ci{ 160570af302Sopenharmony_ci Dl_namespace dlns_default; 161570af302Sopenharmony_ci dlns_get(NULL, &dlns_default); 162570af302Sopenharmony_ci Dl_namespace dlns; 163570af302Sopenharmony_ci dlns_init(&dlns, "ns_no_allowed_libs"); 164570af302Sopenharmony_ci dlns_inherit(&dlns, &dlns_default, "libc++.so"); 165570af302Sopenharmony_ci 166570af302Sopenharmony_ci void* handle = dlopen_ns(&dlns, dllNamePath, RTLD_LAZY); 167570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_0100", handle); 168570af302Sopenharmony_ci dlclose(handle); 169570af302Sopenharmony_ci} 170570af302Sopenharmony_ci 171570af302Sopenharmony_ci/** 172570af302Sopenharmony_ci * @tc.name : dlopen_ns_0200 173570af302Sopenharmony_ci * @tc.desc : dlopen_ns invalid full path test 174570af302Sopenharmony_ci * @tc.level : Level 2 175570af302Sopenharmony_ci */ 176570af302Sopenharmony_civoid dlopen_ns_0200(void) 177570af302Sopenharmony_ci{ 178570af302Sopenharmony_ci Dl_namespace dlns_default; 179570af302Sopenharmony_ci dlns_get(NULL, &dlns_default); 180570af302Sopenharmony_ci Dl_namespace dlns; 181570af302Sopenharmony_ci dlns_init(&dlns, "ns_no_allowed_libs"); 182570af302Sopenharmony_ci dlns_inherit(&dlns, &dlns_default, "libc++.so"); 183570af302Sopenharmony_ci 184570af302Sopenharmony_ci void* handle = dlopen_ns(&dlns, errdllNamePath, RTLD_LAZY); 185570af302Sopenharmony_ci EXPECT_FALSE("dlopen_ns_0200", handle); 186570af302Sopenharmony_ci} 187570af302Sopenharmony_ci 188570af302Sopenharmony_ci/** 189570af302Sopenharmony_ci * @tc.name : dlopen_ns_0300 190570af302Sopenharmony_ci * @tc.desc : dlopen_ns valid short name test 191570af302Sopenharmony_ci * @tc.level : Level 1 192570af302Sopenharmony_ci */ 193570af302Sopenharmony_civoid dlopen_ns_0300(void) 194570af302Sopenharmony_ci{ 195570af302Sopenharmony_ci Dl_namespace dlns_default; 196570af302Sopenharmony_ci dlns_get(NULL, &dlns_default); 197570af302Sopenharmony_ci Dl_namespace dlns; 198570af302Sopenharmony_ci dlns_init(&dlns, "ns_no_allowed_libs"); 199570af302Sopenharmony_ci dlns_inherit(&dlns, &dlns_default, "libc++.so"); 200570af302Sopenharmony_ci 201570af302Sopenharmony_ci void* handle = dlopen_ns(&dlns, dllName, RTLD_LAZY); 202570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_0300", handle); 203570af302Sopenharmony_ci dlclose(handle); 204570af302Sopenharmony_ci} 205570af302Sopenharmony_ci 206570af302Sopenharmony_ci/** 207570af302Sopenharmony_ci * @tc.name : dlopen_ns_0400 208570af302Sopenharmony_ci * @tc.desc : When dlns=NULL, call dlopen_ns to load the library 209570af302Sopenharmony_ci * @tc.level : Level 1 210570af302Sopenharmony_ci */ 211570af302Sopenharmony_civoid dlopen_ns_0400(void) 212570af302Sopenharmony_ci{ 213570af302Sopenharmony_ci void* handle = dlopen_ns(NULL, dllNamePath, RTLD_LAZY); 214570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_0400", handle); 215570af302Sopenharmony_ci dlclose(handle); 216570af302Sopenharmony_ci} 217570af302Sopenharmony_ci 218570af302Sopenharmony_ci/** 219570af302Sopenharmony_ci * @tc.name : dlopen_ns_0500 220570af302Sopenharmony_ci * @tc.desc : When file=NULL, call dlopen_ns to load the library 221570af302Sopenharmony_ci * @tc.level : Level 2 222570af302Sopenharmony_ci */ 223570af302Sopenharmony_civoid dlopen_ns_0500(void) 224570af302Sopenharmony_ci{ 225570af302Sopenharmony_ci Dl_namespace dlns; 226570af302Sopenharmony_ci dlns_init(&dlns, "ns_no_allowed_libs"); 227570af302Sopenharmony_ci 228570af302Sopenharmony_ci void *handle = dlopen_ns(&dlns, NULL, RTLD_LAZY); 229570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_0500", handle); 230570af302Sopenharmony_ci dlclose(handle); 231570af302Sopenharmony_ci} 232570af302Sopenharmony_ci 233570af302Sopenharmony_ci/** 234570af302Sopenharmony_ci * @tc.name : dlns_get_0100 235570af302Sopenharmony_ci * @tc.desc : Gets an existing namespace handle. 236570af302Sopenharmony_ci * @tc.level : Level 1 237570af302Sopenharmony_ci */ 238570af302Sopenharmony_civoid dlns_get_0100(void) 239570af302Sopenharmony_ci{ 240570af302Sopenharmony_ci Dl_namespace dlns; 241570af302Sopenharmony_ci dlns_init(&dlns, "dlns_get_0100"); 242570af302Sopenharmony_ci dlns_create(&dlns, NULL); 243570af302Sopenharmony_ci dlns_get("dlns_get_0100", &dlns); 244570af302Sopenharmony_ci EXPECT_EQ("dlns_get_0100", strcmp(dlns.name, "dlns_get_0100"), 0); 245570af302Sopenharmony_ci} 246570af302Sopenharmony_ci 247570af302Sopenharmony_ci/** 248570af302Sopenharmony_ci * @tc.name : dlns_get_0200 249570af302Sopenharmony_ci * @tc.desc : Gets the current namespace handle when name=NULL. 250570af302Sopenharmony_ci * @tc.level : Level 1 251570af302Sopenharmony_ci */ 252570af302Sopenharmony_civoid dlns_get_0200(void) 253570af302Sopenharmony_ci{ 254570af302Sopenharmony_ci Dl_namespace dlns; 255570af302Sopenharmony_ci dlns_get(NULL, &dlns); 256570af302Sopenharmony_ci EXPECT_EQ("dlns_get_0200", strcmp(dlns.name, "default"), 0); 257570af302Sopenharmony_ci} 258570af302Sopenharmony_ci 259570af302Sopenharmony_ci/** 260570af302Sopenharmony_ci * @tc.name : dlns_get_0300 261570af302Sopenharmony_ci * @tc.desc : Call dlns_get when dlns=NULL. 262570af302Sopenharmony_ci * @tc.level : Level 2 263570af302Sopenharmony_ci */ 264570af302Sopenharmony_civoid dlns_get_0300(void) 265570af302Sopenharmony_ci{ 266570af302Sopenharmony_ci dlns_get(NULL, NULL); 267570af302Sopenharmony_ci EXPECT_EQ("dlns_get_0300", dlns_get(NULL, NULL), EINVAL); 268570af302Sopenharmony_ci} 269570af302Sopenharmony_ci 270570af302Sopenharmony_ci/** 271570af302Sopenharmony_ci * @tc.name : dlns_get_0400 272570af302Sopenharmony_ci * @tc.desc : Gets a namespace handle that does not exist. 273570af302Sopenharmony_ci * @tc.level : Level 2 274570af302Sopenharmony_ci */ 275570af302Sopenharmony_civoid dlns_get_0400(void) 276570af302Sopenharmony_ci{ 277570af302Sopenharmony_ci Dl_namespace dlns; 278570af302Sopenharmony_ci dlns_init(&dlns, "dlns_get_0400"); 279570af302Sopenharmony_ci EXPECT_EQ("dlns_get_0400", dlns_get("dlns_get_0400", &dlns), ENOKEY); 280570af302Sopenharmony_ci} 281570af302Sopenharmony_ci 282570af302Sopenharmony_ci/** 283570af302Sopenharmony_ci * @tc.name : dlopen_add_reloc 284570af302Sopenharmony_ci * @tc.desc : Test add_reloc_can_search_dso: not enough memory. 285570af302Sopenharmony_ci * Dlopen lib whth more than 32 dependent libs.(libace.z.so) 286570af302Sopenharmony_ci * @tc.level : Level 1 287570af302Sopenharmony_ci */ 288570af302Sopenharmony_civoid dlopen_add_reloc(void) 289570af302Sopenharmony_ci{ 290570af302Sopenharmony_ci void* handle = dlopen(dllAcePath, RTLD_LAZY); 291570af302Sopenharmony_ci EXPECT_TRUE("dlopen_add_reloc", handle); 292570af302Sopenharmony_ci} 293570af302Sopenharmony_ci 294570af302Sopenharmony_ci/** 295570af302Sopenharmony_ci * @tc.name : dlopen_relocation 296570af302Sopenharmony_ci * @tc.desc : Test dlopen lib relocation type is REL_DTPMOD/REL_DTPOFF.(libstd.dylib.so) 297570af302Sopenharmony_ci * @tc.level : Level 1 298570af302Sopenharmony_ci */ 299570af302Sopenharmony_civoid dlopen_relocation(void) 300570af302Sopenharmony_ci{ 301570af302Sopenharmony_ci void* handle = dlopen(dllDylibPath, RTLD_LAZY); 302570af302Sopenharmony_ci EXPECT_TRUE("dlopen_relocation", handle); 303570af302Sopenharmony_ci if(handle){ 304570af302Sopenharmony_ci dlclose(handle); 305570af302Sopenharmony_ci } 306570af302Sopenharmony_ci} 307570af302Sopenharmony_ci 308570af302Sopenharmony_ci/** 309570af302Sopenharmony_ci * @tc.name : dlopen_hash_type 310570af302Sopenharmony_ci * @tc.desc : Test dlopen lib hash type is sysv.(libdlopen_hash_sysv.so) 311570af302Sopenharmony_ci * @tc.level : Level 1 312570af302Sopenharmony_ci */ 313570af302Sopenharmony_civoid dlopen_hash_type(void) 314570af302Sopenharmony_ci{ 315570af302Sopenharmony_ci void* handle = dlopen(dllHashsysvPath, RTLD_LAZY); 316570af302Sopenharmony_ci EXPECT_TRUE("dlopen_hash_type", handle); 317570af302Sopenharmony_ci if(handle){ 318570af302Sopenharmony_ci dlclose(handle); 319570af302Sopenharmony_ci } 320570af302Sopenharmony_ci} 321570af302Sopenharmony_ci 322570af302Sopenharmony_ci/** 323570af302Sopenharmony_ci * @tc.name : dlopen_set_rpath 324570af302Sopenharmony_ci * @tc.desc : Test dlopen lib by set rpath.(libdlopen_hash_sysv.so) 325570af302Sopenharmony_ci * @tc.level : Level 1 326570af302Sopenharmony_ci */ 327570af302Sopenharmony_civoid dlopen_set_rpath(void) 328570af302Sopenharmony_ci{ 329570af302Sopenharmony_ci void* handle = dlopen(dllHashsysv, RTLD_LAZY); 330570af302Sopenharmony_ci EXPECT_TRUE("dlopen_set_rpath", handle); 331570af302Sopenharmony_ci if(handle){ 332570af302Sopenharmony_ci dlclose(handle); 333570af302Sopenharmony_ci } 334570af302Sopenharmony_ci} 335570af302Sopenharmony_ci 336570af302Sopenharmony_ci/** 337570af302Sopenharmony_ci * @tc.name : dlopen_fill_random 338570af302Sopenharmony_ci * @tc.desc : Test dlopen lib libdlopen_fill_random.so to coverage fill_random_data. 339570af302Sopenharmony_ci * @tc.level : Level 1 340570af302Sopenharmony_ci */ 341570af302Sopenharmony_civoid dlopen_fill_random(void) 342570af302Sopenharmony_ci{ 343570af302Sopenharmony_ci void* handle = dlopen(dllFillRandom, RTLD_LAZY); 344570af302Sopenharmony_ci EXPECT_TRUE("dlopen_fill_random", handle); 345570af302Sopenharmony_ci if(handle){ 346570af302Sopenharmony_ci dlclose(handle); 347570af302Sopenharmony_ci } 348570af302Sopenharmony_ci} 349570af302Sopenharmony_ci 350570af302Sopenharmony_ciTEST_FUN G_Fun_Array[] = { 351570af302Sopenharmony_ci dlopen_0100, 352570af302Sopenharmony_ci dlopen_0200, 353570af302Sopenharmony_ci dlns_init_0100, 354570af302Sopenharmony_ci dlns_init_0200, 355570af302Sopenharmony_ci dlns_create_0100, 356570af302Sopenharmony_ci dlns_create_0200, 357570af302Sopenharmony_ci dlns_create_0300, 358570af302Sopenharmony_ci dlns_create_0400, 359570af302Sopenharmony_ci dlns_create_0500, 360570af302Sopenharmony_ci dlopen_ns_0100, 361570af302Sopenharmony_ci dlopen_ns_0200, 362570af302Sopenharmony_ci dlopen_ns_0300, 363570af302Sopenharmony_ci dlopen_ns_0400, 364570af302Sopenharmony_ci dlopen_ns_0500, 365570af302Sopenharmony_ci dlns_get_0100, 366570af302Sopenharmony_ci dlns_get_0200, 367570af302Sopenharmony_ci dlns_get_0300, 368570af302Sopenharmony_ci dlns_get_0400, 369570af302Sopenharmony_ci dlopen_relocation, 370570af302Sopenharmony_ci dlopen_hash_type, 371570af302Sopenharmony_ci dlopen_set_rpath, 372570af302Sopenharmony_ci dlopen_fill_random, 373570af302Sopenharmony_ci dlopen_add_reloc, 374570af302Sopenharmony_ci}; 375570af302Sopenharmony_ci 376570af302Sopenharmony_ciint main(void) 377570af302Sopenharmony_ci{ 378570af302Sopenharmony_ci int num = sizeof(G_Fun_Array)/sizeof(TEST_FUN); 379570af302Sopenharmony_ci for (int pos = 0; pos < num; ++pos) { 380570af302Sopenharmony_ci G_Fun_Array[pos](); 381570af302Sopenharmony_ci } 382570af302Sopenharmony_ci 383570af302Sopenharmony_ci return t_status; 384570af302Sopenharmony_ci}