Initial merge
This commit is contained in:
@@ -23,21 +23,7 @@ BOOST_FIXTURE_TEST_SUITE(Checkpoints_tests, BasicTestingSetup)
|
||||
BOOST_AUTO_TEST_CASE(sanity)
|
||||
{
|
||||
const Checkpoints::CCheckpointData& checkpoints = Params(CBaseChainParams::MAIN).Checkpoints();
|
||||
uint256 p11111 = uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d");
|
||||
uint256 p134444 = uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe");
|
||||
BOOST_CHECK(Checkpoints::CheckBlock(checkpoints, 11111, p11111));
|
||||
BOOST_CHECK(Checkpoints::CheckBlock(checkpoints, 134444, p134444));
|
||||
|
||||
|
||||
// Wrong hashes at checkpoints should fail:
|
||||
BOOST_CHECK(!Checkpoints::CheckBlock(checkpoints, 11111, p134444));
|
||||
BOOST_CHECK(!Checkpoints::CheckBlock(checkpoints, 134444, p11111));
|
||||
|
||||
// ... but any hash not at a checkpoint should succeed:
|
||||
BOOST_CHECK(Checkpoints::CheckBlock(checkpoints, 11111+1, p134444));
|
||||
BOOST_CHECK(Checkpoints::CheckBlock(checkpoints, 134444+1, p11111));
|
||||
|
||||
BOOST_CHECK(Checkpoints::GetTotalBlocksEstimate(checkpoints) >= 134444);
|
||||
}
|
||||
}
|
||||
*/
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include <boost/filesystem/operations.hpp>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include "json/json_spirit_reader_template.h"
|
||||
|
||||
#include "key.h"
|
||||
#include "alertkeys.h"
|
||||
|
||||
@@ -17,23 +17,20 @@
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include "json/json_spirit_reader_template.h"
|
||||
#include "json/json_spirit_utils.h"
|
||||
#include "json/json_spirit_writer_template.h"
|
||||
|
||||
using namespace json_spirit;
|
||||
extern Array read_json(const std::string& jsondata);
|
||||
#include <univalue.h>
|
||||
|
||||
extern UniValue read_json(const std::string& jsondata);
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(base58_tests, BasicTestingSetup)
|
||||
|
||||
// Goal: test low-level base58 encoding functionality
|
||||
BOOST_AUTO_TEST_CASE(base58_EncodeBase58)
|
||||
{
|
||||
Array tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
std::string strTest = write_string(tv, false);
|
||||
UniValue tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
std::string strTest = test.write();
|
||||
if (test.size() < 2) // Allow for extra stuff (useful for comments)
|
||||
{
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
@@ -50,13 +47,12 @@ BOOST_AUTO_TEST_CASE(base58_EncodeBase58)
|
||||
// Goal: test low-level base58 decoding functionality
|
||||
BOOST_AUTO_TEST_CASE(base58_DecodeBase58)
|
||||
{
|
||||
Array tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
|
||||
UniValue tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
|
||||
std::vector<unsigned char> result;
|
||||
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
std::string strTest = write_string(tv, false);
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
std::string strTest = test.write();
|
||||
if (test.size() < 2) // Allow for extra stuff (useful for comments)
|
||||
{
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
@@ -124,16 +120,15 @@ public:
|
||||
// Goal: check that parsed keys match test payload
|
||||
BOOST_AUTO_TEST_CASE(base58_keys_valid_parse)
|
||||
{
|
||||
Array tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid)));
|
||||
UniValue tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid)));
|
||||
std::vector<unsigned char> result;
|
||||
CBitcoinSecret secret;
|
||||
CBitcoinAddress addr;
|
||||
SelectParams(CBaseChainParams::MAIN);
|
||||
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
std::string strTest = write_string(tv, false);
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
std::string strTest = test.write();
|
||||
if (test.size() < 3) // Allow for extra stuff (useful for comments)
|
||||
{
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
@@ -141,7 +136,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse)
|
||||
}
|
||||
std::string exp_base58string = test[0].get_str();
|
||||
std::vector<unsigned char> exp_payload = ParseHex(test[1].get_str());
|
||||
const Object &metadata = test[2].get_obj();
|
||||
const UniValue &metadata = test[2].get_obj();
|
||||
bool isPrivkey = find_value(metadata, "isPrivkey").get_bool();
|
||||
bool isTestnet = find_value(metadata, "isTestnet").get_bool();
|
||||
if (isTestnet)
|
||||
@@ -183,12 +178,12 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse)
|
||||
// Goal: check that generated keys match test vectors
|
||||
BOOST_AUTO_TEST_CASE(base58_keys_valid_gen)
|
||||
{
|
||||
Array tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid)));
|
||||
UniValue tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid)));
|
||||
std::vector<unsigned char> result;
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
std::string strTest = write_string(tv, false);
|
||||
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
std::string strTest = test.write();
|
||||
if (test.size() < 3) // Allow for extra stuff (useful for comments)
|
||||
{
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
@@ -196,7 +191,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen)
|
||||
}
|
||||
std::string exp_base58string = test[0].get_str();
|
||||
std::vector<unsigned char> exp_payload = ParseHex(test[1].get_str());
|
||||
const Object &metadata = test[2].get_obj();
|
||||
const UniValue &metadata = test[2].get_obj();
|
||||
bool isPrivkey = find_value(metadata, "isPrivkey").get_bool();
|
||||
bool isTestnet = find_value(metadata, "isTestnet").get_bool();
|
||||
if (isTestnet)
|
||||
@@ -251,15 +246,14 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen)
|
||||
// Goal: check that base58 parsing code is robust against a variety of corrupted data
|
||||
BOOST_AUTO_TEST_CASE(base58_keys_invalid)
|
||||
{
|
||||
Array tests = read_json(std::string(json_tests::base58_keys_invalid, json_tests::base58_keys_invalid + sizeof(json_tests::base58_keys_invalid))); // Negative testcases
|
||||
UniValue tests = read_json(std::string(json_tests::base58_keys_invalid, json_tests::base58_keys_invalid + sizeof(json_tests::base58_keys_invalid))); // Negative testcases
|
||||
std::vector<unsigned char> result;
|
||||
CBitcoinSecret secret;
|
||||
CBitcoinAddress addr;
|
||||
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
std::string strTest = write_string(tv, false);
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
std::string strTest = test.write();
|
||||
if (test.size() < 1) // Allow for extra stuff (useful for comments)
|
||||
{
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
|
||||
@@ -88,12 +88,23 @@ void RunTest(const TestVector &test) {
|
||||
unsigned char data[74];
|
||||
key.Encode(data);
|
||||
pubkey.Encode(data);
|
||||
|
||||
// Test private key
|
||||
CBitcoinExtKey b58key; b58key.SetKey(key);
|
||||
BOOST_CHECK(b58key.ToString() == derive.prv);
|
||||
|
||||
CBitcoinExtKey b58keyDecodeCheck(derive.prv);
|
||||
CExtKey checkKey = b58keyDecodeCheck.GetKey();
|
||||
assert(checkKey == key); //ensure a base58 decoded key also matches
|
||||
|
||||
// Test public key
|
||||
CBitcoinExtPubKey b58pubkey; b58pubkey.SetKey(pubkey);
|
||||
BOOST_CHECK(b58pubkey.ToString() == derive.pub);
|
||||
|
||||
CBitcoinExtPubKey b58PubkeyDecodeCheck(derive.pub);
|
||||
CExtPubKey checkPubKey = b58PubkeyDecodeCheck.GetKey();
|
||||
assert(checkPubKey == pubkey); //ensure a base58 decoded pubkey also matches
|
||||
|
||||
// Derive new keys
|
||||
CExtKey keyNew;
|
||||
BOOST_CHECK(key.Derive(keyNew, derive.nChild));
|
||||
|
||||
@@ -143,9 +143,9 @@ public:
|
||||
memusage::DynamicUsage(cacheAnchors) +
|
||||
memusage::DynamicUsage(cacheNullifiers);
|
||||
for (CCoinsMap::iterator it = cacheCoins.begin(); it != cacheCoins.end(); it++) {
|
||||
ret += memusage::DynamicUsage(it->second.coins);
|
||||
ret += it->second.coins.DynamicMemoryUsage();
|
||||
}
|
||||
BOOST_CHECK_EQUAL(memusage::DynamicUsage(*this), ret);
|
||||
BOOST_CHECK_EQUAL(DynamicMemoryUsage(), ret);
|
||||
}
|
||||
|
||||
};
|
||||
@@ -756,7 +756,7 @@ BOOST_AUTO_TEST_CASE(coins_coinbase_spends)
|
||||
|
||||
{
|
||||
CTransaction tx2(mtx2);
|
||||
BOOST_CHECK(NonContextualCheckInputs(tx2, state, cache, false, SCRIPT_VERIFY_NONE, false, Params().GetConsensus()));
|
||||
BOOST_CHECK(Consensus::CheckTxInputs(tx2, state, cache, 100+COINBASE_MATURITY, Params().GetConsensus()));
|
||||
}
|
||||
|
||||
mtx2.vout.resize(1);
|
||||
@@ -765,7 +765,7 @@ BOOST_AUTO_TEST_CASE(coins_coinbase_spends)
|
||||
|
||||
{
|
||||
CTransaction tx2(mtx2);
|
||||
BOOST_CHECK(!NonContextualCheckInputs(tx2, state, cache, false, SCRIPT_VERIFY_NONE, false, Params().GetConsensus()));
|
||||
BOOST_CHECK(!Consensus::CheckTxInputs(tx2, state, cache, 100+COINBASE_MATURITY, Params().GetConsensus()));
|
||||
BOOST_CHECK(state.GetRejectReason() == "bad-txns-coinbase-spend-has-transparent-outputs");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
["-create",
|
||||
"in=4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485:0",
|
||||
"set=privatekeys:[\"5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf\"]",
|
||||
"set=prevtxs:[{\"txid\":\"4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485\",\"vout\":0,\"scriptPubKey\":\"4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485\"}]",
|
||||
"set=prevtxs:[{\"txid\":\"4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485\",\"vout\":0,\"scriptPubKey\":\"76a91491b24bf9f5288532960ac687abb035127b1d28a588ac\"}]",
|
||||
"sign=ALL",
|
||||
"outaddr=0.001:t1Ruz6gK4QPZoPPGpHaieupnnh62mktjQE7"],
|
||||
"output_cmp": "txcreatesign.hex"
|
||||
|
||||
@@ -1 +1 @@
|
||||
01000000018594c5bdcaec8f06b78b596f31cd292a294fd031e24eec716f43dac91ea7494d0000000000ffffffff01a0860100000000001976a9145834479edbbe0539b31ffd3a8f8ebadc2165ed0188ac00000000
|
||||
01000000018594c5bdcaec8f06b78b596f31cd292a294fd031e24eec716f43dac91ea7494d000000008b48304502210096a75056c9e2cc62b7214777b3d2a592cfda7092520126d4ebfcd6d590c99bd8022051bb746359cf98c0603f3004477eac68701132380db8facba19c89dc5ab5c5e201410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ffffffff01a0860100000000001976a9145834479edbbe0539b31ffd3a8f8ebadc2165ed0188ac00000000
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
#include "config/bitcoin-config.h"
|
||||
#endif
|
||||
|
||||
#include "arith_uint256.h"
|
||||
#include "crypto/sha256.h"
|
||||
#include "crypto/equihash.h"
|
||||
@@ -40,6 +44,7 @@ void PrintSolutions(std::stringstream &strm, std::set<std::vector<uint32_t>> sol
|
||||
strm << "\n}";
|
||||
}
|
||||
|
||||
#ifdef ENABLE_MINING
|
||||
void TestEquihashSolvers(unsigned int n, unsigned int k, const std::string &I, const arith_uint256 &nonce, const std::set<std::vector<uint32_t>> &solns) {
|
||||
size_t cBitLen { n/(k+1) };
|
||||
crypto_generichash_blake2b_state state;
|
||||
@@ -78,6 +83,7 @@ void TestEquihashSolvers(unsigned int n, unsigned int k, const std::string &I, c
|
||||
BOOST_CHECK(retOpt == solns);
|
||||
BOOST_CHECK(retOpt == ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
void TestEquihashValidator(unsigned int n, unsigned int k, const std::string &I, const arith_uint256 &nonce, std::vector<uint32_t> soln, bool expected) {
|
||||
size_t cBitLen { n/(k+1) };
|
||||
@@ -95,6 +101,7 @@ void TestEquihashValidator(unsigned int n, unsigned int k, const std::string &I,
|
||||
BOOST_CHECK(isValid == expected);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_MINING
|
||||
BOOST_AUTO_TEST_CASE(solver_testvectors) {
|
||||
TestEquihashSolvers(96, 5, "block header", 0, {
|
||||
{976, 126621, 100174, 123328, 38477, 105390, 38834, 90500, 6411, 116489, 51107, 129167, 25557, 92292, 38525, 56514, 1110, 98024, 15426, 74455, 3185, 84007, 24328, 36473, 17427, 129451, 27556, 119967, 31704, 62448, 110460, 117894},
|
||||
@@ -147,6 +154,7 @@ BOOST_AUTO_TEST_CASE(solver_testvectors) {
|
||||
{8144, 33053, 33933, 77498, 21356, 110495, 42805, 116575, 27360, 48574, 100682, 102629, 50754, 64608, 96899, 120978, 11924, 74422, 49240, 106822, 12787, 68290, 44314, 50005, 38056, 49716, 83299, 95307, 41798, 82309, 94504, 96161}
|
||||
});
|
||||
}
|
||||
#endif
|
||||
|
||||
BOOST_AUTO_TEST_CASE(validator_testvectors) {
|
||||
// Original valid solution
|
||||
|
||||
94
src/test/raii_event_tests.cpp
Normal file
94
src/test/raii_event_tests.cpp
Normal file
@@ -0,0 +1,94 @@
|
||||
// Copyright (c) 2016 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <event2/event.h>
|
||||
|
||||
#ifdef EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED
|
||||
// It would probably be ideal to define dummy test(s) that report skipped, but boost::test doesn't seem to make that practical (at least not in versions available with common distros)
|
||||
|
||||
#include <map>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "support/events.h"
|
||||
|
||||
#include "test/test_bitcoin.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
static std::map<void*, short> tags;
|
||||
static std::map<void*, uint16_t> orders;
|
||||
static uint16_t tagSequence = 0;
|
||||
|
||||
static void* tag_malloc(size_t sz) {
|
||||
void* mem = malloc(sz);
|
||||
if (!mem) return mem;
|
||||
tags[mem]++;
|
||||
orders[mem] = tagSequence++;
|
||||
return mem;
|
||||
}
|
||||
|
||||
static void tag_free(void* mem) {
|
||||
tags[mem]--;
|
||||
orders[mem] = tagSequence++;
|
||||
free(mem);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(raii_event_tests, BasicTestingSetup)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(raii_event_creation)
|
||||
{
|
||||
event_set_mem_functions(tag_malloc, realloc, tag_free);
|
||||
|
||||
void* base_ptr = NULL;
|
||||
{
|
||||
auto base = obtain_event_base();
|
||||
base_ptr = (void*)base.get();
|
||||
BOOST_CHECK(tags[base_ptr] == 1);
|
||||
}
|
||||
BOOST_CHECK(tags[base_ptr] == 0);
|
||||
|
||||
void* event_ptr = NULL;
|
||||
{
|
||||
auto base = obtain_event_base();
|
||||
auto event = obtain_event(base.get(), -1, 0, NULL, NULL);
|
||||
|
||||
base_ptr = (void*)base.get();
|
||||
event_ptr = (void*)event.get();
|
||||
|
||||
BOOST_CHECK(tags[base_ptr] == 1);
|
||||
BOOST_CHECK(tags[event_ptr] == 1);
|
||||
}
|
||||
BOOST_CHECK(tags[base_ptr] == 0);
|
||||
BOOST_CHECK(tags[event_ptr] == 0);
|
||||
|
||||
event_set_mem_functions(malloc, realloc, free);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(raii_event_order)
|
||||
{
|
||||
event_set_mem_functions(tag_malloc, realloc, tag_free);
|
||||
|
||||
void* base_ptr = NULL;
|
||||
void* event_ptr = NULL;
|
||||
{
|
||||
auto base = obtain_event_base();
|
||||
auto event = obtain_event(base.get(), -1, 0, NULL, NULL);
|
||||
|
||||
base_ptr = (void*)base.get();
|
||||
event_ptr = (void*)event.get();
|
||||
|
||||
// base should have allocated before event
|
||||
BOOST_CHECK(orders[base_ptr] < orders[event_ptr]);
|
||||
}
|
||||
// base should be freed after event
|
||||
BOOST_CHECK(orders[base_ptr] > orders[event_ptr]);
|
||||
|
||||
event_set_mem_functions(malloc, realloc, free);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
#endif // EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED
|
||||
@@ -13,22 +13,23 @@
|
||||
#include <boost/algorithm/string.hpp>
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace json_spirit;
|
||||
#include <univalue.h>
|
||||
|
||||
Array
|
||||
using namespace std;
|
||||
|
||||
UniValue
|
||||
createArgs(int nRequired, const char* address1=NULL, const char* address2=NULL)
|
||||
{
|
||||
Array result;
|
||||
UniValue result(UniValue::VARR);
|
||||
result.push_back(nRequired);
|
||||
Array addresses;
|
||||
UniValue addresses(UniValue::VARR);
|
||||
if (address1) addresses.push_back(address1);
|
||||
if (address2) addresses.push_back(address2);
|
||||
result.push_back(addresses);
|
||||
return result;
|
||||
}
|
||||
|
||||
Value CallRPC(string args)
|
||||
UniValue CallRPC(string args)
|
||||
{
|
||||
vector<string> vArgs;
|
||||
boost::split(vArgs, args, boost::is_any_of(" \t"));
|
||||
@@ -40,14 +41,14 @@ Value CallRPC(string args)
|
||||
vArgs[i] = "";
|
||||
}
|
||||
}
|
||||
Array params = RPCConvertValues(strMethod, vArgs);
|
||||
UniValue params = RPCConvertValues(strMethod, vArgs);
|
||||
|
||||
rpcfn_type method = tableRPC[strMethod]->actor;
|
||||
try {
|
||||
Value result = (*method)(params, false);
|
||||
UniValue result = (*method)(params, false);
|
||||
return result;
|
||||
}
|
||||
catch (const Object& objError) {
|
||||
catch (const UniValue& objError) {
|
||||
throw runtime_error(find_value(objError, "message").get_str());
|
||||
}
|
||||
}
|
||||
@@ -58,7 +59,7 @@ BOOST_FIXTURE_TEST_SUITE(rpc_tests, TestingSetup)
|
||||
BOOST_AUTO_TEST_CASE(rpc_rawparams)
|
||||
{
|
||||
// Test raw transaction API argument handling
|
||||
Value r;
|
||||
UniValue r;
|
||||
|
||||
BOOST_CHECK_THROW(CallRPC("getrawtransaction"), runtime_error);
|
||||
BOOST_CHECK_THROW(CallRPC("getrawtransaction not_hex"), runtime_error);
|
||||
@@ -98,7 +99,7 @@ BOOST_AUTO_TEST_CASE(rpc_rawparams)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(rpc_rawsign)
|
||||
{
|
||||
Value r;
|
||||
UniValue r;
|
||||
// input is a 1-of-2 multisig (so is output):
|
||||
string prevout =
|
||||
"[{\"txid\":\"b4cc287e58f87cdae59417329f710f3ecd75a4ee1d2872b7248f50977c8493f3\","
|
||||
@@ -117,25 +118,51 @@ BOOST_AUTO_TEST_CASE(rpc_rawsign)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(rpc_format_monetary_values)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(write_string(ValueFromAmount(0LL), false), "0.00000000");
|
||||
BOOST_CHECK_EQUAL(write_string(ValueFromAmount(1LL), false), "0.00000001");
|
||||
BOOST_CHECK_EQUAL(write_string(ValueFromAmount(17622195LL), false), "0.17622195");
|
||||
BOOST_CHECK_EQUAL(write_string(ValueFromAmount(50000000LL), false), "0.50000000");
|
||||
BOOST_CHECK_EQUAL(write_string(ValueFromAmount(89898989LL), false), "0.89898989");
|
||||
BOOST_CHECK_EQUAL(write_string(ValueFromAmount(100000000LL), false), "1.00000000");
|
||||
BOOST_CHECK_EQUAL(write_string(ValueFromAmount(2099999999999990LL), false), "20999999.99999990");
|
||||
BOOST_CHECK_EQUAL(write_string(ValueFromAmount(2099999999999999LL), false), "20999999.99999999");
|
||||
BOOST_CHECK(ValueFromAmount(0LL).write() == "0.00000000");
|
||||
BOOST_CHECK(ValueFromAmount(1LL).write() == "0.00000001");
|
||||
BOOST_CHECK(ValueFromAmount(17622195LL).write() == "0.17622195");
|
||||
BOOST_CHECK(ValueFromAmount(50000000LL).write() == "0.50000000");
|
||||
BOOST_CHECK(ValueFromAmount(89898989LL).write() == "0.89898989");
|
||||
BOOST_CHECK(ValueFromAmount(100000000LL).write() == "1.00000000");
|
||||
BOOST_CHECK(ValueFromAmount(2099999999999990LL).write() == "20999999.99999990");
|
||||
BOOST_CHECK(ValueFromAmount(2099999999999999LL).write() == "20999999.99999999");
|
||||
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(0).write(), "0.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount((COIN/10000)*123456789).write(), "12345.67890000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(-COIN).write(), "-1.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(-COIN/10).write(), "-0.10000000");
|
||||
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN*100000000).write(), "100000000.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN*10000000).write(), "10000000.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN*1000000).write(), "1000000.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN*100000).write(), "100000.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN*10000).write(), "10000.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN*1000).write(), "1000.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN*100).write(), "100.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN*10).write(), "10.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN).write(), "1.00000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN/10).write(), "0.10000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN/100).write(), "0.01000000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN/1000).write(), "0.00100000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN/10000).write(), "0.00010000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN/100000).write(), "0.00001000");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN/1000000).write(), "0.00000100");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN/10000000).write(), "0.00000010");
|
||||
BOOST_CHECK_EQUAL(ValueFromAmount(COIN/100000000).write(), "0.00000001");
|
||||
}
|
||||
|
||||
static Value ValueFromString(const std::string &str)
|
||||
static UniValue ValueFromString(const std::string &str)
|
||||
{
|
||||
Value value;
|
||||
BOOST_CHECK(read_string(str, value));
|
||||
UniValue value;
|
||||
BOOST_CHECK(value.setNumStr(str));
|
||||
return value;
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(rpc_parse_monetary_values)
|
||||
{
|
||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("-0.00000001")), UniValue);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0")), 0LL);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000000")), 0LL);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000001")), 1LL);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.17622195")), 17622195LL);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.5")), 50000000LL);
|
||||
@@ -144,39 +171,128 @@ BOOST_AUTO_TEST_CASE(rpc_parse_monetary_values)
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("1.00000000")), 100000000LL);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("20999999.9999999")), 2099999999999990LL);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("20999999.99999999")), 2099999999999999LL);
|
||||
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("1e-8")), COIN/100000000);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.1e-7")), COIN/100000000);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.01e-6")), COIN/100000000);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.0000000000000000000000000000000000000000000000000000000000000000000000000001e+68")), COIN/100000000);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("10000000000000000000000000000000000000000000000000000000000000000e-64")), COIN);
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000e64")), COIN);
|
||||
|
||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e-9")), UniValue); //should fail
|
||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("0.000000019")), UniValue); //should fail
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000001000000")), 1LL); //should pass, cut trailing 0
|
||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("19e-9")), UniValue); //should fail
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.19e-6")), 19); //should pass, leading 0 is present
|
||||
|
||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("92233720368.54775808")), UniValue); //overflow error
|
||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e+11")), UniValue); //overflow error
|
||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("1e11")), UniValue); //overflow error signless
|
||||
BOOST_CHECK_THROW(AmountFromValue(ValueFromString("93e+9")), UniValue); //overflow error
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(json_parse_errors)
|
||||
{
|
||||
Value value;
|
||||
// Valid
|
||||
BOOST_CHECK_EQUAL(read_string(std::string("1.0"), value), true);
|
||||
// Valid, with trailing whitespace
|
||||
BOOST_CHECK_EQUAL(read_string(std::string("1.0 "), value), true);
|
||||
BOOST_CHECK_EQUAL(ParseNonRFCJSONValue("1.0").get_real(), 1.0);
|
||||
// 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_THROW(AmountFromValue(ParseNonRFCJSONValue(".19e-6")), std::runtime_error); //should fail, missing leading 0, therefore invalid JSON
|
||||
BOOST_CHECK_EQUAL(AmountFromValue(ParseNonRFCJSONValue("0.00000000000000000000000000000000000001e+30 ")), 1);
|
||||
// Invalid, initial garbage
|
||||
BOOST_CHECK_EQUAL(read_string(std::string("[1.0"), value), false);
|
||||
BOOST_CHECK_EQUAL(read_string(std::string("a1.0"), value), false);
|
||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("[1.0"), std::runtime_error);
|
||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("a1.0"), std::runtime_error);
|
||||
// Invalid, trailing garbage
|
||||
BOOST_CHECK_EQUAL(read_string(std::string("1.0sds"), value), false);
|
||||
BOOST_CHECK_EQUAL(read_string(std::string("1.0]"), value), false);
|
||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("1.0sds"), std::runtime_error);
|
||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("1.0]"), std::runtime_error);
|
||||
// BTC addresses should fail parsing
|
||||
BOOST_CHECK_EQUAL(read_string(std::string("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"), value), false);
|
||||
BOOST_CHECK_EQUAL(read_string(std::string("3J98t1WpEZ73CNmQviecrnyiWrnqRhWNL"), value), false);
|
||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"), std::runtime_error);
|
||||
BOOST_CHECK_THROW(ParseNonRFCJSONValue("3J98t1WpEZ73CNmQviecrnyiWrnqRhWNL"), std::runtime_error);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(rpc_boostasiotocnetaddr)
|
||||
BOOST_AUTO_TEST_CASE(rpc_ban)
|
||||
{
|
||||
// Check IPv4 addresses
|
||||
BOOST_CHECK_EQUAL(BoostAsioToCNetAddr(boost::asio::ip::address::from_string("1.2.3.4")).ToString(), "1.2.3.4");
|
||||
BOOST_CHECK_EQUAL(BoostAsioToCNetAddr(boost::asio::ip::address::from_string("127.0.0.1")).ToString(), "127.0.0.1");
|
||||
// Check IPv6 addresses
|
||||
BOOST_CHECK_EQUAL(BoostAsioToCNetAddr(boost::asio::ip::address::from_string("::1")).ToString(), "::1");
|
||||
BOOST_CHECK_EQUAL(BoostAsioToCNetAddr(boost::asio::ip::address::from_string("123:4567:89ab:cdef:123:4567:89ab:cdef")).ToString(),
|
||||
"123:4567:89ab:cdef:123:4567:89ab:cdef");
|
||||
// v4 compatible must be interpreted as IPv4
|
||||
BOOST_CHECK_EQUAL(BoostAsioToCNetAddr(boost::asio::ip::address::from_string("::0:127.0.0.1")).ToString(), "127.0.0.1");
|
||||
// v4 mapped must be interpreted as IPv4
|
||||
BOOST_CHECK_EQUAL(BoostAsioToCNetAddr(boost::asio::ip::address::from_string("::ffff:127.0.0.1")).ToString(), "127.0.0.1");
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
|
||||
|
||||
UniValue r;
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0 add")));
|
||||
BOOST_CHECK_THROW(r = CallRPC(string("setban 127.0.0.0:8334")), runtime_error); //portnumber for setban not allowed
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
UniValue ar = r.get_array();
|
||||
UniValue o1 = ar[0].get_obj();
|
||||
UniValue adr = find_value(o1, "address");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.255");
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0 remove")));;
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
BOOST_CHECK_EQUAL(ar.size(), 0);
|
||||
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0/24 add 1607731200 true")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
UniValue banned_until = find_value(o1, "banned_until");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.0");
|
||||
BOOST_CHECK_EQUAL(banned_until.get_int64(), 1607731200); // absolute time check
|
||||
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
|
||||
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0/24 add 200")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
banned_until = find_value(o1, "banned_until");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.0");
|
||||
int64_t now = GetTime();
|
||||
BOOST_CHECK(banned_until.get_int64() > now);
|
||||
BOOST_CHECK(banned_until.get_int64()-now <= 200);
|
||||
|
||||
// must throw an exception because 127.0.0.1 is in already banned suubnet range
|
||||
BOOST_CHECK_THROW(r = CallRPC(string("setban 127.0.0.1 add")), runtime_error);
|
||||
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0/24 remove")));;
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
BOOST_CHECK_EQUAL(ar.size(), 0);
|
||||
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0/255.255.0.0 add")));
|
||||
BOOST_CHECK_THROW(r = CallRPC(string("setban 127.0.1.1 add")), runtime_error);
|
||||
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
BOOST_CHECK_EQUAL(ar.size(), 0);
|
||||
|
||||
|
||||
BOOST_CHECK_THROW(r = CallRPC(string("setban test add")), runtime_error); //invalid IP
|
||||
|
||||
//IPv6 tests
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban FE80:0000:0000:0000:0202:B3FF:FE1E:8329 add")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "fe80::202:b3ff:fe1e:8329/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
|
||||
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 2001:db8::/30 add")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "2001:db8::/ffff:fffc:0:0:0:0:0:0");
|
||||
|
||||
BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/128 add")));
|
||||
BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
|
||||
ar = r.get_array();
|
||||
o1 = ar[0].get_obj();
|
||||
adr = find_value(o1, "address");
|
||||
BOOST_CHECK_EQUAL(adr.get_str(), "2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
@@ -31,15 +31,16 @@
|
||||
#include <boost/format.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace json_spirit;
|
||||
#include <univalue.h>
|
||||
|
||||
extern Array createArgs(int nRequired, const char* address1 = NULL, const char* address2 = NULL);
|
||||
extern Value CallRPC(string args);
|
||||
using namespace std;
|
||||
|
||||
extern UniValue createArgs(int nRequired, const char* address1 = NULL, const char* address2 = NULL);
|
||||
extern UniValue CallRPC(string args);
|
||||
|
||||
extern CWallet* pwalletMain;
|
||||
|
||||
bool find_error(const Object& objError, const std::string& expected) {
|
||||
bool find_error(const UniValue& objError, const std::string& expected) {
|
||||
return find_value(objError, "message").get_str().find(expected) != string::npos;
|
||||
}
|
||||
|
||||
@@ -56,7 +57,7 @@ BOOST_AUTO_TEST_CASE(rpc_addmultisig)
|
||||
// new, compressed:
|
||||
const char address2Hex[] = "0388c2037017c62240b6b72ac1a2a5f94da790596ebd06177c8572752922165cb4";
|
||||
|
||||
Value v;
|
||||
UniValue v;
|
||||
CBitcoinAddress address;
|
||||
BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex), false));
|
||||
address.SetString(v.get_str());
|
||||
@@ -87,13 +88,13 @@ BOOST_AUTO_TEST_CASE(rpc_addmultisig)
|
||||
BOOST_AUTO_TEST_CASE(rpc_wallet)
|
||||
{
|
||||
// Test RPC calls for various wallet statistics
|
||||
Value r;
|
||||
UniValue r;
|
||||
|
||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||
|
||||
CPubKey demoPubkey = pwalletMain->GenerateNewKey();
|
||||
CBitcoinAddress demoAddress = CBitcoinAddress(CTxDestination(demoPubkey.GetID()));
|
||||
Value retValue;
|
||||
UniValue retValue;
|
||||
string strAccount = "";
|
||||
string strPurpose = "receive";
|
||||
BOOST_CHECK_NO_THROW({ /*Initialize Wallet with an account */
|
||||
@@ -239,31 +240,47 @@ BOOST_AUTO_TEST_CASE(rpc_wallet)
|
||||
*********************************/
|
||||
BOOST_CHECK_THROW(CallRPC("getaddressesbyaccount"), runtime_error);
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("getaddressesbyaccount " + strAccount));
|
||||
Array arr = retValue.get_array();
|
||||
UniValue arr = retValue.get_array();
|
||||
BOOST_CHECK_EQUAL(4, arr.size());
|
||||
bool notFound = true;
|
||||
for (auto a : arr) {
|
||||
for (auto a : arr.getValues()) {
|
||||
notFound &= CBitcoinAddress(a.get_str()).Get() != demoAddress.Get();
|
||||
}
|
||||
BOOST_CHECK(!notFound);
|
||||
|
||||
/*********************************
|
||||
* fundrawtransaction
|
||||
*********************************/
|
||||
BOOST_CHECK_THROW(CallRPC("fundrawtransaction 28z"), runtime_error);
|
||||
BOOST_CHECK_THROW(CallRPC("fundrawtransaction 01000000000180969800000000001976a91450ce0a4b0ee0ddeb633da85199728b940ac3fe9488ac00000000"), runtime_error);
|
||||
|
||||
/*
|
||||
* getblocksubsidy
|
||||
*/
|
||||
BOOST_CHECK_THROW(CallRPC("getblocksubsidy too many args"), runtime_error);
|
||||
BOOST_CHECK_THROW(CallRPC("getblocksubsidy -1"), runtime_error);
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("getblocksubsidy 50000"));
|
||||
Object obj = retValue.get_obj();
|
||||
BOOST_CHECK(find_value(obj, "miner") == 10.0);
|
||||
BOOST_CHECK(find_value(obj, "founders") == 2.5);
|
||||
UniValue obj = retValue.get_obj();
|
||||
BOOST_CHECK_EQUAL(find_value(obj, "miner").get_real(), 10.0);
|
||||
BOOST_CHECK_EQUAL(find_value(obj, "founders").get_real(), 2.5);
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("getblocksubsidy 1000000"));
|
||||
obj = retValue.get_obj();
|
||||
BOOST_CHECK(find_value(obj, "miner") == 6.25);
|
||||
BOOST_CHECK(find_value(obj, "founders") == 0.0);
|
||||
BOOST_CHECK_EQUAL(find_value(obj, "miner").get_real(), 6.25);
|
||||
BOOST_CHECK_EQUAL(find_value(obj, "founders").get_real(), 0.0);
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("getblocksubsidy 2000000"));
|
||||
obj = retValue.get_obj();
|
||||
BOOST_CHECK(find_value(obj, "miner") == 3.125);
|
||||
BOOST_CHECK(find_value(obj, "founders") == 0.0);
|
||||
BOOST_CHECK_EQUAL(find_value(obj, "miner").get_real(), 3.125);
|
||||
BOOST_CHECK_EQUAL(find_value(obj, "founders").get_real(), 0.0);
|
||||
|
||||
/*
|
||||
* getblock
|
||||
*/
|
||||
BOOST_CHECK_THROW(CallRPC("getblock too many args"), runtime_error);
|
||||
BOOST_CHECK_THROW(CallRPC("getblock -1"), runtime_error);
|
||||
BOOST_CHECK_THROW(CallRPC("getblock 2147483647"), runtime_error); // allowed, but > height of active chain tip
|
||||
BOOST_CHECK_THROW(CallRPC("getblock 2147483648"), runtime_error); // not allowed, > int32 used for nHeight
|
||||
BOOST_CHECK_THROW(CallRPC("getblock 100badchars"), runtime_error);
|
||||
BOOST_CHECK_NO_THROW(CallRPC("getblock 0"));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(rpc_wallet_getbalance)
|
||||
@@ -304,7 +321,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_validateaddress)
|
||||
|
||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||
|
||||
Value retValue;
|
||||
UniValue retValue;
|
||||
|
||||
// Check number of args
|
||||
BOOST_CHECK_THROW(CallRPC("z_validateaddress"), runtime_error);
|
||||
@@ -317,7 +334,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_validateaddress)
|
||||
|
||||
// This address is not valid, it belongs to another network
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress ztaaga95QAPyp1kSQ1hD2kguCpzyMHjxWZqaYDEkzbvo7uYQYAw2S8X4Kx98AvhhofMtQL8PAXKHuZsmhRcanavKRKmdCzk"));
|
||||
Object resultObj = retValue.get_obj();
|
||||
UniValue resultObj = retValue.get_obj();
|
||||
bool b = find_value(resultObj, "isvalid").get_bool();
|
||||
BOOST_CHECK_EQUAL(b, false);
|
||||
|
||||
@@ -484,7 +501,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importwallet)
|
||||
BOOST_AUTO_TEST_CASE(rpc_wallet_z_importexport)
|
||||
{
|
||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||
Value retValue;
|
||||
UniValue retValue;
|
||||
int n1 = 1000; // number of times to import/export
|
||||
int n2 = 1000; // number of addresses to create and list
|
||||
|
||||
@@ -493,9 +510,17 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importexport)
|
||||
BOOST_CHECK_THROW(CallRPC("z_exportkey"), runtime_error);
|
||||
|
||||
// error if too many args
|
||||
BOOST_CHECK_THROW(CallRPC("z_importkey too many args"), runtime_error);
|
||||
BOOST_CHECK_THROW(CallRPC("z_importkey way too many args"), runtime_error);
|
||||
BOOST_CHECK_THROW(CallRPC("z_exportkey toomany args"), runtime_error);
|
||||
|
||||
// error if invalid args
|
||||
auto sk = libzcash::SpendingKey::random();
|
||||
std::string prefix = std::string("z_importkey ") + CZCSpendingKey(sk).ToString() + " yes ";
|
||||
BOOST_CHECK_THROW(CallRPC(prefix + "-1"), runtime_error);
|
||||
BOOST_CHECK_THROW(CallRPC(prefix + "2147483647"), runtime_error); // allowed, but > height of active chain tip
|
||||
BOOST_CHECK_THROW(CallRPC(prefix + "2147483648"), runtime_error); // not allowed, > int32 used for nHeight
|
||||
BOOST_CHECK_THROW(CallRPC(prefix + "100badchars"), runtime_error);
|
||||
|
||||
// wallet should currently be empty
|
||||
std::set<libzcash::PaymentAddress> addrs;
|
||||
pwalletMain->GetPaymentAddresses(addrs);
|
||||
@@ -515,12 +540,12 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importexport)
|
||||
|
||||
// Verify we can list the keys imported
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("z_listaddresses"));
|
||||
Array arr = retValue.get_array();
|
||||
UniValue arr = retValue.get_array();
|
||||
BOOST_CHECK(arr.size() == n1);
|
||||
|
||||
// Put addresses into a set
|
||||
std::unordered_set<std::string> myaddrs;
|
||||
for (Value element : arr) {
|
||||
for (UniValue element : arr.getValues()) {
|
||||
myaddrs.insert(element.get_str());
|
||||
}
|
||||
|
||||
@@ -542,7 +567,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_z_importexport)
|
||||
|
||||
// Create a set from them
|
||||
std::unordered_set<std::string> listaddrs;
|
||||
for (Value element : arr) {
|
||||
for (UniValue element : arr.getValues()) {
|
||||
listaddrs.insert(element.get_str());
|
||||
}
|
||||
|
||||
@@ -581,7 +606,7 @@ public:
|
||||
start_execution_clock();
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(naptime));
|
||||
stop_execution_clock();
|
||||
set_result(Value("done"));
|
||||
set_result(UniValue(UniValue::VSTR, "done"));
|
||||
set_state(OperationStatus::SUCCESS);
|
||||
}
|
||||
};
|
||||
@@ -620,8 +645,8 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_async_operations)
|
||||
BOOST_CHECK_EQUAL(op1->isReady(), false);
|
||||
BOOST_CHECK_EQUAL(op1->isFailed(), false);
|
||||
BOOST_CHECK_EQUAL(op1->isSuccess(), true);
|
||||
BOOST_CHECK(op1->getError() == Value::null );
|
||||
BOOST_CHECK(op1->getResult().is_null() == false );
|
||||
BOOST_CHECK_EQUAL(op1->getError().isNull(), true);
|
||||
BOOST_CHECK_EQUAL(op1->getResult().isNull(), false);
|
||||
BOOST_CHECK_EQUAL(op1->getStateAsString(), "success");
|
||||
BOOST_CHECK_NE(op1->getStateAsString(), "executing");
|
||||
|
||||
@@ -781,12 +806,12 @@ BOOST_AUTO_TEST_CASE(rpc_z_getoperations)
|
||||
// Check if too many args
|
||||
BOOST_CHECK_THROW(CallRPC("z_listoperationids toomany args"), runtime_error);
|
||||
|
||||
Value retValue;
|
||||
UniValue retValue;
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("z_listoperationids"));
|
||||
BOOST_CHECK(retValue.get_array().size() == 2);
|
||||
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("z_getoperationstatus"));
|
||||
Array array = retValue.get_array();
|
||||
UniValue array = retValue.get_array();
|
||||
BOOST_CHECK(array.size() == 2);
|
||||
|
||||
// idempotent
|
||||
@@ -794,18 +819,18 @@ BOOST_AUTO_TEST_CASE(rpc_z_getoperations)
|
||||
array = retValue.get_array();
|
||||
BOOST_CHECK(array.size() == 2);
|
||||
|
||||
for (Value v : array) {
|
||||
Object obj = v.get_obj();
|
||||
Value id = find_value(obj, "id");
|
||||
for (UniValue v : array.getValues()) {
|
||||
UniValue obj = v.get_obj();
|
||||
UniValue id = find_value(obj, "id");
|
||||
|
||||
Value result;
|
||||
UniValue result;
|
||||
// removes result from internal storage
|
||||
BOOST_CHECK_NO_THROW(result = CallRPC("z_getoperationresult [\"" + id.get_str() + "\"]"));
|
||||
Array resultArray = result.get_array();
|
||||
UniValue resultArray = result.get_array();
|
||||
BOOST_CHECK(resultArray.size() == 1);
|
||||
|
||||
Object resultObj = resultArray.front().get_obj();
|
||||
Value resultId = find_value(resultObj, "id");
|
||||
UniValue resultObj = resultArray[0].get_obj();
|
||||
UniValue resultId = find_value(resultObj, "id");
|
||||
BOOST_CHECK_EQUAL(id.get_str(), resultId.get_str());
|
||||
|
||||
// verify the operation has been removed
|
||||
@@ -884,26 +909,26 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_parameters)
|
||||
// Test constructor of AsyncRPCOperation_sendmany
|
||||
try {
|
||||
std::shared_ptr<AsyncRPCOperation> operation(new AsyncRPCOperation_sendmany("",{}, {}, -1));
|
||||
} catch (const Object& objError) {
|
||||
} catch (const UniValue& objError) {
|
||||
BOOST_CHECK( find_error(objError, "Minconf cannot be negative"));
|
||||
}
|
||||
|
||||
try {
|
||||
std::shared_ptr<AsyncRPCOperation> operation(new AsyncRPCOperation_sendmany("",{}, {}, 1));
|
||||
} catch (const Object& objError) {
|
||||
} catch (const UniValue& objError) {
|
||||
BOOST_CHECK( find_error(objError, "From address parameter missing"));
|
||||
}
|
||||
|
||||
try {
|
||||
std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany("tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ", {}, {}, 1) );
|
||||
} catch (const Object& objError) {
|
||||
} catch (const UniValue& objError) {
|
||||
BOOST_CHECK( find_error(objError, "No recipients"));
|
||||
}
|
||||
|
||||
try {
|
||||
std::vector<SendManyRecipient> recipients = { SendManyRecipient("dummy",1.0, "") };
|
||||
std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany("INVALID", recipients, {}, 1) );
|
||||
} catch (const Object& objError) {
|
||||
} catch (const UniValue& objError) {
|
||||
BOOST_CHECK( find_error(objError, "payment address is invalid"));
|
||||
}
|
||||
|
||||
@@ -911,7 +936,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_parameters)
|
||||
try {
|
||||
std::vector<SendManyRecipient> recipients = { SendManyRecipient("dummy",1.0, "") };
|
||||
std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany("zcMuhvq8sEkHALuSU2i4NbNQxshSAYrpCExec45ZjtivYPbuiFPwk6WHy4SvsbeZ4siy1WheuRGjtaJmoD1J8bFqNXhsG6U", recipients, {}, 1) );
|
||||
} catch (const Object& objError) {
|
||||
} catch (const UniValue& objError) {
|
||||
BOOST_CHECK( find_error(objError, "payment address is for wrong network type"));
|
||||
}
|
||||
|
||||
@@ -920,7 +945,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_parameters)
|
||||
try {
|
||||
std::vector<SendManyRecipient> recipients = { SendManyRecipient("dummy",1.0, "") };
|
||||
std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany("ztjiDe569DPNbyTE6TSdJTaSDhoXEHLGvYoUnBU1wfVNU52TEyT6berYtySkd21njAeEoh8fFJUT42kua9r8EnhBaEKqCpP", recipients, {}, 1) );
|
||||
} catch (const Object& objError) {
|
||||
} catch (const UniValue& objError) {
|
||||
BOOST_CHECK( find_error(objError, "no spending key found for zaddr"));
|
||||
}
|
||||
}
|
||||
@@ -933,7 +958,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals)
|
||||
|
||||
LOCK(pwalletMain->cs_wallet);
|
||||
|
||||
Value retValue;
|
||||
UniValue retValue;
|
||||
|
||||
// add keys manually
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("getnewaddress"));
|
||||
@@ -985,7 +1010,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals)
|
||||
|
||||
try {
|
||||
proxy.get_memo_from_hex_string(bigmemo);
|
||||
} catch (const Object& objError) {
|
||||
} catch (const UniValue& objError) {
|
||||
BOOST_CHECK( find_error(objError, "too big"));
|
||||
}
|
||||
|
||||
@@ -995,7 +1020,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals)
|
||||
|
||||
try {
|
||||
proxy.get_memo_from_hex_string(badmemo);
|
||||
} catch (const Object& objError) {
|
||||
} catch (const UniValue& objError) {
|
||||
BOOST_CHECK( find_error(objError, "hexadecimal format"));
|
||||
}
|
||||
|
||||
@@ -1006,7 +1031,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals)
|
||||
std::string oddmemo(v.begin(), v.end());
|
||||
try {
|
||||
proxy.get_memo_from_hex_string(oddmemo);
|
||||
} catch (const Object& objError) {
|
||||
} catch (const UniValue& objError) {
|
||||
BOOST_CHECK( find_error(objError, "hexadecimal format"));
|
||||
}
|
||||
}
|
||||
@@ -1061,7 +1086,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals)
|
||||
// Raw joinsplit is a zaddr->zaddr
|
||||
{
|
||||
std::string raw = "020000000000000000000100000000000000001027000000000000183a0d4c46c369078705e39bcfebee59a978dbd210ce8de3efc9555a03fbabfd3cea16693d730c63850d7e48ccde79854c19adcb7e9dcd7b7d18805ee09083f6b16e1860729d2d4a90e2f2acd009cf78b5eb0f4a6ee4bdb64b1262d7ce9eb910c460b02022991e968d0c50ee44908e4ccccbc591d0053bcca154dd6d6fc400a29fa686af4682339832ccea362a62aeb9df0d5aa74f86a1e75ac0f48a8ccc41e0a940643c6c33e1d09223b0a46eaf47a1bb4407cfc12b1dcf83a29c0cef51e45c7876ca5b9e5bae86d92976eb3ef68f29cd29386a8be8451b50f82bf9da10c04651868655194da8f6ed3d241bb5b5ff93a3e2bbe44644544d88bcde5cc35978032ee92699c7a61fcbb395e7583f47e698c4d53ede54f956629400bf510fb5e22d03158cc10bdcaaf29e418ef18eb6480dd9c8b9e2a377809f9f32a556ef872febd0021d4ad013aa9f0b7255e98e408d302abefd33a71180b720271835b487ab309e160b06dfe51932120fb84a7ede16b20c53599a11071592109e10260f265ee60d48c62bfe24074020e9b586ce9e9356e68f2ad1a9538258234afe4b83a209f178f45202270eaeaeecaf2ce3100b2c5a714f75f35777a9ebff5ebf47059d2bbf6f3726190216468f2b152673b766225b093f3a2f827c86d6b48b42117fec1d0ac38dd7af700308dcfb02eba821612b16a2c164c47715b9b0c93900893b1aba2ea03765c94d87022db5be06ab338d1912e0936dfe87586d0a8ee49144a6cd2e306abdcb652faa3e0222739deb23154d778b50de75069a4a2cce1208cd1ced3cb4744c9888ce1c2fcd2e66dc31e62d3aa9e423d7275882525e9981f92e84ac85975b8660739407efbe1e34c2249420fde7e17db3096d5b22e83d051d01f0e6e7690dca7d168db338aadf0897fedac10de310db2b1bff762d322935dddbb60c2efb8b15d231fa17b84630371cb275c209f0c4c7d0c68b150ea5cd514122215e3f7fcfb351d69514788d67c2f3c8922581946e3a04bdf1f07f15696ca76eb95b10698bf1188fd882945c57657515889d042a6fc45d38cbc943540c4f0f6d1c45a1574c81f3e42d1eb8702328b729909adee8a5cfed7c79d54627d1fd389af941d878376f7927b9830ca659bf9ab18c5ca5192d52d02723008728d03701b8ab3e1c4a3109409ec0b13df334c7deec3523eeef4c97b5603e643de3a647b873f4c1b47fbfc6586ba66724f112e51fc93839648005043620aa3ce458e246d77977b19c53d98e3e812de006afc1a79744df236582943631d04cc02941ac4be500e4ed9fb9e3e7cc187b1c4050fad1d9d09d5fd70d5d01d615b439d8c0015d2eb10398bcdbf8c4b2bd559dbe4c288a186aed3f86f608da4d582e120c4a896e015e2241900d1daeccd05db968852677c71d752bec46de9962174b46f980e8cc603654daf8b98a3ee92dac066033954164a89568b70b1780c2ce2410b2f816dbeddb2cd463e0c8f21a52cf6427d9647a6fd4bafa8fb4cd4d47ac057b0160bee86c6b2fb8adce214c2bcdda277512200adf0eaa5d2114a2c077b009836a68ec254bfe56f51d147b9afe2ddd9cb917c0c2de19d81b7b8fd9f4574f51fa1207630dc13976f4d7587c962f761af267de71f3909a576e6bedaf6311633910d291ac292c467cc8331ef577aef7646a5d949322fa0367a49f20597a13def53136ee31610395e3e48d291fd8f58504374031fe9dcfba5e06086ebcf01a9106f6a4d6e16e19e4c5bb893f7da79419c94eca31a384be6fa1747284dee0fc3bbc8b1b860172c10b29c1594bb8c747d7fe05827358ff2160f49050001625ffe2e880bd7fc26cd0ffd89750745379a8e862816e08a5a2008043921ab6a4976064ac18f7ee37b6628bc0127d8d5ebd3548e41d8881a082d86f20b32e33094f15a0e6ea6074b08c6cd28142de94713451640a55985051f5577eb54572699d838cb34a79c8939e981c0c277d06a6e2ce69ccb74f8a691ff08f81d8b99e6a86223d29a2b7c8e7b041aba44ea678ae654277f7e91cbfa79158b989164a3d549d9f4feb0cc43169699c13e321fe3f4b94258c75d198ff9184269cd6986c55409e07528c93f64942c6c283ce3917b4bf4c3be2fe3173c8c38cccb35f1fbda0ca88b35a599c0678cb22aa8eabea8249dbd2e4f849fffe69803d299e435ebcd7df95854003d8eda17a74d98b4be0e62d45d7fe48c06a6f464a14f8e0570077cc631279092802a89823f031eef5e1028a6d6fdbd502869a731ee7d28b4d6c71b419462a30d31442d3ee444ffbcbd16d558c9000c97e949c2b1f9d6f6d8db7b9131ebd963620d3fc8595278d6f8fdf49084325373196d53e64142fa5a23eccd6ef908c4d80b8b3e6cc334b7f7012103a3682e4678e9b518163d262a39a2c1a69bf88514c52b7ccd7cc8dc80e71f7c2ec0701cff982573eb0c2c4daeb47fa0b586f4451c10d1da2e5d182b03dd067a5e971b3a6138ca6667aaf853d2ac03b80a1d5870905f2cfb6c78ec3c3719c02f973d638a0f973424a2b0f2b0023f136d60092fe15fba4bc180b9176bd0ff576e053f1af6939fe9ca256203ffaeb3e569f09774d2a6cbf91873e56651f4d6ff77e0b5374b0a1a201d7e523604e0247644544cc571d48c458a4f96f45580b";
|
||||
Object obj;
|
||||
UniValue obj(UniValue::VOBJ);
|
||||
obj.push_back(Pair("rawtxn", raw));
|
||||
|
||||
// we have the spending key for the dummy recipient zaddr1
|
||||
@@ -1079,9 +1104,9 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals)
|
||||
|
||||
// Verify test mode is returning output (since no input taddrs, signed and unsigned are the same).
|
||||
BOOST_CHECK_NO_THROW( proxy.sign_send_raw_transaction(obj) );
|
||||
Value result = operation->getResult();
|
||||
BOOST_CHECK(!result.is_null());
|
||||
Object resultObj = result.get_obj();
|
||||
UniValue result = operation->getResult();
|
||||
BOOST_CHECK(!result.isNull());
|
||||
UniValue resultObj = result.get_obj();
|
||||
std::string hex = find_value(resultObj, "hex").get_str();
|
||||
BOOST_CHECK_EQUAL(hex, raw);
|
||||
}
|
||||
@@ -1149,7 +1174,7 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals)
|
||||
BOOST_AUTO_TEST_CASE(rpc_wallet_encrypted_wallet_zkeys)
|
||||
{
|
||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||
Value retValue;
|
||||
UniValue retValue;
|
||||
int n = 100;
|
||||
|
||||
// wallet should currently be empty
|
||||
@@ -1164,7 +1189,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_encrypted_wallet_zkeys)
|
||||
|
||||
// Verify we can list the keys imported
|
||||
BOOST_CHECK_NO_THROW(retValue = CallRPC("z_listaddresses"));
|
||||
Array arr = retValue.get_array();
|
||||
UniValue arr = retValue.get_array();
|
||||
BOOST_CHECK(arr.size() == n);
|
||||
|
||||
// Verify that the wallet encryption RPC is disabled
|
||||
|
||||
@@ -26,12 +26,10 @@
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include "json/json_spirit_reader_template.h"
|
||||
#include "json/json_spirit_utils.h"
|
||||
#include "json/json_spirit_writer_template.h"
|
||||
|
||||
#include <univalue.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace json_spirit;
|
||||
|
||||
// Uncomment if you want to output updated JSON tests.
|
||||
// #define UPDATE_JSON_TESTS
|
||||
@@ -41,15 +39,15 @@ static const unsigned int flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC;
|
||||
unsigned int ParseScriptFlags(string strFlags);
|
||||
string FormatScriptFlags(unsigned int flags);
|
||||
|
||||
Array
|
||||
UniValue
|
||||
read_json(const std::string& jsondata)
|
||||
{
|
||||
Value v;
|
||||
UniValue v;
|
||||
|
||||
if (!read_string(jsondata, v) || v.type() != array_type)
|
||||
if (!v.read(jsondata) || !v.isArray())
|
||||
{
|
||||
BOOST_ERROR("Parse error.");
|
||||
return Array();
|
||||
return UniValue(UniValue::VARR);
|
||||
}
|
||||
return v.get_array();
|
||||
}
|
||||
@@ -295,10 +293,10 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
Array GetJSON()
|
||||
UniValue GetJSON()
|
||||
{
|
||||
DoPush();
|
||||
Array array;
|
||||
UniValue array(UniValue::VARR);
|
||||
array.push_back(FormatScript(spendTx.vin[0].scriptSig));
|
||||
array.push_back(FormatScript(creditTx.vout[0].scriptPubKey));
|
||||
array.push_back(FormatScriptFlags(flags));
|
||||
@@ -582,14 +580,16 @@ BOOST_AUTO_TEST_CASE(script_build)
|
||||
std::set<std::string> tests_bad;
|
||||
|
||||
{
|
||||
Array json_good = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid)));
|
||||
Array json_bad = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid)));
|
||||
UniValue json_good = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid)));
|
||||
UniValue json_bad = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid)));
|
||||
|
||||
BOOST_FOREACH(Value& tv, json_good) {
|
||||
tests_good.insert(write_string(Value(tv.get_array()), true));
|
||||
for (size_t idx = 0; idx < json_good.size(); idx++) {
|
||||
const UniValue& tv = json_good[idx];
|
||||
tests_good.insert(tv.get_array().write());
|
||||
}
|
||||
BOOST_FOREACH(Value& tv, json_bad) {
|
||||
tests_bad.insert(write_string(Value(tv.get_array()), true));
|
||||
for (size_t idx = 0; idx < json_bad.size(); idx++) {
|
||||
const UniValue& tv = json_bad[idx];
|
||||
tests_bad.insert(tv.get_array().write());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -598,7 +598,7 @@ BOOST_AUTO_TEST_CASE(script_build)
|
||||
|
||||
BOOST_FOREACH(TestBuilder& test, good) {
|
||||
test.Test(true);
|
||||
std::string str = write_string(Value(test.GetJSON()), true);
|
||||
std::string str = test.GetJSON().write();
|
||||
#ifndef UPDATE_JSON_TESTS
|
||||
if (tests_good.count(str) == 0) {
|
||||
BOOST_CHECK_MESSAGE(false, "Missing auto script_valid test: " + test.GetComment());
|
||||
@@ -608,7 +608,7 @@ BOOST_AUTO_TEST_CASE(script_build)
|
||||
}
|
||||
BOOST_FOREACH(TestBuilder& test, bad) {
|
||||
test.Test(false);
|
||||
std::string str = write_string(Value(test.GetJSON()), true);
|
||||
std::string str = test.GetJSON().write();
|
||||
#ifndef UPDATE_JSON_TESTS
|
||||
if (tests_bad.count(str) == 0) {
|
||||
BOOST_CHECK_MESSAGE(false, "Missing auto script_invalid test: " + test.GetComment());
|
||||
@@ -634,12 +634,11 @@ BOOST_AUTO_TEST_CASE(script_valid)
|
||||
// Inner arrays are [ "scriptSig", "scriptPubKey", "flags" ]
|
||||
// ... where scriptSig and scriptPubKey are stringified
|
||||
// scripts.
|
||||
Array tests = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid)));
|
||||
UniValue tests = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid)));
|
||||
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
string strTest = write_string(tv, false);
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
string strTest = test.write();
|
||||
if (test.size() < 3) // Allow size > 3; extra stuff ignored (useful for comments)
|
||||
{
|
||||
if (test.size() != 1) {
|
||||
@@ -660,13 +659,12 @@ BOOST_AUTO_TEST_CASE(script_valid)
|
||||
BOOST_AUTO_TEST_CASE(script_invalid)
|
||||
{
|
||||
// Scripts that should evaluate as invalid
|
||||
Array tests = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid)));
|
||||
UniValue tests = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid)));
|
||||
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
string strTest = write_string(tv, false);
|
||||
if (test.size() < 3) // Allow size > 3; extra stuff ignored (useful for comments)
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
string strTest = test.write();
|
||||
if (test.size() < 3) // Allow size > 2; extra stuff ignored (useful for comments)
|
||||
{
|
||||
if (test.size() != 1) {
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
|
||||
@@ -17,12 +17,10 @@
|
||||
#include <iostream>
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include "json/json_spirit_reader_template.h"
|
||||
#include "json/json_spirit_utils.h"
|
||||
#include "json/json_spirit_writer_template.h"
|
||||
|
||||
using namespace json_spirit;
|
||||
extern Array read_json(const std::string& jsondata);
|
||||
#include <univalue.h>
|
||||
|
||||
extern UniValue read_json(const std::string& jsondata);
|
||||
|
||||
// Old script.cpp SignatureHash function
|
||||
uint256 static SignatureHashOld(CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType)
|
||||
@@ -205,12 +203,11 @@ BOOST_AUTO_TEST_CASE(sighash_test)
|
||||
// Goal: check that SignatureHash generates correct hash
|
||||
BOOST_AUTO_TEST_CASE(sighash_from_data)
|
||||
{
|
||||
Array tests = read_json(std::string(json_tests::sighash, json_tests::sighash + sizeof(json_tests::sighash)));
|
||||
UniValue tests = read_json(std::string(json_tests::sighash, json_tests::sighash + sizeof(json_tests::sighash)));
|
||||
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
std::string strTest = write_string(tv, false);
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
std::string strTest = test.write();
|
||||
if (test.size() < 1) // Allow for extra stuff (useful for comments)
|
||||
{
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
|
||||
168
src/test/torcontrol_tests.cpp
Normal file
168
src/test/torcontrol_tests.cpp
Normal file
@@ -0,0 +1,168 @@
|
||||
// Copyright (c) 2017 The Zcash developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
//
|
||||
#include "test/test_bitcoin.h"
|
||||
#include "torcontrol.cpp"
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(torcontrol_tests, BasicTestingSetup)
|
||||
|
||||
void CheckSplitTorReplyLine(std::string input, std::string command, std::string args)
|
||||
{
|
||||
BOOST_TEST_MESSAGE(std::string("CheckSplitTorReplyLine(") + input + ")");
|
||||
auto ret = SplitTorReplyLine(input);
|
||||
BOOST_CHECK_EQUAL(ret.first, command);
|
||||
BOOST_CHECK_EQUAL(ret.second, args);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(util_SplitTorReplyLine)
|
||||
{
|
||||
// Data we should receive during normal usage
|
||||
CheckSplitTorReplyLine(
|
||||
"PROTOCOLINFO PIVERSION",
|
||||
"PROTOCOLINFO", "PIVERSION");
|
||||
CheckSplitTorReplyLine(
|
||||
"AUTH METHODS=COOKIE,SAFECOOKIE COOKIEFILE=\"/home/x/.tor/control_auth_cookie\"",
|
||||
"AUTH", "METHODS=COOKIE,SAFECOOKIE COOKIEFILE=\"/home/x/.tor/control_auth_cookie\"");
|
||||
CheckSplitTorReplyLine(
|
||||
"AUTH METHODS=NULL",
|
||||
"AUTH", "METHODS=NULL");
|
||||
CheckSplitTorReplyLine(
|
||||
"AUTH METHODS=HASHEDPASSWORD",
|
||||
"AUTH", "METHODS=HASHEDPASSWORD");
|
||||
CheckSplitTorReplyLine(
|
||||
"VERSION Tor=\"0.2.9.8 (git-a0df013ea241b026)\"",
|
||||
"VERSION", "Tor=\"0.2.9.8 (git-a0df013ea241b026)\"");
|
||||
CheckSplitTorReplyLine(
|
||||
"AUTHCHALLENGE SERVERHASH=aaaa SERVERNONCE=bbbb",
|
||||
"AUTHCHALLENGE", "SERVERHASH=aaaa SERVERNONCE=bbbb");
|
||||
|
||||
// Other valid inputs
|
||||
CheckSplitTorReplyLine("COMMAND", "COMMAND", "");
|
||||
CheckSplitTorReplyLine("COMMAND SOME ARGS", "COMMAND", "SOME ARGS");
|
||||
|
||||
// These inputs are valid because PROTOCOLINFO accepts an OtherLine that is
|
||||
// just an OptArguments, which enables multiple spaces to be present
|
||||
// between the command and arguments.
|
||||
CheckSplitTorReplyLine("COMMAND ARGS", "COMMAND", " ARGS");
|
||||
CheckSplitTorReplyLine("COMMAND EVEN+more ARGS", "COMMAND", " EVEN+more ARGS");
|
||||
}
|
||||
|
||||
void CheckParseTorReplyMapping(std::string input, std::map<std::string,std::string> expected)
|
||||
{
|
||||
BOOST_TEST_MESSAGE(std::string("CheckParseTorReplyMapping(") + input + ")");
|
||||
auto ret = ParseTorReplyMapping(input);
|
||||
BOOST_CHECK_EQUAL(ret.size(), expected.size());
|
||||
auto r_it = ret.begin();
|
||||
auto e_it = expected.begin();
|
||||
while (r_it != ret.end() && e_it != expected.end()) {
|
||||
BOOST_CHECK_EQUAL(r_it->first, e_it->first);
|
||||
BOOST_CHECK_EQUAL(r_it->second, e_it->second);
|
||||
r_it++;
|
||||
e_it++;
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(util_ParseTorReplyMapping)
|
||||
{
|
||||
// Data we should receive during normal usage
|
||||
CheckParseTorReplyMapping(
|
||||
"METHODS=COOKIE,SAFECOOKIE COOKIEFILE=\"/home/x/.tor/control_auth_cookie\"", {
|
||||
{"METHODS", "COOKIE,SAFECOOKIE"},
|
||||
{"COOKIEFILE", "/home/x/.tor/control_auth_cookie"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"METHODS=NULL", {
|
||||
{"METHODS", "NULL"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"METHODS=HASHEDPASSWORD", {
|
||||
{"METHODS", "HASHEDPASSWORD"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"Tor=\"0.2.9.8 (git-a0df013ea241b026)\"", {
|
||||
{"Tor", "0.2.9.8 (git-a0df013ea241b026)"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"SERVERHASH=aaaa SERVERNONCE=bbbb", {
|
||||
{"SERVERHASH", "aaaa"},
|
||||
{"SERVERNONCE", "bbbb"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"ServiceID=exampleonion1234", {
|
||||
{"ServiceID", "exampleonion1234"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"PrivateKey=RSA1024:BLOB", {
|
||||
{"PrivateKey", "RSA1024:BLOB"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"ClientAuth=bob:BLOB", {
|
||||
{"ClientAuth", "bob:BLOB"},
|
||||
});
|
||||
|
||||
// Other valid inputs
|
||||
CheckParseTorReplyMapping(
|
||||
"Foo=Bar=Baz Spam=Eggs", {
|
||||
{"Foo", "Bar=Baz"},
|
||||
{"Spam", "Eggs"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"Foo=\"Bar=Baz\"", {
|
||||
{"Foo", "Bar=Baz"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"Foo=\"Bar Baz\"", {
|
||||
{"Foo", "Bar Baz"},
|
||||
});
|
||||
|
||||
// Escapes (which are left escaped by the parser)
|
||||
CheckParseTorReplyMapping(
|
||||
"Foo=\"Bar\\ Baz\"", {
|
||||
{"Foo", "Bar\\ Baz"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"Foo=\"Bar\\Baz\"", {
|
||||
{"Foo", "Bar\\Baz"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"Foo=\"Bar\\@Baz\"", {
|
||||
{"Foo", "Bar\\@Baz"},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"Foo=\"Bar\\\"Baz\" Spam=\"\\\"Eggs\\\"\"", {
|
||||
{"Foo", "Bar\\\"Baz"},
|
||||
{"Spam", "\\\"Eggs\\\""},
|
||||
});
|
||||
CheckParseTorReplyMapping(
|
||||
"Foo=\"Bar\\\\Baz\"", {
|
||||
{"Foo", "Bar\\\\Baz"},
|
||||
});
|
||||
|
||||
// A more complex valid grammar. PROTOCOLINFO accepts a VersionLine that
|
||||
// takes a key=value pair followed by an OptArguments, making this valid.
|
||||
// Because an OptArguments contains no semantic data, there is no point in
|
||||
// parsing it.
|
||||
CheckParseTorReplyMapping(
|
||||
"SOME=args,here MORE optional=arguments here", {
|
||||
{"SOME", "args,here"},
|
||||
});
|
||||
|
||||
// Inputs that are effectively invalid under the target grammar.
|
||||
// PROTOCOLINFO accepts an OtherLine that is just an OptArguments, which
|
||||
// would make these inputs valid. However,
|
||||
// - This parser is never used in that situation, because the
|
||||
// SplitTorReplyLine parser enables OtherLine to be skipped.
|
||||
// - Even if these were valid, an OptArguments contains no semantic data,
|
||||
// so there is no point in parsing it.
|
||||
CheckParseTorReplyMapping("ARGS", {});
|
||||
CheckParseTorReplyMapping("MORE ARGS", {});
|
||||
CheckParseTorReplyMapping("MORE ARGS", {});
|
||||
CheckParseTorReplyMapping("EVEN more=ARGS", {});
|
||||
CheckParseTorReplyMapping("EVEN+more ARGS", {});
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
@@ -23,19 +23,20 @@
|
||||
|
||||
#include <boost/algorithm/string/classification.hpp>
|
||||
#include <boost/algorithm/string/split.hpp>
|
||||
#include <boost/assign/list_of.hpp>
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <boost/assign/list_of.hpp>
|
||||
#include "json/json_spirit_writer_template.h"
|
||||
|
||||
#include <univalue.h>
|
||||
|
||||
#include "zcash/Note.hpp"
|
||||
#include "zcash/Address.hpp"
|
||||
#include "zcash/Proof.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace json_spirit;
|
||||
|
||||
// In script_tests.cpp
|
||||
extern Array read_json(const std::string& jsondata);
|
||||
extern UniValue read_json(const std::string& jsondata);
|
||||
|
||||
static std::map<string, unsigned int> mapFlagNames = boost::assign::map_list_of
|
||||
(string("NONE"), (unsigned int)SCRIPT_VERIFY_NONE)
|
||||
@@ -96,33 +97,32 @@ BOOST_AUTO_TEST_CASE(tx_valid)
|
||||
// ... where all scripts are stringified scripts.
|
||||
//
|
||||
// verifyFlags is a comma separated list of script verification flags to apply, or "NONE"
|
||||
Array tests = read_json(std::string(json_tests::tx_valid, json_tests::tx_valid + sizeof(json_tests::tx_valid)));
|
||||
UniValue tests = read_json(std::string(json_tests::tx_valid, json_tests::tx_valid + sizeof(json_tests::tx_valid)));
|
||||
|
||||
auto verifier = libzcash::ProofVerifier::Strict();
|
||||
ScriptError err;
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
string strTest = write_string(tv, false);
|
||||
if (test[0].type() == array_type)
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
string strTest = test.write();
|
||||
if (test[0].isArray())
|
||||
{
|
||||
if (test.size() != 3 || test[1].type() != str_type || test[2].type() != str_type)
|
||||
if (test.size() != 3 || !test[1].isStr() || !test[2].isStr())
|
||||
{
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
continue;
|
||||
}
|
||||
|
||||
map<COutPoint, CScript> mapprevOutScriptPubKeys;
|
||||
Array inputs = test[0].get_array();
|
||||
UniValue inputs = test[0].get_array();
|
||||
bool fValid = true;
|
||||
BOOST_FOREACH(Value& input, inputs)
|
||||
{
|
||||
if (input.type() != array_type)
|
||||
for (size_t inpIdx = 0; inpIdx < inputs.size(); inpIdx++) {
|
||||
const UniValue& input = inputs[inpIdx];
|
||||
if (!input.isArray())
|
||||
{
|
||||
fValid = false;
|
||||
break;
|
||||
}
|
||||
Array vinput = input.get_array();
|
||||
UniValue vinput = input.get_array();
|
||||
if (vinput.size() != 3)
|
||||
{
|
||||
fValid = false;
|
||||
@@ -173,33 +173,32 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
|
||||
// ... where all scripts are stringified scripts.
|
||||
//
|
||||
// verifyFlags is a comma separated list of script verification flags to apply, or "NONE"
|
||||
Array tests = read_json(std::string(json_tests::tx_invalid, json_tests::tx_invalid + sizeof(json_tests::tx_invalid)));
|
||||
UniValue tests = read_json(std::string(json_tests::tx_invalid, json_tests::tx_invalid + sizeof(json_tests::tx_invalid)));
|
||||
|
||||
auto verifier = libzcash::ProofVerifier::Strict();
|
||||
ScriptError err;
|
||||
BOOST_FOREACH(Value& tv, tests)
|
||||
{
|
||||
Array test = tv.get_array();
|
||||
string strTest = write_string(tv, false);
|
||||
if (test[0].type() == array_type)
|
||||
for (size_t idx = 0; idx < tests.size(); idx++) {
|
||||
UniValue test = tests[idx];
|
||||
string strTest = test.write();
|
||||
if (test[0].isArray())
|
||||
{
|
||||
if (test.size() != 3 || test[1].type() != str_type || test[2].type() != str_type)
|
||||
if (test.size() != 3 || !test[1].isStr() || !test[2].isStr())
|
||||
{
|
||||
BOOST_ERROR("Bad test: " << strTest);
|
||||
continue;
|
||||
}
|
||||
|
||||
map<COutPoint, CScript> mapprevOutScriptPubKeys;
|
||||
Array inputs = test[0].get_array();
|
||||
UniValue inputs = test[0].get_array();
|
||||
bool fValid = true;
|
||||
BOOST_FOREACH(Value& input, inputs)
|
||||
{
|
||||
if (input.type() != array_type)
|
||||
for (size_t inpIdx = 0; inpIdx < inputs.size(); inpIdx++) {
|
||||
const UniValue& input = inputs[inpIdx];
|
||||
if (!input.isArray())
|
||||
{
|
||||
fValid = false;
|
||||
break;
|
||||
}
|
||||
Array vinput = input.get_array();
|
||||
UniValue vinput = input.get_array();
|
||||
if (vinput.size() != 3)
|
||||
{
|
||||
fValid = false;
|
||||
@@ -475,6 +474,7 @@ BOOST_AUTO_TEST_CASE(test_simple_joinsplit_invalidity)
|
||||
jsdesc->nullifiers[1] = GetRandHash();
|
||||
|
||||
newTx.vjoinsplit.push_back(JSDescription());
|
||||
jsdesc = &newTx.vjoinsplit[0]; // Fixes #2026. Related PR #2078.
|
||||
JSDescription *jsdesc2 = &newTx.vjoinsplit[1];
|
||||
|
||||
jsdesc2->nullifiers[0] = GetRandHash();
|
||||
@@ -560,7 +560,7 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
|
||||
string reason;
|
||||
BOOST_CHECK(IsStandardTx(t, reason));
|
||||
|
||||
t.vout[0].nValue = 501; // dust
|
||||
t.vout[0].nValue = 53; // dust
|
||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
||||
|
||||
t.vout[0].nValue = 2730; // not dust
|
||||
@@ -639,7 +639,7 @@ BOOST_AUTO_TEST_CASE(test_IsStandardV2)
|
||||
BOOST_CHECK(IsStandardTx(t, reason));
|
||||
|
||||
// v2 transactions can still be non-standard for the same reasons as v1.
|
||||
t.vout[0].nValue = 501; // dust
|
||||
t.vout[0].nValue = 53; // dust
|
||||
BOOST_CHECK(!IsStandardTx(t, reason));
|
||||
|
||||
// v3 is not standard.
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include "univalue/univalue.h"
|
||||
#include <univalue.h>
|
||||
#include "test/test_bitcoin.h"
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
@@ -63,6 +63,48 @@ BOOST_AUTO_TEST_CASE(univalue_constructor)
|
||||
BOOST_CHECK_EQUAL(v9.getValStr(), "zappa");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(univalue_typecheck)
|
||||
{
|
||||
UniValue v1;
|
||||
BOOST_CHECK(v1.setNumStr("1"));
|
||||
BOOST_CHECK(v1.isNum());
|
||||
BOOST_CHECK_THROW(v1.get_bool(), runtime_error);
|
||||
|
||||
UniValue v2;
|
||||
BOOST_CHECK(v2.setBool(true));
|
||||
BOOST_CHECK_EQUAL(v2.get_bool(), true);
|
||||
BOOST_CHECK_THROW(v2.get_int(), runtime_error);
|
||||
|
||||
UniValue v3;
|
||||
BOOST_CHECK(v3.setNumStr("32482348723847471234"));
|
||||
BOOST_CHECK_THROW(v3.get_int64(), runtime_error);
|
||||
BOOST_CHECK(v3.setNumStr("1000"));
|
||||
BOOST_CHECK_EQUAL(v3.get_int64(), 1000);
|
||||
|
||||
UniValue v4;
|
||||
BOOST_CHECK(v4.setNumStr("2147483648"));
|
||||
BOOST_CHECK_EQUAL(v4.get_int64(), 2147483648);
|
||||
BOOST_CHECK_THROW(v4.get_int(), runtime_error);
|
||||
BOOST_CHECK(v4.setNumStr("1000"));
|
||||
BOOST_CHECK_EQUAL(v4.get_int(), 1000);
|
||||
BOOST_CHECK_THROW(v4.get_str(), runtime_error);
|
||||
BOOST_CHECK_EQUAL(v4.get_real(), 1000);
|
||||
BOOST_CHECK_THROW(v4.get_array(), runtime_error);
|
||||
BOOST_CHECK_THROW(v4.getKeys(), runtime_error);
|
||||
BOOST_CHECK_THROW(v4.getValues(), runtime_error);
|
||||
BOOST_CHECK_THROW(v4.get_obj(), runtime_error);
|
||||
|
||||
UniValue v5;
|
||||
BOOST_CHECK(v5.read("[true, 10]"));
|
||||
BOOST_CHECK_NO_THROW(v5.get_array());
|
||||
std::vector<UniValue> vals = v5.getValues();
|
||||
BOOST_CHECK_THROW(vals[0].get_int(), runtime_error);
|
||||
BOOST_CHECK_EQUAL(vals[0].get_bool(), true);
|
||||
|
||||
BOOST_CHECK_EQUAL(vals[1].get_int(), 10);
|
||||
BOOST_CHECK_THROW(vals[1].get_bool(), runtime_error);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(univalue_set)
|
||||
{
|
||||
UniValue v(UniValue::VSTR, "foo");
|
||||
@@ -72,13 +114,13 @@ BOOST_AUTO_TEST_CASE(univalue_set)
|
||||
|
||||
BOOST_CHECK(v.setObject());
|
||||
BOOST_CHECK(v.isObject());
|
||||
BOOST_CHECK_EQUAL(v.count(), 0);
|
||||
BOOST_CHECK_EQUAL(v.size(), 0);
|
||||
BOOST_CHECK_EQUAL(v.getType(), UniValue::VOBJ);
|
||||
BOOST_CHECK(v.empty());
|
||||
|
||||
BOOST_CHECK(v.setArray());
|
||||
BOOST_CHECK(v.isArray());
|
||||
BOOST_CHECK_EQUAL(v.count(), 0);
|
||||
BOOST_CHECK_EQUAL(v.size(), 0);
|
||||
|
||||
BOOST_CHECK(v.setStr("zum"));
|
||||
BOOST_CHECK(v.isStr());
|
||||
@@ -145,7 +187,7 @@ BOOST_AUTO_TEST_CASE(univalue_array)
|
||||
BOOST_CHECK(arr.push_backV(vec));
|
||||
|
||||
BOOST_CHECK_EQUAL(arr.empty(), false);
|
||||
BOOST_CHECK_EQUAL(arr.count(), 5);
|
||||
BOOST_CHECK_EQUAL(arr.size(), 5);
|
||||
|
||||
BOOST_CHECK_EQUAL(arr[0].getValStr(), "1023");
|
||||
BOOST_CHECK_EQUAL(arr[1].getValStr(), "zippy");
|
||||
@@ -157,7 +199,7 @@ BOOST_AUTO_TEST_CASE(univalue_array)
|
||||
|
||||
arr.clear();
|
||||
BOOST_CHECK(arr.empty());
|
||||
BOOST_CHECK_EQUAL(arr.count(), 0);
|
||||
BOOST_CHECK_EQUAL(arr.size(), 0);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(univalue_object)
|
||||
@@ -197,7 +239,7 @@ BOOST_AUTO_TEST_CASE(univalue_object)
|
||||
BOOST_CHECK(obj.pushKVs(obj2));
|
||||
|
||||
BOOST_CHECK_EQUAL(obj.empty(), false);
|
||||
BOOST_CHECK_EQUAL(obj.count(), 9);
|
||||
BOOST_CHECK_EQUAL(obj.size(), 9);
|
||||
|
||||
BOOST_CHECK_EQUAL(obj["age"].getValStr(), "100");
|
||||
BOOST_CHECK_EQUAL(obj["first"].getValStr(), "John");
|
||||
@@ -240,11 +282,11 @@ BOOST_AUTO_TEST_CASE(univalue_object)
|
||||
|
||||
obj.clear();
|
||||
BOOST_CHECK(obj.empty());
|
||||
BOOST_CHECK_EQUAL(obj.count(), 0);
|
||||
BOOST_CHECK_EQUAL(obj.size(), 0);
|
||||
}
|
||||
|
||||
static const char *json1 =
|
||||
"[1.1,{\"key1\":\"str\",\"key2\":800,\"key3\":{\"name\":\"martian\"}}]";
|
||||
"[1.10000000,{\"key1\":\"str\\u0000\",\"key2\":800,\"key3\":{\"name\":\"martian http://test.com\"}}]";
|
||||
|
||||
BOOST_AUTO_TEST_CASE(univalue_readwrite)
|
||||
{
|
||||
@@ -255,16 +297,18 @@ BOOST_AUTO_TEST_CASE(univalue_readwrite)
|
||||
BOOST_CHECK(v.read(strJson1));
|
||||
|
||||
BOOST_CHECK(v.isArray());
|
||||
BOOST_CHECK_EQUAL(v.count(), 2);
|
||||
BOOST_CHECK_EQUAL(v.size(), 2);
|
||||
|
||||
BOOST_CHECK_EQUAL(v[0].getValStr(), "1.1");
|
||||
BOOST_CHECK_EQUAL(v[0].getValStr(), "1.10000000");
|
||||
|
||||
UniValue obj = v[1];
|
||||
BOOST_CHECK(obj.isObject());
|
||||
BOOST_CHECK_EQUAL(obj.count(), 3);
|
||||
BOOST_CHECK_EQUAL(obj.size(), 3);
|
||||
|
||||
BOOST_CHECK(obj["key1"].isStr());
|
||||
BOOST_CHECK_EQUAL(obj["key1"].getValStr(), "str");
|
||||
std::string correctValue("str");
|
||||
correctValue.push_back('\0');
|
||||
BOOST_CHECK_EQUAL(obj["key1"].getValStr(), correctValue);
|
||||
BOOST_CHECK(obj["key2"].isNum());
|
||||
BOOST_CHECK_EQUAL(obj["key2"].getValStr(), "800");
|
||||
BOOST_CHECK(obj["key3"].isObject());
|
||||
|
||||
@@ -146,29 +146,27 @@ BOOST_AUTO_TEST_CASE(util_GetArg)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(util_FormatMoney)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(FormatMoney(0, false), "0.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney((COIN/10000)*123456789, false), "12345.6789");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN, true), "+1.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(-COIN, false), "-1.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(-COIN, true), "-1.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(0), "0.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney((COIN/10000)*123456789), "12345.6789");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(-COIN), "-1.00");
|
||||
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*100000000, false), "100000000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*10000000, false), "10000000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*1000000, false), "1000000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*100000, false), "100000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*10000, false), "10000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*1000, false), "1000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*100, false), "100.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*10, false), "10.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN, false), "1.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/10, false), "0.10");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/100, false), "0.01");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/1000, false), "0.001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/10000, false), "0.0001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/100000, false), "0.00001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/1000000, false), "0.000001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/10000000, false), "0.0000001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/100000000, false), "0.00000001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*100000000), "100000000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*10000000), "10000000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*1000000), "1000000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*100000), "100000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*10000), "10000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*1000), "1000.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*100), "100.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN*10), "10.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN), "1.00");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/10), "0.10");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/100), "0.01");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/1000), "0.001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/10000), "0.0001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/100000), "0.00001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/1000000), "0.000001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/10000000), "0.0000001");
|
||||
BOOST_CHECK_EQUAL(FormatMoney(COIN/100000000), "0.00000001");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(util_ParseMoney)
|
||||
@@ -322,9 +320,16 @@ BOOST_AUTO_TEST_CASE(test_ParseInt32)
|
||||
BOOST_CHECK(ParseInt32("-2147483648", &n) && n == -2147483648);
|
||||
BOOST_CHECK(ParseInt32("-1234", &n) && n == -1234);
|
||||
// Invalid values
|
||||
BOOST_CHECK(!ParseInt32("", &n));
|
||||
BOOST_CHECK(!ParseInt32(" 1", &n)); // no padding inside
|
||||
BOOST_CHECK(!ParseInt32("1 ", &n));
|
||||
BOOST_CHECK(!ParseInt32("1a", &n));
|
||||
BOOST_CHECK(!ParseInt32("aap", &n));
|
||||
BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex
|
||||
BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex
|
||||
const char test_bytes[] = {'1', 0, '1'};
|
||||
std::string teststr(test_bytes, sizeof(test_bytes));
|
||||
BOOST_CHECK(!ParseInt32(teststr, &n)); // no embedded NULs
|
||||
// Overflow and underflow
|
||||
BOOST_CHECK(!ParseInt32("-2147483649", NULL));
|
||||
BOOST_CHECK(!ParseInt32("2147483648", NULL));
|
||||
@@ -332,6 +337,64 @@ BOOST_AUTO_TEST_CASE(test_ParseInt32)
|
||||
BOOST_CHECK(!ParseInt32("32482348723847471234", NULL));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_ParseInt64)
|
||||
{
|
||||
int64_t n;
|
||||
// Valid values
|
||||
BOOST_CHECK(ParseInt64("1234", NULL));
|
||||
BOOST_CHECK(ParseInt64("0", &n) && n == 0LL);
|
||||
BOOST_CHECK(ParseInt64("1234", &n) && n == 1234LL);
|
||||
BOOST_CHECK(ParseInt64("01234", &n) && n == 1234LL); // no octal
|
||||
BOOST_CHECK(ParseInt64("2147483647", &n) && n == 2147483647LL);
|
||||
BOOST_CHECK(ParseInt64("-2147483648", &n) && n == -2147483648LL);
|
||||
BOOST_CHECK(ParseInt64("9223372036854775807", &n) && n == (int64_t)9223372036854775807);
|
||||
BOOST_CHECK(ParseInt64("-9223372036854775808", &n) && n == (int64_t)-9223372036854775807-1);
|
||||
BOOST_CHECK(ParseInt64("-1234", &n) && n == -1234LL);
|
||||
// Invalid values
|
||||
BOOST_CHECK(!ParseInt64("", &n));
|
||||
BOOST_CHECK(!ParseInt64(" 1", &n)); // no padding inside
|
||||
BOOST_CHECK(!ParseInt64("1 ", &n));
|
||||
BOOST_CHECK(!ParseInt64("1a", &n));
|
||||
BOOST_CHECK(!ParseInt64("aap", &n));
|
||||
BOOST_CHECK(!ParseInt64("0x1", &n)); // no hex
|
||||
const char test_bytes[] = {'1', 0, '1'};
|
||||
std::string teststr(test_bytes, sizeof(test_bytes));
|
||||
BOOST_CHECK(!ParseInt64(teststr, &n)); // no embedded NULs
|
||||
// Overflow and underflow
|
||||
BOOST_CHECK(!ParseInt64("-9223372036854775809", NULL));
|
||||
BOOST_CHECK(!ParseInt64("9223372036854775808", NULL));
|
||||
BOOST_CHECK(!ParseInt64("-32482348723847471234", NULL));
|
||||
BOOST_CHECK(!ParseInt64("32482348723847471234", NULL));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_ParseDouble)
|
||||
{
|
||||
double n;
|
||||
// Valid values
|
||||
BOOST_CHECK(ParseDouble("1234", NULL));
|
||||
BOOST_CHECK(ParseDouble("0", &n) && n == 0.0);
|
||||
BOOST_CHECK(ParseDouble("1234", &n) && n == 1234.0);
|
||||
BOOST_CHECK(ParseDouble("01234", &n) && n == 1234.0); // no octal
|
||||
BOOST_CHECK(ParseDouble("2147483647", &n) && n == 2147483647.0);
|
||||
BOOST_CHECK(ParseDouble("-2147483648", &n) && n == -2147483648.0);
|
||||
BOOST_CHECK(ParseDouble("-1234", &n) && n == -1234.0);
|
||||
BOOST_CHECK(ParseDouble("1e6", &n) && n == 1e6);
|
||||
BOOST_CHECK(ParseDouble("-1e6", &n) && n == -1e6);
|
||||
// Invalid values
|
||||
BOOST_CHECK(!ParseDouble("", &n));
|
||||
BOOST_CHECK(!ParseDouble(" 1", &n)); // no padding inside
|
||||
BOOST_CHECK(!ParseDouble("1 ", &n));
|
||||
BOOST_CHECK(!ParseDouble("1a", &n));
|
||||
BOOST_CHECK(!ParseDouble("aap", &n));
|
||||
BOOST_CHECK(!ParseDouble("0x1", &n)); // no hex
|
||||
const char test_bytes[] = {'1', 0, '1'};
|
||||
std::string teststr(test_bytes, sizeof(test_bytes));
|
||||
BOOST_CHECK(!ParseDouble(teststr, &n)); // no embedded NULs
|
||||
// Overflow and underflow
|
||||
BOOST_CHECK(!ParseDouble("-1e10000", NULL));
|
||||
BOOST_CHECK(!ParseDouble("1e10000", NULL));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_FormatParagraph)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(FormatParagraph("", 79, 0), "");
|
||||
@@ -363,4 +426,70 @@ BOOST_AUTO_TEST_CASE(test_FormatSubVersion)
|
||||
BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99900, comments2), std::string("/Test:0.9.99-beta1(comment1; comment2)/"));
|
||||
BOOST_CHECK_EQUAL(FormatSubVersion("Test", 99950, comments2), std::string("/Test:0.9.99(comment1; comment2)/"));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_ParseFixedPoint)
|
||||
{
|
||||
int64_t amount = 0;
|
||||
BOOST_CHECK(ParseFixedPoint("0", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 0LL);
|
||||
BOOST_CHECK(ParseFixedPoint("1", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 100000000LL);
|
||||
BOOST_CHECK(ParseFixedPoint("0.0", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 0LL);
|
||||
BOOST_CHECK(ParseFixedPoint("-0.1", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, -10000000LL);
|
||||
BOOST_CHECK(ParseFixedPoint("1.1", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 110000000LL);
|
||||
BOOST_CHECK(ParseFixedPoint("1.10000000000000000", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 110000000LL);
|
||||
BOOST_CHECK(ParseFixedPoint("1.1e1", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 1100000000LL);
|
||||
BOOST_CHECK(ParseFixedPoint("1.1e-1", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 11000000LL);
|
||||
BOOST_CHECK(ParseFixedPoint("1000", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 100000000000LL);
|
||||
BOOST_CHECK(ParseFixedPoint("-1000", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, -100000000000LL);
|
||||
BOOST_CHECK(ParseFixedPoint("0.00000001", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 1LL);
|
||||
BOOST_CHECK(ParseFixedPoint("0.0000000100000000", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 1LL);
|
||||
BOOST_CHECK(ParseFixedPoint("-0.00000001", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, -1LL);
|
||||
BOOST_CHECK(ParseFixedPoint("1000000000.00000001", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 100000000000000001LL);
|
||||
BOOST_CHECK(ParseFixedPoint("9999999999.99999999", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, 999999999999999999LL);
|
||||
BOOST_CHECK(ParseFixedPoint("-9999999999.99999999", 8, &amount));
|
||||
BOOST_CHECK_EQUAL(amount, -999999999999999999LL);
|
||||
|
||||
BOOST_CHECK(!ParseFixedPoint("", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("a-1000", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-a1000", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-1000a", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-01000", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("00.1", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint(".1", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("--0.1", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("0.000000001", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-0.000000001", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("0.00000001000000001", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-10000000000.00000000", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("10000000000.00000000", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-10000000000.00000001", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("10000000000.00000001", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-10000000000.00000009", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("10000000000.00000009", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-99999999999.99999999", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("99999909999.09999999", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("92233720368.54775807", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("92233720368.54775808", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-92233720368.54775808", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("-92233720368.54775809", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("1.1e", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("1.1e-", 8, &amount));
|
||||
BOOST_CHECK(!ParseFixedPoint("1.", 8, &amount));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
Reference in New Issue
Block a user