Files
strongswan-ext/src/libstrongswan/utils/test.c
T
Martin Willi 0c34c1b3af unit-tests: Support testable functions on Windows, avoid weak GCC symbols
Instead of using weak symbols, we use dlsym() on Windows to find an arbitrary
symbol in libtest to detect its linkage. Instead of creating the associated
hashtable in the test runner, we maintain it in libstrongswan, making it
significantly simpler.
2014-06-04 15:53:12 +02:00

93 lines
1.9 KiB
C

/*
* Copyright (C) 2013 Tobias Brunner
* Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "test.h"
#include <library.h>
/**
* A collection of testable functions
*/
static hashtable_t *functions = NULL;
#ifndef WIN32
bool test_runner_available __attribute__((weak));
#endif
/**
* Check if we have libtest linkage and need testable functions
*/
static bool has_libtest_linkage()
{
#ifdef WIN32
return dlsym(RTLD_DEFAULT, "test_runner_available");
#else
return test_runner_available;
#endif
}
/*
* Described in header.
*/
void testable_function_register(char *name, void *fn)
{
bool old = FALSE;
if (lib && lib->leak_detective)
{
old = lib->leak_detective->set_state(lib->leak_detective, FALSE);
}
if (has_libtest_linkage())
{
if (!functions)
{
chunk_hash_seed();
functions = hashtable_create(hashtable_hash_str,
hashtable_equals_str, 8);
}
if (fn)
{
functions->put(functions, name, fn);
}
else
{
functions->remove(functions, name);
if (functions->get_count(functions) == 0)
{
functions->destroy(functions);
functions = NULL;
}
}
}
if (lib && lib->leak_detective)
{
lib->leak_detective->set_state(lib->leak_detective, old);
}
}
/*
* Described in header.
*/
void* testable_function_get(char *name)
{
if (functions)
{
return functions->get(functions, name);
}
return NULL;
}