rippled
Loading...
Searching...
No Matches
GetCounts_test.cpp
1#include <test/jtx.h>
2
3#include <xrpl/basics/CountedObject.h>
4#include <xrpl/beast/unit_test.h>
5#include <xrpl/protocol/SField.h>
6#include <xrpl/protocol/jss.h>
7
8namespace xrpl {
9
11{
12 void
14 {
15 using namespace test::jtx;
16 Env env(*this);
17
18 Json::Value result;
19 {
20 using namespace std::chrono_literals;
21 // Add a little delay so the App's "uptime" will have a value.
23 // check counts with no transactions posted
24 result = env.rpc("get_counts")[jss::result];
25 BEAST_EXPECT(result[jss::status] == "success");
26 BEAST_EXPECT(!result.isMember("Transaction"));
27 BEAST_EXPECT(!result.isMember("STObject"));
28 BEAST_EXPECT(!result.isMember("HashRouterEntry"));
29 BEAST_EXPECT(result.isMember(jss::uptime) && !result[jss::uptime].asString().empty());
30 BEAST_EXPECT(result.isMember(jss::dbKBTotal) && result[jss::dbKBTotal].asInt() > 0);
31 }
32
33 // create some transactions
34 env.close();
35 Account alice{"alice"};
36 Account bob{"bob"};
37 env.fund(XRP(10000), alice, bob);
38 env.trust(alice["USD"](1000), bob);
39 for (auto i = 0; i < 20; ++i)
40 {
41 env(pay(alice, bob, alice["USD"](5)));
42 env.close();
43 }
44
45 {
46 // check counts, default params
47 result = env.rpc("get_counts")[jss::result];
48 BEAST_EXPECT(result[jss::status] == "success");
49 // compare with values reported by CountedObjects
50 auto const& objectCounts = CountedObjects::getInstance().getCounts(10);
51 for (auto const& it : objectCounts)
52 {
53 BEAST_EXPECTS(result.isMember(it.first), it.first);
54 BEAST_EXPECTS(result[it.first].asInt() == it.second, it.first);
55 }
56 BEAST_EXPECT(!result.isMember(jss::local_txs));
57 }
58
59 {
60 // make request with min threshold 100 and verify
61 // that only STObject and NodeObject are reported
62 result = env.rpc("get_counts", "100")[jss::result];
63 BEAST_EXPECT(result[jss::status] == "success");
64
65 // compare with values reported by CountedObjects
66 auto const& objectCounts = CountedObjects::getInstance().getCounts(100);
67 for (auto const& it : objectCounts)
68 {
69 BEAST_EXPECTS(result.isMember(it.first), it.first);
70 BEAST_EXPECTS(result[it.first].asInt() == it.second, it.first);
71 }
72 BEAST_EXPECT(!result.isMember("Transaction"));
73 BEAST_EXPECT(!result.isMember("STTx"));
74 BEAST_EXPECT(!result.isMember("STArray"));
75 BEAST_EXPECT(!result.isMember("HashRouterEntry"));
76 BEAST_EXPECT(!result.isMember("STLedgerEntry"));
77 }
78
79 {
80 // local_txs field will exist when there are open Txs
81 env(pay(alice, bob, alice["USD"](5)));
82 result = env.rpc("get_counts")[jss::result];
83 // deliberately don't call close so we have open Tx
84 BEAST_EXPECT(result.isMember(jss::local_txs) && result[jss::local_txs].asInt() > 0);
85 }
86 }
87
88public:
89 void
90 run() override
91 {
93 }
94};
95
96BEAST_DEFINE_TESTSUITE(GetCounts, rpc, xrpl);
97
98} // namespace xrpl
Represents a JSON value.
Definition json_value.h:131
Int asInt() const
std::string asString() const
Returns the unquoted string value.
bool isMember(char const *key) const
Return true if the object has a member named key.
A testsuite class.
Definition suite.h:52
List getCounts(int minimumThreshold) const
static CountedObjects & getInstance() noexcept
void run() override
Runs the suite.
T empty(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
T sleep_for(T... args)