rippled
Loading...
Searching...
No Matches
AmendmentBlocked_test.cpp
1#include <test/jtx.h>
2#include <test/jtx/WSClient.h>
3
4#include <xrpld/app/misc/NetworkOPs.h>
5#include <xrpld/core/ConfigSections.h>
6
7#include <xrpl/protocol/jss.h>
8
9namespace ripple {
10
12{
13 void
15 {
16 using namespace test::jtx;
17 Env env{*this, envconfig([](std::unique_ptr<Config> cfg) {
18 cfg->loadFromString("[" SECTION_SIGNING_SUPPORT "]\ntrue");
19 return cfg;
20 })};
21 auto const gw = Account{"gateway"};
22 auto const USD = gw["USD"];
23 auto const alice = Account{"alice"};
24 auto const bob = Account{"bob"};
25 Account const ali{"ali", KeyType::secp256k1};
26 env.fund(XRP(10000), alice, bob, gw);
27 env.memoize(ali);
28 // This close() ensures that all the accounts get created and their
29 // default ripple flag gets set before the trust lines are created.
30 // Without it, the ordering manages to create alice's trust line with
31 // noRipple set on gw's end. The existing tests pass either way, but
32 // better to do it right.
33 env.close();
34 env.trust(USD(600), alice);
35 env.trust(USD(700), bob);
36 env(pay(gw, alice, USD(70)));
37 env(pay(gw, bob, USD(50)));
38 env.close();
39
40 auto wsc = test::makeWSClient(env.app().config());
41
42 auto current = env.current();
43 // ledger_accept
44 auto jr = env.rpc("ledger_accept")[jss::result];
45 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
46 BEAST_EXPECT(!jr.isMember(jss::warnings));
47
48 // ledger_current
49 jr = env.rpc("ledger_current")[jss::result];
50 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
51 BEAST_EXPECT(!jr.isMember(jss::warnings));
52
53 // owner_info
54 jr = env.rpc("owner_info", alice.human())[jss::result];
55 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
56 BEAST_EXPECT(!jr.isMember(jss::warnings));
57
58 // path_find
59 Json::Value pf_req;
60 pf_req[jss::subcommand] = "create";
61 pf_req[jss::source_account] = alice.human();
62 pf_req[jss::destination_account] = bob.human();
63 pf_req[jss::destination_amount] =
64 bob["USD"](20).value().getJson(JsonOptions::none);
65 jr = wsc->invoke("path_find", pf_req)[jss::result];
66 BEAST_EXPECT(
67 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
68 jr[jss::alternatives].size() == 1);
69 BEAST_EXPECT(!jr.isMember(jss::warnings));
70
71 // submit
72 auto jt = env.jt(noop(alice));
73 Serializer s;
74 jt.stx->add(s);
75 jr = env.rpc("submit", strHex(s.slice()))[jss::result];
76 BEAST_EXPECT(
77 jr.isMember(jss::engine_result) &&
78 jr[jss::engine_result] == "tesSUCCESS");
79 BEAST_EXPECT(!jr.isMember(jss::warnings));
80
81 // submit_multisigned
82 env(signers(bob, 1, {{alice, 1}}), sig(bob));
83 env(regkey(alice, ali));
84 env.close();
85
86 Json::Value set_tx;
87 set_tx[jss::Account] = bob.human();
88 set_tx[jss::TransactionType] = jss::AccountSet;
89 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
90 set_tx[jss::Sequence] = env.seq(bob);
91 set_tx[jss::SigningPubKey] = "";
92
93 Json::Value sign_for;
94 sign_for[jss::tx_json] = set_tx;
95 sign_for[jss::account] = alice.human();
96 sign_for[jss::secret] = ali.name();
97 jr = env.rpc("json", "sign_for", to_string(sign_for))[jss::result];
98 BEAST_EXPECT(jr[jss::status] == "success");
99 BEAST_EXPECT(!jr.isMember(jss::warnings));
100
101 Json::Value ms_req;
102 ms_req[jss::tx_json] = jr[jss::tx_json];
103 jr = env.rpc(
104 "json", "submit_multisigned", to_string(ms_req))[jss::result];
105 BEAST_EXPECT(
106 jr.isMember(jss::engine_result) &&
107 jr[jss::engine_result] == "tesSUCCESS");
108 BEAST_EXPECT(!jr.isMember(jss::warnings));
109
110 // set up an amendment warning. Nothing changes
111
112 env.app().getOPs().setAmendmentWarned();
113
114 current = env.current();
115 // ledger_accept
116 jr = env.rpc("ledger_accept")[jss::result];
117 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
118 BEAST_EXPECT(!jr.isMember(jss::warnings));
119
120 // ledger_current
121 jr = env.rpc("ledger_current")[jss::result];
122 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
123 BEAST_EXPECT(!jr.isMember(jss::warnings));
124
125 // owner_info
126 jr = env.rpc("owner_info", alice.human())[jss::result];
127 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
128 BEAST_EXPECT(!jr.isMember(jss::warnings));
129
130 // path_find
131 pf_req[jss::subcommand] = "create";
132 pf_req[jss::source_account] = alice.human();
133 pf_req[jss::destination_account] = bob.human();
134 pf_req[jss::destination_amount] =
135 bob["USD"](20).value().getJson(JsonOptions::none);
136 jr = wsc->invoke("path_find", pf_req)[jss::result];
137 BEAST_EXPECT(
138 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
139 jr[jss::alternatives].size() == 1);
140 BEAST_EXPECT(!jr.isMember(jss::warnings));
141
142 // submit
143 jt = env.jt(noop(alice));
144 s.erase();
145 jt.stx->add(s);
146 jr = env.rpc("submit", strHex(s.slice()))[jss::result];
147 BEAST_EXPECT(
148 jr.isMember(jss::engine_result) &&
149 jr[jss::engine_result] == "tesSUCCESS");
150 BEAST_EXPECT(!jr.isMember(jss::warnings));
151
152 // submit_multisigned
153 env(signers(bob, 1, {{alice, 1}}), sig(bob));
154 env(regkey(alice, ali));
155 env.close();
156
157 set_tx[jss::Account] = bob.human();
158 set_tx[jss::TransactionType] = jss::AccountSet;
159 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
160 set_tx[jss::Sequence] = env.seq(bob);
161 set_tx[jss::SigningPubKey] = "";
162
163 sign_for[jss::tx_json] = set_tx;
164 sign_for[jss::account] = alice.human();
165 sign_for[jss::secret] = ali.name();
166 jr = env.rpc("json", "sign_for", to_string(sign_for))[jss::result];
167 BEAST_EXPECT(jr[jss::status] == "success");
168 BEAST_EXPECT(!jr.isMember(jss::warnings));
169
170 ms_req[jss::tx_json] = jr[jss::tx_json];
171 jr = env.rpc(
172 "json", "submit_multisigned", to_string(ms_req))[jss::result];
173 BEAST_EXPECT(
174 jr.isMember(jss::engine_result) &&
175 jr[jss::engine_result] == "tesSUCCESS");
176 BEAST_EXPECT(!jr.isMember(jss::warnings));
177
178 // make the network amendment blocked...now all the same
179 // requests should fail
180
181 env.app().getOPs().setAmendmentBlocked();
182
183 // ledger_accept
184 jr = env.rpc("ledger_accept")[jss::result];
185 BEAST_EXPECT(
186 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
187 BEAST_EXPECT(jr[jss::status] == "error");
188 BEAST_EXPECT(!jr.isMember(jss::warnings));
189
190 // ledger_current
191 jr = env.rpc("ledger_current")[jss::result];
192 BEAST_EXPECT(
193 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
194 BEAST_EXPECT(jr[jss::status] == "error");
195 BEAST_EXPECT(!jr.isMember(jss::warnings));
196
197 // owner_info
198 jr = env.rpc("owner_info", alice.human())[jss::result];
199 BEAST_EXPECT(
200 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
201 BEAST_EXPECT(jr[jss::status] == "error");
202 BEAST_EXPECT(!jr.isMember(jss::warnings));
203
204 // path_find
205 jr = wsc->invoke("path_find", pf_req)[jss::result];
206 BEAST_EXPECT(
207 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
208 BEAST_EXPECT(jr[jss::status] == "error");
209 BEAST_EXPECT(!jr.isMember(jss::warnings));
210
211 // submit
212 jr = env.rpc("submit", strHex(s.slice()))[jss::result];
213 BEAST_EXPECT(
214 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
215 BEAST_EXPECT(jr[jss::status] == "error");
216 BEAST_EXPECT(!jr.isMember(jss::warnings));
217
218 // submit_multisigned
219 set_tx[jss::Sequence] = env.seq(bob);
220 sign_for[jss::tx_json] = set_tx;
221 jr = env.rpc("json", "sign_for", to_string(sign_for))[jss::result];
222 BEAST_EXPECT(jr[jss::status] == "success");
223 ms_req[jss::tx_json] = jr[jss::tx_json];
224 jr = env.rpc(
225 "json", "submit_multisigned", to_string(ms_req))[jss::result];
226 BEAST_EXPECT(
227 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
228 BEAST_EXPECT(!jr.isMember(jss::warnings));
229 }
230
231public:
232 void
233 run() override
234 {
236 }
237};
238
239BEAST_DEFINE_TESTSUITE(AmendmentBlocked, rpc, ripple);
240
241} // namespace ripple
Represents a JSON value.
Definition json_value.h:130
A testsuite class.
Definition suite.h:52
void run() override
Runs the suite.
Slice slice() const noexcept
Definition Serializer.h:47
std::unique_ptr< WSClient > makeWSClient(Config const &cfg, bool v2, unsigned rpc_version, std::unordered_map< std::string, std::string > const &headers)
Returns a client operating through WebSockets/S.
Definition WSClient.cpp:304
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
@ current
This was a new validation and was added.
std::string strHex(FwdIt begin, FwdIt end)
Definition strHex.h:11
std::string to_string(base_uint< Bits, Tag > const &a)
Definition base_uint.h:611