21 #include <ripple/protocol/Feature.h>
22 #include <ripple/protocol/jss.h>
23 #include <ripple/app/misc/AmendmentTable.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)))
45 BEAST_EXPECTS(! feature[jss::enabled].asBool(),
46 feature[jss::name].asString() +
" enabled");
47 BEAST_EXPECTS(! feature[jss::vetoed].asBool(),
48 feature[jss::name].asString() +
" vetoed");
49 BEAST_EXPECTS(feature[jss::supported].asBool(),
50 feature[jss::name].asString() +
" supported");
57 testcase (
"Feature Param");
59 using namespace test::jtx;
62 auto jrr = env.rpc(
"feature",
"MultiSignReserve") [jss::result];
63 BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status");
64 jrr.removeMember(jss::status);
65 BEAST_EXPECT(jrr.size() == 1);
66 auto feature = *(jrr.begin());
68 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
69 BEAST_EXPECTS(! feature[jss::enabled].asBool(),
"enabled");
70 BEAST_EXPECTS(! feature[jss::vetoed].asBool(),
"vetoed");
71 BEAST_EXPECTS(feature[jss::supported].asBool(),
"supported");
74 jrr = env.rpc(
"feature",
"multiSignReserve") [jss::result];
75 BEAST_EXPECT(jrr[jss::error] ==
"badFeature");
76 BEAST_EXPECT(jrr[jss::error_message] ==
"Feature unknown or invalid.");
82 testcase (
"Invalid Feature");
84 using namespace test::jtx;
87 auto jrr = env.rpc(
"feature",
"AllTheThings") [jss::result];
88 BEAST_EXPECT(jrr[jss::error] ==
"badFeature");
89 BEAST_EXPECT(jrr[jss::error_message] ==
"Feature unknown or invalid.");
95 testcase (
"Feature Without Admin");
97 using namespace test::jtx;
99 (*cfg)[
"port_rpc"].set(
"admin",
"");
100 (*cfg)[
"port_ws"].set(
"admin",
"");
104 auto jrr = env.rpc(
"feature") [jss::result];
108 BEAST_EXPECT(jrr.isNull());
114 testcase (
"No Params, Some Enabled");
116 using namespace test::jtx;
120 auto jrr = env.rpc(
"feature") [jss::result];
121 if(! BEAST_EXPECT(jrr.isMember(jss::features)))
123 for(
auto it = jrr[jss::features].begin();
124 it != jrr[jss::features].end(); ++it)
128 if(! BEAST_EXPECT((*it).isMember(jss::name)))
130 bool expectEnabled = env.app().getAmendmentTable().isEnabled(
id);
131 bool expectSupported = env.app().getAmendmentTable().isSupported(
id);
132 BEAST_EXPECTS((*it)[jss::enabled].asBool() == expectEnabled,
133 (*it)[jss::name].asString() +
" enabled");
134 BEAST_EXPECTS(! (*it)[jss::vetoed].asBool(),
135 (*it)[jss::name].asString() +
" vetoed");
136 BEAST_EXPECTS((*it)[jss::supported].asBool() == expectSupported,
137 (*it)[jss::name].asString() +
" supported");
144 testcase (
"With Majorities");
146 using namespace test::jtx;
147 Env env {*
this, envconfig(validator,
"")};
149 auto jrr = env.rpc(
"feature") [jss::result];
150 if(! BEAST_EXPECT(jrr.isMember(jss::features)))
155 for(
auto const& feature : jrr[jss::features])
157 if(! BEAST_EXPECT(feature.isMember(jss::name)))
159 BEAST_EXPECTS(! feature.isMember(jss::majority),
160 feature[jss::name].asString() +
" majority");
161 BEAST_EXPECTS(! feature.isMember(jss::count),
162 feature[jss::name].asString() +
" count");
163 BEAST_EXPECTS(! feature.isMember(jss::threshold),
164 feature[jss::name].asString() +
" threshold");
165 BEAST_EXPECTS(! feature.isMember(jss::validations),
166 feature[jss::name].asString() +
" validations");
167 BEAST_EXPECTS(! feature.isMember(jss::vote),
168 feature[jss::name].asString() +
" vote");
172 if(! BEAST_EXPECT(majorities.empty()))
176 for (
auto i = 0; i <= 256; ++i)
180 if (! majorities.empty())
186 BEAST_EXPECT(majorities.size() >= 5);
188 jrr = env.rpc(
"feature") [jss::result];
189 if(! BEAST_EXPECT(jrr.isMember(jss::features)))
191 for(
auto const& feature : jrr[jss::features])
193 if(! BEAST_EXPECT(feature.isMember(jss::name)))
195 BEAST_EXPECTS(feature.isMember(jss::majority),
196 feature[jss::name].asString() +
" majority");
197 BEAST_EXPECTS(feature.isMember(jss::count),
198 feature[jss::name].asString() +
" count");
199 BEAST_EXPECTS(feature.isMember(jss::threshold),
200 feature[jss::name].asString() +
" threshold");
201 BEAST_EXPECTS(feature.isMember(jss::validations),
202 feature[jss::name].asString() +
" validations");
203 BEAST_EXPECTS(feature.isMember(jss::vote),
204 feature[jss::name].asString() +
" vote");
205 BEAST_EXPECT(feature[jss::vote] == 256);
206 BEAST_EXPECT(feature[jss::majority] == 2740);
216 using namespace test::jtx;
220 auto jrr = env.rpc(
"feature",
"MultiSignReserve") [jss::result];
221 if(! BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status"))
223 jrr.removeMember(jss::status);
224 if(! BEAST_EXPECT(jrr.size() == 1))
226 auto feature = *(jrr.begin());
227 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
228 BEAST_EXPECTS(! feature[jss::vetoed].asBool(),
"vetoed");
230 jrr = env.rpc(
"feature",
"MultiSignReserve",
"reject") [jss::result];
231 if(! BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status"))
233 jrr.removeMember(jss::status);
234 if(! BEAST_EXPECT(jrr.size() == 1))
236 feature = *(jrr.begin());
237 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
238 BEAST_EXPECTS(feature[jss::vetoed].asBool(),
"vetoed");
240 jrr = env.rpc(
"feature",
"MultiSignReserve",
"accept") [jss::result];
241 if(! BEAST_EXPECTS(jrr[jss::status] == jss::success,
"status"))
243 jrr.removeMember(jss::status);
244 if(! BEAST_EXPECT(jrr.size() == 1))
246 feature = *(jrr.begin());
247 BEAST_EXPECTS(feature[jss::name] ==
"MultiSignReserve",
"name");
248 BEAST_EXPECTS(! feature[jss::vetoed].asBool(),
"vetoed");
251 jrr = env.rpc(
"feature",
"MultiSignReserve",
"maybe");
252 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
253 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid parameters.");