|
|
@ -453,4 +453,57 @@ BOOST_FIXTURE_TEST_CASE(coin_mark_dirty_immature_credit, TestChain100Setup) |
|
|
|
BOOST_CHECK_EQUAL(wtx.GetImmatureCredit(), 50*COIN); |
|
|
|
BOOST_CHECK_EQUAL(wtx.GetImmatureCredit(), 50*COIN); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int64_t AddTx(CWallet& wallet, uint32_t lockTime, int64_t mockTime, int64_t blockTime) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
CMutableTransaction tx; |
|
|
|
|
|
|
|
tx.nLockTime = lockTime; |
|
|
|
|
|
|
|
SetMockTime(mockTime); |
|
|
|
|
|
|
|
CBlockIndex* block = nullptr; |
|
|
|
|
|
|
|
if (blockTime > 0) { |
|
|
|
|
|
|
|
auto inserted = mapBlockIndex.emplace(GetRandHash(), new CBlockIndex); |
|
|
|
|
|
|
|
assert(inserted.second); |
|
|
|
|
|
|
|
const uint256& hash = inserted.first->first; |
|
|
|
|
|
|
|
block = inserted.first->second; |
|
|
|
|
|
|
|
block->nTime = blockTime; |
|
|
|
|
|
|
|
block->phashBlock = &hash; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CWalletTx wtx(&wallet, MakeTransactionRef(tx)); |
|
|
|
|
|
|
|
if (block) { |
|
|
|
|
|
|
|
wtx.SetMerkleBranch(block, 0); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
wallet.AddToWallet(wtx); |
|
|
|
|
|
|
|
return wallet.mapWallet.at(wtx.GetHash()).nTimeSmart; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Simple test to verify assignment of CWalletTx::nSmartTime value. Could be
|
|
|
|
|
|
|
|
// expanded to cover more corner cases of smart time logic.
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(ComputeTimeSmart) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
CWallet wallet; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// New transaction should use clock time if lower than block time.
|
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(AddTx(wallet, 1, 100, 120), 100); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Test that updating existing transaction does not change smart time.
|
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(AddTx(wallet, 1, 200, 220), 100); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// New transaction should use clock time if there's no block time.
|
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(AddTx(wallet, 2, 300, 0), 300); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// New transaction should use block time if lower than clock time.
|
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(AddTx(wallet, 3, 420, 400), 400); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// New transaction should use latest entry time if higher than
|
|
|
|
|
|
|
|
// min(block time, clock time).
|
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(AddTx(wallet, 4, 500, 390), 400); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If there are future entries, new transaction should use time of the
|
|
|
|
|
|
|
|
// newest entry that is no more than 300 seconds ahead of the clock time.
|
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(AddTx(wallet, 5, 50, 600), 300); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Reset mock time for other tests.
|
|
|
|
|
|
|
|
SetMockTime(0); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE_END() |
|
|
|
BOOST_AUTO_TEST_SUITE_END() |
|
|
|