dlopen-tests.c revision af4ffe1001adcc0a96897e426d26444f07af9aa1
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce/*
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce SSSD
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce debug-tests.c
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce Authors:
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce Simo Sorce <simo@redhat.com>
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce Copyright (C) 2013 Red Hat
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce This program is free software; you can redistribute it and/or modify
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce it under the terms of the GNU General Public License as published by
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce the Free Software Foundation; either version 3 of the License, or
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce (at your option) any later version.
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce This program is distributed in the hope that it will be useful,
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce but WITHOUT ANY WARRANTY; without even the implied warranty of
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce GNU General Public License for more details.
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce You should have received a copy of the GNU General Public License
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce along with this program. If not, see <http://www.gnu.org/licenses/>.
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce*/
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#define _GNU_SOURCE
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#include <stdbool.h>
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#include <dlfcn.h>
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#include <stdio.h>
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#include <stdlib.h>
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#include <limits.h>
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#include <check.h>
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#include "tests/common.h"
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#define LIBPFX ABS_BUILD_DIR"/.libs/"
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorcestruct so {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce const char *name;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce const char *libs[6];
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce} so[] = {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_debug.so", { LIBPFX"libsss_debug.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libipa_hbac.so", { LIBPFX"libipa_hbac.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_idmap.so", { LIBPFX"libsss_idmap.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_nss_idmap.so", { LIBPFX"libsss_nss_idmap.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libnss_sss.so", { LIBPFX"libnss_sss.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "pam_sss.so", { LIBPFX"pam_sss.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#ifdef BUILD_SUDO
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_sudo.so", { LIBPFX"libsss_sudo.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#endif
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#ifdef BUILD_AUTOFS
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_autofs.so", { LIBPFX"libsss_autofs.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#endif
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#ifdef HAVE_KRB5_LOCATOR_PLUGIN
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "sssd_krb5_locator_plugin.so", { LIBPFX"sssd_krb5_locator_plugin.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#endif
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#ifdef HAVE_PAC_RESPONDER
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "sssd_pac_plugin.so", { LIBPFX"sssd_pac_plugin.so", NULL } },
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke#endif
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke#ifdef HAVE_CIFS_IDMAP_PLUGIN
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzke { "cifs_idmap_sss.so", { LIBPFX"cifs_idmap_sss.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#endif
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "memberof.so", { LIBPFX"memberof.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_child.so", { "libtevent.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_debug.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_crypt.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_util.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_child.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_crypt.so", { "libtalloc.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_debug.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_crypt.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_util.so", { "libtalloc.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_debug.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_crypt.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_util.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_simple.so", { LIBPFX"libdlopen_test_providers.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_simple.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_ad.so", { LIBPFX"libdlopen_test_providers.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_ad.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_ipa.so", { LIBPFX"libdlopen_test_providers.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_ipa.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_krb5.so", { LIBPFX"libdlopen_test_providers.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_krb5.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_ldap.so", { LIBPFX"libdlopen_test_providers.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_ldap.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "libsss_proxy.so", { LIBPFX"libdlopen_test_providers.so",
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce LIBPFX"libsss_proxy.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#ifdef HAVE_PYTHON_BINDINGS
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "pyhbac.so", { LIBPFX"pyhbac.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "pysss.so", { LIBPFX"pysss.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "pysss_murmur.so", { LIBPFX"pysss_murmur.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { "pysss_nss_idmap.so", { LIBPFX"pysss_nss_idmap.so", NULL } },
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce#endif
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce { NULL }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce};
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorcestatic bool recursive_dlopen(const char **name, int round, char **errmsg)
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce{
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce void *handle;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce bool ok;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce *errmsg = NULL;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce handle = dlopen(name[round], RTLD_GLOBAL|RTLD_NOW);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (!handle) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce asprintf(errmsg, "dlopen() failed: %s", dlerror());
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce return false;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce round++;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (name[round]) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ok = recursive_dlopen(name, round, errmsg);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce } else {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ok = true;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce dlclose(handle);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce return ok;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce}
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo SorceSTART_TEST(test_dlopen_base)
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce{
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce char *errmsg;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce bool ok;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce int i;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce for (i = 0; so[i].name != NULL; i++) {
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce ok = recursive_dlopen(so[i].libs, 0, &errmsg);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce fail_unless(ok, "Error opening %s: [%s]", so[i].name, errmsg);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce }
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce}
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo SorceEND_TEST
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo SorceSuite *dlopen_suite(void)
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce{
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce Suite *s = suite_create("dlopen");
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce TCase *tc_dlopen = tcase_create("dlopen");
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce tcase_add_test(tc_dlopen, test_dlopen_base);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce tcase_set_timeout(tc_dlopen, 10);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce suite_add_tcase(s, tc_dlopen);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce return s;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce}
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorceint main(int argc, const char *argv[])
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce{
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce int number_failed;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce Suite *s = dlopen_suite();
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce SRunner *sr = srunner_create(s);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce srunner_run_all(sr, CK_NORMAL);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce number_failed = srunner_ntests_failed(sr);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce srunner_free(sr);
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce if (number_failed == 0)
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce return EXIT_SUCCESS;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce return EXIT_FAILURE;
36ccdecd053a9ad88dce86b8c84770dc2aa11d21Simo Sorce}