2
2
// Distributed under the MIT software license, see the accompanying
3
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
4
5
- #include " main.h"
6
5
#include " txmempool.h"
7
6
7
+ #include " blockmap.h"
8
+ #include " MockUtxoHasher.h"
9
+
8
10
#include < boost/test/unit_test.hpp>
9
11
#include < list>
10
12
13
+ extern CChain chainActive;
14
+ extern BlockMap mapBlockIndex;
15
+
11
16
class MempoolTestFixture
12
17
{
13
18
19
+ private:
20
+
21
+ /* * Empty coins view used to back the cached view we actually use. */
22
+ CCoinsView emptyView;
23
+
24
+ /* * Tip of our fake chain. */
25
+ CBlockIndex tip;
26
+
14
27
protected:
15
28
16
29
/* * A parent transaction. */
17
30
CMutableTransaction txParent;
18
31
19
- /* * Three children of the parent. */
32
+ /* * Three children of the parent. They use the bare txid for their UTXOs
33
+ * in our UTXO hasher. */
20
34
CMutableTransaction txChild[3 ];
21
35
22
36
/* * Three grand children. */
23
37
CMutableTransaction txGrandChild[3 ];
24
38
39
+ /* * Coins view with the parent inputs. */
40
+ CCoinsViewCache view;
41
+
25
42
/* * The test mempool instance. */
26
43
CTxMemPool testPool;
27
44
28
45
public:
29
46
30
47
MempoolTestFixture ()
31
- : testPool(CFeeRate(0 ))
48
+ : view(&emptyView), testPool(CFeeRate(0 ))
32
49
{
50
+ std::unique_ptr<MockUtxoHasher> utxoHasher (new MockUtxoHasher ());
51
+
52
+ CMutableTransaction base;
53
+ base.vout .emplace_back (99000LL , CScript () << OP_11 << OP_EQUAL);
54
+ view.ModifyCoins (base.GetHash ())->FromTx (base, 0 );
55
+
56
+ tip.pprev = nullptr ;
57
+ tip.nHeight = 0 ;
58
+ mapBlockIndex[tip.GetBlockHeader ().GetHash ()] = &tip;
59
+ view.SetBestBlock (tip.GetBlockHeader ().GetHash ());
60
+ chainActive.SetTip (&tip);
61
+
33
62
txParent.vin .resize (1 );
34
63
txParent.vin [0 ].scriptSig = CScript () << OP_11;
64
+ txParent.vin [0 ].prevout .hash = base.GetHash ();
65
+ txParent.vin [0 ].prevout .n = 0 ;
35
66
txParent.vout .resize (3 );
36
67
for (int i = 0 ; i < 3 ; i++)
37
68
{
@@ -48,18 +79,39 @@ class MempoolTestFixture
48
79
txChild[i].vout .resize (1 );
49
80
txChild[i].vout [0 ].scriptPubKey = CScript () << OP_11 << OP_EQUAL;
50
81
txChild[i].vout [0 ].nValue = 11000LL ;
82
+ utxoHasher->UseBareTxid (txChild[i]);
51
83
}
52
84
53
85
for (int i = 0 ; i < 3 ; i++)
54
86
{
55
87
txGrandChild[i].vin .resize (1 );
56
88
txGrandChild[i].vin [0 ].scriptSig = CScript () << OP_11;
57
- txGrandChild[i].vin [0 ].prevout .hash = txChild[i].GetHash ();
89
+ txGrandChild[i].vin [0 ].prevout .hash = txChild[i].GetBareTxid ();
58
90
txGrandChild[i].vin [0 ].prevout .n = 0 ;
59
91
txGrandChild[i].vout .resize (1 );
60
92
txGrandChild[i].vout [0 ].scriptPubKey = CScript () << OP_11 << OP_EQUAL;
61
93
txGrandChild[i].vout [0 ].nValue = 11000LL ;
62
94
}
95
+
96
+ testPool.setSanityCheck (true );
97
+ testPool.SetUtxoHasherForTesting (std::move (utxoHasher));
98
+ testPool.clear ();
99
+ }
100
+
101
+ ~MempoolTestFixture ()
102
+ {
103
+ mapBlockIndex.clear ();
104
+ }
105
+
106
+ /* * Adds the parent, childs and grandchilds to the mempool. */
107
+ void AddAll ()
108
+ {
109
+ testPool.addUnchecked (txParent.GetHash (), CTxMemPoolEntry (txParent, 0 , 0 , 0.0 , 1 ));
110
+ for (int i = 0 ; i < 3 ; i++)
111
+ {
112
+ testPool.addUnchecked (txChild[i].GetHash (), CTxMemPoolEntry (txChild[i], 0 , 0 , 0.0 , 1 ));
113
+ testPool.addUnchecked (txGrandChild[i].GetHash (), CTxMemPoolEntry (txGrandChild[i], 0 , 0 , 0.0 , 1 ));
114
+ }
63
115
}
64
116
65
117
};
@@ -83,12 +135,10 @@ BOOST_AUTO_TEST_CASE(MempoolRemoveTest)
83
135
removed.clear ();
84
136
85
137
// Parent, children, grandchildren:
86
- testPool.addUnchecked (txParent.GetHash (), CTxMemPoolEntry (txParent, 0 , 0 , 0.0 , 1 ));
87
- for (int i = 0 ; i < 3 ; i++)
88
- {
89
- testPool.addUnchecked (txChild[i].GetHash (), CTxMemPoolEntry (txChild[i], 0 , 0 , 0.0 , 1 ));
90
- testPool.addUnchecked (txGrandChild[i].GetHash (), CTxMemPoolEntry (txGrandChild[i], 0 , 0 , 0.0 , 1 ));
91
- }
138
+ AddAll ();
139
+
140
+ testPool.check (&view);
141
+
92
142
// Remove Child[0], GrandChild[0] should be removed:
93
143
testPool.remove (txChild[0 ], removed, true );
94
144
BOOST_CHECK_EQUAL (removed.size (), 2 );
@@ -123,12 +173,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexByBareTxid)
123
173
CTransaction tx;
124
174
std::list<CTransaction> removed;
125
175
126
- testPool.addUnchecked (txParent.GetHash (), CTxMemPoolEntry (txParent, 0 , 0 , 0.0 , 1 ));
127
- for (int i = 0 ; i < 3 ; ++i)
128
- {
129
- testPool.addUnchecked (txChild[i].GetHash (), CTxMemPoolEntry (txChild[i], 0 , 0 , 0.0 , 1 ));
130
- testPool.addUnchecked (txGrandChild[i].GetHash (), CTxMemPoolEntry (txGrandChild[i], 0 , 0 , 0.0 , 1 ));
131
- }
176
+ AddAll ();
132
177
133
178
BOOST_CHECK (testPool.lookupBareTxid (txParent.GetBareTxid (), tx));
134
179
BOOST_CHECK (tx.GetHash () == txParent.GetHash ());
@@ -140,4 +185,28 @@ BOOST_AUTO_TEST_CASE(MempoolIndexByBareTxid)
140
185
BOOST_CHECK (!testPool.lookupBareTxid (txGrandChild[0 ].GetBareTxid (), tx));
141
186
}
142
187
188
+ BOOST_AUTO_TEST_CASE (MempoolOutpointLookup)
189
+ {
190
+ CTransaction tx;
191
+ CCoins coins;
192
+
193
+ AddAll ();
194
+ CCoinsViewMemPool viewPool (&view, testPool);
195
+
196
+ BOOST_CHECK (testPool.lookupOutpoint (txParent.GetHash (), tx));
197
+ BOOST_CHECK (!testPool.lookupOutpoint (txParent.GetBareTxid (), tx));
198
+ BOOST_CHECK (!testPool.lookupOutpoint (txChild[0 ].GetHash (), tx));
199
+ BOOST_CHECK (testPool.lookupOutpoint (txChild[0 ].GetBareTxid (), tx));
200
+
201
+ BOOST_CHECK (viewPool.HaveCoins (txParent.GetHash ()));
202
+ BOOST_CHECK (viewPool.GetCoins (txParent.GetHash (), coins));
203
+ BOOST_CHECK (!viewPool.HaveCoins (txParent.GetBareTxid ()));
204
+ BOOST_CHECK (!viewPool.GetCoins (txParent.GetBareTxid (), coins));
205
+
206
+ BOOST_CHECK (!viewPool.HaveCoins (txChild[0 ].GetHash ()));
207
+ BOOST_CHECK (!viewPool.GetCoins (txChild[0 ].GetHash (), coins));
208
+ BOOST_CHECK (viewPool.HaveCoins (txChild[0 ].GetBareTxid ()));
209
+ BOOST_CHECK (viewPool.GetCoins (txChild[0 ].GetBareTxid (), coins));
210
+ }
211
+
143
212
BOOST_AUTO_TEST_SUITE_END ()
0 commit comments