rippled
Version_test.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012-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 <ripple/protocol/jss.h>
21 #include <ripple/rpc/impl/RPCHelpers.h>
22 #include <test/jtx.h>
23 
24 namespace ripple {
25 
26 class Version_test : public beast::unit_test::suite
27 {
28  void
30  {
31  testcase("right api_version: explicitly specified or filled by parser");
32 
33  using namespace test::jtx;
34  Env env{*this};
35 
36  auto isCorrectReply = [](Json::Value const& re) -> bool {
37  if (re.isMember(jss::error))
38  return false;
39  return re.isMember(jss::version);
40  };
41 
42  auto jrr = env.rpc(
43  "json",
44  "version",
45  "{\"api_version\": " +
47  "}")[jss::result];
48  BEAST_EXPECT(isCorrectReply(jrr));
49 
50  jrr = env.rpc("version")[jss::result];
51  BEAST_EXPECT(isCorrectReply(jrr));
52  }
53 
54  void
56  {
57  testcase("wrong api_version: too low, too high, or wrong format");
58 
59  using namespace test::jtx;
60  Env env{*this};
61 
62  auto get_error_what = [](Json::Value const& re) -> std::string {
63  if (re.isMember("error_what"))
64  if (re["error_what"].isString())
65  return re["error_what"].asString();
66  return {};
67  };
68 
69  auto re = env.rpc(
70  "json",
71  "version",
72  "{\"api_version\": " +
74  BEAST_EXPECT(get_error_what(re).find(jss::invalid_API_version.c_str()));
75 
76  re = env.rpc(
77  "json",
78  "version",
79  "{\"api_version\": " +
81  BEAST_EXPECT(get_error_what(re).find(jss::invalid_API_version.c_str()));
82 
83  re = env.rpc("json", "version", "{\"api_version\": \"a\"}");
84  BEAST_EXPECT(get_error_what(re).find(jss::invalid_API_version.c_str()));
85  }
86 
87  void
89  {
90  testcase("test getAPIVersionNumber function");
91 
92  unsigned int versionIfUnspecified =
96 
99  BEAST_EXPECT(RPC::getAPIVersionNumber(j_array) == versionIfUnspecified);
100  BEAST_EXPECT(RPC::getAPIVersionNumber(j_null) == versionIfUnspecified);
101 
103  BEAST_EXPECT(
104  RPC::getAPIVersionNumber(j_object) == versionIfUnspecified);
105  j_object[jss::api_version] = RPC::APIVersionIfUnspecified;
106  BEAST_EXPECT(
107  RPC::getAPIVersionNumber(j_object) == versionIfUnspecified);
108 
109  j_object[jss::api_version] = RPC::ApiMinimumSupportedVersion;
110  BEAST_EXPECT(
111  RPC::getAPIVersionNumber(j_object) ==
113  j_object[jss::api_version] = RPC::ApiMaximumSupportedVersion;
114  BEAST_EXPECT(
115  RPC::getAPIVersionNumber(j_object) ==
117 
118  j_object[jss::api_version] = RPC::ApiMinimumSupportedVersion - 1;
119  BEAST_EXPECT(
121  j_object[jss::api_version] = RPC::ApiMaximumSupportedVersion + 1;
122  BEAST_EXPECT(
124 
125  j_object[jss::api_version] = RPC::APIInvalidVersion;
126  BEAST_EXPECT(
128  j_object[jss::api_version] = "a";
129  BEAST_EXPECT(
131  }
132 
133  void
135  {
136  testcase("batch, all good request");
137 
138  using namespace test::jtx;
139  Env env{*this};
140 
141  auto const without_api_verion = std::string("{ ") +
142  "\"jsonrpc\": \"2.0\", "
143  "\"ripplerpc\": \"2.0\", "
144  "\"id\": 5, "
145  "\"method\": \"version\", "
146  "\"params\": {}}";
147  auto const with_api_verion = std::string("{ ") +
148  "\"jsonrpc\": \"2.0\", "
149  "\"ripplerpc\": \"2.0\", "
150  "\"id\": 6, "
151  "\"method\": \"version\", "
152  "\"params\": { "
153  "\"api_version\": " +
155  auto re = env.rpc(
156  "json2", '[' + without_api_verion + ", " + with_api_verion + ']');
157 
158  if (!BEAST_EXPECT(re.isArray()))
159  return;
160  if (!BEAST_EXPECT(re.size() == 2))
161  return;
162  BEAST_EXPECT(
163  re[0u].isMember(jss::result) &&
164  re[0u][jss::result].isMember(jss::version));
165  BEAST_EXPECT(
166  re[1u].isMember(jss::result) &&
167  re[1u][jss::result].isMember(jss::version));
168  }
169 
170  void
172  {
173  testcase("batch, with a bad request");
174 
175  using namespace test::jtx;
176  Env env{*this};
177 
178  auto const without_api_verion = std::string("{ ") +
179  "\"jsonrpc\": \"2.0\", "
180  "\"ripplerpc\": \"2.0\", "
181  "\"id\": 5, "
182  "\"method\": \"version\", "
183  "\"params\": {}}";
184  auto const with_wrong_api_verion = std::string("{ ") +
185  "\"jsonrpc\": \"2.0\", "
186  "\"ripplerpc\": \"2.0\", "
187  "\"id\": 6, "
188  "\"method\": \"version\", "
189  "\"params\": { "
190  "\"api_version\": " +
192  auto re = env.rpc(
193  "json2",
194  '[' + without_api_verion + ", " + with_wrong_api_verion + ']');
195 
196  if (!BEAST_EXPECT(re.isArray()))
197  return;
198  if (!BEAST_EXPECT(re.size() == 2))
199  return;
200  BEAST_EXPECT(
201  re[0u].isMember(jss::result) &&
202  re[0u][jss::result].isMember(jss::version));
203  BEAST_EXPECT(re[1u].isMember(jss::error));
204  }
205 
206 public:
207  void
208  run() override
209  {
213  testBatch();
214  testBatchFail();
215  }
216 };
217 
218 BEAST_DEFINE_TESTSUITE(Version, rpc, ripple);
219 
220 } // namespace ripple
ripple::Version_test::testBatch
void testBatch()
Definition: Version_test.cpp:134
std::string
STL class.
ripple::BEAST_DEFINE_TESTSUITE
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, ripple)
ripple::RPC::getAPIVersionNumber
unsigned int getAPIVersionNumber(Json::Value const &jv)
Retrieve the api version number from the json value.
Definition: RPCHelpers.cpp:833
Json::arrayValue
@ arrayValue
array value (ordered list)
Definition: json_value.h:42
ripple::Version_test::testBatchFail
void testBatchFail()
Definition: Version_test.cpp:171
ripple::RPC::APIVersionIfUnspecified
constexpr unsigned int APIVersionIfUnspecified
Definition: RPCHelpers.h:212
ripple::RPC::ApiMinimumSupportedVersion
constexpr unsigned int ApiMinimumSupportedVersion
Definition: RPCHelpers.h:213
Json::objectValue
@ objectValue
object value (collection of name/value pairs).
Definition: json_value.h:43
ripple::Version_test::testCorrectVersionNumber
void testCorrectVersionNumber()
Definition: Version_test.cpp:29
std::to_string
T to_string(T... args)
ripple::RPC::ApiMaximumSupportedVersion
constexpr unsigned int ApiMaximumSupportedVersion
Definition: RPCHelpers.h:214
ripple::Version_test
Definition: Version_test.cpp:26
ripple::RPC::APIInvalidVersion
constexpr unsigned int APIInvalidVersion
API version numbers used in later API versions.
Definition: RPCHelpers.h:211
ripple::Version_test::run
void run() override
Definition: Version_test.cpp:208
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::Version_test::testGetAPIVersionNumber
void testGetAPIVersionNumber()
Definition: Version_test.cpp:88
Json::nullValue
@ nullValue
'null' value
Definition: json_value.h:36
ripple::Version_test::testWrongVersionNumber
void testWrongVersionNumber()
Definition: Version_test.cpp:55
Json::Value
Represents a JSON value.
Definition: json_value.h:145