rippled
Loading...
Searching...
No Matches
AmendmentBlocked_test.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2017 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#include <test/jtx.h>
21#include <test/jtx/WSClient.h>
22
23#include <xrpld/app/misc/NetworkOPs.h>
24#include <xrpld/core/ConfigSections.h>
25
26#include <xrpl/protocol/jss.h>
27
28namespace ripple {
29
31{
32 void
34 {
35 using namespace test::jtx;
36 Env env{*this, envconfig([](std::unique_ptr<Config> cfg) {
37 cfg->loadFromString("[" SECTION_SIGNING_SUPPORT "]\ntrue");
38 return cfg;
39 })};
40 auto const gw = Account{"gateway"};
41 auto const USD = gw["USD"];
42 auto const alice = Account{"alice"};
43 auto const bob = Account{"bob"};
44 Account const ali{"ali", KeyType::secp256k1};
45 env.fund(XRP(10000), alice, bob, gw);
46 env.memoize(ali);
47 // This close() ensures that all the accounts get created and their
48 // default ripple flag gets set before the trust lines are created.
49 // Without it, the ordering manages to create alice's trust line with
50 // noRipple set on gw's end. The existing tests pass either way, but
51 // better to do it right.
52 env.close();
53 env.trust(USD(600), alice);
54 env.trust(USD(700), bob);
55 env(pay(gw, alice, USD(70)));
56 env(pay(gw, bob, USD(50)));
57 env.close();
58
59 auto wsc = test::makeWSClient(env.app().config());
60
61 auto current = env.current();
62 // ledger_accept
63 auto jr = env.rpc("ledger_accept")[jss::result];
64 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
65 BEAST_EXPECT(!jr.isMember(jss::warnings));
66
67 // ledger_current
68 jr = env.rpc("ledger_current")[jss::result];
69 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
70 BEAST_EXPECT(!jr.isMember(jss::warnings));
71
72 // owner_info
73 jr = env.rpc("owner_info", alice.human())[jss::result];
74 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
75 BEAST_EXPECT(!jr.isMember(jss::warnings));
76
77 // path_find
78 Json::Value pf_req;
79 pf_req[jss::subcommand] = "create";
80 pf_req[jss::source_account] = alice.human();
81 pf_req[jss::destination_account] = bob.human();
82 pf_req[jss::destination_amount] =
83 bob["USD"](20).value().getJson(JsonOptions::none);
84 jr = wsc->invoke("path_find", pf_req)[jss::result];
85 BEAST_EXPECT(
86 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
87 jr[jss::alternatives].size() == 1);
88 BEAST_EXPECT(!jr.isMember(jss::warnings));
89
90 // submit
91 auto jt = env.jt(noop(alice));
92 Serializer s;
93 jt.stx->add(s);
94 jr = env.rpc("submit", strHex(s.slice()))[jss::result];
95 BEAST_EXPECT(
96 jr.isMember(jss::engine_result) &&
97 jr[jss::engine_result] == "tesSUCCESS");
98 BEAST_EXPECT(!jr.isMember(jss::warnings));
99
100 // submit_multisigned
101 env(signers(bob, 1, {{alice, 1}}), sig(bob));
102 env(regkey(alice, ali));
103 env.close();
104
105 Json::Value set_tx;
106 set_tx[jss::Account] = bob.human();
107 set_tx[jss::TransactionType] = jss::AccountSet;
108 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
109 set_tx[jss::Sequence] = env.seq(bob);
110 set_tx[jss::SigningPubKey] = "";
111
112 Json::Value sign_for;
113 sign_for[jss::tx_json] = set_tx;
114 sign_for[jss::account] = alice.human();
115 sign_for[jss::secret] = ali.name();
116 jr = env.rpc("json", "sign_for", to_string(sign_for))[jss::result];
117 BEAST_EXPECT(jr[jss::status] == "success");
118 BEAST_EXPECT(!jr.isMember(jss::warnings));
119
120 Json::Value ms_req;
121 ms_req[jss::tx_json] = jr[jss::tx_json];
122 jr = env.rpc(
123 "json", "submit_multisigned", to_string(ms_req))[jss::result];
124 BEAST_EXPECT(
125 jr.isMember(jss::engine_result) &&
126 jr[jss::engine_result] == "tesSUCCESS");
127 BEAST_EXPECT(!jr.isMember(jss::warnings));
128
129 // set up an amendment warning. Nothing changes
130
131 env.app().getOPs().setAmendmentWarned();
132
133 current = env.current();
134 // ledger_accept
135 jr = env.rpc("ledger_accept")[jss::result];
136 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
137 BEAST_EXPECT(!jr.isMember(jss::warnings));
138
139 // ledger_current
140 jr = env.rpc("ledger_current")[jss::result];
141 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
142 BEAST_EXPECT(!jr.isMember(jss::warnings));
143
144 // owner_info
145 jr = env.rpc("owner_info", alice.human())[jss::result];
146 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
147 BEAST_EXPECT(!jr.isMember(jss::warnings));
148
149 // path_find
150 pf_req[jss::subcommand] = "create";
151 pf_req[jss::source_account] = alice.human();
152 pf_req[jss::destination_account] = bob.human();
153 pf_req[jss::destination_amount] =
154 bob["USD"](20).value().getJson(JsonOptions::none);
155 jr = wsc->invoke("path_find", pf_req)[jss::result];
156 BEAST_EXPECT(
157 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
158 jr[jss::alternatives].size() == 1);
159 BEAST_EXPECT(!jr.isMember(jss::warnings));
160
161 // submit
162 jt = env.jt(noop(alice));
163 s.erase();
164 jt.stx->add(s);
165 jr = env.rpc("submit", strHex(s.slice()))[jss::result];
166 BEAST_EXPECT(
167 jr.isMember(jss::engine_result) &&
168 jr[jss::engine_result] == "tesSUCCESS");
169 BEAST_EXPECT(!jr.isMember(jss::warnings));
170
171 // submit_multisigned
172 env(signers(bob, 1, {{alice, 1}}), sig(bob));
173 env(regkey(alice, ali));
174 env.close();
175
176 set_tx[jss::Account] = bob.human();
177 set_tx[jss::TransactionType] = jss::AccountSet;
178 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
179 set_tx[jss::Sequence] = env.seq(bob);
180 set_tx[jss::SigningPubKey] = "";
181
182 sign_for[jss::tx_json] = set_tx;
183 sign_for[jss::account] = alice.human();
184 sign_for[jss::secret] = ali.name();
185 jr = env.rpc("json", "sign_for", to_string(sign_for))[jss::result];
186 BEAST_EXPECT(jr[jss::status] == "success");
187 BEAST_EXPECT(!jr.isMember(jss::warnings));
188
189 ms_req[jss::tx_json] = jr[jss::tx_json];
190 jr = env.rpc(
191 "json", "submit_multisigned", to_string(ms_req))[jss::result];
192 BEAST_EXPECT(
193 jr.isMember(jss::engine_result) &&
194 jr[jss::engine_result] == "tesSUCCESS");
195 BEAST_EXPECT(!jr.isMember(jss::warnings));
196
197 // make the network amendment blocked...now all the same
198 // requests should fail
199
200 env.app().getOPs().setAmendmentBlocked();
201
202 // ledger_accept
203 jr = env.rpc("ledger_accept")[jss::result];
204 BEAST_EXPECT(
205 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
206 BEAST_EXPECT(jr[jss::status] == "error");
207 BEAST_EXPECT(!jr.isMember(jss::warnings));
208
209 // ledger_current
210 jr = env.rpc("ledger_current")[jss::result];
211 BEAST_EXPECT(
212 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
213 BEAST_EXPECT(jr[jss::status] == "error");
214 BEAST_EXPECT(!jr.isMember(jss::warnings));
215
216 // owner_info
217 jr = env.rpc("owner_info", alice.human())[jss::result];
218 BEAST_EXPECT(
219 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
220 BEAST_EXPECT(jr[jss::status] == "error");
221 BEAST_EXPECT(!jr.isMember(jss::warnings));
222
223 // path_find
224 jr = wsc->invoke("path_find", pf_req)[jss::result];
225 BEAST_EXPECT(
226 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
227 BEAST_EXPECT(jr[jss::status] == "error");
228 BEAST_EXPECT(!jr.isMember(jss::warnings));
229
230 // submit
231 jr = env.rpc("submit", strHex(s.slice()))[jss::result];
232 BEAST_EXPECT(
233 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
234 BEAST_EXPECT(jr[jss::status] == "error");
235 BEAST_EXPECT(!jr.isMember(jss::warnings));
236
237 // submit_multisigned
238 set_tx[jss::Sequence] = env.seq(bob);
239 sign_for[jss::tx_json] = set_tx;
240 jr = env.rpc("json", "sign_for", to_string(sign_for))[jss::result];
241 BEAST_EXPECT(jr[jss::status] == "success");
242 ms_req[jss::tx_json] = jr[jss::tx_json];
243 jr = env.rpc(
244 "json", "submit_multisigned", to_string(ms_req))[jss::result];
245 BEAST_EXPECT(
246 jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
247 BEAST_EXPECT(!jr.isMember(jss::warnings));
248 }
249
250public:
251 void
252 run() override
253 {
255 }
256};
257
258BEAST_DEFINE_TESTSUITE(AmendmentBlocked, rpc, ripple);
259
260} // namespace ripple
Represents a JSON value.
Definition json_value.h:149
A testsuite class.
Definition suite.h:55
void run() override
Runs the suite.
Slice slice() const noexcept
Definition Serializer.h:66
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:323
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:25
@ current
This was a new validation and was added.
std::string strHex(FwdIt begin, FwdIt end)
Definition strHex.h:30
std::string to_string(base_uint< Bits, Tag > const &a)
Definition base_uint.h:630