/* * Copyright (C) 2013 Tobias Brunner * HSR 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 . * * 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 /** * 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; }