Changeset View
Changeset View
Standalone View
Standalone View
src/test/monolith_opcodes_tests.cpp
Show All 13 Lines | |||||
typedef std::vector<uint8_t> valtype; | typedef std::vector<uint8_t> valtype; | ||||
typedef std::vector<valtype> stacktype; | typedef std::vector<valtype> stacktype; | ||||
BOOST_FIXTURE_TEST_SUITE(monolith_opcodes_tests, BasicTestingSetup) | BOOST_FIXTURE_TEST_SUITE(monolith_opcodes_tests, BasicTestingSetup) | ||||
std::array<uint32_t, 3> flagset{ | std::array<uint32_t, 3> flagset{ | ||||
{0, STANDARD_SCRIPT_VERIFY_FLAGS, MANDATORY_SCRIPT_VERIFY_FLAGS}}; | {0, STANDARD_SCRIPT_VERIFY_FLAGS, MANDATORY_SCRIPT_VERIFY_FLAGS}}; | ||||
static void CheckTestResult(uint32_t flags, const stacktype &original_stack, | |||||
const CScript &script, const stacktype &expected) { | |||||
BaseSignatureChecker sigchecker; | |||||
ScriptError err = SCRIPT_ERR_OK; | |||||
stacktype stack{original_stack}; | |||||
bool r = EvalScript(stack, script, flags, sigchecker, &err); | |||||
BOOST_CHECK(r); | |||||
BOOST_CHECK(stack == expected); | |||||
} | |||||
/** | /** | ||||
* General utility functions to check for script passing/failing. | * General utility functions to check for script passing/failing. | ||||
*/ | */ | ||||
static void CheckTestResultForAllFlags(const stacktype &original_stack, | static void CheckTestResultForAllFlags(const stacktype &original_stack, | ||||
const CScript &script, | const CScript &script, | ||||
const stacktype &expected) { | const stacktype &expected) { | ||||
BaseSignatureChecker sigchecker; | |||||
for (uint32_t flags : flagset) { | for (uint32_t flags : flagset) { | ||||
ScriptError err = SCRIPT_ERR_OK; | CheckTestResult(flags, original_stack, script, expected); | ||||
stacktype stack{original_stack}; | |||||
bool r = EvalScript(stack, script, flags, sigchecker, &err); | |||||
BOOST_CHECK(r); | |||||
BOOST_CHECK(stack == expected); | |||||
} | } | ||||
} | } | ||||
static void CheckError(uint32_t flags, const stacktype &original_stack, | static void CheckError(uint32_t flags, const stacktype &original_stack, | ||||
const CScript &script, ScriptError expected_error) { | const CScript &script, ScriptError expected_error) { | ||||
BaseSignatureChecker sigchecker; | BaseSignatureChecker sigchecker; | ||||
ScriptError err = SCRIPT_ERR_OK; | ScriptError err = SCRIPT_ERR_OK; | ||||
stacktype stack{original_stack}; | stacktype stack{original_stack}; | ||||
▲ Show 20 Lines • Show All 578 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(type_conversion_test) { | ||||
// NUM2BIN must not generate oversized push. | // NUM2BIN must not generate oversized push. | ||||
valtype largezero(MAX_SCRIPT_ELEMENT_SIZE, 0); | valtype largezero(MAX_SCRIPT_ELEMENT_SIZE, 0); | ||||
BOOST_CHECK_EQUAL(largezero.size(), MAX_SCRIPT_ELEMENT_SIZE); | BOOST_CHECK_EQUAL(largezero.size(), MAX_SCRIPT_ELEMENT_SIZE); | ||||
CheckTypeConversionOp(largezero, {}); | CheckTypeConversionOp(largezero, {}); | ||||
CheckNum2BinError({{}, {0x09, 0x02}}, SCRIPT_ERR_PUSH_SIZE); | CheckNum2BinError({{}, {0x09, 0x02}}, SCRIPT_ERR_PUSH_SIZE); | ||||
// NUM2BIN can't take negative sizes, for which it throws an error | |||||
// "Push value size limit exceeded" | |||||
CheckNum2BinError({{}, {0x81}}, SCRIPT_ERR_PUSH_SIZE); | |||||
// ... except for negative zero of course (without minimaldata flag) | |||||
CheckTestResult(0, {{0x00, 0x80}, {0x80}}, CScript() << OP_NUM2BIN, {{}}); | |||||
CheckTestResult(0, {{0x00, 0x80}, {0x00, 0x80}}, CScript() << OP_NUM2BIN, | |||||
{{}}); | |||||
// Check that the requested encoding is possible. | // Check that the requested encoding is possible. | ||||
CheckNum2BinError({{0xab, 0xcd, 0xef, 0x80}, {0x03}}, | CheckNum2BinError({{0xab, 0xcd, 0xef, 0x80}, {0x03}}, | ||||
SCRIPT_ERR_IMPOSSIBLE_ENCODING); | SCRIPT_ERR_IMPOSSIBLE_ENCODING); | ||||
} | } | ||||
/** | /** | ||||
* Arithmetic Opcodes | * Arithmetic Opcodes | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 135 Lines • Show Last 20 Lines |