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 18570af302Sopenharmony_ci#include "dso_symver.h" 19570af302Sopenharmony_ci 20570af302Sopenharmony_ci/** 21570af302Sopenharmony_ci * @tc.name : dlvsym_no_symver_0100 22570af302Sopenharmony_ci * @tc.desc : invoke a symbol with an invalid version 23570af302Sopenharmony_ci * @tc.level : Level 2 24570af302Sopenharmony_ci */ 25570af302Sopenharmony_civoid dlvsym_no_symver_0100(void) 26570af302Sopenharmony_ci{ 27570af302Sopenharmony_ci symver_log("start"); 28570af302Sopenharmony_ci 29570af302Sopenharmony_ci void *handle = dlopen(dso_no_symver_name, RTLD_LAZY); 30570af302Sopenharmony_ci if (!handle) { 31570af302Sopenharmony_ci symver_error("%s", dlerror()); 32570af302Sopenharmony_ci return; 33570af302Sopenharmony_ci } 34570af302Sopenharmony_ci 35570af302Sopenharmony_ci // Clear any existing error 36570af302Sopenharmony_ci dlerror(); 37570af302Sopenharmony_ci 38570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_no_symver_symbol, dso_version_invalid); 39570af302Sopenharmony_ci const char *error = dlerror(); 40570af302Sopenharmony_ci if (error == NULL) { 41570af302Sopenharmony_ci symver_error(); 42570af302Sopenharmony_ci return; 43570af302Sopenharmony_ci } 44570af302Sopenharmony_ci 45570af302Sopenharmony_ci symver_log("error = %s", error); 46570af302Sopenharmony_ci 47570af302Sopenharmony_ci dlclose(handle); 48570af302Sopenharmony_ci 49570af302Sopenharmony_ci symver_log("end"); 50570af302Sopenharmony_ci} 51570af302Sopenharmony_ci 52570af302Sopenharmony_ci/** 53570af302Sopenharmony_ci * @tc.name : dlvsym_no_symver_0200 54570af302Sopenharmony_ci * @tc.desc : invoke an invalid symbol with an invalid version 55570af302Sopenharmony_ci * @tc.level : Level 2 56570af302Sopenharmony_ci */ 57570af302Sopenharmony_civoid dlvsym_no_symver_0200(void) 58570af302Sopenharmony_ci{ 59570af302Sopenharmony_ci symver_log("start"); 60570af302Sopenharmony_ci 61570af302Sopenharmony_ci void *handle = dlopen(dso_no_symver_name, RTLD_LAZY); 62570af302Sopenharmony_ci if (!handle) { 63570af302Sopenharmony_ci symver_error("%s", dlerror()); 64570af302Sopenharmony_ci return; 65570af302Sopenharmony_ci } 66570af302Sopenharmony_ci 67570af302Sopenharmony_ci // Clear any existing error 68570af302Sopenharmony_ci dlerror(); 69570af302Sopenharmony_ci 70570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_symbol_invalid, dso_version_invalid); 71570af302Sopenharmony_ci const char *error = dlerror(); 72570af302Sopenharmony_ci if (error == NULL) { 73570af302Sopenharmony_ci symver_error(); 74570af302Sopenharmony_ci return; 75570af302Sopenharmony_ci } 76570af302Sopenharmony_ci 77570af302Sopenharmony_ci symver_log("error = %s", error); 78570af302Sopenharmony_ci 79570af302Sopenharmony_ci dlclose(handle); 80570af302Sopenharmony_ci 81570af302Sopenharmony_ci symver_log("end"); 82570af302Sopenharmony_ci} 83570af302Sopenharmony_ci 84570af302Sopenharmony_ci/** 85570af302Sopenharmony_ci * @tc.name : dlvsym_easy_symver_0100 86570af302Sopenharmony_ci * @tc.desc : invoke a symbol with the default version 87570af302Sopenharmony_ci * @tc.level : Level 0 88570af302Sopenharmony_ci */ 89570af302Sopenharmony_civoid dlvsym_easy_symver_0100(void) 90570af302Sopenharmony_ci{ 91570af302Sopenharmony_ci symver_log("start"); 92570af302Sopenharmony_ci 93570af302Sopenharmony_ci void *handle = dlopen(dso_easy_symver_name, RTLD_LAZY); 94570af302Sopenharmony_ci if (!handle) { 95570af302Sopenharmony_ci symver_error("%s", dlerror()); 96570af302Sopenharmony_ci return; 97570af302Sopenharmony_ci } 98570af302Sopenharmony_ci 99570af302Sopenharmony_ci // Clear any existing error 100570af302Sopenharmony_ci dlerror(); 101570af302Sopenharmony_ci 102570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_easy_symver_symbol, dso_easy_symver_version_stable); 103570af302Sopenharmony_ci const char *error = dlerror(); 104570af302Sopenharmony_ci if (error != NULL) { 105570af302Sopenharmony_ci symver_error("%s", error); 106570af302Sopenharmony_ci return; 107570af302Sopenharmony_ci } 108570af302Sopenharmony_ci 109570af302Sopenharmony_ci const char *result = func(); 110570af302Sopenharmony_ci symver_streq(result, dso_easy_symver_symbol_stable); 111570af302Sopenharmony_ci 112570af302Sopenharmony_ci dlclose(handle); 113570af302Sopenharmony_ci 114570af302Sopenharmony_ci symver_log("end"); 115570af302Sopenharmony_ci} 116570af302Sopenharmony_ci 117570af302Sopenharmony_ci/** 118570af302Sopenharmony_ci * @tc.name : dlvsym_easy_symver_0200 119570af302Sopenharmony_ci * @tc.desc : invoke a symbol with a non-default version 120570af302Sopenharmony_ci * @tc.level : Level 1 121570af302Sopenharmony_ci */ 122570af302Sopenharmony_civoid dlvsym_easy_symver_0200(void) 123570af302Sopenharmony_ci{ 124570af302Sopenharmony_ci symver_log("start"); 125570af302Sopenharmony_ci 126570af302Sopenharmony_ci void *handle = dlopen(dso_easy_symver_name, RTLD_LAZY); 127570af302Sopenharmony_ci if (!handle) { 128570af302Sopenharmony_ci symver_error("%s", dlerror()); 129570af302Sopenharmony_ci return; 130570af302Sopenharmony_ci } 131570af302Sopenharmony_ci 132570af302Sopenharmony_ci // Clear any existing error 133570af302Sopenharmony_ci dlerror(); 134570af302Sopenharmony_ci 135570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_easy_symver_symbol, dso_easy_symver_version_old); 136570af302Sopenharmony_ci const char *error = dlerror(); 137570af302Sopenharmony_ci if (error != NULL) { 138570af302Sopenharmony_ci symver_error("%s", error); 139570af302Sopenharmony_ci return; 140570af302Sopenharmony_ci } 141570af302Sopenharmony_ci 142570af302Sopenharmony_ci const char *result = func(); 143570af302Sopenharmony_ci symver_streq(result, dso_easy_symver_symbol_old); 144570af302Sopenharmony_ci 145570af302Sopenharmony_ci dlclose(handle); 146570af302Sopenharmony_ci 147570af302Sopenharmony_ci symver_log("end"); 148570af302Sopenharmony_ci} 149570af302Sopenharmony_ci 150570af302Sopenharmony_ci/** 151570af302Sopenharmony_ci * @tc.name : dlvsym_easy_symver_0300 152570af302Sopenharmony_ci * @tc.desc : invoke an invalid symbol with an invalid version 153570af302Sopenharmony_ci * @tc.level : Level 2 154570af302Sopenharmony_ci */ 155570af302Sopenharmony_civoid dlvsym_easy_symver_0300(void) 156570af302Sopenharmony_ci{ 157570af302Sopenharmony_ci symver_log("start"); 158570af302Sopenharmony_ci 159570af302Sopenharmony_ci void *handle = dlopen(dso_easy_symver_name, RTLD_LAZY); 160570af302Sopenharmony_ci if (!handle) { 161570af302Sopenharmony_ci symver_error("%s", dlerror()); 162570af302Sopenharmony_ci return; 163570af302Sopenharmony_ci } 164570af302Sopenharmony_ci 165570af302Sopenharmony_ci // Clear any existing error 166570af302Sopenharmony_ci dlerror(); 167570af302Sopenharmony_ci 168570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_symbol_invalid, dso_version_invalid); 169570af302Sopenharmony_ci const char *error = dlerror(); 170570af302Sopenharmony_ci if (error == NULL) { 171570af302Sopenharmony_ci symver_error(); 172570af302Sopenharmony_ci return; 173570af302Sopenharmony_ci } 174570af302Sopenharmony_ci 175570af302Sopenharmony_ci symver_log("error = %s", error); 176570af302Sopenharmony_ci 177570af302Sopenharmony_ci dlclose(handle); 178570af302Sopenharmony_ci 179570af302Sopenharmony_ci symver_log("end"); 180570af302Sopenharmony_ci} 181570af302Sopenharmony_ci 182570af302Sopenharmony_ci/** 183570af302Sopenharmony_ci * @tc.name : dlvsym_easy_symver_0400 184570af302Sopenharmony_ci * @tc.desc : invoke a symbol with an invalid version 185570af302Sopenharmony_ci * @tc.level : Level 2 186570af302Sopenharmony_ci */ 187570af302Sopenharmony_civoid dlvsym_easy_symver_0400(void) 188570af302Sopenharmony_ci{ 189570af302Sopenharmony_ci symver_log("start"); 190570af302Sopenharmony_ci 191570af302Sopenharmony_ci void *handle = dlopen(dso_easy_symver_name, RTLD_LAZY); 192570af302Sopenharmony_ci if (!handle) { 193570af302Sopenharmony_ci symver_error("%s", dlerror()); 194570af302Sopenharmony_ci return; 195570af302Sopenharmony_ci } 196570af302Sopenharmony_ci 197570af302Sopenharmony_ci // Clear any existing error 198570af302Sopenharmony_ci dlerror(); 199570af302Sopenharmony_ci 200570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_easy_symver_symbol, dso_version_invalid); 201570af302Sopenharmony_ci const char *error = dlerror(); 202570af302Sopenharmony_ci if (error == NULL) { 203570af302Sopenharmony_ci symver_error(); 204570af302Sopenharmony_ci return; 205570af302Sopenharmony_ci } 206570af302Sopenharmony_ci 207570af302Sopenharmony_ci symver_log("error = %s", error); 208570af302Sopenharmony_ci 209570af302Sopenharmony_ci dlclose(handle); 210570af302Sopenharmony_ci 211570af302Sopenharmony_ci symver_log("end"); 212570af302Sopenharmony_ci} 213570af302Sopenharmony_ci 214570af302Sopenharmony_ci/** 215570af302Sopenharmony_ci * @tc.name : dlvsym_hard_symver_0100 216570af302Sopenharmony_ci * @tc.desc : invoke a symbol with the default version 217570af302Sopenharmony_ci * @tc.level : Level 0 218570af302Sopenharmony_ci */ 219570af302Sopenharmony_civoid dlvsym_hard_symver_0100(void) 220570af302Sopenharmony_ci{ 221570af302Sopenharmony_ci symver_log("start"); 222570af302Sopenharmony_ci 223570af302Sopenharmony_ci void *handle = dlopen(dso_hard_symver_name, RTLD_LAZY); 224570af302Sopenharmony_ci if (!handle) { 225570af302Sopenharmony_ci symver_error("%s", dlerror()); 226570af302Sopenharmony_ci return; 227570af302Sopenharmony_ci } 228570af302Sopenharmony_ci 229570af302Sopenharmony_ci // Clear any existing error 230570af302Sopenharmony_ci dlerror(); 231570af302Sopenharmony_ci 232570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_hard_symver_if_symbol, dso_hard_symver_version_stable); 233570af302Sopenharmony_ci const char *error = dlerror(); 234570af302Sopenharmony_ci if (error != NULL) { 235570af302Sopenharmony_ci symver_error("%s", error); 236570af302Sopenharmony_ci return; 237570af302Sopenharmony_ci } 238570af302Sopenharmony_ci 239570af302Sopenharmony_ci const char *result = func(); 240570af302Sopenharmony_ci symver_streq(result, dso_hard_symver_if_symbol_stable); 241570af302Sopenharmony_ci 242570af302Sopenharmony_ci dlclose(handle); 243570af302Sopenharmony_ci 244570af302Sopenharmony_ci symver_log("end"); 245570af302Sopenharmony_ci} 246570af302Sopenharmony_ci 247570af302Sopenharmony_ci/** 248570af302Sopenharmony_ci * @tc.name : dlvsym_hard_symver_0200 249570af302Sopenharmony_ci * @tc.desc : invoke a symbol with a non-default version 250570af302Sopenharmony_ci * @tc.level : Level 1 251570af302Sopenharmony_ci */ 252570af302Sopenharmony_civoid dlvsym_hard_symver_0200(void) 253570af302Sopenharmony_ci{ 254570af302Sopenharmony_ci symver_log("start"); 255570af302Sopenharmony_ci 256570af302Sopenharmony_ci void *handle = dlopen(dso_hard_symver_name, RTLD_LAZY); 257570af302Sopenharmony_ci if (!handle) { 258570af302Sopenharmony_ci symver_error("%s", dlerror()); 259570af302Sopenharmony_ci return; 260570af302Sopenharmony_ci } 261570af302Sopenharmony_ci 262570af302Sopenharmony_ci // Clear any existing error 263570af302Sopenharmony_ci dlerror(); 264570af302Sopenharmony_ci 265570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_hard_symver_if_symbol, dso_hard_symver_version_old); 266570af302Sopenharmony_ci const char *error = dlerror(); 267570af302Sopenharmony_ci if (error != NULL) { 268570af302Sopenharmony_ci symver_error("%s", error); 269570af302Sopenharmony_ci return; 270570af302Sopenharmony_ci } 271570af302Sopenharmony_ci 272570af302Sopenharmony_ci const char *result = func(); 273570af302Sopenharmony_ci symver_streq(result, dso_hard_symver_if_symbol_old); 274570af302Sopenharmony_ci 275570af302Sopenharmony_ci dlclose(handle); 276570af302Sopenharmony_ci 277570af302Sopenharmony_ci symver_log("end"); 278570af302Sopenharmony_ci} 279570af302Sopenharmony_ci 280570af302Sopenharmony_ci/** 281570af302Sopenharmony_ci * @tc.name : dlvsym_hard_symver_0300 282570af302Sopenharmony_ci * @tc.desc : invoke an invalid symbol with an invalid version 283570af302Sopenharmony_ci * @tc.level : Level 2 284570af302Sopenharmony_ci */ 285570af302Sopenharmony_civoid dlvsym_hard_symver_0300(void) 286570af302Sopenharmony_ci{ 287570af302Sopenharmony_ci symver_log("start"); 288570af302Sopenharmony_ci 289570af302Sopenharmony_ci void *handle = dlopen(dso_hard_symver_name, RTLD_LAZY); 290570af302Sopenharmony_ci if (!handle) { 291570af302Sopenharmony_ci symver_error("%s", dlerror()); 292570af302Sopenharmony_ci return; 293570af302Sopenharmony_ci } 294570af302Sopenharmony_ci 295570af302Sopenharmony_ci // Clear any existing error 296570af302Sopenharmony_ci dlerror(); 297570af302Sopenharmony_ci 298570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_symbol_invalid, dso_version_invalid); 299570af302Sopenharmony_ci const char *error = dlerror(); 300570af302Sopenharmony_ci if (error == NULL) { 301570af302Sopenharmony_ci symver_error(); 302570af302Sopenharmony_ci return; 303570af302Sopenharmony_ci } 304570af302Sopenharmony_ci 305570af302Sopenharmony_ci symver_log("error = %s", error); 306570af302Sopenharmony_ci 307570af302Sopenharmony_ci dlclose(handle); 308570af302Sopenharmony_ci 309570af302Sopenharmony_ci symver_log("end"); 310570af302Sopenharmony_ci} 311570af302Sopenharmony_ci 312570af302Sopenharmony_ci/** 313570af302Sopenharmony_ci * @tc.name : dlvsym_hard_symver_0400 314570af302Sopenharmony_ci * @tc.desc : invoke a symbol with an invalid version 315570af302Sopenharmony_ci * @tc.level : Level 2 316570af302Sopenharmony_ci */ 317570af302Sopenharmony_civoid dlvsym_hard_symver_0400(void) 318570af302Sopenharmony_ci{ 319570af302Sopenharmony_ci symver_log("start"); 320570af302Sopenharmony_ci 321570af302Sopenharmony_ci void *handle = dlopen(dso_hard_symver_name, RTLD_LAZY); 322570af302Sopenharmony_ci if (!handle) { 323570af302Sopenharmony_ci symver_error("%s", dlerror()); 324570af302Sopenharmony_ci return; 325570af302Sopenharmony_ci } 326570af302Sopenharmony_ci 327570af302Sopenharmony_ci // Clear any existing error 328570af302Sopenharmony_ci dlerror(); 329570af302Sopenharmony_ci 330570af302Sopenharmony_ci functype func = (functype)dlvsym(handle, dso_hard_symver_if_symbol, dso_version_invalid); 331570af302Sopenharmony_ci const char *error = dlerror(); 332570af302Sopenharmony_ci if (error == NULL) { 333570af302Sopenharmony_ci symver_error(); 334570af302Sopenharmony_ci return; 335570af302Sopenharmony_ci } 336570af302Sopenharmony_ci 337570af302Sopenharmony_ci symver_log("error = %s", error); 338570af302Sopenharmony_ci 339570af302Sopenharmony_ci dlclose(handle); 340570af302Sopenharmony_ci 341570af302Sopenharmony_ci symver_log("end"); 342570af302Sopenharmony_ci} 343570af302Sopenharmony_ci 344570af302Sopenharmony_ciint main(int argc, char *argv[]) 345570af302Sopenharmony_ci{ 346570af302Sopenharmony_ci symver_log("start"); 347570af302Sopenharmony_ci 348570af302Sopenharmony_ci dlvsym_no_symver_0100(); 349570af302Sopenharmony_ci dlvsym_no_symver_0200(); 350570af302Sopenharmony_ci 351570af302Sopenharmony_ci dlvsym_easy_symver_0100(); 352570af302Sopenharmony_ci dlvsym_easy_symver_0200(); 353570af302Sopenharmony_ci dlvsym_easy_symver_0300(); 354570af302Sopenharmony_ci dlvsym_easy_symver_0400(); 355570af302Sopenharmony_ci 356570af302Sopenharmony_ci dlvsym_hard_symver_0100(); 357570af302Sopenharmony_ci dlvsym_hard_symver_0200(); 358570af302Sopenharmony_ci dlvsym_hard_symver_0300(); 359570af302Sopenharmony_ci dlvsym_hard_symver_0400(); 360570af302Sopenharmony_ci 361570af302Sopenharmony_ci symver_log("t_status = %d", t_status); 362570af302Sopenharmony_ci symver_log("end"); 363570af302Sopenharmony_ci 364570af302Sopenharmony_ci return t_status; 365570af302Sopenharmony_ci} 366