20 #include <ripple/app/misc/AmendmentTable.h>
21 #include <ripple/protocol/Feature.h>
22 #include <ripple/protocol/jss.h>
32 testcase(
"No Params, None Enabled");
34 using namespace test::jtx;
37 auto jrr = env.rpc(
"feature")[jss::result];
38 if (!BEAST_EXPECT(jrr.isMember(jss::features)))
40 for (
auto const& feature : jrr[jss::features])
42 if (!BEAST_EXPECT(feature.isMember(jss::name)))
47 !feature[jss::enabled].asBool(),
48 feature[jss::name].asString() +
" enabled");
50 !feature[jss::vetoed].asBool(),
51 feature[jss::name].asString() +
" vetoed");
53 feature[jss::supported].asBool(),
54 feature[jss::name].asString() +
" supported");
61 testcase(
"Feature Param");
63 using namespace test::jtx;
66 auto jrr = env.rpc(
"feature",
"MultiSignReserve")[jss::result];
67 BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status");
68 jrr.removeMember(jss::status);
69 BEAST_EXPECT(jrr.size() == 1);
70 auto feature = *(jrr.begin());
72 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
73 BEAST_EXPECTS(!feature[jss::enabled].asBool(),
"enabled");
74 BEAST_EXPECTS(!feature[jss::vetoed].asBool(),
"vetoed");
75 BEAST_EXPECTS(feature[jss::supported].asBool(),
"supported");
78 jrr = env.rpc(
"feature",
"multiSignReserve")[jss::result];
79 BEAST_EXPECT(jrr[jss::error] ==
"badFeature");
80 BEAST_EXPECT(jrr[jss::error_message] ==
"Feature unknown or invalid.");
86 testcase(
"Invalid Feature");
88 using namespace test::jtx;
91 auto jrr = env.rpc(
"feature",
"AllTheThings")[jss::result];
92 BEAST_EXPECT(jrr[jss::error] ==
"badFeature");
93 BEAST_EXPECT(jrr[jss::error_message] ==
"Feature unknown or invalid.");
99 testcase(
"Feature Without Admin");
101 using namespace test::jtx;
103 (*cfg)[
"port_rpc"].set(
"admin",
"");
104 (*cfg)[
"port_ws"].set(
"admin",
"");
108 auto jrr = env.rpc(
"feature")[jss::result];
112 BEAST_EXPECT(jrr.isNull());
118 testcase(
"No Params, Some Enabled");
120 using namespace test::jtx;
124 auto jrr = env.rpc(
"feature")[jss::result];
125 if (!BEAST_EXPECT(jrr.isMember(jss::features)))
127 for (
auto it = jrr[jss::features].begin();
128 it != jrr[jss::features].end();
133 if (!BEAST_EXPECT((*it).isMember(jss::name)))
135 bool expectEnabled = env.app().getAmendmentTable().isEnabled(
id);
136 bool expectSupported =
137 env.app().getAmendmentTable().isSupported(
id);
139 (*it)[jss::enabled].asBool() == expectEnabled,
140 (*it)[jss::name].asString() +
" enabled");
142 !(*it)[jss::vetoed].asBool(),
143 (*it)[jss::name].asString() +
" vetoed");
145 (*it)[jss::supported].asBool() == expectSupported,
146 (*it)[jss::name].asString() +
" supported");
153 testcase(
"With Majorities");
155 using namespace test::jtx;
156 Env env{*
this, envconfig(validator,
"")};
158 auto jrr = env.rpc(
"feature")[jss::result];
159 if (!BEAST_EXPECT(jrr.isMember(jss::features)))
164 for (
auto const& feature : jrr[jss::features])
166 if (!BEAST_EXPECT(feature.isMember(jss::name)))
169 !feature.isMember(jss::majority),
170 feature[jss::name].asString() +
" majority");
172 !feature.isMember(jss::count),
173 feature[jss::name].asString() +
" count");
175 !feature.isMember(jss::threshold),
176 feature[jss::name].asString() +
" threshold");
178 !feature.isMember(jss::validations),
179 feature[jss::name].asString() +
" validations");
181 !feature.isMember(jss::vote),
182 feature[jss::name].asString() +
" vote");
186 if (!BEAST_EXPECT(majorities.empty()))
190 for (
auto i = 0; i <= 256; ++i)
194 if (!majorities.empty())
200 BEAST_EXPECT(majorities.size() >= 5);
202 jrr = env.rpc(
"feature")[jss::result];
203 if (!BEAST_EXPECT(jrr.isMember(jss::features)))
205 for (
auto const& feature : jrr[jss::features])
207 if (!BEAST_EXPECT(feature.isMember(jss::name)))
210 feature.isMember(jss::majority),
211 feature[jss::name].asString() +
" majority");
213 feature.isMember(jss::count),
214 feature[jss::name].asString() +
" count");
216 feature.isMember(jss::threshold),
217 feature[jss::name].asString() +
" threshold");
219 feature.isMember(jss::validations),
220 feature[jss::name].asString() +
" validations");
221 BEAST_EXPECT(feature[jss::count] == 1);
222 BEAST_EXPECT(feature[jss::threshold] == 1);
223 BEAST_EXPECT(feature[jss::validations] == 1);
224 BEAST_EXPECT(feature[jss::majority] == 2740);
233 using namespace test::jtx;
236 auto jrr = env.rpc(
"feature",
"MultiSignReserve")[jss::result];
237 if (!BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status"))
239 jrr.removeMember(jss::status);
240 if (!BEAST_EXPECT(jrr.size() == 1))
242 auto feature = *(jrr.begin());
243 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
244 BEAST_EXPECTS(!feature[jss::vetoed].asBool(),
"vetoed");
246 jrr = env.rpc(
"feature",
"MultiSignReserve",
"reject")[jss::result];
247 if (!BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status"))
249 jrr.removeMember(jss::status);
250 if (!BEAST_EXPECT(jrr.size() == 1))
252 feature = *(jrr.begin());
253 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
254 BEAST_EXPECTS(feature[jss::vetoed].asBool(),
"vetoed");
256 jrr = env.rpc(
"feature",
"MultiSignReserve",
"accept")[jss::result];
257 if (!BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status"))
259 jrr.removeMember(jss::status);
260 if (!BEAST_EXPECT(jrr.size() == 1))
262 feature = *(jrr.begin());
263 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
264 BEAST_EXPECTS(!feature[jss::vetoed].asBool(),
"vetoed");
267 jrr = env.rpc(
"feature",
"MultiSignReserve",
"maybe");
268 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
269 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid parameters.");