dogecoin/src/test/main_tests.cpp
2014-05-04 01:31:43 +02:00

259 lines
9.6 KiB
C++

#include "core.h"
#include "main.h"
#include "uint256.h"
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(main_tests)
/**
* the maximum block reward at a given height for a block without fees
*/
uint64_t expectedMaxSubsidy(int height) {
if(height < 100000) {
return 1000000 * COIN;
} else if (height < 150000) {
return 500000 * COIN;
} else if (height < 200000) {
return 250000 * COIN;
} else if (height < 300000) {
return 125000 * COIN;
} else if (height < 400000) {
return 62500 * COIN;
} else if (height < 500000) {
return 31250 * COIN;
} else if (height < 600000) {
return 15625 * COIN;
} else {
return 10000 * COIN;
}
}
/**
* the minimum possible value for the maximum block reward at a given height
* for a block without fees
*/
uint64_t expectedMinSubsidy(int height) {
if(height < 100000) {
return 0;
} else if (height < 150000) {
return 0;
} else if (height < 200000) {
return 250000 * COIN;
} else if (height < 300000) {
return 125000 * COIN;
} else if (height < 400000) {
return 62500 * COIN;
} else if (height < 500000) {
return 31250 * COIN;
} else if (height < 600000) {
return 15625 * COIN;
} else {
return 10000 * COIN;
}
}
BOOST_AUTO_TEST_CASE(subsidy_limit_test)
{
int nHeight = 0;
int nStepSize= 1;
uint256 nSum = 0;
for (nHeight = 0; nHeight <= 600000; nHeight += nStepSize) {
uint64_t nSubsidy = GetBlockValue(nHeight, 0, 0);
BOOST_CHECK(MoneyRange(nSubsidy));
BOOST_CHECK(nSubsidy >= expectedMinSubsidy(nHeight));
BOOST_CHECK(nSubsidy <= expectedMaxSubsidy(nHeight));
nSum += nSubsidy * nStepSize;
}
//test sum +- ~10billion
uint256 upperlimit = uint256("95e14ec776380000"); //108 billion doge
BOOST_CHECK(nSum <= upperlimit);
uint256 lowerlimit = uint256("7a1fe16027700000"); //88 billion doge
BOOST_CHECK(nSum >= lowerlimit);
//test infinitely increasing block rewards
for (; nHeight < 700000; nHeight += nStepSize) {
uint64_t nSubsidy = GetBlockValue(nHeight, 0, 0);
BOOST_CHECK(MoneyRange(nSubsidy));
BOOST_CHECK(nSubsidy >= expectedMinSubsidy(nHeight));
BOOST_CHECK(nSubsidy <= expectedMaxSubsidy(nHeight));
nSum += nSubsidy * nStepSize;
}
//make sure that MAX_MONEY is not what some people think it is
BOOST_CHECK(nSum > MAX_MONEY);
//test subsidy in 1000 years
nHeight = 1000 * 365 * 24 * 60;
uint64_t nSubsidy = GetBlockValue(nHeight, 0, 0);
BOOST_CHECK(MoneyRange(nSubsidy));
BOOST_CHECK(nSubsidy >= expectedMinSubsidy(nHeight));
BOOST_CHECK(nSubsidy <= expectedMaxSubsidy(nHeight));
}
BOOST_AUTO_TEST_CASE(GetMinFee_test)
{
uint64_t value = 1000 * COIN;
CTransaction tx;
CTxOut txout1(value, (CScript)vector<unsigned char>(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<unsigned char>(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<unsigned char>(24, 0));
tx.vout.push_back(txout1);
for(int i=0; i<100; i++) {
CTxOut txoutn(value, (CScript)vector<unsigned char>(24, 0));
tx.vout.push_back(txoutn);
}
CTxOut txout101(1000 * COIN, (CScript)vector<unsigned char>(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<unsigned char>(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<unsigned char>(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<unsigned char>(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()