From d2d6a973400342494a2e9e4793f2aed6756bcc92 Mon Sep 17 00:00:00 2001 From: Jannis Froese Date: Sun, 4 May 2014 01:31:43 +0200 Subject: [PATCH] add unit tests for GetMinFee --- src/test/main_tests.cpp | 159 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/src/test/main_tests.cpp b/src/test/main_tests.cpp index 453dc0b4a..50ee2f58a 100644 --- a/src/test/main_tests.cpp +++ b/src/test/main_tests.cpp @@ -96,4 +96,163 @@ BOOST_AUTO_TEST_CASE(subsidy_limit_test) BOOST_CHECK(nSubsidy <= expectedMaxSubsidy(nHeight)); } + +BOOST_AUTO_TEST_CASE(GetMinFee_test) +{ + uint64_t value = 1000 * COIN; + + CTransaction tx; + CTxOut txout1(value, (CScript)vector(24, 0)); + tx.vout.push_back(txout1); + + if(CTransaction::nMinTxFee == CTransaction::nMinRelayTxFee) + CTransaction::nMinTxFee++; + + BOOST_CHECK(GetMinFee(tx, 100, false, GMF_RELAY) == CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 100, false, GMF_SEND) == CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 1, false, GMF_RELAY) == CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 1, false, GMF_SEND) == CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 999, false, GMF_RELAY) == CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 999, false, GMF_SEND) == CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 1000, false, GMF_RELAY) == 2 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 1000, false, GMF_SEND) == 2 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 2000, false, GMF_RELAY) == 3 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 2000, false, GMF_SEND) == 3 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, MAX_STANDARD_TX_SIZE, false, GMF_RELAY) == (1+(MAX_STANDARD_TX_SIZE/1000))*CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, MAX_STANDARD_TX_SIZE, false, GMF_SEND) == (1+(MAX_STANDARD_TX_SIZE/1000))*CTransaction::nMinTxFee); +} + +BOOST_AUTO_TEST_CASE(GetMinFee_dust_test) +{ + uint64_t value = 1000; + + CTransaction tx; + CTxOut txout1(value, (CScript)vector(24, 0)); + tx.vout.push_back(txout1); + + if(CTransaction::nMinTxFee == CTransaction::nMinRelayTxFee) + CTransaction::nMinTxFee++; + + BOOST_CHECK(GetMinFee(tx, 1, false, GMF_RELAY) == 2 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 1, false, GMF_SEND) == 2 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 999, false, GMF_RELAY) == 2 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 999, false, GMF_SEND) == 2 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 1000, false, GMF_RELAY) == 3 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 1000, false, GMF_SEND) == 3 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 2000, false, GMF_RELAY) == 4 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 2000, false, GMF_SEND) == 4 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, MAX_STANDARD_TX_SIZE, false, GMF_RELAY) == (2+(MAX_STANDARD_TX_SIZE/1000))*CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, MAX_STANDARD_TX_SIZE, false, GMF_SEND) == (2+(MAX_STANDARD_TX_SIZE/1000))*CTransaction::nMinTxFee); +} + +BOOST_AUTO_TEST_CASE(GetMinFee_manydust_test) +{ + uint64_t value = 1000; + + CTransaction tx; + CTxOut txout1(1000 * COIN, (CScript)vector(24, 0)); + tx.vout.push_back(txout1); + + for(int i=0; i<100; i++) { + CTxOut txoutn(value, (CScript)vector(24, 0)); + tx.vout.push_back(txoutn); + } + + CTxOut txout101(1000 * COIN, (CScript)vector(24, 0)); + tx.vout.push_back(txout101); + + if(CTransaction::nMinTxFee == CTransaction::nMinRelayTxFee) + CTransaction::nMinTxFee++; + + BOOST_CHECK(GetMinFee(tx, 1, false, GMF_RELAY) == 101 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 1, false, GMF_SEND) == 101 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 999, false, GMF_RELAY) == 101 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 999, false, GMF_SEND) == 101 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 1000, false, GMF_RELAY) == 102 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 1000, false, GMF_SEND) == 102 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, 2000, false, GMF_RELAY) == 103 * CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, 2000, false, GMF_SEND) == 103 * CTransaction::nMinTxFee); + + BOOST_CHECK(GetMinFee(tx, MAX_STANDARD_TX_SIZE, false, GMF_RELAY) == (101+(MAX_STANDARD_TX_SIZE/1000))*CTransaction::nMinRelayTxFee); + BOOST_CHECK(GetMinFee(tx, MAX_STANDARD_TX_SIZE, false, GMF_SEND) == (101+(MAX_STANDARD_TX_SIZE/1000))*CTransaction::nMinTxFee); +} + +BOOST_AUTO_TEST_CASE(GetMinFee_relayfree_test) +{ + uint64_t value = 1000 * COIN; + + CTransaction tx; + CTxOut txout1(value, (CScript)vector(24, 0)); + tx.vout.push_back(txout1); + + if(CTransaction::nMinTxFee == CTransaction::nMinRelayTxFee) + CTransaction::nMinTxFee++; + + BOOST_CHECK(GetMinFee(tx, 100, true, GMF_RELAY) == 0); + BOOST_CHECK(GetMinFee(tx, 1000, true, GMF_RELAY) == 0); + BOOST_CHECK(GetMinFee(tx, 25999, true, GMF_RELAY) == 0); + + BOOST_CHECK(GetMinFee(tx, 26000, true, GMF_RELAY) > 0); + BOOST_CHECK(GetMinFee(tx, 26000, true, GMF_RELAY) == GetMinFee(tx, 26000, false, GMF_RELAY)); + + BOOST_CHECK(GetMinFee(tx, MAX_STANDARD_TX_SIZE, true, GMF_RELAY) == (1+(MAX_STANDARD_TX_SIZE/1000))*CTransaction::nMinRelayTxFee); +} + +BOOST_AUTO_TEST_CASE(GetMinFee_createFree_test) +{ + uint64_t value = 1000 * COIN; + + CTransaction tx; + CTxOut txout1(value, (CScript)vector(24, 0)); + tx.vout.push_back(txout1); + + if(CTransaction::nMinTxFee == CTransaction::nMinRelayTxFee) + CTransaction::nMinTxFee++; + + BOOST_CHECK(GetMinFee(tx, 100, true, GMF_SEND) == 0); + BOOST_CHECK(GetMinFee(tx, 1000, true, GMF_SEND) == 0); + BOOST_CHECK(GetMinFee(tx, 25999, true, GMF_SEND) == 0); + + BOOST_CHECK(GetMinFee(tx, 26000, true, GMF_SEND) > 0); + BOOST_CHECK(GetMinFee(tx, 26000, true, GMF_SEND) == GetMinFee(tx, 26000, false, GMF_SEND)); + + BOOST_CHECK(GetMinFee(tx, MAX_STANDARD_TX_SIZE, true, GMF_SEND) == (1+(MAX_STANDARD_TX_SIZE/1000))*CTransaction::nMinTxFee); +} + +BOOST_AUTO_TEST_CASE(GetMinFee_createNoFree_test) +{ + uint64_t value = 1000 * COIN; + + CTransaction tx; + CTxOut txout1(value, (CScript)vector(24, 0)); + tx.vout.push_back(txout1); + + if(CTransaction::nMinTxFee == CTransaction::nMinRelayTxFee) + CTransaction::nMinTxFee++; + + BOOST_CHECK(GetMinFee(tx, 100, true, GMF_SEND) > 0); + BOOST_CHECK(GetMinFee(tx, 100, true, GMF_SEND) == GetMinFee(tx, 100, false, GMF_SEND)); + BOOST_CHECK(GetMinFee(tx, 1000, true, GMF_SEND) > 0); + BOOST_CHECK(GetMinFee(tx, 1000, true, GMF_SEND) == GetMinFee(tx, 1000, false, GMF_SEND)); + BOOST_CHECK(GetMinFee(tx, 25999, true, GMF_SEND) > 0); + BOOST_CHECK(GetMinFee(tx, 25999, true, GMF_SEND) == GetMinFee(tx, 25999, false, GMF_SEND)); + + BOOST_CHECK(GetMinFee(tx, 26000, true, GMF_SEND) > 0); + BOOST_CHECK(GetMinFee(tx, 26000, true, GMF_SEND) == GetMinFee(tx, 26000, false, GMF_SEND)); + + BOOST_CHECK(GetMinFee(tx, MAX_STANDARD_TX_SIZE, true, GMF_SEND) == (1+(MAX_STANDARD_TX_SIZE/1000))*CTransaction::nMinTxFee); +} + BOOST_AUTO_TEST_SUITE_END()