2018-12-27 18:50:45 +03:00
// Copyright (c) 2014-2018 Zano Project
// Copyright (c) 2014-2018 The Louisdor Project
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
# pragma once
# include "chaingen.h"
2020-05-27 13:12:28 +03:00
struct wallet_test : virtual public test_chain_unit_enchanced
2018-12-27 18:50:45 +03:00
{
enum { MINER_ACC_IDX = 0 , ALICE_ACC_IDX = 1 , BOB_ACC_IDX = 2 , CAROL_ACC_IDX = 3 , DAN_ACC_IDX = 4 , TOTAL_ACCS_COUNT = 5 } ; // to be used as index for m_accounts
wallet_test ( ) ;
bool need_core_proxy ( ) const { return true ; }
void set_core_proxy ( std : : shared_ptr < tools : : i_core_proxy > p ) { m_core_proxy = p ; }
bool check_balance_via_build_wallets ( currency : : core & c , size_t ev_index , const std : : vector < test_event_entry > & events ) ;
bool check_balance ( currency : : core & c , size_t ev_index , const std : : vector < test_event_entry > & events ) ;
2023-06-03 04:12:01 +02:00
void on_test_constructed ( ) override { on_test_generator_created ( this - > generator ) ; }
2022-11-01 00:11:51 +01:00
static std : : string get_test_account_name_by_id ( size_t acc_id ) ;
2023-08-24 20:32:50 +02:00
template < typename wallet_t >
2023-08-28 20:50:40 +02:00
std : : shared_ptr < wallet_t > init_playtime_test_wallet_t ( const std : : vector < test_event_entry > & events , currency : : core & c , const currency : : account_base & acc ) const
2023-08-24 20:32:50 +02:00
{
CHECK_AND_ASSERT_THROW_MES ( events . size ( ) > 0 & & events [ 0 ] . type ( ) = = typeid ( currency : : block ) , " Invalid events queue, can't find genesis block at the beginning " ) ;
2023-08-28 20:50:40 +02:00
crypto : : hash genesis_hash = get_block_hash ( boost : : get < currency : : block > ( events [ 0 ] ) ) ;
2023-08-24 20:32:50 +02:00
std : : shared_ptr < wallet_t > w ( new wallet_t ) ;
w - > set_core_runtime_config ( c . get_blockchain_storage ( ) . get_core_runtime_config ( ) ) ;
w - > assign_account ( acc ) ;
w - > set_genesis ( genesis_hash ) ;
w - > set_core_proxy ( m_core_proxy ) ;
w - > set_disable_tor_relay ( true ) ;
return w ;
}
template < typename wallet_t >
2023-08-28 20:58:26 +02:00
std : : shared_ptr < wallet_t > init_playtime_test_wallet_t ( const std : : vector < test_event_entry > & events , currency : : core & c , size_t account_index ) const
2023-08-24 20:32:50 +02:00
{
CHECK_AND_ASSERT_THROW_MES ( account_index < m_accounts . size ( ) , " Invalid account index " ) ;
return init_playtime_test_wallet_t < wallet_t > ( events , c , m_accounts [ account_index ] ) ;
}
2018-12-27 18:50:45 +03:00
protected :
struct params_check_balance
{
params_check_balance ( size_t account_index = 0 ,
uint64_t total_balance = 0 ,
uint64_t unlocked_balance = std : : numeric_limits < uint64_t > : : max ( ) ,
uint64_t mined_balance = std : : numeric_limits < uint64_t > : : max ( ) ,
uint64_t awaiting_in = std : : numeric_limits < uint64_t > : : max ( ) ,
uint64_t awaiting_out = std : : numeric_limits < uint64_t > : : max ( ) )
: account_index ( account_index ) , total_balance ( total_balance ) , unlocked_balance ( unlocked_balance ) , mined_balance ( mined_balance ) , awaiting_in ( awaiting_in ) , awaiting_out ( awaiting_out ) { }
uint64_t total_balance ;
uint64_t unlocked_balance ;
uint64_t mined_balance ;
uint64_t awaiting_in ;
uint64_t awaiting_out ;
size_t account_index ;
} ;
std : : shared_ptr < tools : : wallet2 > init_playtime_test_wallet ( const std : : vector < test_event_entry > & events , currency : : core & c , size_t account_index ) const ;
std : : shared_ptr < tools : : wallet2 > init_playtime_test_wallet ( const std : : vector < test_event_entry > & events , currency : : core & c , const currency : : account_base & acc ) const ;
mutable std : : vector < currency : : account_base > m_accounts ;
mutable test_generator generator ;
std : : shared_ptr < tools : : i_core_proxy > m_core_proxy ;
} ;
2019-11-07 13:39:46 +03:00
2023-06-13 00:16:46 +02:00
2023-06-13 23:06:55 +02:00
inline const tools : : wallet_public : : asset_balance_entry get_native_balance_entry ( const std : : list < tools : : wallet_public : : asset_balance_entry > & balances )
2023-06-13 00:16:46 +02:00
{
for ( const auto & b : balances )
{
if ( b . asset_info . asset_id = = currency : : native_coin_asset_id )
return b ;
}
return tools : : wallet_public : : asset_balance_entry ( ) ;
}
2019-11-07 13:39:46 +03:00
// wallet callback helper to check balance in wallet callbacks
// see escrow_balance test for usage example
struct wallet_callback_balance_checker : public tools : : i_wallet2_callback
{
wallet_callback_balance_checker ( const std : : string & label ) : m_label ( label ) , m_result ( true ) , m_called ( false ) , m_balance ( UINT64_MAX ) , m_unlocked_balance ( UINT64_MAX ) , m_total_mined ( UINT64_MAX ) { }
void expect_balance ( uint64_t balance = UINT64_MAX , uint64_t unlocked_balance = UINT64_MAX , uint64_t total_mined = UINT64_MAX )
{
m_balance = balance ;
m_unlocked_balance = unlocked_balance ;
m_total_mined = total_mined ;
m_called = false ;
}
2023-06-13 00:16:46 +02:00
virtual void on_transfer2 ( const tools : : wallet_public : : wallet_transfer_info & wti , const std : : list < tools : : wallet_public : : asset_balance_entry > & balances , uint64_t total_mined ) override
2019-11-07 13:39:46 +03:00
{
2023-06-13 00:16:46 +02:00
tools : : wallet_public : : asset_balance_entry native_balance = get_native_balance_entry ( balances ) ;
uint64_t balance = native_balance . total ;
uint64_t unlocked_balance = native_balance . unlocked ;
2019-11-07 13:39:46 +03:00
m_called = true ;
m_result = false ;
CHECK_AND_ASSERT_MES ( m_balance = = UINT64_MAX | | balance = = m_balance , ( void ) ( 0 ) , m_label < < " balance is incorrect: " < < currency : : print_money_brief ( balance ) < < " , expected: " < < currency : : print_money_brief ( m_balance ) ) ;
CHECK_AND_ASSERT_MES ( m_unlocked_balance = = UINT64_MAX | | unlocked_balance = = m_unlocked_balance , ( void ) ( 0 ) , m_label < < " unlocked balance is incorrect: " < < currency : : print_money_brief ( unlocked_balance ) < < " , expected: " < < currency : : print_money_brief ( m_unlocked_balance ) ) ;
CHECK_AND_ASSERT_MES ( m_total_mined = = UINT64_MAX | | total_mined = = m_total_mined , ( void ) ( 0 ) , m_label < < " total mined is incorrect: " < < currency : : print_money_brief ( total_mined ) < < " , expected: " < < currency : : print_money_brief ( m_total_mined ) ) ;
m_result = true ;
}
bool check ( )
{
bool result = m_result ;
m_result = false ; // clear result to avoid errorneous successive calls to check() without calling except_balance()
return result ;
}
bool called ( )
{
return m_called ;
}
bool m_result ;
bool m_called ;
std : : string m_label ;
uint64_t m_balance ;
uint64_t m_unlocked_balance ;
uint64_t m_total_mined ;
} ;
2020-04-28 15:51:41 +03:00
struct wlt_lambda_on_transfer2_wrapper : public tools : : i_wallet2_callback
{
2023-06-13 00:16:46 +02:00
typedef std : : function < bool ( const tools : : wallet_public : : wallet_transfer_info & , const std : : list < tools : : wallet_public : : asset_balance_entry > & , uint64_t ) > Func ;
2020-04-28 15:51:41 +03:00
wlt_lambda_on_transfer2_wrapper ( Func callback ) : m_result ( false ) , m_callback ( callback ) { }
2023-06-13 00:16:46 +02:00
virtual void on_transfer2 ( const tools : : wallet_public : : wallet_transfer_info & wti , const std : : list < tools : : wallet_public : : asset_balance_entry > & balances , uint64_t total_mined ) override
2020-04-28 15:51:41 +03:00
{
2023-06-13 00:16:46 +02:00
m_result = m_callback ( wti , balances , total_mined ) ;
2020-04-28 15:51:41 +03:00
}
bool m_result ;
Func m_callback ;
} ;
2023-08-24 17:56:59 +02:00
class debug_wallet2 : public tools : : wallet2
{
public :
epee : : misc_utils : : events_dispatcher & get_debug_events_dispatcher ( )
{
return this - > m_debug_events_dispatcher ;
}
} ;