@ -26,6 +26,17 @@
BOOST_FIXTURE_TEST_SUITE ( miner_tests , TestingSetup )
BOOST_FIXTURE_TEST_SUITE ( miner_tests , TestingSetup )
// BOOST_CHECK_EXCEPTION predicates to check the specific validation error
class HasReason {
public :
HasReason ( const std : : string & reason ) : m_reason ( reason ) { }
bool operator ( ) ( const std : : runtime_error & e ) const {
return std : : string ( e . what ( ) ) . find ( m_reason ) ! = std : : string : : npos ;
} ;
private :
const std : : string m_reason ;
} ;
static CFeeRate blockMinFeeRate = CFeeRate ( DEFAULT_BLOCK_MIN_TX_FEE ) ;
static CFeeRate blockMinFeeRate = CFeeRate ( DEFAULT_BLOCK_MIN_TX_FEE ) ;
static BlockAssembler AssemblerForTest ( const CChainParams & params ) {
static BlockAssembler AssemblerForTest ( const CChainParams & params ) {
@ -264,7 +275,8 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
mempool . addUnchecked ( hash , entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( spendsCoinbase ) . FromTx ( tx ) ) ;
mempool . addUnchecked ( hash , entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( spendsCoinbase ) . FromTx ( tx ) ) ;
tx . vin [ 0 ] . prevout . hash = hash ;
tx . vin [ 0 ] . prevout . hash = hash ;
}
}
BOOST_CHECK_THROW ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error ) ;
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " bad-blk-sigops " ) ) ;
mempool . clear ( ) ;
mempool . clear ( ) ;
tx . vin [ 0 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ;
tx . vin [ 0 ] . prevout . hash = txFirst [ 0 ] - > GetHash ( ) ;
@ -304,7 +316,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
// orphan in mempool, template creation fails
// orphan in mempool, template creation fails
hash = tx . GetHash ( ) ;
hash = tx . GetHash ( ) ;
mempool . addUnchecked ( hash , entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . FromTx ( tx ) ) ;
mempool . addUnchecked ( hash , entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . FromTx ( tx ) ) ;
BOOST_CHECK_THROW ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error ) ;
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " bad-txns-inputs-missingorspent " ) ) ;
mempool . clear ( ) ;
mempool . clear ( ) ;
// child with higher feerate than parent
// child with higher feerate than parent
@ -332,7 +344,8 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
hash = tx . GetHash ( ) ;
hash = tx . GetHash ( ) ;
// give it a fee so it'll get mined
// give it a fee so it'll get mined
mempool . addUnchecked ( hash , entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( false ) . FromTx ( tx ) ) ;
mempool . addUnchecked ( hash , entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( false ) . FromTx ( tx ) ) ;
BOOST_CHECK_THROW ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error ) ;
// Should throw bad-cb-multiple
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " bad-cb-multiple " ) ) ;
mempool . clear ( ) ;
mempool . clear ( ) ;
// double spend txn pair in mempool, template creation fails
// double spend txn pair in mempool, template creation fails
@ -345,7 +358,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
tx . vout [ 0 ] . scriptPubKey = CScript ( ) < < OP_2 ;
tx . vout [ 0 ] . scriptPubKey = CScript ( ) < < OP_2 ;
hash = tx . GetHash ( ) ;
hash = tx . GetHash ( ) ;
mempool . addUnchecked ( hash , entry . Fee ( HIGHFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
mempool . addUnchecked ( hash , entry . Fee ( HIGHFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( true ) . FromTx ( tx ) ) ;
BOOST_CHECK_THROW ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error ) ;
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " bad-txns-inputs-missingorspent " ) ) ;
mempool . clear ( ) ;
mempool . clear ( ) ;
// subsidy changing
// subsidy changing
@ -389,7 +402,8 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
tx . vout [ 0 ] . nValue - = LOWFEE ;
tx . vout [ 0 ] . nValue - = LOWFEE ;
hash = tx . GetHash ( ) ;
hash = tx . GetHash ( ) ;
mempool . addUnchecked ( hash , entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( false ) . FromTx ( tx ) ) ;
mempool . addUnchecked ( hash , entry . Fee ( LOWFEE ) . Time ( GetTime ( ) ) . SpendsCoinbase ( false ) . FromTx ( tx ) ) ;
BOOST_CHECK_THROW ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error ) ;
// Should throw block-validation-failed
BOOST_CHECK_EXCEPTION ( AssemblerForTest ( chainparams ) . CreateNewBlock ( scriptPubKey ) , std : : runtime_error , HasReason ( " block-validation-failed " ) ) ;
mempool . clear ( ) ;
mempool . clear ( ) ;
// Delete the dummy blocks again.
// Delete the dummy blocks again.