Changeset View
Changeset View
Standalone View
Standalone View
src/test/rpc_tests.cpp
Show First 20 Lines • Show All 237 Lines • ▼ Show 20 Lines | BOOST_CHECK_NO_THROW( | ||||
"50ed\",\"vout\":0}] " | "50ed\",\"vout\":0}] " | ||||
"{\"data\":" | "{\"data\":" | ||||
"\"010203040506070809101112131415161718192021222324252627282930" | "\"010203040506070809101112131415161718192021222324252627282930" | ||||
"31323334353637383940414243444546474849505152535455565758596061" | "31323334353637383940414243444546474849505152535455565758596061" | ||||
"6263646566676869707172737475767778798081\"}")); | "6263646566676869707172737475767778798081\"}")); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(rpc_format_monetary_values) { | BOOST_AUTO_TEST_CASE(rpc_format_monetary_values) { | ||||
BOOST_CHECK(ValueFromAmount(0LL).write() == "0.00000000"); | BOOST_CHECK(ValueFromAmount(Amount(0LL)).write() == "0.00000000"); | ||||
BOOST_CHECK(ValueFromAmount(1LL).write() == "0.00000001"); | BOOST_CHECK(ValueFromAmount(Amount(1LL)).write() == "0.00000001"); | ||||
BOOST_CHECK(ValueFromAmount(17622195LL).write() == "0.17622195"); | BOOST_CHECK(ValueFromAmount(Amount(17622195LL)).write() == "0.17622195"); | ||||
BOOST_CHECK(ValueFromAmount(50000000LL).write() == "0.50000000"); | BOOST_CHECK(ValueFromAmount(Amount(50000000LL)).write() == "0.50000000"); | ||||
BOOST_CHECK(ValueFromAmount(89898989LL).write() == "0.89898989"); | BOOST_CHECK(ValueFromAmount(Amount(89898989LL)).write() == "0.89898989"); | ||||
BOOST_CHECK(ValueFromAmount(100000000LL).write() == "1.00000000"); | BOOST_CHECK(ValueFromAmount(Amount(100000000LL)).write() == "1.00000000"); | ||||
BOOST_CHECK(ValueFromAmount(2099999999999990LL).write() == | BOOST_CHECK(ValueFromAmount(Amount(2099999999999990LL)).write() == | ||||
"20999999.99999990"); | "20999999.99999990"); | ||||
BOOST_CHECK(ValueFromAmount(2099999999999999LL).write() == | BOOST_CHECK(ValueFromAmount(Amount(2099999999999999LL)).write() == | ||||
"20999999.99999999"); | "20999999.99999999"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(0).write(), "0.00000000"); | BOOST_CHECK_EQUAL(ValueFromAmount(Amount(0)).write(), "0.00000000"); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL(ValueFromAmount(123456789 * (COIN / 10000)).write(), | ||||
ValueFromAmount((COIN.GetSatoshis() / 10000) * 123456789).write(), | |||||
"12345.67890000"); | "12345.67890000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(-COIN.GetSatoshis()).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(-1 * COIN).write(), "-1.00000000"); | ||||
"-1.00000000"); | BOOST_CHECK_EQUAL(ValueFromAmount(-1 * COIN / 10).write(), "-0.10000000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(-COIN.GetSatoshis() / 10).write(), | |||||
"-0.10000000"); | |||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() * 100000000).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(100000000 * COIN).write(), | ||||
"100000000.00000000"); | "100000000.00000000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() * 10000000).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(10000000 * COIN).write(), | ||||
"10000000.00000000"); | "10000000.00000000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() * 1000000).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(1000000 * COIN).write(), | ||||
"1000000.00000000"); | "1000000.00000000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() * 100000).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(100000 * COIN).write(), | ||||
"100000.00000000"); | "100000.00000000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() * 10000).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(10000 * COIN).write(), "10000.00000000"); | ||||
"10000.00000000"); | BOOST_CHECK_EQUAL(ValueFromAmount(1000 * COIN).write(), "1000.00000000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() * 1000).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(100 * COIN).write(), "100.00000000"); | ||||
"1000.00000000"); | BOOST_CHECK_EQUAL(ValueFromAmount(10 * COIN).write(), "10.00000000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() * 100).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(COIN).write(), "1.00000000"); | ||||
"100.00000000"); | BOOST_CHECK_EQUAL(ValueFromAmount(COIN / 10).write(), "0.10000000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() * 10).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(COIN / 100).write(), "0.01000000"); | ||||
"10.00000000"); | BOOST_CHECK_EQUAL(ValueFromAmount(COIN / 1000).write(), "0.00100000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis()).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(COIN / 10000).write(), "0.00010000"); | ||||
"1.00000000"); | BOOST_CHECK_EQUAL(ValueFromAmount(COIN / 100000).write(), "0.00001000"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() / 10).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(COIN / 1000000).write(), "0.00000100"); | ||||
"0.10000000"); | BOOST_CHECK_EQUAL(ValueFromAmount(COIN / 10000000).write(), "0.00000010"); | ||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() / 100).write(), | BOOST_CHECK_EQUAL(ValueFromAmount(COIN / 100000000).write(), "0.00000001"); | ||||
"0.01000000"); | |||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() / 1000).write(), | |||||
"0.00100000"); | |||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() / 10000).write(), | |||||
"0.00010000"); | |||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() / 100000).write(), | |||||
"0.00001000"); | |||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() / 1000000).write(), | |||||
"0.00000100"); | |||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() / 10000000).write(), | |||||
"0.00000010"); | |||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN.GetSatoshis() / 100000000).write(), | |||||
"0.00000001"); | |||||
} | } | ||||
static UniValue ValueFromString(const std::string &str) { | static UniValue ValueFromString(const std::string &str) { | ||||
UniValue value; | UniValue value; | ||||
BOOST_CHECK(value.setNumStr(str)); | BOOST_CHECK(value.setNumStr(str)); | ||||
return value; | return value; | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(rpc_parse_monetary_values) { | BOOST_AUTO_TEST_CASE(rpc_parse_monetary_values) { | ||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("-0.00000001")), | BOOST_CHECK_THROW(AmountFromValue(ValueFromString("-0.00000001")), | ||||
UniValue); | UniValue); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0")), 0LL); | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0")), Amount(0LL)); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000000")), 0LL); | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000000")), | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000001")), 1LL); | Amount(0LL)); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000001")), | |||||
Amount(1LL)); | |||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.17622195")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.17622195")), | ||||
17622195LL); | Amount(17622195LL)); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.5")), 50000000LL); | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.5")), | ||||
Amount(50000000LL)); | |||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.50000000")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.50000000")), | ||||
50000000LL); | Amount(50000000LL)); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.89898989")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.89898989")), | ||||
89898989LL); | Amount(89898989LL)); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("1.00000000")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("1.00000000")), | ||||
100000000LL); | Amount(100000000LL)); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("20999999.9999999")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("20999999.9999999")), | ||||
2099999999999990LL); | Amount(2099999999999990LL)); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("20999999.99999999")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("20999999.99999999")), | ||||
2099999999999999LL); | Amount(2099999999999999LL)); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("1e-8")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("1e-8")), | ||||
COIN.GetSatoshis() / 100000000); | COIN / 100000000); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.1e-7")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.1e-7")), | ||||
COIN.GetSatoshis() / 100000000); | COIN / 100000000); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.01e-6")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.01e-6")), | ||||
COIN.GetSatoshis() / 100000000); | COIN / 100000000); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString( | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString( | ||||
"0." | "0." | ||||
"0000000000000000000000000000000000000000000000000000" | "0000000000000000000000000000000000000000000000000000" | ||||
"000000000000000000000001e+68")), | "000000000000000000000001e+68")), | ||||
COIN.GetSatoshis() / 100000000); | COIN / 100000000); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
AmountFromValue(ValueFromString("10000000000000000000000000000000000000" | AmountFromValue(ValueFromString("10000000000000000000000000000000000000" | ||||
"000000000000000000000000000e-64")), | "000000000000000000000000000e-64")), | ||||
COIN.GetSatoshis()); | COIN); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
AmountFromValue(ValueFromString( | AmountFromValue(ValueFromString( | ||||
"0." | "0." | ||||
"000000000000000000000000000000000000000000000000000000000000000100" | "000000000000000000000000000000000000000000000000000000000000000100" | ||||
"000000000000000000000000000000000000000000000000000e64")), | "000000000000000000000000000000000000000000000000000e64")), | ||||
COIN.GetSatoshis()); | COIN); | ||||
// should fail | // should fail | ||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e-9")), UniValue); | BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e-9")), UniValue); | ||||
// should fail | // should fail | ||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("0.000000019")), | BOOST_CHECK_THROW(AmountFromValue(ValueFromString("0.000000019")), | ||||
UniValue); | UniValue); | ||||
// should pass, cut trailing 0 | // should pass, cut trailing 0 | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000001000000")), | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000001000000")), | ||||
1LL); | Amount(1LL)); | ||||
// should fail | // should fail | ||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("19e-9")), UniValue); | BOOST_CHECK_THROW(AmountFromValue(ValueFromString("19e-9")), UniValue); | ||||
// should pass, leading 0 is present | // should pass, leading 0 is present | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.19e-6")), 19); | BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.19e-6")), Amount(19)); | ||||
// overflow error | // overflow error | ||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("92233720368.54775808")), | BOOST_CHECK_THROW(AmountFromValue(ValueFromString("92233720368.54775808")), | ||||
UniValue); | UniValue); | ||||
// overflow error | // overflow error | ||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e+11")), UniValue); | BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e+11")), UniValue); | ||||
// overflow error signless | // overflow error signless | ||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e11")), UniValue); | BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e11")), UniValue); | ||||
// overflow error | // overflow error | ||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("93e+9")), UniValue); | BOOST_CHECK_THROW(AmountFromValue(ValueFromString("93e+9")), UniValue); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(json_parse_errors) { | BOOST_AUTO_TEST_CASE(json_parse_errors) { | ||||
// Valid | // Valid | ||||
BOOST_CHECK_EQUAL(ParseNonRFCJSONValue("1.0").get_real(), 1.0); | BOOST_CHECK_EQUAL(ParseNonRFCJSONValue("1.0").get_real(), 1.0); | ||||
// Valid, with leading or trailing whitespace | // Valid, with leading or trailing whitespace | ||||
BOOST_CHECK_EQUAL(ParseNonRFCJSONValue(" 1.0").get_real(), 1.0); | BOOST_CHECK_EQUAL(ParseNonRFCJSONValue(" 1.0").get_real(), 1.0); | ||||
BOOST_CHECK_EQUAL(ParseNonRFCJSONValue("1.0 ").get_real(), 1.0); | BOOST_CHECK_EQUAL(ParseNonRFCJSONValue("1.0 ").get_real(), 1.0); | ||||
// should fail, missing leading 0, therefore invalid JSON | // should fail, missing leading 0, therefore invalid JSON | ||||
BOOST_CHECK_THROW(AmountFromValue(ParseNonRFCJSONValue(".19e-6")), | BOOST_CHECK_THROW(AmountFromValue(ParseNonRFCJSONValue(".19e-6")), | ||||
std::runtime_error); | std::runtime_error); | ||||
BOOST_CHECK_EQUAL(AmountFromValue(ParseNonRFCJSONValue( | BOOST_CHECK_EQUAL(AmountFromValue(ParseNonRFCJSONValue( | ||||
"0.00000000000000000000000000000000000001e+30 ")), | "0.00000000000000000000000000000000000001e+30 ")), | ||||
1); | Amount(1)); | ||||
// Invalid, initial garbage | // Invalid, initial garbage | ||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("[1.0"), std::runtime_error); | BOOST_CHECK_THROW(ParseNonRFCJSONValue("[1.0"), std::runtime_error); | ||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("a1.0"), std::runtime_error); | BOOST_CHECK_THROW(ParseNonRFCJSONValue("a1.0"), std::runtime_error); | ||||
// Invalid, trailing garbage | // Invalid, trailing garbage | ||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("1.0sds"), std::runtime_error); | BOOST_CHECK_THROW(ParseNonRFCJSONValue("1.0sds"), std::runtime_error); | ||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("1.0]"), std::runtime_error); | BOOST_CHECK_THROW(ParseNonRFCJSONValue("1.0]"), std::runtime_error); | ||||
// BCH addresses should fail parsing | // BCH addresses should fail parsing | ||||
BOOST_CHECK_THROW( | BOOST_CHECK_THROW( | ||||
Show All 14 Lines | BOOST_AUTO_TEST_CASE(rpc_ban) { | ||||
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | ||||
UniValue ar = r.get_array(); | UniValue ar = r.get_array(); | ||||
UniValue o1 = ar[0].get_obj(); | UniValue o1 = ar[0].get_obj(); | ||||
UniValue adr = find_value(o1, "address"); | UniValue adr = find_value(o1, "address"); | ||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/32"); | BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/32"); | ||||
BOOST_CHECK_NO_THROW(CallRPC(std::string("setban 127.0.0.0 remove"))); | BOOST_CHECK_NO_THROW(CallRPC(std::string("setban 127.0.0.0 remove"))); | ||||
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | ||||
ar = r.get_array(); | ar = r.get_array(); | ||||
BOOST_CHECK_EQUAL(ar.size(), 0); | BOOST_CHECK_EQUAL(ar.size(), 0UL); | ||||
BOOST_CHECK_NO_THROW( | BOOST_CHECK_NO_THROW( | ||||
r = CallRPC(std::string("setban 127.0.0.0/24 add 1607731200 true"))); | r = CallRPC(std::string("setban 127.0.0.0/24 add 1607731200 true"))); | ||||
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | ||||
ar = r.get_array(); | ar = r.get_array(); | ||||
o1 = ar[0].get_obj(); | o1 = ar[0].get_obj(); | ||||
adr = find_value(o1, "address"); | adr = find_value(o1, "address"); | ||||
UniValue banned_until = find_value(o1, "banned_until"); | UniValue banned_until = find_value(o1, "banned_until"); | ||||
Show All 18 Lines | BOOST_AUTO_TEST_CASE(rpc_ban) { | ||||
// must throw an exception because 127.0.0.1 is in already banned subnet | // must throw an exception because 127.0.0.1 is in already banned subnet | ||||
// range | // range | ||||
BOOST_CHECK_THROW(r = CallRPC(std::string("setban 127.0.0.1 add")), | BOOST_CHECK_THROW(r = CallRPC(std::string("setban 127.0.0.1 add")), | ||||
std::runtime_error); | std::runtime_error); | ||||
BOOST_CHECK_NO_THROW(CallRPC(std::string("setban 127.0.0.0/24 remove"))); | BOOST_CHECK_NO_THROW(CallRPC(std::string("setban 127.0.0.0/24 remove"))); | ||||
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | ||||
ar = r.get_array(); | ar = r.get_array(); | ||||
BOOST_CHECK_EQUAL(ar.size(), 0); | BOOST_CHECK_EQUAL(ar.size(), 0UL); | ||||
BOOST_CHECK_NO_THROW( | BOOST_CHECK_NO_THROW( | ||||
r = CallRPC(std::string("setban 127.0.0.0/255.255.0.0 add"))); | r = CallRPC(std::string("setban 127.0.0.0/255.255.0.0 add"))); | ||||
BOOST_CHECK_THROW(r = CallRPC(std::string("setban 127.0.1.1 add")), | BOOST_CHECK_THROW(r = CallRPC(std::string("setban 127.0.1.1 add")), | ||||
std::runtime_error); | std::runtime_error); | ||||
BOOST_CHECK_NO_THROW(CallRPC(std::string("clearbanned"))); | BOOST_CHECK_NO_THROW(CallRPC(std::string("clearbanned"))); | ||||
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); | ||||
ar = r.get_array(); | ar = r.get_array(); | ||||
BOOST_CHECK_EQUAL(ar.size(), 0); | BOOST_CHECK_EQUAL(ar.size(), 0UL); | ||||
// invalid IP | // invalid IP | ||||
BOOST_CHECK_THROW(r = CallRPC(std::string("setban test add")), | BOOST_CHECK_THROW(r = CallRPC(std::string("setban test add")), | ||||
std::runtime_error); | std::runtime_error); | ||||
// IPv6 tests | // IPv6 tests | ||||
BOOST_CHECK_NO_THROW( | BOOST_CHECK_NO_THROW( | ||||
r = CallRPC( | r = CallRPC( | ||||
▲ Show 20 Lines • Show All 63 Lines • Show Last 20 Lines |