Newer
Older
#include "test_suite.h"
#include "hammer.h"
static void test_tt_user(void) {
g_check_cmp_int32(TT_USER, >, TT_NONE);
g_check_cmp_int32(TT_USER, >, TT_BYTES);
g_check_cmp_int32(TT_USER, >, TT_SINT);
g_check_cmp_int32(TT_USER, >, TT_UINT);
g_check_cmp_int32(TT_USER, >, TT_SEQUENCE);
g_check_cmp_int32(TT_USER, >, TT_ERR);
static void test_tt_registry(void) {
int id = h_allocate_token_type("com.upstandinghackers.test.token_type");
g_check_cmp_int32(id, >=, TT_USER);
int id2 = h_allocate_token_type("com.upstandinghackers.test.token_type_2");
g_check_cmp_int32(id2, !=, id);
g_check_cmp_int32(id2, >=, TT_USER);
g_check_cmp_int32(id, ==, h_get_token_type_number("com.upstandinghackers.test.token_type"));
g_check_cmp_int32(id2, ==, h_get_token_type_number("com.upstandinghackers.test.token_type_2"));
g_check_string("com.upstandinghackers.test.token_type", ==, h_get_token_type_name(id));
g_check_string("com.upstandinghackers.test.token_type_2", ==, h_get_token_type_name(id2));
if (h_get_token_type_name(0) != NULL) {
g_test_message("Unknown token type should not return a name");
g_test_fail();
}
g_check_cmp_int32(h_get_token_type_number("com.upstandinghackers.test.unkown_token_type"), ==, 0);
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
// perform a big allocation during parsing to trigger out-of-memory handling
static HParsedToken *act_big_alloc(const HParseResult *r, void *user) {
void *buf = h_arena_malloc(r->arena, 1024*1024*1024);
assert(buf != NULL);
return NULL;
}
static void test_oom(void) {
HParser *p = h_action(h_ch('x'), act_big_alloc, NULL);
// this should always fail, but never crash
struct rlimit bak, lim;
int i;
i = getrlimit(RLIMIT_DATA, &bak);
assert(i == 0);
lim.rlim_cur = 1000*1024*1024; // never enough
if(lim.rlim_cur > bak.rlim_max)
lim.rlim_cur = bak.rlim_max;
lim.rlim_max = bak.rlim_max;
i = setrlimit(RLIMIT_DATA, &lim);
assert(i == 0);
g_check_parse_failed(p, PB_PACKRAT, "x",1);
g_check_parse_failed(p, PB_REGULAR, "x",1);
g_check_parse_failed(p, PB_LLk, "x",1);
g_check_parse_failed(p, PB_LALR, "x",1);
g_check_parse_failed(p, PB_GLR, "x",1);
g_check_parse_chunks_failed(p, PB_LLk, "",0, "x",1);
//g_check_parse_chunks_failed(p, PB_LALR, "",0, "x",1);
//g_check_parse_chunks_failed(p, PB_GLR, "",0, "x",1);
i = setrlimit(RLIMIT_DATA, &bak);
assert(i == 0);
}
void register_misc_tests(void) {
g_test_add_func("/core/misc/tt_user", test_tt_user);
g_test_add_func("/core/misc/tt_registry", test_tt_registry);
g_test_add_func("/core/misc/oom", test_oom);