123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- /* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include "testutil.h"
- #include "fspr_general.h"
- #include "fspr_pools.h"
- #include "fspr_errno.h"
- #include "fspr_dso.h"
- #include "fspr_strings.h"
- #include "fspr_file_info.h"
- #include "fspr.h"
- #if APR_HAVE_UNISTD_H
- #include <unistd.h>
- #endif
- #if APR_HAS_DSO
- #ifdef NETWARE
- # define MOD_NAME "mod_test.nlm"
- #elif defined(BEOS)
- # define MOD_NAME "mod_test.so"
- #elif defined(WIN32)
- # define MOD_NAME "mod_test.dll"
- #elif defined(DARWIN)
- # define MOD_NAME ".libs/mod_test.so"
- # define LIB_NAME ".libs/libmod_test.dylib"
- #elif defined(__hpux__) || defined(__hpux)
- # define MOD_NAME ".libs/mod_test.sl"
- # define LIB_NAME ".libs/libmod_test.sl"
- #elif defined(_AIX) || defined(__bsdi__)
- # define MOD_NAME ".libs/libmod_test.so"
- # define LIB_NAME ".libs/libmod_test.so"
- #else /* Every other Unix */
- # define MOD_NAME ".libs/mod_test.so"
- # define LIB_NAME ".libs/libmod_test.so"
- #endif
- static char *modname;
- static void test_load_module(abts_case *tc, void *data)
- {
- fspr_dso_handle_t *h = NULL;
- fspr_status_t status;
- char errstr[256];
- status = fspr_dso_load(&h, modname, p);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_dso_unload(h);
- }
- static void test_dso_sym(abts_case *tc, void *data)
- {
- fspr_dso_handle_t *h = NULL;
- fspr_dso_handle_sym_t func1 = NULL;
- fspr_status_t status;
- void (*function)(char str[256]);
- char teststr[256];
- char errstr[256];
- status = fspr_dso_load(&h, modname, p);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, h);
- status = fspr_dso_sym(&func1, h, "print_hello");
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, func1);
- if (!tc->failed) {
- function = (void (*)(char *))func1;
- (*function)(teststr);
- ABTS_STR_EQUAL(tc, "Hello - I'm a DSO!\n", teststr);
- }
- fspr_dso_unload(h);
- }
- static void test_dso_sym_return_value(abts_case *tc, void *data)
- {
- fspr_dso_handle_t *h = NULL;
- fspr_dso_handle_sym_t func1 = NULL;
- fspr_status_t status;
- int (*function)(int);
- char errstr[256];
- status = fspr_dso_load(&h, modname, p);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, h);
- status = fspr_dso_sym(&func1, h, "count_reps");
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, func1);
- if (!tc->failed) {
- function = (int (*)(int))func1;
- status = (*function)(5);
- ABTS_INT_EQUAL(tc, 5, status);
- }
- fspr_dso_unload(h);
- }
- static void test_unload_module(abts_case *tc, void *data)
- {
- fspr_dso_handle_t *h = NULL;
- fspr_status_t status;
- char errstr[256];
- fspr_dso_handle_sym_t func1 = NULL;
- status = fspr_dso_load(&h, modname, p);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, h);
- status = fspr_dso_unload(h);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- status = fspr_dso_sym(&func1, h, "print_hello");
- ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_ESYMNOTFOUND(status));
- }
- #ifdef LIB_NAME
- static char *libname;
- static void test_load_library(abts_case *tc, void *data)
- {
- fspr_dso_handle_t *h = NULL;
- fspr_status_t status;
- char errstr[256];
- status = fspr_dso_load(&h, libname, p);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_dso_unload(h);
- }
- static void test_dso_sym_library(abts_case *tc, void *data)
- {
- fspr_dso_handle_t *h = NULL;
- fspr_dso_handle_sym_t func1 = NULL;
- fspr_status_t status;
- void (*function)(char str[256]);
- char teststr[256];
- char errstr[256];
- status = fspr_dso_load(&h, libname, p);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, h);
- status = fspr_dso_sym(&func1, h, "print_hello");
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, func1);
- if (!tc->failed) {
- function = (void (*)(char *))func1;
- (*function)(teststr);
- ABTS_STR_EQUAL(tc, "Hello - I'm a DSO!\n", teststr);
- }
- fspr_dso_unload(h);
- }
- static void test_dso_sym_return_value_library(abts_case *tc, void *data)
- {
- fspr_dso_handle_t *h = NULL;
- fspr_dso_handle_sym_t func1 = NULL;
- fspr_status_t status;
- int (*function)(int);
- char errstr[256];
- status = fspr_dso_load(&h, libname, p);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, h);
- status = fspr_dso_sym(&func1, h, "count_reps");
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, func1);
- if (!tc->failed) {
- function = (int (*)(int))func1;
- status = (*function)(5);
- ABTS_INT_EQUAL(tc, 5, status);
- }
- fspr_dso_unload(h);
- }
- static void test_unload_library(abts_case *tc, void *data)
- {
- fspr_dso_handle_t *h = NULL;
- fspr_status_t status;
- char errstr[256];
- fspr_dso_handle_sym_t func1 = NULL;
- status = fspr_dso_load(&h, libname, p);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- ABTS_PTR_NOTNULL(tc, h);
- status = fspr_dso_unload(h);
- ABTS_ASSERT(tc, fspr_dso_error(h, errstr, 256), APR_SUCCESS == status);
- status = fspr_dso_sym(&func1, h, "print_hello");
- ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_ESYMNOTFOUND(status));
- }
- #endif /* def(LIB_NAME) */
- static void test_load_notthere(abts_case *tc, void *data)
- {
- fspr_dso_handle_t *h = NULL;
- fspr_status_t status;
- status = fspr_dso_load(&h, "No_File.so", p);
- ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_EDSOOPEN(status));
- ABTS_PTR_NOTNULL(tc, h);
- }
- #endif /* APR_HAS_DSO */
- abts_suite *testdso(abts_suite *suite)
- {
- suite = ADD_SUITE(suite)
- #if APR_HAS_DSO
- fspr_filepath_merge(&modname, NULL, MOD_NAME, 0, p);
-
- abts_run_test(suite, test_load_module, NULL);
- abts_run_test(suite, test_dso_sym, NULL);
- abts_run_test(suite, test_dso_sym_return_value, NULL);
- abts_run_test(suite, test_unload_module, NULL);
- #ifdef LIB_NAME
- fspr_filepath_merge(&libname, NULL, LIB_NAME, 0, p);
-
- abts_run_test(suite, test_load_library, NULL);
- abts_run_test(suite, test_dso_sym_library, NULL);
- abts_run_test(suite, test_dso_sym_return_value_library, NULL);
- abts_run_test(suite, test_unload_library, NULL);
- #endif
- abts_run_test(suite, test_load_notthere, NULL);
- #endif /* APR_HAS_DSO */
- return suite;
- }
|