Skip to content

Commit 4b06e41

Browse files
sdaftuargmaxwell
authored andcommitted
Add unit test for FindEarliestAtLeast
1 parent 997a98a commit 4b06e41

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

src/test/skiplist_tests.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,47 @@ BOOST_AUTO_TEST_CASE(getlocator_test)
100100
}
101101
}
102102

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+
}
103146
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)