aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorPeter Todd <pete@petertodd.org>2014-01-26 21:50:15 -0500
committerPeter Todd <pete@petertodd.org>2014-01-26 21:50:15 -0500
commit665bdd3bc9ba4ac566edf5ba3fa8bbd93eb4780f (patch)
treee365b2e271d8df98f88982c6fe27608dd9eb7fe1 /src/test
parentd0a94f2c2f127768acd9be4c0905d40f609ba6fc (diff)
downloadbitcoin-665bdd3bc9ba4ac566edf5ba3fa8bbd93eb4780f.tar.xz
Fix off-by-one errors in use of IsFinalTx()
Previously CreateNewBlock() didn't take into account the fact that IsFinalTx() without any arguments tests if the transaction is considered final in the *current* block, when both those functions really needed to know if the transaction would be final in the *next* block. Additionally the UI had a similar misunderstanding. Also adds some basic tests to check that CreateNewBlock() is in fact mining nLockTime-using transactions correctly. Thanks to Wladimir J. van der Laan for rebase.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/miner_tests.cpp51
1 files changed, 50 insertions, 1 deletions
diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp
index 8e3091d555..d35137a663 100644
--- a/src/test/miner_tests.cpp
+++ b/src/test/miner_tests.cpp
@@ -51,7 +51,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
{
CScript scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
CBlockTemplate *pblocktemplate;
- CTransaction tx;
+ CTransaction tx,tx2;
CScript script;
uint256 hash;
@@ -204,8 +204,57 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
delete pblocktemplate;
chainActive.Tip()->nHeight = nHeight;
+ // non-final txs in mempool
+ SetMockTime(chainActive.Tip()->GetMedianTimePast()+1);
+
+ // height locked
+ tx.vin[0].prevout.hash = txFirst[0]->GetHash();
+ tx.vin[0].scriptSig = CScript() << OP_1;
+ tx.vin[0].nSequence = 0;
+ tx.vout[0].nValue = 4900000000LL;
+ tx.vout[0].scriptPubKey = CScript() << OP_1;
+ tx.nLockTime = chainActive.Tip()->nHeight+1;
+ hash = tx.GetHash();
+ mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11));
+ BOOST_CHECK(!IsFinalTx(tx, chainActive.Tip()->nHeight + 1));
+
+ // time locked
+ tx2.vin.resize(1);
+ tx2.vin[0].prevout.hash = txFirst[1]->GetHash();
+ tx2.vin[0].prevout.n = 0;
+ tx2.vin[0].scriptSig = CScript() << OP_1;
+ tx2.vin[0].nSequence = 0;
+ tx2.vout.resize(1);
+ tx2.vout[0].nValue = 4900000000LL;
+ tx2.vout[0].scriptPubKey = CScript() << OP_1;
+ tx2.nLockTime = chainActive.Tip()->GetMedianTimePast()+1;
+ hash = tx2.GetHash();
+ mempool.addUnchecked(hash, CTxMemPoolEntry(tx2, 11, GetTime(), 111.0, 11));
+ BOOST_CHECK(!IsFinalTx(tx2));
+
+ BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey));
+
+ // Neither tx should have make it into the template.
+ BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 1);
+ delete pblocktemplate;
+
+ // However if we advance height and time by one, both will.
+ chainActive.Tip()->nHeight++;
+ SetMockTime(chainActive.Tip()->GetMedianTimePast()+2);
+
+ BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 1));
+ BOOST_CHECK(IsFinalTx(tx2));
+
+ BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey));
+ BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 3);
+ delete pblocktemplate;
+
+ chainActive.Tip()->nHeight--;
+ SetMockTime(0);
+
BOOST_FOREACH(CTransaction *tx, txFirst)
delete tx;
+
}
BOOST_AUTO_TEST_CASE(sha256transform_equality)