Changeset View
Changeset View
Standalone View
Standalone View
src/test/skiplist_tests.cpp
Show First 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | for (int i = 0; i < 1000; i++) { | ||||
BOOST_CHECK(vIndex[from].GetAncestor(0) == vIndex.data()); | BOOST_CHECK(vIndex[from].GetAncestor(0) == vIndex.data()); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(getlocator_test) { | BOOST_AUTO_TEST_CASE(getlocator_test) { | ||||
// Build a main chain 100000 blocks long. | // Build a main chain 100000 blocks long. | ||||
std::vector<uint256> vHashMain(100000); | std::vector<uint256> vHashMain(100000); | ||||
std::vector<CBlockIndex> vBlocksMain(100000); | std::vector<CBlockIndex> vBlocksMain(100000); | ||||
for (unsigned int i = 0; i < vBlocksMain.size(); i++) { | for (size_t i = 0; i < vBlocksMain.size(); i++) { | ||||
// Set the hash equal to the height, so we can quickly check the | // Set the hash equal to the height, so we can quickly check the | ||||
// distances. | // distances. | ||||
vHashMain[i] = ArithToUint256(i); | vHashMain[i] = ArithToUint256(i); | ||||
vBlocksMain[i].nHeight = i; | vBlocksMain[i].nHeight = i; | ||||
vBlocksMain[i].pprev = i ? &vBlocksMain[i - 1] : nullptr; | vBlocksMain[i].pprev = i ? &vBlocksMain[i - 1] : nullptr; | ||||
vBlocksMain[i].phashBlock = &vHashMain[i]; | vBlocksMain[i].phashBlock = &vHashMain[i]; | ||||
vBlocksMain[i].BuildSkip(); | vBlocksMain[i].BuildSkip(); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
(int)UintToArith256(vBlocksMain[i].GetBlockHash()).GetLow64(), | (int)UintToArith256(vBlocksMain[i].GetBlockHash()).GetLow64(), | ||||
vBlocksMain[i].nHeight); | vBlocksMain[i].nHeight); | ||||
BOOST_CHECK(vBlocksMain[i].pprev == nullptr || | BOOST_CHECK(vBlocksMain[i].pprev == nullptr || | ||||
vBlocksMain[i].nHeight == | vBlocksMain[i].nHeight == | ||||
vBlocksMain[i].pprev->nHeight + 1); | vBlocksMain[i].pprev->nHeight + 1); | ||||
} | } | ||||
// Build a branch that splits off at block 49999, 50000 blocks long. | // Build a branch that splits off at block 49999, 50000 blocks long. | ||||
std::vector<uint256> vHashSide(50000); | std::vector<uint256> vHashSide(50000); | ||||
std::vector<CBlockIndex> vBlocksSide(50000); | std::vector<CBlockIndex> vBlocksSide(50000); | ||||
for (unsigned int i = 0; i < vBlocksSide.size(); i++) { | for (size_t i = 0; i < vBlocksSide.size(); i++) { | ||||
// Add 1<<128 to the hashes, so GetLow64() still returns the height. | // Add 1<<128 to the hashes, so GetLow64() still returns the height. | ||||
vHashSide[i] = ArithToUint256(i + 50000 + (arith_uint256(1) << 128)); | vHashSide[i] = ArithToUint256(i + 50000 + (arith_uint256(1) << 128)); | ||||
vBlocksSide[i].nHeight = i + 50000; | vBlocksSide[i].nHeight = i + 50000; | ||||
vBlocksSide[i].pprev = | vBlocksSide[i].pprev = | ||||
i ? &vBlocksSide[i - 1] : (vBlocksMain.data() + 49999); | i ? &vBlocksSide[i - 1] : (vBlocksMain.data() + 49999); | ||||
vBlocksSide[i].phashBlock = &vHashSide[i]; | vBlocksSide[i].phashBlock = &vHashSide[i]; | ||||
vBlocksSide[i].BuildSkip(); | vBlocksSide[i].BuildSkip(); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
Show All 24 Lines | for (int n = 0; n < 100; n++) { | ||||
for (unsigned int i = 1; i < 12 && i < locator.vHave.size() - 1; i++) { | for (unsigned int i = 1; i < 12 && i < locator.vHave.size() - 1; i++) { | ||||
BOOST_CHECK_EQUAL(UintToArith256(locator.vHave[i]).GetLow64(), | BOOST_CHECK_EQUAL(UintToArith256(locator.vHave[i]).GetLow64(), | ||||
tip->nHeight - i); | tip->nHeight - i); | ||||
} | } | ||||
// The further ones (excluding the last one) go back with exponential | // The further ones (excluding the last one) go back with exponential | ||||
// steps. | // steps. | ||||
unsigned int dist = 2; | unsigned int dist = 2; | ||||
for (unsigned int i = 12; i < locator.vHave.size() - 1; i++) { | for (size_t i = 12; i < locator.vHave.size() - 1; i++) { | ||||
BOOST_CHECK_EQUAL(UintToArith256(locator.vHave[i - 1]).GetLow64() - | BOOST_CHECK_EQUAL(UintToArith256(locator.vHave[i - 1]).GetLow64() - | ||||
UintToArith256(locator.vHave[i]).GetLow64(), | UintToArith256(locator.vHave[i]).GetLow64(), | ||||
dist); | dist); | ||||
dist *= 2; | dist *= 2; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(findearliestatleast_test) { | BOOST_AUTO_TEST_CASE(findearliestatleast_test) { | ||||
std::vector<uint256> vHashMain(100000); | std::vector<uint256> vHashMain(100000); | ||||
std::vector<CBlockIndex> vBlocksMain(100000); | std::vector<CBlockIndex> vBlocksMain(100000); | ||||
for (unsigned int i = 0; i < vBlocksMain.size(); i++) { | for (size_t i = 0; i < vBlocksMain.size(); i++) { | ||||
// Set the hash equal to the height | // Set the hash equal to the height | ||||
vHashMain[i] = ArithToUint256(i); | vHashMain[i] = ArithToUint256(i); | ||||
vBlocksMain[i].nHeight = i; | vBlocksMain[i].nHeight = i; | ||||
vBlocksMain[i].pprev = i ? &vBlocksMain[i - 1] : nullptr; | vBlocksMain[i].pprev = i ? &vBlocksMain[i - 1] : nullptr; | ||||
vBlocksMain[i].phashBlock = &vHashMain[i]; | vBlocksMain[i].phashBlock = &vHashMain[i]; | ||||
vBlocksMain[i].BuildSkip(); | vBlocksMain[i].BuildSkip(); | ||||
if (i < 10) { | if (i < 10) { | ||||
vBlocksMain[i].nTime = i; | vBlocksMain[i].nTime = i; | ||||
vBlocksMain[i].nTimeMax = i; | vBlocksMain[i].nTimeMax = i; | ||||
} else { | } else { | ||||
// randomly choose something in the range [MTP, MTP*2] | // randomly choose something in the range [MTP, MTP*2] | ||||
int64_t medianTimePast = vBlocksMain[i].GetMedianTimePast(); | int64_t medianTimePast = vBlocksMain[i].GetMedianTimePast(); | ||||
int r = InsecureRandRange(medianTimePast); | int r = InsecureRandRange(medianTimePast); | ||||
vBlocksMain[i].nTime = r + medianTimePast; | vBlocksMain[i].nTime = r + medianTimePast; | ||||
vBlocksMain[i].nTimeMax = | vBlocksMain[i].nTimeMax = | ||||
std::max(vBlocksMain[i].nTime, vBlocksMain[i - 1].nTimeMax); | std::max(vBlocksMain[i].nTime, vBlocksMain[i - 1].nTimeMax); | ||||
} | } | ||||
} | } | ||||
// Check that we set nTimeMax up correctly. | // Check that we set nTimeMax up correctly. | ||||
unsigned int curTimeMax = 0; | unsigned int curTimeMax = 0; | ||||
for (unsigned int i = 0; i < vBlocksMain.size(); ++i) { | for (size_t i = 0; i < vBlocksMain.size(); ++i) { | ||||
curTimeMax = std::max(curTimeMax, vBlocksMain[i].nTime); | curTimeMax = std::max(curTimeMax, vBlocksMain[i].nTime); | ||||
BOOST_CHECK(curTimeMax == vBlocksMain[i].nTimeMax); | BOOST_CHECK(curTimeMax == vBlocksMain[i].nTimeMax); | ||||
} | } | ||||
// Build a CChain for the main branch. | // Build a CChain for the main branch. | ||||
CChain chain; | CChain chain; | ||||
chain.SetTip(&vBlocksMain.back()); | chain.SetTip(&vBlocksMain.back()); | ||||
▲ Show 20 Lines • Show All 61 Lines • Show Last 20 Lines |