aboutsummaryrefslogtreecommitdiff
path: root/src/test/rpc_tests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/rpc_tests.cpp')
-rw-r--r--src/test/rpc_tests.cpp86
1 files changed, 83 insertions, 3 deletions
diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp
index 242e1fb7ff..a49796d6f4 100644
--- a/src/test/rpc_tests.cpp
+++ b/src/test/rpc_tests.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The Bitcoin Core developers
+// Copyright (c) 2012-2018 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -16,6 +16,8 @@
#include <univalue.h>
+#include <rpc/blockchain.h>
+
UniValue CallRPC(std::string args)
{
std::vector<std::string> vArgs;
@@ -247,14 +249,14 @@ BOOST_AUTO_TEST_CASE(rpc_ban)
ar = r.get_array();
BOOST_CHECK_EQUAL(ar.size(), 0U);
- BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 127.0.0.0/24 add 1607731200 true")));
+ BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 127.0.0.0/24 add 9907731200 true")));
BOOST_CHECK_NO_THROW(r = CallRPC(std::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/24");
- BOOST_CHECK_EQUAL(banned_until.get_int64(), 1607731200); // absolute time check
+ BOOST_CHECK_EQUAL(banned_until.get_int64(), 9907731200); // absolute time check
BOOST_CHECK_NO_THROW(CallRPC(std::string("clearbanned")));
@@ -336,4 +338,82 @@ BOOST_AUTO_TEST_CASE(rpc_convert_values_generatetoaddress)
BOOST_CHECK_EQUAL(result[2].get_int(), 9);
}
+BOOST_AUTO_TEST_CASE(rpc_getblockstats_calculate_percentiles_by_weight)
+{
+ int64_t total_weight = 200;
+ std::vector<std::pair<CAmount, int64_t>> feerates;
+ CAmount result[NUM_GETBLOCKSTATS_PERCENTILES] = { 0 };
+
+ for (int64_t i = 0; i < 100; i++) {
+ feerates.emplace_back(std::make_pair(1 ,1));
+ }
+
+ for (int64_t i = 0; i < 100; i++) {
+ feerates.emplace_back(std::make_pair(2 ,1));
+ }
+
+ CalculatePercentilesByWeight(result, feerates, total_weight);
+ BOOST_CHECK_EQUAL(result[0], 1);
+ BOOST_CHECK_EQUAL(result[1], 1);
+ BOOST_CHECK_EQUAL(result[2], 1);
+ BOOST_CHECK_EQUAL(result[3], 2);
+ BOOST_CHECK_EQUAL(result[4], 2);
+
+ // Test with more pairs, and two pairs overlapping 2 percentiles.
+ total_weight = 100;
+ CAmount result2[NUM_GETBLOCKSTATS_PERCENTILES] = { 0 };
+ feerates.clear();
+
+ feerates.emplace_back(std::make_pair(1, 9));
+ feerates.emplace_back(std::make_pair(2 , 16)); //10th + 25th percentile
+ feerates.emplace_back(std::make_pair(4 ,50)); //50th + 75th percentile
+ feerates.emplace_back(std::make_pair(5 ,10));
+ feerates.emplace_back(std::make_pair(9 ,15)); // 90th percentile
+
+ CalculatePercentilesByWeight(result2, feerates, total_weight);
+
+ BOOST_CHECK_EQUAL(result2[0], 2);
+ BOOST_CHECK_EQUAL(result2[1], 2);
+ BOOST_CHECK_EQUAL(result2[2], 4);
+ BOOST_CHECK_EQUAL(result2[3], 4);
+ BOOST_CHECK_EQUAL(result2[4], 9);
+
+ // Same test as above, but one of the percentile-overlapping pairs is split in 2.
+ total_weight = 100;
+ CAmount result3[NUM_GETBLOCKSTATS_PERCENTILES] = { 0 };
+ feerates.clear();
+
+ feerates.emplace_back(std::make_pair(1, 9));
+ feerates.emplace_back(std::make_pair(2 , 11)); // 10th percentile
+ feerates.emplace_back(std::make_pair(2 , 5)); // 25th percentile
+ feerates.emplace_back(std::make_pair(4 ,50)); //50th + 75th percentile
+ feerates.emplace_back(std::make_pair(5 ,10));
+ feerates.emplace_back(std::make_pair(9 ,15)); // 90th percentile
+
+ CalculatePercentilesByWeight(result3, feerates, total_weight);
+
+ BOOST_CHECK_EQUAL(result3[0], 2);
+ BOOST_CHECK_EQUAL(result3[1], 2);
+ BOOST_CHECK_EQUAL(result3[2], 4);
+ BOOST_CHECK_EQUAL(result3[3], 4);
+ BOOST_CHECK_EQUAL(result3[4], 9);
+
+ // Test with one transaction spanning all percentiles.
+ total_weight = 104;
+ CAmount result4[NUM_GETBLOCKSTATS_PERCENTILES] = { 0 };
+ feerates.clear();
+
+ feerates.emplace_back(std::make_pair(1, 100));
+ feerates.emplace_back(std::make_pair(2, 1));
+ feerates.emplace_back(std::make_pair(3, 1));
+ feerates.emplace_back(std::make_pair(3, 1));
+ feerates.emplace_back(std::make_pair(999999, 1));
+
+ CalculatePercentilesByWeight(result4, feerates, total_weight);
+
+ for (int64_t i = 0; i < NUM_GETBLOCKSTATS_PERCENTILES; i++) {
+ BOOST_CHECK_EQUAL(result4[i], 1);
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()