blob: 395ad0c3f55dfaa4ee1ccb383099bf589478365f [file] [log] [blame]
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <assert.h>
int main(int argc, char* argv[])
{
#if defined(__FreeBSD__)
// workaround for Bugzilla 14824
void *druntime = dlopen(argv[1], RTLD_LAZY); // load druntime
assert(druntime);
#endif
#if defined(__DragonFly__)
// workaround for Bugzilla 14824
void *druntime = dlopen(argv[1], RTLD_LAZY); // load druntime
assert(druntime);
#endif
const size_t pathlen = strrchr(argv[0], '/') - argv[0] + 1;
char *name = malloc(pathlen + sizeof("plugin1.so"));
memcpy(name, argv[0], pathlen);
memcpy(name+pathlen, "plugin1.so", sizeof("plugin1.so"));
void* plugin1 = dlopen(name, RTLD_LAZY);
name[pathlen + sizeof("plugin1.so") - 5] = '2';
void* plugin2 = dlopen(name, RTLD_LAZY);
int (*plugin1_init)() = dlsym(plugin1, "plugin_init");
int (*plugin1_term)() = dlsym(plugin1, "plugin_term");
int (*runTests1)() = dlsym(plugin1, "runTests");
int (*plugin2_init)() = dlsym(plugin2, "plugin_init");
int (*plugin2_term)() = dlsym(plugin2, "plugin_term");
int (*runTests2)() = dlsym(plugin2, "runTests");
assert(plugin1_init());
assert(runTests1());
assert(plugin2_init());
assert(runTests2());
assert(plugin1_term());
assert(dlclose(plugin1) == 0);
assert(runTests2());
name[pathlen + sizeof("plugin1.so") - 5] = '1';
plugin1 = dlopen(name, RTLD_LAZY);
plugin1_init = dlsym(plugin1, "plugin_init");
plugin1_term = dlsym(plugin1, "plugin_term");
runTests1 = dlsym(plugin1, "runTests");
assert(plugin1_init());
assert(runTests1());
assert(runTests2());
assert(plugin2_term());
assert(dlclose(plugin2) == 0);
assert(runTests1());
assert(plugin1_term());
assert(dlclose(plugin1) == 0);
free(name);
#if defined(__FreeBSD__)
dlclose(druntime);
#endif
#if defined(__DragonFly__)
dlclose(druntime);
#endif
return EXIT_SUCCESS;
}