2018-01-02 18:12:05 +01:00
// Copyright (c) 2016-2017 The Bitcoin Core developers
2016-12-21 05:43:49 +01:00
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
# include <event2/event.h>
2017-01-28 09:03:57 +01:00
# ifdef EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED
// It would probably be ideal to define dummy test(s) that report skipped, but boost::test doesn't seem to make that practical (at least not in versions available with common distros)
2016-12-21 05:43:49 +01:00
# include <map>
# include <stdlib.h>
2017-11-10 01:57:53 +01:00
# include <support/events.h>
2016-12-21 05:43:49 +01:00
2017-11-10 01:57:53 +01:00
# include <test/test_bitcoin.h>
2016-12-21 05:43:49 +01:00
# include <vector>
# include <boost/test/unit_test.hpp>
static std : : map < void * , short > tags ;
static std : : map < void * , uint16_t > orders ;
static uint16_t tagSequence = 0 ;
static void * tag_malloc ( size_t sz ) {
void * mem = malloc ( sz ) ;
if ( ! mem ) return mem ;
tags [ mem ] + + ;
orders [ mem ] = tagSequence + + ;
return mem ;
}
static void tag_free ( void * mem ) {
tags [ mem ] - - ;
orders [ mem ] = tagSequence + + ;
free ( mem ) ;
}
BOOST_FIXTURE_TEST_SUITE ( raii_event_tests , BasicTestingSetup )
BOOST_AUTO_TEST_CASE ( raii_event_creation )
{
event_set_mem_functions ( tag_malloc , realloc , tag_free ) ;
2017-08-07 07:36:37 +02:00
void * base_ptr = nullptr ;
2016-12-21 05:43:49 +01:00
{
auto base = obtain_event_base ( ) ;
base_ptr = ( void * ) base . get ( ) ;
BOOST_CHECK ( tags [ base_ptr ] = = 1 ) ;
}
BOOST_CHECK ( tags [ base_ptr ] = = 0 ) ;
2017-08-07 07:36:37 +02:00
void * event_ptr = nullptr ;
2016-12-21 05:43:49 +01:00
{
auto base = obtain_event_base ( ) ;
2017-08-07 07:36:37 +02:00
auto event = obtain_event ( base . get ( ) , - 1 , 0 , nullptr , nullptr ) ;
2016-12-21 05:43:49 +01:00
base_ptr = ( void * ) base . get ( ) ;
event_ptr = ( void * ) event . get ( ) ;
BOOST_CHECK ( tags [ base_ptr ] = = 1 ) ;
BOOST_CHECK ( tags [ event_ptr ] = = 1 ) ;
}
BOOST_CHECK ( tags [ base_ptr ] = = 0 ) ;
BOOST_CHECK ( tags [ event_ptr ] = = 0 ) ;
event_set_mem_functions ( malloc , realloc , free ) ;
}
BOOST_AUTO_TEST_CASE ( raii_event_order )
{
event_set_mem_functions ( tag_malloc , realloc , tag_free ) ;
2017-08-07 07:36:37 +02:00
void * base_ptr = nullptr ;
void * event_ptr = nullptr ;
2016-12-21 05:43:49 +01:00
{
auto base = obtain_event_base ( ) ;
2017-08-07 07:36:37 +02:00
auto event = obtain_event ( base . get ( ) , - 1 , 0 , nullptr , nullptr ) ;
2016-12-21 05:43:49 +01:00
base_ptr = ( void * ) base . get ( ) ;
event_ptr = ( void * ) event . get ( ) ;
// base should have allocated before event
BOOST_CHECK ( orders [ base_ptr ] < orders [ event_ptr ] ) ;
}
// base should be freed after event
BOOST_CHECK ( orders [ base_ptr ] > orders [ event_ptr ] ) ;
event_set_mem_functions ( malloc , realloc , free ) ;
}
BOOST_AUTO_TEST_SUITE_END ( )
2017-01-28 09:03:57 +01:00
# endif // EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED