From 9334677d81bf66348fd0c3769016035cf9f73872 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 12 Dec 2014 11:13:25 +0100 Subject: [PATCH] make tests more valgrind-friendly by not leaking memory --- s/preview | 7 ++++++- src/battle.c | 3 ++- src/battle.h | 19 ++++++++++--------- src/battle.test.c | 8 ++++++++ src/kernel/jsonconf.test.c | 1 + src/kernel/order.test.c | 24 ++++++++++++++++++++---- src/kernel/save.test.c | 2 ++ src/keyword.test.c | 3 +++ src/test_eressea.c | 13 ++++++++----- src/vortex.test.c | 1 + 10 files changed, 61 insertions(+), 20 deletions(-) diff --git a/s/preview b/s/preview index 049eaac50..94edabaf1 100755 --- a/s/preview +++ b/s/preview @@ -78,7 +78,12 @@ ln -f $LIVE/data/$turn.dat data/ rm -rf reports mkdir -p reports -$SOURCE/build-x86_64-gcc-Debug/eressea/eressea -v$verbose -t$turn -re$game $SOURCE/scripts/run-turn.lua +SERVER="$SOURCE/build-x86_64-gcc-Debug/eressea/eressea" +VALGRIND=$(which valgrind) +if [ ! -z $VALGRIND ]; then +SERVER="$VALGRIND --leak-check=no $SERVER" +fi +$SERVER -v$verbose -t$turn -re$game $SOURCE/scripts/run-turn.lua let turn=$turn+1 [ -e data/$turn.dat ] || abort "no data file created" } diff --git a/src/battle.c b/src/battle.c index 5a4cd2779..e7676d990 100644 --- a/src/battle.c +++ b/src/battle.c @@ -3675,7 +3675,7 @@ static void free_fighter(fighter * fig) } -static void free_battle(battle * b) +void free_battle(battle * b) { int max_fac_no = 0; @@ -4338,5 +4338,6 @@ void battle_free(battle * b) { } free_side(s); } + free(b); } diff --git a/src/battle.h b/src/battle.h index 95d869ff3..15e7b7257 100644 --- a/src/battle.h +++ b/src/battle.h @@ -260,15 +260,16 @@ extern "C" { extern void drain_exp(struct unit *u, int d); extern void kill_troop(troop dt); extern void remove_troop(troop dt); /* not the same as the badly named rmtroop */ - extern bool is_attacker(const fighter * fig); - - extern struct battle *make_battle(struct region * r); - extern fighter *make_fighter(struct battle *b, struct unit *u, side * s, - bool attack); - extern struct side *make_side(struct battle * b, const struct faction * f, - const struct group * g, unsigned int flags, - const struct faction * stealthfaction); - extern int skilldiff(troop at, troop dt, int dist); + + bool is_attacker(const fighter * fig); + struct battle *make_battle(struct region * r); + void free_battle(struct battle * b); + struct fighter *make_fighter(struct battle *b, struct unit *u, + struct side * s, bool attack); + struct side *make_side(struct battle * b, const struct faction * f, + const struct group * g, unsigned int flags, + const struct faction * stealthfaction); + int skilldiff(troop at, troop dt, int dist); #ifdef __cplusplus } diff --git a/src/battle.test.c b/src/battle.test.c index 47e0d69d8..ae28dd497 100644 --- a/src/battle.test.c +++ b/src/battle.test.c @@ -54,6 +54,8 @@ static void test_make_fighter(CuTest * tc) CuAssertIntEquals(tc, 3, af->magic); CuAssertIntEquals(tc, 1, af->horses); CuAssertIntEquals(tc, 0, af->elvenhorses); + free_battle(b); + test_cleanup(); } static int add_two(building * b, unit * u) { @@ -103,6 +105,8 @@ static void test_defenders_get_building_bonus(CuTest * tc) diff = skilldiff(dt, at, 0); CuAssertIntEquals(tc, 0, diff); + free_battle(b); + test_cleanup(); } static void test_attackers_get_no_building_bonus(CuTest * tc) @@ -131,6 +135,8 @@ static void test_attackers_get_no_building_bonus(CuTest * tc) af = make_fighter(b, au, as, true); CuAssertPtrEquals(tc, 0, af->building); + free_battle(b); + test_cleanup(); } static void test_building_bonus_respects_size(CuTest * tc) @@ -167,6 +173,8 @@ static void test_building_bonus_respects_size(CuTest * tc) CuAssertPtrEquals(tc, bld, af->building); CuAssertPtrEquals(tc, 0, df->building); + free_battle(b); + test_cleanup(); } CuSuite *get_battle_suite(void) diff --git a/src/kernel/jsonconf.test.c b/src/kernel/jsonconf.test.c index 42505f0bb..aeb48d667 100644 --- a/src/kernel/jsonconf.test.c +++ b/src/kernel/jsonconf.test.c @@ -113,6 +113,7 @@ static void test_findrace(CuTest *tc) { rc = findrace("Zwerg", lang); CuAssertPtrNotNull(tc, rc); CuAssertStrEquals(tc, "dwarf", rc->_name); + test_cleanup(); } static void test_items(CuTest * tc) diff --git a/src/kernel/order.test.c b/src/kernel/order.test.c index 1d556c622..d97343511 100644 --- a/src/kernel/order.test.c +++ b/src/kernel/order.test.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -13,7 +14,10 @@ static void test_create_order(CuTest *tc) { char cmd[32]; order *ord; - struct locale * lang = get_or_create_locale("en"); + struct locale * lang; + + test_cleanup(); + lang = get_or_create_locale("en"); locale_setstring(lang, "keyword::move", "MOVE"); ord = create_order(K_MOVE, lang, "NORTH"); @@ -24,12 +28,16 @@ static void test_create_order(CuTest *tc) { CuAssertIntEquals(tc, K_MOVE, init_order(ord)); CuAssertStrEquals(tc, "NORTH", getstrtoken()); free_order(ord); + test_cleanup(); } static void test_parse_order(CuTest *tc) { char cmd[32]; order *ord; - struct locale * lang = get_or_create_locale("en"); + struct locale * lang; + + test_cleanup(); + lang = get_or_create_locale("en"); locale_setstring(lang, "keyword::move", "MOVE"); ord = parse_order("MOVE NORTH", lang); @@ -40,12 +48,16 @@ static void test_parse_order(CuTest *tc) { CuAssertIntEquals(tc, K_MOVE, init_order(ord)); CuAssertStrEquals(tc, "NORTH", getstrtoken()); free_order(ord); + test_cleanup(); } static void test_parse_make(CuTest *tc) { char cmd[32]; order *ord; - struct locale * lang = get_or_create_locale("en"); + struct locale * lang; + + test_cleanup(); + lang = get_or_create_locale("en"); locale_setstring(lang, keyword(K_MAKE), "MAKE"); locale_setstring(lang, keyword(K_MAKETEMP), "MAKETEMP"); @@ -58,13 +70,16 @@ static void test_parse_make(CuTest *tc) { CuAssertIntEquals(tc, K_MAKE, init_order(ord)); CuAssertStrEquals(tc, "hurrdurr", getstrtoken()); free_order(ord); + test_cleanup(); } static void test_parse_make_temp(CuTest *tc) { char cmd[32]; order *ord; - struct locale * lang = get_or_create_locale("en"); + struct locale * lang; + test_cleanup(); + lang = get_or_create_locale("en"); locale_setstring(lang, keyword(K_MAKE), "MAKE"); locale_setstring(lang, keyword(K_MAKETEMP), "MAKETEMP"); locale_setstring(lang, "TEMP", "TEMP"); @@ -78,6 +93,7 @@ static void test_parse_make_temp(CuTest *tc) { CuAssertIntEquals(tc, K_MAKETEMP, init_order(ord)); CuAssertStrEquals(tc, "herp", getstrtoken()); free_order(ord); + test_cleanup(); } static void test_parse_maketemp(CuTest *tc) { diff --git a/src/kernel/save.test.c b/src/kernel/save.test.c index 3928c2280..cdbdbd3bf 100644 --- a/src/kernel/save.test.c +++ b/src/kernel/save.test.c @@ -12,11 +12,13 @@ static void test_readwrite_data(CuTest * tc) { const char *filename = "test.dat"; char path[MAX_PATH]; + test_cleanup(); sprintf(path, "%s/%s", datapath(), filename); CuAssertIntEquals(tc, 0, writegame(filename)); CuAssertIntEquals(tc, 0, readgame(filename, 0)); CuAssertIntEquals(tc, RELEASE_VERSION, global.data_version); CuAssertIntEquals(tc, 0, remove(path)); + test_cleanup(); } CuSuite *get_save_suite(void) diff --git a/src/keyword.test.c b/src/keyword.test.c index f2cde5ab1..977c74c86 100644 --- a/src/keyword.test.c +++ b/src/keyword.test.c @@ -42,6 +42,7 @@ static void test_findkeyword(CuTest *tc) { CuAssertIntEquals(tc, K_STUDY, findkeyword("study")); CuAssertIntEquals(tc, NOKEYWORD, findkeyword("")); CuAssertIntEquals(tc, NOKEYWORD, findkeyword("potato")); + test_cleanup(); } static void test_get_keyword_default(CuTest *tc) { @@ -51,6 +52,7 @@ static void test_get_keyword_default(CuTest *tc) { CuAssertIntEquals(tc, NOKEYWORD, get_keyword("potato", lang)); CuAssertIntEquals(tc, K_MOVE, get_keyword("move", lang)); CuAssertIntEquals(tc, K_STUDY, get_keyword("study", lang)); + test_cleanup(); } static void test_get_shortest_match(CuTest *tc) { @@ -69,6 +71,7 @@ static void test_get_shortest_match(CuTest *tc) { CuAssertIntEquals(tc, K_STATUS, get_keyword("COM", lang)); CuAssertIntEquals(tc, K_STATUS, get_keyword("COMBAT", lang)); CuAssertIntEquals(tc, K_COMBATSPELL, get_keyword("COMBATS", lang)); + test_cleanup(); } #define SUITE_DISABLE_TEST(suite, test) (void)test diff --git a/src/test_eressea.c b/src/test_eressea.c index a721141d6..8f6e5ba86 100644 --- a/src/test_eressea.c +++ b/src/test_eressea.c @@ -6,14 +6,15 @@ #pragma warning(disable: 4210) #define ADD_TESTS(suite, name) \ -CuSuite *get_##name##_suite(void); \ -CuSuiteAddSuite(suite, get_##name##_suite()) + CuSuite *get_##name##_suite(void); \ + CuSuite *name = get_##name##_suite(); \ + CuSuiteAddSuite(suite, name); int RunAllTests(void) { CuString *output = CuStringNew(); CuSuite *suite = CuSuiteNew(); - int flags = log_flags; + int result, flags = log_flags; log_flags = LOG_FLUSH | LOG_CPERROR; kernel_init(); @@ -66,8 +67,10 @@ int RunAllTests(void) CuSuiteDetails(suite, output); printf("%s\n", output->buffer); - log_flags = flags; - return suite->failCount; + log_flags = flags; + result = suite->failCount; + CuSuiteDelete(suite); + return result; } int main(int argc, char ** argv) { diff --git a/src/vortex.test.c b/src/vortex.test.c index 152def397..9ea2a70a4 100644 --- a/src/vortex.test.c +++ b/src/vortex.test.c @@ -33,6 +33,7 @@ static void test_move_to_vortex(CuTest *tc) { CuAssertIntEquals(tc, E_MOVE_NOREGION, movewhere(u, "barf", r1, &r)); CuAssertIntEquals(tc, E_MOVE_OK, movewhere(u, "wirbel", r1, &r)); CuAssertPtrEquals(tc, r2, r); + test_cleanup(); } static void test_vortex(CuTest *tc) {