@@ -100,4 +100,47 @@ BOOST_AUTO_TEST_CASE(getlocator_test)
100
100
}
101
101
}
102
102
103
+ BOOST_AUTO_TEST_CASE (findearliestatleast_test)
104
+ {
105
+ std::vector<uint256> vHashMain (100000 );
106
+ std::vector<CBlockIndex> vBlocksMain (100000 );
107
+ for (unsigned int i=0 ; i<vBlocksMain.size (); i++) {
108
+ vHashMain[i] = ArithToUint256 (i); // Set the hash equal to the height
109
+ vBlocksMain[i].nHeight = i;
110
+ vBlocksMain[i].pprev = i ? &vBlocksMain[i - 1 ] : NULL ;
111
+ vBlocksMain[i].phashBlock = &vHashMain[i];
112
+ vBlocksMain[i].BuildSkip ();
113
+ if (i < 10 ) {
114
+ vBlocksMain[i].nTime = i;
115
+ vBlocksMain[i].nTimeMax = i;
116
+ } else {
117
+ // randomly choose something in the range [MTP, MTP*2]
118
+ int64_t medianTimePast = vBlocksMain[i].GetMedianTimePast ();
119
+ int r = insecure_rand () % medianTimePast;
120
+ vBlocksMain[i].nTime = r + medianTimePast;
121
+ vBlocksMain[i].nTimeMax = std::max (vBlocksMain[i].nTime , vBlocksMain[i-1 ].nTimeMax );
122
+ }
123
+ }
124
+ // Check that we set nTimeMax up correctly.
125
+ unsigned int curTimeMax = 0 ;
126
+ for (unsigned int i=0 ; i<vBlocksMain.size (); ++i) {
127
+ curTimeMax = std::max (curTimeMax, vBlocksMain[i].nTime );
128
+ BOOST_CHECK (curTimeMax == vBlocksMain[i].nTimeMax );
129
+ }
130
+
131
+ // Build a CChain for the main branch.
132
+ CChain chain;
133
+ chain.SetTip (&vBlocksMain.back ());
134
+
135
+ // Verify that FindEarliestAtLeast is correct.
136
+ for (unsigned int i=0 ; i<10000 ; ++i) {
137
+ // Pick a random element in vBlocksMain.
138
+ int r = insecure_rand () % vBlocksMain.size ();
139
+ int64_t test_time = vBlocksMain[r].nTime ;
140
+ CBlockIndex *ret = chain.FindEarliestAtLeast (test_time);
141
+ BOOST_CHECK (ret->nTimeMax >= test_time);
142
+ BOOST_CHECK ((ret->pprev ==NULL ) || ret->pprev ->nTimeMax < test_time);
143
+ BOOST_CHECK (vBlocksMain[r].GetAncestor (ret->nHeight ) == ret);
144
+ }
145
+ }
103
146
BOOST_AUTO_TEST_SUITE_END ()
0 commit comments