20 #include <ripple/app/misc/AmendmentTable.h>
21 #include <ripple/protocol/Feature.h>
22 #include <ripple/protocol/jss.h>
32 testcase(
"internals");
59 testcase(
"featureToName");
66 for (
auto const& [feature, vote] : supported)
70 if (BEAST_EXPECT(registered))
84 "0000000000000000000000000000000000000000000000000000000000000000");
97 "fixTakerDryOfferRemoval");
103 testcase(
"No Params, None Enabled");
105 using namespace test::jtx;
111 auto jrr = env.rpc(
"feature")[jss::result];
112 if (!BEAST_EXPECT(jrr.isMember(jss::features)))
114 for (
auto const& feature : jrr[jss::features])
116 if (!BEAST_EXPECT(feature.isMember(jss::name)))
123 !feature[jss::enabled].asBool(),
124 feature[jss::name].asString() +
" enabled");
126 feature[jss::vetoed].asBool() == expectVeto,
127 feature[jss::name].asString() +
" vetoed");
129 feature[jss::supported].asBool(),
130 feature[jss::name].asString() +
" supported");
137 testcase(
"Feature Param");
139 using namespace test::jtx;
142 auto jrr = env.rpc(
"feature",
"MultiSignReserve")[jss::result];
143 BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status");
144 jrr.removeMember(jss::status);
145 BEAST_EXPECT(jrr.size() == 1);
147 jrr.isMember(
"586480873651E106F1D6339B0C4A8945BA705A777F3F4524626FF"
149 auto feature = *(jrr.begin());
151 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
152 BEAST_EXPECTS(!feature[jss::enabled].asBool(),
"enabled");
153 BEAST_EXPECTS(!feature[jss::vetoed].asBool(),
"vetoed");
154 BEAST_EXPECTS(feature[jss::supported].asBool(),
"supported");
157 jrr = env.rpc(
"feature",
"multiSignReserve")[jss::result];
158 BEAST_EXPECT(jrr[jss::error] ==
"badFeature");
159 BEAST_EXPECT(jrr[jss::error_message] ==
"Feature unknown or invalid.");
165 testcase(
"Invalid Feature");
167 using namespace test::jtx;
170 auto jrr = env.rpc(
"feature",
"AllTheThings")[jss::result];
171 BEAST_EXPECT(jrr[jss::error] ==
"badFeature");
172 BEAST_EXPECT(jrr[jss::error_message] ==
"Feature unknown or invalid.");
178 testcase(
"Feature Without Admin");
180 using namespace test::jtx;
182 (*cfg)[
"port_rpc"].set(
"admin",
"");
183 (*cfg)[
"port_ws"].set(
"admin",
"");
187 auto jrr = env.rpc(
"feature")[jss::result];
191 BEAST_EXPECT(jrr.isNull());
197 testcase(
"No Params, Some Enabled");
199 using namespace test::jtx;
206 auto jrr = env.rpc(
"feature")[jss::result];
207 if (!BEAST_EXPECT(jrr.isMember(jss::features)))
209 for (
auto it = jrr[jss::features].begin();
210 it != jrr[jss::features].end();
214 (void)
id.parseHex(it.key().asString().c_str());
215 if (!BEAST_EXPECT((*it).isMember(jss::name)))
217 bool expectEnabled = env.app().getAmendmentTable().isEnabled(
id);
218 bool expectSupported =
219 env.app().getAmendmentTable().isSupported(
id);
223 (*it)[jss::enabled].asBool() == expectEnabled,
224 (*it)[jss::name].asString() +
" enabled");
226 (*it)[jss::vetoed].asBool() == expectVeto,
227 (*it)[jss::name].asString() +
" vetoed");
229 (*it)[jss::supported].asBool() == expectSupported,
230 (*it)[jss::name].asString() +
" supported");
237 testcase(
"With Majorities");
239 using namespace test::jtx;
240 Env env{*
this, envconfig(validator,
"")};
242 auto jrr = env.rpc(
"feature")[jss::result];
243 if (!BEAST_EXPECT(jrr.isMember(jss::features)))
248 for (
auto const& feature : jrr[jss::features])
250 if (!BEAST_EXPECT(feature.isMember(jss::name)))
253 !feature.isMember(jss::majority),
254 feature[jss::name].asString() +
" majority");
256 !feature.isMember(jss::count),
257 feature[jss::name].asString() +
" count");
259 !feature.isMember(jss::threshold),
260 feature[jss::name].asString() +
" threshold");
262 !feature.isMember(jss::validations),
263 feature[jss::name].asString() +
" validations");
265 !feature.isMember(jss::vote),
266 feature[jss::name].asString() +
" vote");
270 if (!BEAST_EXPECT(majorities.empty()))
274 for (
auto i = 0; i <= 256; ++i)
278 if (!majorities.empty())
284 BEAST_EXPECT(majorities.size() >= 5);
288 jrr = env.rpc(
"feature")[jss::result];
289 if (!BEAST_EXPECT(jrr.isMember(jss::features)))
291 for (
auto const& feature : jrr[jss::features])
293 if (!BEAST_EXPECT(feature.isMember(jss::name)))
298 expectVeto ^ feature.isMember(jss::majority),
299 feature[jss::name].asString() +
" majority");
301 feature.isMember(jss::vetoed) &&
302 feature[jss::vetoed].asBool() == expectVeto,
303 feature[jss::name].asString() +
" vetoed");
305 feature.isMember(jss::count),
306 feature[jss::name].asString() +
" count");
308 feature.isMember(jss::threshold),
309 feature[jss::name].asString() +
" threshold");
311 feature.isMember(jss::validations),
312 feature[jss::name].asString() +
" validations");
313 BEAST_EXPECT(feature[jss::count] == (expectVeto ? 0 : 1));
314 BEAST_EXPECT(feature[jss::threshold] == 1);
315 BEAST_EXPECT(feature[jss::validations] == 1);
317 expectVeto || feature[jss::majority] == 2540,
318 "Majority: " + feature[jss::majority].asString());
327 using namespace test::jtx;
330 auto jrr = env.rpc(
"feature",
"MultiSignReserve")[jss::result];
331 if (!BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status"))
333 jrr.removeMember(jss::status);
334 if (!BEAST_EXPECT(jrr.size() == 1))
336 auto feature = *(jrr.begin());
337 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
338 BEAST_EXPECTS(!feature[jss::vetoed].asBool(),
"vetoed");
340 jrr = env.rpc(
"feature",
"MultiSignReserve",
"reject")[jss::result];
341 if (!BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status"))
343 jrr.removeMember(jss::status);
344 if (!BEAST_EXPECT(jrr.size() == 1))
346 feature = *(jrr.begin());
347 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
348 BEAST_EXPECTS(feature[jss::vetoed].asBool(),
"vetoed");
350 jrr = env.rpc(
"feature",
"MultiSignReserve",
"accept")[jss::result];
351 if (!BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status"))
353 jrr.removeMember(jss::status);
354 if (!BEAST_EXPECT(jrr.size() == 1))
356 feature = *(jrr.begin());
357 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
358 BEAST_EXPECTS(!feature[jss::vetoed].asBool(),
"vetoed");
361 jrr = env.rpc(
"feature",
"MultiSignReserve",
"maybe");
362 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
363 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid parameters.");