Skip to content

Commit

Permalink
test: add trivial validation invalid tests
Browse files Browse the repository at this point in the history
  • Loading branch information
panleone committed Mar 25, 2024
1 parent 2c87e78 commit 607ba81
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 43 deletions.
1 change: 1 addition & 0 deletions src/Makefile.test.include
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ JSON_TEST_FILES = \
test/data/tx_valid.json \
test/data/sighash.json \
test/data/specialtx_valid.json \
test/data/specialtx_invalid.json \
test/data/merkle_roots_sapling.json \
test/data/merkle_serialization_sapling.json \
test/data/merkle_witness_serialization_sapling.json \
Expand Down
1 change: 1 addition & 0 deletions src/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ set(JSON_TEST_FILES
${CMAKE_CURRENT_SOURCE_DIR}/data/tx_valid.json
${CMAKE_CURRENT_SOURCE_DIR}/data/sighash.json
${CMAKE_CURRENT_SOURCE_DIR}/data/specialtx_valid.json
${CMAKE_CURRENT_SOURCE_DIR}/data/specialtx_invalid.json
${CMAKE_CURRENT_SOURCE_DIR}/data/merkle_roots_sapling.json
${CMAKE_CURRENT_SOURCE_DIR}/data/merkle_serialization_sapling.json
${CMAKE_CURRENT_SOURCE_DIR}/data/merkle_witness_serialization_sapling.json
Expand Down
12 changes: 12 additions & 0 deletions src/test/data/specialtx_invalid.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[
["tx hash", "tx type", "tx data", "reject reason"],
["303135081f24e94f4955b0f7032283725db16eb41d2c93849a4958ff260e3602", "proreg", "0300010000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fd0701010000000000c104cdffac53355a8efb419a94dd8e50d4fbaed38b654d54b962d2f8a0044cd1030000000104390cd20bc910696753aaf5f1c7b2355e7291caca23493ce04a76a7708d1e52859af0642b988828642862c81622b51a61ac122d1b16c4fba7d8d3c0f237a478c5b529de0f724ee971d6b82f59b55f7f690fb842c528bfc0966d47b973c95b0024061976a914440ccdcb2bf467e5b24478d9e7d7dee20c02e8a488ac740a0d9333f678f24b734783c7819fe9ce4af54cdd01474c17646bd31d1fd3413f13d88fee01910cbfe8ce56af3d4562547298ae56c49c1061f3f608aae6a102075cc471f65e4268e04b28be28b773ee236ac232dc4de01aff0ac285b6873f43", "bad-protx-payee"],
["e726c0356b47f969ad588b4336319f3e0868f9d67d8c38818bd69fc801aaf2c3", "proreg", "0300010000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fd200101000000000081f55d647a2cc3af2db7b2761489bea8cfce1bde8d2a28e3fb464e091a847ed7010000000104390cd20bc910f98abe08f1d074bfb235f136e55d904e01520323a55a7cedf98d19c3cd6148d259a962c01e59832f38c0f71dc1697771081204fd47d6be0f02876d8492f3d58172dd4e008ec0095c4a197f0a7aacd31ba68eb868695835471976a914f8c7bc94edbe683770c8b3cc0da2aa1bc78a0adf88ac983a1976a91417fb35f6d8d3a42f437286ad69aa95ad8750b28988ac4dc3483166ad92db8bd3db41e0ffebcf32121144c5c346e9f92330ab1b5510ad3f6422c2fecdd970c1d884adf447ddfa476d6291cf394201e5dc1c91237e1a9703527865132307a52b6c5849228e75cfeeae0de5dec2f5c3606f53e3bf8eba9f", "bad-protx-operator-reward"],
["88bf452a578e8461e69d77687514180257f857ad8a479a23a807223c9a8ef0f8", "proreg", "0300010000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fd2001010014000000d79cf0351b8d674cc1adf240cc54c7b59e8c31a1a27dc487ac135f2d1d957bb6030000000104390cd20bc910b87b7f8dc53b6b7b8c4340bc0fa473daede3c7938446acc73fa3a2744b82e4db02929ebd9c7c7740e8aeac22866f9e9b188a4d3c5b40bfd51df999af27e50966ecd28d60553d01afe533c2660e92aea111be878c580467b81976a91463498c659d02465591d9cf839fdede23e0dfb0bf88acd41b1976a9149a5e94a2cf58eeb711fd830724888344f8618bcd88ac8eb817ac505236fb091440230cbb8243863bbf51d4bc0f28cffd9628f24780273f15071a336818a0fb455d3c6ada37c5f7dd1b08358a1ff7521a3ff8a5651b53d60a4fb2eeeb1ba42b8723f07577bafe5cd5189adf7ddc3b2a0c34c526be6d2d", "bad-protx-type"],
["e9c4361fd611c9e91763aa8ed4f8301ee53df3fa663c414dc6181f604c6e841f", "proreg", "0300010000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fd2001010000002d00800ca65597d5cddeca987639557149d8b6927a4a5835001b2ca0b6fa93819ec1000000000104390cd20bc910f1c9206b01ac417da193374952ea21840f028ee68b2752b6a12eece75002e136f3f1b4e16c1e2159295265cb6317b9d5b8cb965e2511161a5ca107915e5962eaa1c53e3d0938777e9cf93714b93aae759f6ae94a36c8dbea1976a9144d996226da3518c9324437065fbbfbf15629bb8f88ac47161976a9148263b22487b2994959778412447c1178dfd48eaf88ac7de6f371ad2dd241f1b1cde3a8aa54420b6143bb53618ad6972da198cc9ad20d3f895946c79cdc935c433efb8d45d98385c10b5c6bd3cb71a446b68799436ab823f264e550e9e3c8997b8088562253f0d0028dc1930e4b7115a4fa6a9119be00", "bad-protx-mode"],
["51751302181ae7e8a3a6c888f4153a3566cbe1c26b1cdfbf1f2999fe06ab9472", "proreg", "0300010000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fd20010100000000004cf97f333e28c16afaa7649a1681f97e6686d270626a85f83a8dd4c5794fd82b010000000104390cd20bc9100000000000000000000000000000000000000000afd491ef3324a9b872bc8d379ab74952abd19f472d172103ec0c8b1d7122183b92f31a200de6d8c185e5dc61d98bb62bafda0b881325111f4ae38f81a92acf2edb26cc701976a9148ac5365785ed1441f004ac53862d1c79f640417f88ac40021976a914eb78df6d44898a6a464521cb087385f811b1971588ac898c4c0d31b215566d4eb5b9096c4ff5f45f297adaa832ef29d68d23b62bd8b43f85c06a8a3c9476239712accb64277e8cff998741ce2ac57b0100c4f847be2fc4194f17187fdd55b8a7e781ff59bdb6ade3a0028a32e3d3e2dc4793c5f6102e", "bad-protx-key-null"],
["fb9723b9a389f4a3809b8d8ac83703631b947b360409213ed333c53f209af15c", "proupserv", "0300020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fd200116000000000000aa8573e68925484d52c014df7958ad15db9e000625ad212051c085cba8811c010000000104390cd20bc910703aebc06b31d4af7e21859e5b62db01eb0aaa1e863d63489095880ab2573eb499fe4e284b1c8fe35f772e8211e73c0ee7e117b28e25ddf3da321c7da7ebb8c9cbb3cffff6f0b88cbf72c74d192b3aed844668ea7f2011fd1976a91498973548d3dc4f9c6d39db71a4594b702af9660388ac8c0c1976a914a9aecc0bf6e4e6879e3bd779d047be4e056c01d188acedf4ad62e15dfba859d0266a77659c11f2604588ffecfbdfa27e7e02a7bca60c3fb680f7a4744bd38ef0264b68e1b05133d78fa86dc5b212f6742e4a6e1b7c36a6e7a2ddbc8344a56c0d8d0726326620ced4a3edcc597f31ccc666c6937e81c8", "bad-protx-version"],
["e530a1ce015fbbfd5576b9c1824899540168f097ea7c11ef84dec4150d91c3ec", "proupreg", "0300030000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e201003a997ca6248d5c03435c6ee0a15b7ac7480f447528de2e91239bc81fdb55b46e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037c1f96bdeb9903c2ab68fbdc62f490bbbf83a9b1976a91494940cbaadb839213217f6729fa8ab372747547488acb1c11695ed5cd5cd1f4c2d9b1f84c28e86698b97ec3141401f93120cdedd5beb3f4032beb1d185a5af6651559a0356a268b9ddf91353a1954428e65585280c8b06ef1089dd68486bb718538bb73822143204d4fcf54bac99f9568bab492c146c", "bad-protx-operator-key-invalid"],
["095ba1b8760e35922689bbc84b65c12f64a916468beff47820349155642a87bb", "proreg", "0300010000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fd200101000000000064082dc9759ad9677da9d3b2665f6761149cafd79060d8601f99b9625e395ecb000000000104390cd20bc9106d9b6b3c1bc038f492fe0d93f50afb46892c1dfa8c647be1aae417d37ea8516d1a8ce629801d33e052daccde1e73ac9f86bf9011b5195e71a64defdb43e7704133b8c09e146196c23070e593f31646aa7fe5ea938f551a5e1976a914146196c23070e593f31646aa7fe5ea938f551a5e88ac9b161976a914e99d712170c2f36d9aa9d7cece1f0288d3b3b63088ac4f8145338e1a4d2a31148ad854a3910758b3da6fb9233255fd7d89f6222fd6c03ffa6d7e73b6e8984e4bce47aa43da72c122ceec2ec873db6b4d8bdab995c08b945fdfe049f05595e6a9fab9dab5f0691ec877544bba4797a973e4b0ea34ae57", "bad-protx-payee-reuse"],
["3e216d5d89a797811d6d2a60701031c88e4eddaa148d48f691c0b2dea92e248e", "prouprev", "0300040000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a40100ca65ec7e9c76cb30777baa0ed89cb8d245b67046b5820086e572a8c8c74defff050022d1384de09bf553a29a84ddc0476886e2f66a3c8acd5e42e82f9c7d44ac59e9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "bad-protx-reason"]
]
106 changes: 63 additions & 43 deletions src/test/evo_specialtx_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "test/test_pivx.h"

#include "test/data/specialtx_invalid.json.h"
#include "test/data/specialtx_valid.json.h"

#include "consensus/validation.h"
Expand Down Expand Up @@ -134,12 +135,65 @@ static bool EqualCommitments(const llmq::CFinalCommitment& a, const llmq::CFinal
}

template <typename T>
static void TrivialCheckSpecialTx(const CMutableTransaction& mtx)
static void TrivialCheckSpecialTx(const CMutableTransaction& mtx, const bool shouldFail, const std::string& rejectReason)
{
T pl;
CValidationState state;
GetTxPayload(mtx, pl);
BOOST_CHECK(pl.IsTriviallyValid(state));
BOOST_CHECK(pl.IsTriviallyValid(state) == !shouldFail);
if (shouldFail) {
BOOST_CHECK(state.GetRejectReason() == rejectReason);
}
}

static void SpecialTxTrivialValidator(const UniValue& tests)
{
for (size_t i = 1; i < tests.size(); i++) {
const auto& test = tests[i];

uint256 txHash;
std::string txType;
CMutableTransaction mtx;
std::string rejectReason = "";
try {
txHash = uint256S(test[0].get_str());

txType = test[1].get_str();
CDataStream stream(ParseHex(test[2].get_str()), SER_NETWORK, PROTOCOL_VERSION);
stream >> mtx;

bool shouldFail = test.size() > 3;
if (shouldFail) {
rejectReason = test[3].get_str();
}
BOOST_CHECK(mtx.GetHash() == txHash);

switch (mtx.nType) {
case CTransaction::TxType::PROREG:
BOOST_CHECK(txType == "proreg");
TrivialCheckSpecialTx<ProRegPL>(mtx, shouldFail, rejectReason);
break;
case CTransaction::TxType::PROUPSERV:
BOOST_CHECK(txType == "proupserv");
TrivialCheckSpecialTx<ProUpServPL>(mtx, shouldFail, rejectReason);
break;
case CTransaction::TxType::PROUPREG:
BOOST_CHECK(txType == "proupreg");
TrivialCheckSpecialTx<ProUpRegPL>(mtx, shouldFail, rejectReason);
break;
case CTransaction::TxType::PROUPREV:
BOOST_CHECK(txType == "prouprev");
TrivialCheckSpecialTx<ProUpRevPL>(mtx, shouldFail, rejectReason);
break;
default:
BOOST_CHECK(false);
}
} catch (...) {
std::string strTest = test.write();
BOOST_ERROR("Bad test, couldn't deserialize data: " << strTest);
continue;
}
}
}

BOOST_AUTO_TEST_CASE(protx_validation_test)
Expand Down Expand Up @@ -291,50 +345,16 @@ BOOST_AUTO_TEST_CASE(llmqcomm_setpayload_test)
BOOST_CHECK(EqualCommitments(pl.commitment, pl2.commitment));
}

BOOST_AUTO_TEST_CASE(specialtx_trivial_validation)
BOOST_AUTO_TEST_CASE(specialtx_trivial_valid)
{
UniValue tests = read_json(std::string(json_tests::specialtx_valid, json_tests::specialtx_valid + sizeof(json_tests::specialtx_valid)));
for (size_t i = 1; i < tests.size(); i++) {
const auto& test = tests[i];

uint256 txHash;
std::string txType;
CMutableTransaction mtx;
try {
txHash = uint256S(test[0].get_str());

txType = test[1].get_str();
CDataStream stream(ParseHex(test[2].get_str()), SER_NETWORK, PROTOCOL_VERSION);
stream >> mtx;

BOOST_CHECK(mtx.GetHash() == txHash);
SpecialTxTrivialValidator(tests);
}

switch (mtx.nType) {
case CTransaction::TxType::PROREG:
BOOST_CHECK(txType == "proreg");
TrivialCheckSpecialTx<ProRegPL>(mtx);
break;
case CTransaction::TxType::PROUPSERV:
BOOST_CHECK(txType == "proupserv");
TrivialCheckSpecialTx<ProUpServPL>(mtx);
break;
case CTransaction::TxType::PROUPREG:
BOOST_CHECK(txType == "proupreg");
TrivialCheckSpecialTx<ProUpRegPL>(mtx);
break;
case CTransaction::TxType::PROUPREV:
BOOST_CHECK(txType == "prouprev");
TrivialCheckSpecialTx<ProUpRevPL>(mtx);
break;
default:
BOOST_CHECK(false);
}
} catch (...) {
std::string strTest = test.write();
BOOST_ERROR("Bad test, couldn't deserialize data: " << strTest);
continue;
}
}
BOOST_AUTO_TEST_CASE(specialtx_trivial_invalid)
{
UniValue tests = read_json(std::string(json_tests::specialtx_invalid, json_tests::specialtx_invalid + sizeof(json_tests::specialtx_invalid)));
SpecialTxTrivialValidator(tests);
}

BOOST_AUTO_TEST_SUITE_END()

0 comments on commit 607ba81

Please sign in to comment.