#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