MainTree/tests/internal/shadow-tag/main.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;
}