2017-01-05 11:10:40 +01:00
// Copyright (c) 2016 The Bitcoin Core developers
// 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-30 13:56:21 +01:00
2017-01-05 11:10:40 +01:00
# include <map>
# include <stdlib.h>
2020-03-19 23:46:56 +01:00
# include <support/events.h>
2017-01-05 11:10:40 +01:00
2022-02-25 18:19:25 +01:00
# include <test/util/setup_common.h>
2017-01-05 11:10:40 +01:00
# include <boost/test/unit_test.hpp>
2020-05-31 23:55:51 +02:00
BOOST_FIXTURE_TEST_SUITE ( raii_event_tests , BasicTestingSetup )
# ifdef EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED
2017-01-05 11:10:40 +01:00
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_AUTO_TEST_CASE ( raii_event_creation )
{
event_set_mem_functions ( tag_malloc , realloc , tag_free ) ;
2020-07-29 03:23:12 +02:00
2019-08-06 05:08:33 +02:00
void * base_ptr = nullptr ;
2017-01-05 11:10:40 +01:00
{
auto base = obtain_event_base ( ) ;
base_ptr = ( void * ) base . get ( ) ;
BOOST_CHECK ( tags [ base_ptr ] = = 1 ) ;
}
BOOST_CHECK ( tags [ base_ptr ] = = 0 ) ;
2020-07-29 03:23:12 +02:00
2019-08-06 05:08:33 +02:00
void * event_ptr = nullptr ;
2017-01-05 11:10:40 +01:00
{
auto base = obtain_event_base ( ) ;
2019-08-06 05:08:33 +02:00
auto event = obtain_event ( base . get ( ) , - 1 , 0 , nullptr , nullptr ) ;
2017-01-05 11:10:40 +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 ) ;
2020-07-29 03:23:12 +02:00
2017-01-05 11:10:40 +01:00
event_set_mem_functions ( malloc , realloc , free ) ;
}
BOOST_AUTO_TEST_CASE ( raii_event_order )
{
event_set_mem_functions ( tag_malloc , realloc , tag_free ) ;
2020-07-29 03:23:12 +02:00
2019-08-06 05:08:33 +02:00
void * base_ptr = nullptr ;
void * event_ptr = nullptr ;
2017-01-05 11:10:40 +01:00
{
auto base = obtain_event_base ( ) ;
2019-08-06 05:08:33 +02:00
auto event = obtain_event ( base . get ( ) , - 1 , 0 , nullptr , nullptr ) ;
2017-01-05 11:10:40 +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 ) ;
}
2020-05-31 23:55:51 +02:00
# else
BOOST_AUTO_TEST_CASE ( raii_event_tests_SKIPPED )
{
// It would probably be ideal to report skipped, but boost::test doesn't seem to make that practical (at least not in versions available with common distros)
BOOST_TEST_MESSAGE ( " Skipping raii_event_tess: libevent doesn't support event_set_mem_functions " ) ;
}
2017-01-30 13:56:21 +01:00
# endif // EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED
2020-05-31 23:55:51 +02:00
BOOST_AUTO_TEST_SUITE_END ( )