Changeset View
Changeset View
Standalone View
Standalone View
src/test/blockstatus_tests.cpp
// Copyright (c) 2018 The Bitcoin developers | // Copyright (c) 2018 The Bitcoin developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include "chain.h" | #include "chain.h" | ||||
#include "test/test_bitcoin.h" | #include "test/test_bitcoin.h" | ||||
#include <boost/test/unit_test.hpp> | #include <boost/test/unit_test.hpp> | ||||
#include <set> | #include <set> | ||||
BOOST_FIXTURE_TEST_SUITE(blockstatus_tests, BasicTestingSetup) | BOOST_FIXTURE_TEST_SUITE(blockstatus_tests, BasicTestingSetup) | ||||
static void CheckBlockStatus(BlockStatus s, BlockValidity validity, | static void CheckBlockStatus(const BlockStatus s, BlockValidity validity, | ||||
bool hasData, bool hasUndo) { | bool hasData, bool hasUndo, bool hasFailed, | ||||
bool hasFailedParent) { | |||||
BOOST_CHECK(s.getValidity() == validity); | BOOST_CHECK(s.getValidity() == validity); | ||||
BOOST_CHECK_EQUAL(s.hasData(), hasData); | BOOST_CHECK_EQUAL(s.hasData(), hasData); | ||||
BOOST_CHECK_EQUAL(s.hasUndo(), hasUndo); | BOOST_CHECK_EQUAL(s.hasUndo(), hasUndo); | ||||
BOOST_CHECK_EQUAL(s.hasFailed(), hasFailed); | |||||
BOOST_CHECK_EQUAL(s.hasFailedParent(), hasFailedParent); | |||||
BOOST_CHECK_EQUAL(s.isInvalid(), hasFailed || hasFailedParent); | |||||
} | } | ||||
BOOST_AUTO_TEST_CASE(sighash_construction_test) { | BOOST_AUTO_TEST_CASE(sighash_construction_test) { | ||||
// Check default values. | // Check default values. | ||||
CheckBlockStatus(BlockStatus(), BlockValidity::UNKNOWN, false, false); | CheckBlockStatus(BlockStatus(), BlockValidity::UNKNOWN, false, false, false, | ||||
false); | |||||
// Check all possible permutations. | // Check all possible permutations. | ||||
std::set<BlockValidity> baseValidities{ | std::set<BlockValidity> baseValidities{ | ||||
BlockValidity::UNKNOWN, BlockValidity::HEADER, | BlockValidity::UNKNOWN, BlockValidity::HEADER, | ||||
BlockValidity::TREE, BlockValidity::TRANSACTIONS, | BlockValidity::TREE, BlockValidity::TRANSACTIONS, | ||||
BlockValidity::CHAIN, BlockValidity::SCRIPTS}; | BlockValidity::CHAIN, BlockValidity::SCRIPTS}; | ||||
std::set<bool> hasDataValues{false, true}; | std::set<bool> hasDataValues{false, true}; | ||||
std::set<bool> hasUndoValues{false, true}; | std::set<bool> hasUndoValues{false, true}; | ||||
std::set<bool> hasFailedValues{false, true}; | |||||
std::set<bool> hasFailedParentValues{false, true}; | |||||
for (BlockValidity validity : baseValidities) { | for (BlockValidity validity : baseValidities) { | ||||
for (bool hasData : hasDataValues) { | for (bool hasData : hasDataValues) { | ||||
for (bool hasUndo : hasUndoValues) { | for (bool hasUndo : hasUndoValues) { | ||||
const BlockStatus s = BlockStatus() | for (bool hasFailed : hasFailedValues) { | ||||
for (bool hasFailedParent : hasFailedParentValues) { | |||||
const BlockStatus s = | |||||
BlockStatus() | |||||
.withValidity(validity) | .withValidity(validity) | ||||
.withData(hasData) | .withData(hasData) | ||||
.withUndo(hasUndo); | .withUndo(hasUndo) | ||||
.withFailed(hasFailed) | |||||
CheckBlockStatus(s, validity, hasData, hasUndo); | .withFailedParent(hasFailedParent); | ||||
CheckBlockStatus(s, validity, hasData, hasUndo, | |||||
hasFailed, hasFailedParent); | |||||
// Clears failure flags. | |||||
CheckBlockStatus(s.withClearedFailureFlags(), validity, | |||||
hasData, hasUndo, false, false); | |||||
// Also check all possible alterations. | // Also check all possible alterations. | ||||
CheckBlockStatus(s.withData(hasData), validity, hasData, | CheckBlockStatus(s.withData(hasData), validity, hasData, | ||||
hasUndo); | hasUndo, hasFailed, hasFailedParent); | ||||
CheckBlockStatus(s.withData(!hasData), validity, !hasData, | CheckBlockStatus(s.withData(!hasData), validity, | ||||
hasUndo); | !hasData, hasUndo, hasFailed, | ||||
hasFailedParent); | |||||
CheckBlockStatus(s.withUndo(hasUndo), validity, hasData, | CheckBlockStatus(s.withUndo(hasUndo), validity, hasData, | ||||
hasUndo); | hasUndo, hasFailed, hasFailedParent); | ||||
CheckBlockStatus(s.withUndo(!hasUndo), validity, hasData, | CheckBlockStatus(s.withUndo(!hasUndo), validity, | ||||
!hasUndo); | hasData, !hasUndo, hasFailed, | ||||
hasFailedParent); | |||||
CheckBlockStatus(s.withFailed(hasFailed), validity, | |||||
hasData, hasUndo, hasFailed, | |||||
hasFailedParent); | |||||
CheckBlockStatus(s.withFailed(!hasFailed), validity, | |||||
hasData, hasUndo, !hasFailed, | |||||
hasFailedParent); | |||||
CheckBlockStatus(s.withFailedParent(hasFailedParent), | |||||
validity, hasData, hasUndo, hasFailed, | |||||
hasFailedParent); | |||||
CheckBlockStatus(s.withFailedParent(!hasFailedParent), | |||||
validity, hasData, hasUndo, hasFailed, | |||||
!hasFailedParent); | |||||
for (BlockValidity newValidity : baseValidities) { | for (BlockValidity newValidity : baseValidities) { | ||||
CheckBlockStatus(s.withValidity(newValidity), newValidity, | CheckBlockStatus(s.withValidity(newValidity), | ||||
hasData, hasUndo); | newValidity, hasData, hasUndo, | ||||
hasFailed, hasFailedParent); | |||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |