diff --git a/src/Makefile.test.include b/src/Makefile.test.include --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -105,7 +105,8 @@ test/undo_tests.cpp \ test/univalue_tests.cpp \ test/util_tests.cpp \ - test/validation_tests.cpp + test/validation_tests.cpp \ + test/work_comparator_tests.cpp if ENABLE_WALLET BITCOIN_TESTS += \ diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -117,6 +117,7 @@ univalue_tests.cpp util_tests.cpp validation_tests.cpp + work_comparator_tests.cpp # Tests generated from JSON ${JSON_HEADERS} diff --git a/src/test/work_comparator_tests.cpp b/src/test/work_comparator_tests.cpp new file mode 100644 --- /dev/null +++ b/src/test/work_comparator_tests.cpp @@ -0,0 +1,58 @@ +// Copyright (c) 2018 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "blockindexworkcomparator.h" + +#include + +BOOST_AUTO_TEST_SUITE(work_comparator_tests) + +BOOST_AUTO_TEST_CASE(work_comparator) { + CBlockIndex indexA, indexB; + + // Differing chain work + indexA.nChainWork = 0; + indexB.nChainWork = 1; + for (int sequenceIdA = 1; sequenceIdA < 1024; sequenceIdA *= 2) { + for (int sequenceIdB = 1; sequenceIdB < 1024; sequenceIdB *= 2) { + // Differing sequenceId doesn't affect chain work + indexA.nSequenceId = sequenceIdA; + indexB.nSequenceId = sequenceIdB; + BOOST_CHECK(CBlockIndexWorkComparator()(&indexA, &indexB)); + } + } + + // Same chain work, but differing sequenceId + indexA = CBlockIndex(); + indexB = CBlockIndex(); + for (int sequenceIdA = 1; sequenceIdA < 1024; sequenceIdA *= 2) { + for (int sequenceIdB = 1; sequenceIdB < 1024; sequenceIdB *= 2) { + if (sequenceIdA == sequenceIdB) { + continue; + } + + indexA.nSequenceId = sequenceIdA; + indexB.nSequenceId = sequenceIdB; + if (sequenceIdA > sequenceIdB) { + BOOST_CHECK(CBlockIndexWorkComparator()(&indexA, &indexB)); + } else { + BOOST_CHECK(CBlockIndexWorkComparator()(&indexB, &indexA)); + } + } + } + + // All else equal, so checking pointer address as final check + CBlockIndex *pindexA = new CBlockIndex(); + CBlockIndex *pindexB = new CBlockIndex(); + if (pindexA < pindexB) { + BOOST_CHECK(CBlockIndexWorkComparator()(pindexB, pindexA)); + } else { + BOOST_CHECK(CBlockIndexWorkComparator()(pindexA, pindexB)); + } + + // Same block should return false + BOOST_CHECK(!CBlockIndexWorkComparator()(pindexA, pindexA)); +} + +BOOST_AUTO_TEST_SUITE_END()