Changeset View
Changeset View
Standalone View
Standalone View
src/test/opcode_tests.cpp
Show All 24 Lines | |||||
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; | BaseSignatureChecker sigchecker; | ||||
for (uint32_t flags : flagset) { | for (uint32_t flags : flagset) { | ||||
ScriptError err = SCRIPT_ERR_OK; | ScriptError err = SCRIPT_ERR_OK; | ||||
stacktype stack{original_stack}; | stacktype stack{original_stack}; | ||||
bool r = EvalScript(stack, script, flags, sigchecker, &err); | bool r = | ||||
EvalScript(stack, script, flags | SCRIPT_ENABLE_MAGNETIC_OPCODES, | |||||
sigchecker, &err); | |||||
BOOST_CHECK(r); | BOOST_CHECK(r); | ||||
BOOST_CHECK(stack == expected); | 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}; | ||||
bool r = EvalScript(stack, script, flags, sigchecker, &err); | bool r = EvalScript(stack, script, flags | SCRIPT_ENABLE_MAGNETIC_OPCODES, | ||||
sigchecker, &err); | |||||
BOOST_CHECK(!r); | BOOST_CHECK(!r); | ||||
BOOST_CHECK_EQUAL(err, expected_error); | BOOST_CHECK_EQUAL(err, expected_error); | ||||
} | } | ||||
static void CheckErrorForAllFlags(const stacktype &original_stack, | static void CheckErrorForAllFlags(const stacktype &original_stack, | ||||
const CScript &script, | const CScript &script, | ||||
ScriptError expected_error) { | ScriptError expected_error) { | ||||
for (uint32_t flags : flagset) { | for (uint32_t flags : flagset) { | ||||
Show All 22 Lines | static valtype NegativeValtype(const valtype &v) { | ||||
valtype r(v); | valtype r(v); | ||||
if (r.size() > 0) { | if (r.size() > 0) { | ||||
r[r.size() - 1] ^= 0x80; | r[r.size() - 1] ^= 0x80; | ||||
} | } | ||||
CScriptNum::MinimallyEncode(r); | CScriptNum::MinimallyEncode(r); | ||||
return r; | return r; | ||||
} | } | ||||
// Expects str to contain 8*n bits. | |||||
static valtype to_bitpattern(const char *str) { | |||||
size_t len = strlen(str); | |||||
valtype val((len - 1) / 8 + 1, 0); | |||||
const char *pin = &str[len - 1]; | |||||
for (size_t i = 0; i < len; i++) { | |||||
int byte_idx = i / 8; | |||||
int bit_idx = i % 8; | |||||
int8_t mask = 1 << bit_idx; | |||||
if (*pin == '0') { | |||||
val[byte_idx] &= ~mask; | |||||
} else { | |||||
val[byte_idx] |= mask; | |||||
} | |||||
pin--; | |||||
} | |||||
return val; | |||||
} | |||||
BOOST_AUTO_TEST_CASE(negative_valtype_test) { | BOOST_AUTO_TEST_CASE(negative_valtype_test) { | ||||
// Test zero values | // Test zero values | ||||
BOOST_CHECK(NegativeValtype({}) == valtype{}); | BOOST_CHECK(NegativeValtype({}) == valtype{}); | ||||
BOOST_CHECK(NegativeValtype({0x00}) == valtype{}); | BOOST_CHECK(NegativeValtype({0x00}) == valtype{}); | ||||
BOOST_CHECK(NegativeValtype({0x80}) == valtype{}); | BOOST_CHECK(NegativeValtype({0x80}) == valtype{}); | ||||
BOOST_CHECK(NegativeValtype({0x00, 0x00}) == valtype{}); | BOOST_CHECK(NegativeValtype({0x00, 0x00}) == valtype{}); | ||||
BOOST_CHECK(NegativeValtype({0x00, 0x80}) == valtype{}); | BOOST_CHECK(NegativeValtype({0x00, 0x80}) == valtype{}); | ||||
▲ Show 20 Lines • Show All 296 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(bitwise_opcodes_test) { | ||||
CheckAllBitwiseOpErrors({{0x00}, {0xab, 0xcd, 0xef}}, | CheckAllBitwiseOpErrors({{0x00}, {0xab, 0xcd, 0xef}}, | ||||
SCRIPT_ERR_INVALID_OPERAND_SIZE); | SCRIPT_ERR_INVALID_OPERAND_SIZE); | ||||
CheckAllBitwiseOpErrors({{0xab, 0xcd, 0xef}, {0x00}}, | CheckAllBitwiseOpErrors({{0xab, 0xcd, 0xef}, {0x00}}, | ||||
SCRIPT_ERR_INVALID_OPERAND_SIZE); | SCRIPT_ERR_INVALID_OPERAND_SIZE); | ||||
CheckAllBitwiseOpErrors({{}, a}, SCRIPT_ERR_INVALID_OPERAND_SIZE); | CheckAllBitwiseOpErrors({{}, a}, SCRIPT_ERR_INVALID_OPERAND_SIZE); | ||||
CheckAllBitwiseOpErrors({b, {}}, SCRIPT_ERR_INVALID_OPERAND_SIZE); | CheckAllBitwiseOpErrors({b, {}}, SCRIPT_ERR_INVALID_OPERAND_SIZE); | ||||
} | } | ||||
static void CheckShiftOp(const valtype &x, const valtype &n, opcodetype op, | |||||
const valtype &expected) { | |||||
CheckBinaryOp(x, n, op, expected); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(lshift_test) { | |||||
CheckShiftOp({}, {}, OP_LSHIFT, {}); | |||||
CheckShiftOp({}, {0x01}, OP_LSHIFT, {}); | |||||
CheckShiftOp({}, {0x02}, OP_LSHIFT, {}); | |||||
CheckShiftOp({}, {0x07}, OP_LSHIFT, {}); | |||||
CheckShiftOp({}, {0x08}, OP_LSHIFT, {}); | |||||
CheckShiftOp({}, {0x09}, OP_LSHIFT, {}); | |||||
CheckShiftOp({}, {0x0F}, OP_LSHIFT, {}); | |||||
CheckShiftOp({}, {0x10}, OP_LSHIFT, {}); | |||||
CheckShiftOp({}, {0x11}, OP_LSHIFT, {}); | |||||
CheckShiftOp({0xFF}, {}, OP_LSHIFT, to_bitpattern("11111111")); | |||||
CheckShiftOp({0xFF}, {0x01}, OP_LSHIFT, to_bitpattern("11111110")); | |||||
CheckShiftOp({0xFF}, {0x02}, OP_LSHIFT, to_bitpattern("11111100")); | |||||
CheckShiftOp({0xFF}, {0x03}, OP_LSHIFT, to_bitpattern("11111000")); | |||||
CheckShiftOp({0xFF}, {0x04}, OP_LSHIFT, to_bitpattern("11110000")); | |||||
CheckShiftOp({0xFF}, {0x05}, OP_LSHIFT, to_bitpattern("11100000")); | |||||
CheckShiftOp({0xFF}, {0x06}, OP_LSHIFT, to_bitpattern("11000000")); | |||||
CheckShiftOp({0xFF}, {0x07}, OP_LSHIFT, to_bitpattern("10000000")); | |||||
CheckShiftOp({0xFF}, {0x08}, OP_LSHIFT, to_bitpattern("00000000")); | |||||
CheckShiftOp({0xFF}, {0x01}, OP_LSHIFT, {0xFE}); | |||||
CheckShiftOp({0xFF}, {0x02}, OP_LSHIFT, {0xFC}); | |||||
CheckShiftOp({0xFF}, {0x03}, OP_LSHIFT, {0xF8}); | |||||
CheckShiftOp({0xFF}, {0x04}, OP_LSHIFT, {0xF0}); | |||||
CheckShiftOp({0xFF}, {0x05}, OP_LSHIFT, {0xE0}); | |||||
CheckShiftOp({0xFF}, {0x06}, OP_LSHIFT, {0xC0}); | |||||
CheckShiftOp({0xFF}, {0x07}, OP_LSHIFT, {0x80}); | |||||
CheckShiftOp( | |||||
{0xFF}, {0x08}, OP_LSHIFT, | |||||
{0x00}); // bitpattern, not a number so not reduced to zero bytes | |||||
// valtype {0x9F, 0x11, 0xF5, 0x55} is a bit pattern | |||||
// "01010101111101010001000110011111" | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {}, OP_LSHIFT, | |||||
to_bitpattern("01010101111101010001000110011111")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x01}, OP_LSHIFT, | |||||
to_bitpattern("10101011111010100010001100111110")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x02}, OP_LSHIFT, | |||||
to_bitpattern("01010111110101000100011001111100")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x03}, OP_LSHIFT, | |||||
to_bitpattern("10101111101010001000110011111000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x04}, OP_LSHIFT, | |||||
to_bitpattern("01011111010100010001100111110000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x05}, OP_LSHIFT, | |||||
to_bitpattern("10111110101000100011001111100000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x06}, OP_LSHIFT, | |||||
to_bitpattern("01111101010001000110011111000000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x07}, OP_LSHIFT, | |||||
to_bitpattern("11111010100010001100111110000000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x08}, OP_LSHIFT, | |||||
to_bitpattern("11110101000100011001111100000000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x09}, OP_LSHIFT, | |||||
to_bitpattern("11101010001000110011111000000000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0A}, OP_LSHIFT, | |||||
to_bitpattern("11010100010001100111110000000000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0B}, OP_LSHIFT, | |||||
to_bitpattern("10101000100011001111100000000000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0C}, OP_LSHIFT, | |||||
to_bitpattern("01010001000110011111000000000000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0D}, OP_LSHIFT, | |||||
to_bitpattern("10100010001100111110000000000000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0E}, OP_LSHIFT, | |||||
to_bitpattern("01000100011001111100000000000000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0F}, OP_LSHIFT, | |||||
to_bitpattern("10001000110011111000000000000000")); | |||||
CheckErrorForAllFlags({valtype{0x12, 0x34}}, | |||||
CScript() << OP_1NEGATE << OP_LSHIFT, | |||||
SCRIPT_ERR_INVALID_NUMBER_RANGE); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(rshift_test) { | |||||
CheckShiftOp({}, {}, OP_RSHIFT, {}); | |||||
CheckShiftOp({}, {0x01}, OP_RSHIFT, {}); | |||||
CheckShiftOp({}, {0x02}, OP_RSHIFT, {}); | |||||
CheckShiftOp({}, {0x07}, OP_RSHIFT, {}); | |||||
CheckShiftOp({}, {0x08}, OP_RSHIFT, {}); | |||||
CheckShiftOp({}, {0x09}, OP_RSHIFT, {}); | |||||
CheckShiftOp({}, {0x0F}, OP_RSHIFT, {}); | |||||
CheckShiftOp({}, {0x10}, OP_RSHIFT, {}); | |||||
CheckShiftOp({}, {0x11}, OP_RSHIFT, {}); | |||||
CheckShiftOp({0xFF}, {}, OP_RSHIFT, to_bitpattern("11111111")); | |||||
CheckShiftOp({0xFF}, {0x01}, OP_RSHIFT, to_bitpattern("01111111")); | |||||
CheckShiftOp({0xFF}, {0x02}, OP_RSHIFT, to_bitpattern("00111111")); | |||||
CheckShiftOp({0xFF}, {0x03}, OP_RSHIFT, to_bitpattern("00011111")); | |||||
CheckShiftOp({0xFF}, {0x04}, OP_RSHIFT, to_bitpattern("00001111")); | |||||
CheckShiftOp({0xFF}, {0x05}, OP_RSHIFT, to_bitpattern("00000111")); | |||||
CheckShiftOp({0xFF}, {0x06}, OP_RSHIFT, to_bitpattern("00000011")); | |||||
CheckShiftOp({0xFF}, {0x07}, OP_RSHIFT, to_bitpattern("00000001")); | |||||
CheckShiftOp({0xFF}, {0x08}, OP_RSHIFT, to_bitpattern("00000000")); | |||||
CheckShiftOp({0xFF}, {0x01}, OP_RSHIFT, {0x7F}); | |||||
CheckShiftOp({0xFF}, {0x02}, OP_RSHIFT, {0x3F}); | |||||
CheckShiftOp({0xFF}, {0x03}, OP_RSHIFT, {0x1F}); | |||||
CheckShiftOp({0xFF}, {0x04}, OP_RSHIFT, {0x0F}); | |||||
CheckShiftOp({0xFF}, {0x05}, OP_RSHIFT, {0x07}); | |||||
CheckShiftOp({0xFF}, {0x06}, OP_RSHIFT, {0x03}); | |||||
CheckShiftOp({0xFF}, {0x07}, OP_RSHIFT, {0x01}); | |||||
CheckShiftOp( | |||||
{0xFF}, {0x08}, OP_RSHIFT, | |||||
{0x00}); // bitpattern, not a number so not reduced to zero bytes | |||||
// valtype {0x9F, 0x11, 0xF5, 0x55} is a bit pattern | |||||
// "01010101111101010001000110011111" | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {}, OP_RSHIFT, | |||||
to_bitpattern("01010101111101010001000110011111")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x01}, OP_RSHIFT, | |||||
to_bitpattern("00101010111110101000100011001111")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x02}, OP_RSHIFT, | |||||
to_bitpattern("00010101011111010100010001100111")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x03}, OP_RSHIFT, | |||||
to_bitpattern("00001010101111101010001000110011")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x04}, OP_RSHIFT, | |||||
to_bitpattern("00000101010111110101000100011001")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x05}, OP_RSHIFT, | |||||
to_bitpattern("00000010101011111010100010001100")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x06}, OP_RSHIFT, | |||||
to_bitpattern("00000001010101111101010001000110")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x07}, OP_RSHIFT, | |||||
to_bitpattern("00000000101010111110101000100011")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x08}, OP_RSHIFT, | |||||
to_bitpattern("00000000010101011111010100010001")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x09}, OP_RSHIFT, | |||||
to_bitpattern("00000000001010101111101010001000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0A}, OP_RSHIFT, | |||||
to_bitpattern("00000000000101010111110101000100")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0B}, OP_RSHIFT, | |||||
to_bitpattern("00000000000010101011111010100010")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0C}, OP_RSHIFT, | |||||
to_bitpattern("00000000000001010101111101010001")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0D}, OP_RSHIFT, | |||||
to_bitpattern("00000000000000101010111110101000")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0E}, OP_RSHIFT, | |||||
to_bitpattern("00000000000000010101011111010100")); | |||||
CheckShiftOp({0x9F, 0x11, 0xF5, 0x55}, {0x0F}, OP_RSHIFT, | |||||
to_bitpattern("00000000000000001010101111101010")); | |||||
CheckErrorForAllFlags({valtype{0x12, 0x34}}, | |||||
CScript() << OP_1NEGATE << OP_RSHIFT, | |||||
SCRIPT_ERR_INVALID_NUMBER_RANGE); | |||||
} | |||||
/** | /** | ||||
* String opcodes. | * String opcodes. | ||||
*/ | */ | ||||
static void CheckStringOp(const valtype &a, const valtype &b, | static void CheckStringOp(const valtype &a, const valtype &b, | ||||
const valtype &n) { | const valtype &n) { | ||||
CheckBinaryOp(a, b, OP_CAT, n); | CheckBinaryOp(a, b, OP_CAT, n); | ||||
// Check concatenation with empty elements. | // Check concatenation with empty elements. | ||||
▲ Show 20 Lines • Show All 370 Lines • Show Last 20 Lines |