#pragma once
#include "common.hpp"
#define is_valgrind() (strstr(getenv("LD_PRELOAD") ?: "", "valgrind") != NULL)
#if (HAVE_VALGRIND_MEMCHECK_H)
#include <valgrind/memcheck.h>
#define MAKE_MEM_DEFINED(p, l) VALGRIND_MAKE_MEM_DEFINED(p, l)
#define MAKE_MEM_UNDEFINED(p, l) VALGRIND_MAKE_MEM_UNDEFINED(p, l)
#else
#define MAKE_MEM_DEFINED(p, l) NOOP
#define MAKE_MEM_UNDEFINED(p, l) NOOP
#endif
#ifdef SSLBD_TEST
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#define TEST_ASSERT(expr) CPPUNIT_ASSERT(expr) ///< tests can use this to throw an assertion or simply return false
#define TEST_ASSERT_MESSAGE(msg, expr) CPPUNIT_ASSERT_MESSAGE(msg, expr)
#define TEST(name) \
class name ## _test: public CppUnit::TestCase { \
CPPUNIT_TEST_SUITE(name ## _test); \
CPPUNIT_TEST(runTest); \
CPPUNIT_TEST_SUITE_END(); \
private: static bool theTest(); \
public: void runTest() { CPPUNIT_ASSERT_MESSAGE("test '" STRINGIFY(name) "' returned with some error", theTest()); } \
}; \
CPPUNIT_TEST_SUITE_REGISTRATION(name ## _test); \
bool name ## _test::theTest()
#else
#define TEST_ASSERT(expr) if (!(expr)) return false
#define TEST_ASSERT_MESSAGE(msg, expr) TEST_ASSERT(expr)
#define TEST(name) \
UNUSED __attribute__ ((deprecated)) static bool name ## _test()
#endif