1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/*
* 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;
}
|