81 lines
2.3 KiB
C
81 lines
2.3 KiB
C
|
#include <shadow-tag.h>
|
||
|
#include <signal.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
TEST_CASE_NONE = 0,
|
||
|
TEST_CASE_SHADOW_TAG_POOL_CREATION,
|
||
|
TEST_CASE_SHADOW_TAG_CHAIN_CREATION,
|
||
|
TEST_CASE_SHADOW_TAG_CHAIN_PREPEND,
|
||
|
TEST_CASE_FREE_SHADOW_TAG_CHAIN,
|
||
|
TEST_CASE_STRESSTEST
|
||
|
} TestCase;
|
||
|
|
||
|
TestCase g_current_test_case = TEST_CASE_NONE;
|
||
|
int g_stresstest_iteration = 0;
|
||
|
|
||
|
const char * stringify_test_case(TestCase test_case)
|
||
|
{
|
||
|
switch(test_case)
|
||
|
{
|
||
|
case TEST_CASE_NONE: return "NONE";
|
||
|
case TEST_CASE_SHADOW_TAG_POOL_CREATION: return "SHADOW_TAG_POOL_CREATION";
|
||
|
case TEST_CASE_SHADOW_TAG_CHAIN_CREATION: return "SHADOW_TAG_CHAIN_CREATION";
|
||
|
case TEST_CASE_SHADOW_TAG_CHAIN_PREPEND: return "SHADOW_TAG_CHAIN_PREPEND";
|
||
|
case TEST_CASE_FREE_SHADOW_TAG_CHAIN: return "FREE_SHADOW_TAG_CHAIN";
|
||
|
case TEST_CASE_STRESSTEST: return "STRESSTEST";
|
||
|
}
|
||
|
return "?";
|
||
|
}
|
||
|
|
||
|
void signal_handler(int number)
|
||
|
{
|
||
|
printf("FAIL: The program crashed because of a memory error in test: %s\n",
|
||
|
stringify_test_case(g_current_test_case));
|
||
|
if(g_current_test_case == TEST_CASE_STRESSTEST)
|
||
|
printf("Iteration: %d\n", g_stresstest_iteration);
|
||
|
exit(-1);
|
||
|
}
|
||
|
|
||
|
void test_heavy_use()
|
||
|
{
|
||
|
g_current_test_case = TEST_CASE_STRESSTEST;
|
||
|
MtShadowTagPool *pool = mt_new_shadow_tag_pool(1024);
|
||
|
MtShadowTag *tag_chain = mt_alloc_shadow_tag_in_pool(pool);
|
||
|
|
||
|
while(g_stresstest_iteration < (1024 * 1024))
|
||
|
{
|
||
|
tag_chain = mt_alloc_shadow_tag_before(tag_chain);
|
||
|
++g_stresstest_iteration;
|
||
|
}
|
||
|
mt_free_shadow_tag_chain(tag_chain);
|
||
|
mt_free_shadow_tag_pool(pool);
|
||
|
}
|
||
|
|
||
|
void test_functionality()
|
||
|
{
|
||
|
g_current_test_case = TEST_CASE_SHADOW_TAG_POOL_CREATION;
|
||
|
MtShadowTagPool *pool = mt_new_shadow_tag_pool(1024);
|
||
|
|
||
|
g_current_test_case = TEST_CASE_SHADOW_TAG_CHAIN_CREATION;
|
||
|
MtShadowTag *tag_chain = mt_alloc_shadow_tag_in_pool(pool);
|
||
|
|
||
|
g_current_test_case = TEST_CASE_SHADOW_TAG_CHAIN_PREPEND;
|
||
|
tag_chain = mt_alloc_shadow_tag_before(tag_chain);
|
||
|
|
||
|
g_current_test_case = TEST_CASE_FREE_SHADOW_TAG_CHAIN;
|
||
|
mt_free_shadow_tag_chain(tag_chain);
|
||
|
mt_free_shadow_tag_pool(pool);
|
||
|
}
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
signal(SIGSEGV, &signal_handler);
|
||
|
test_functionality();
|
||
|
test_heavy_use();
|
||
|
puts("Success.");
|
||
|
return 0;
|
||
|
}
|