Enable leak detective for all test cases

This commit is contained in:
Tobias Brunner
2013-06-11 11:03:13 +02:00
parent 2b4902973b
commit 95e9915074
14 changed files with 129 additions and 22 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ TESTS = test_runner
check_PROGRAMS = $(TESTS)
test_runner_SOURCES = \
test_runner.c test_runner.h \
test_runner.c test_runner.h test_suite.h \
test_linked_list.c test_enumerator.c test_linked_list_enumerator.c \
test_bio_reader.c test_bio_writer.c test_chunk.c test_enum.c test_hashtable.c \
test_identification.c test_threading.c test_utils.c
+1 -1
View File
@@ -13,7 +13,7 @@
* for more details.
*/
#include <check.h>
#include "test_suite.h"
#include <bio/bio_reader.h>
+1 -1
View File
@@ -13,7 +13,7 @@
* for more details.
*/
#include <check.h>
#include "test_suite.h"
#include <bio/bio_writer.h>
+1 -1
View File
@@ -15,7 +15,7 @@
*/
#include <check.h>
#include "test_suite.h"
#include <utils/chunk.h>
+1 -1
View File
@@ -13,7 +13,7 @@
* for more details.
*/
#include <check.h>
#include "test_suite.h"
#include <utils/enum.h>
#include <utils/utils.h>
+5 -3
View File
@@ -14,7 +14,7 @@
* for more details.
*/
#include <check.h>
#include "test_suite.h"
#include <collections/enumerator.h>
#include <collections/linked_list.h>
@@ -82,15 +82,17 @@ END_TEST
static int destroy_data_called;
static void setup_destroy_data()
START_SETUP(setup_destroy_data)
{
destroy_data_called = 0;
}
END_SETUP
static void teardown_destroy_data()
START_TEARDOWN(teardown_destroy_data)
{
ck_assert_int_eq(destroy_data_called, 1);
}
END_TEARDOWN
static void destroy_data(void *data)
{
+5 -3
View File
@@ -13,7 +13,7 @@
* for more details.
*/
#include <check.h>
#include "test_suite.h"
#include <collections/hashtable.h>
#include <utils/chunk.h>
@@ -38,17 +38,19 @@ static bool equals(char *key1, char *key2)
static hashtable_t *ht;
static void setup_ht()
START_SETUP(setup_ht)
{
ht = hashtable_create((hashtable_hash_t)hash,
(hashtable_equals_t)equals, 0);
ck_assert_int_eq(ht->get_count(ht), 0);
}
END_SETUP
static void teardown_ht()
START_TEARDOWN(teardown_ht)
{
ht->destroy(ht);
}
END_TEARDOWN
/*******************************************************************************
* put/get
@@ -14,7 +14,7 @@
* for more details.
*/
#include <check.h>
#include "test_suite.h"
#include <utils/identification.h>
+5 -3
View File
@@ -13,7 +13,7 @@
* for more details.
*/
#include <check.h>
#include "test_suite.h"
#include <collections/linked_list.h>
@@ -23,7 +23,7 @@
static linked_list_t *list;
static void setup_list()
START_SETUP(setup_list)
{
void *x = NULL;
@@ -32,11 +32,13 @@ static void setup_list()
ck_assert(list->get_first(list, &x) == NOT_FOUND);
ck_assert(list->get_last(list, &x) == NOT_FOUND);
}
END_SETUP
static void teardown_list()
START_TEARDOWN(teardown_list)
{
list->destroy(list);
}
END_TEARDOWN
/*******************************************************************************
* insert first/last
@@ -13,7 +13,7 @@
* for more details.
*/
#include <check.h>
#include "test_suite.h"
#include <collections/linked_list.h>
@@ -23,17 +23,19 @@
static linked_list_t *list;
static void setup_list()
START_SETUP(setup_list)
{
list = linked_list_create_with_items((void*)1, (void*)2, (void*)3, (void*)4,
(void*)5, NULL);
ck_assert_int_eq(list->get_count(list), 5);
}
END_SETUP
static void teardown_list()
START_TEARDOWN(teardown_list)
{
list->destroy(list);
}
END_TEARDOWN
/*******************************************************************************
* enumeration
+1 -1
View File
@@ -25,7 +25,7 @@ int main()
int nf;
/* test cases are forked and there is no cleanup, so disable leak detective.
* can be enabled for individual tests with leak_detective_t.set_state */
* if test_suite.h is included leak detective is enabled in test cases */
setenv("LEAK_DETECTIVE_DISABLE", "1", 1);
/* redirect all output to stderr (to redirect make's stdout to /dev/null) */
dup2(2, 1);
+99
View File
@@ -0,0 +1,99 @@
/*
* 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.
*/
#ifndef TEST_UTILS_H_
#define TEST_UTILS_H_
#include <check.h>
#include <library.h>
/**
* Used to mark test cases that use test fixtures.
*/
#define UNIT_TEST_FIXTURE_USED "UNIT_TEST_FIXTURE_USED"
/**
* Check for memory leaks and fail if any are encountered.
*/
#define CHECK_FOR_LEAKS() do \
{ \
if (lib->leak_detective->leaks(lib->leak_detective)) { \
lib->leak_detective->report(lib->leak_detective, TRUE); \
} \
ck_assert_int_eq(lib->leak_detective->leaks(lib->leak_detective), 0); \
} \
while(0)
/**
* Extended versions of the START|END_TEST macros that use leak detective.
*
* Since each test case runs in its own fork of the test runner the stuff
* allocated before the test starts is not freed, so leak detective is disabled
* by default to prevent false positives. By enabling it right when the test
* starts we at least capture leaks created by the tested objects/functions and
* the test case itself. This allows writing test cases for cleanup functions.
*
* To define test fixture with possibly allocated/destroyed memory that is
* allocated/freed in a test case use the START|END_SETUP|TEARDOWN macros.
*/
#undef START_TEST
#define START_TEST(name) \
static void name (int _i CK_ATTRIBUTE_UNUSED) \
{ \
tcase_fn_start(""#name, __FILE__, __LINE__); \
lib->leak_detective->set_state(lib->leak_detective, TRUE);
#undef END_TEST
#define END_TEST \
if (!lib->get(lib, UNIT_TEST_FIXTURE_USED)) \
{ \
CHECK_FOR_LEAKS(); \
} \
}
/**
* Define a function to setup a test fixture that can be used with the above
* macros.
*/
#define START_SETUP(name) \
static void name() \
{ \
lib->set(lib, UNIT_TEST_FIXTURE_USED, (void*)TRUE); \
lib->leak_detective->set_state(lib->leak_detective, TRUE);
/**
* End a setup function
*/
#define END_SETUP }
/**
* Define a function to teardown a test fixture that can be used with the above
* macros.
*/
#define START_TEARDOWN(name) \
static void name() \
{
/**
* End a teardown function
*/
#define END_TEARDOWN \
if (lib->get(lib, UNIT_TEST_FIXTURE_USED)) \
{ \
CHECK_FOR_LEAKS(); \
} \
}
#endif /** TEST_UTILS_H_ */
+2 -1
View File
@@ -14,10 +14,11 @@
* for more details.
*/
#include <check.h>
#include <sched.h>
#include <pthread.h>
#include "test_suite.h"
#include <threading/mutex.h>
/*******************************************************************************
+1 -2
View File
@@ -13,8 +13,7 @@
* for more details.
*/
#include <check.h>
#include "test_suite.h"
#include <library.h>
#include <utils/utils.h>