json_test.cc 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. /*
  2. *
  3. * Copyright 2015-2016 gRPC authors.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. #include "src/core/lib/json/json.h"
  19. #include <string.h>
  20. #include <gmock/gmock.h>
  21. #include <gtest/gtest.h>
  22. #include <grpc/support/alloc.h>
  23. #include <grpc/support/log.h>
  24. #include <grpc/support/string_util.h>
  25. #include "src/core/lib/gpr/string.h"
  26. #include "src/core/lib/gpr/useful.h"
  27. #include "test/core/util/test_config.h"
  28. namespace grpc_core {
  29. void ValidateValue(const Json& actual, const Json& expected);
  30. void ValidateObject(const Json::Object& actual, const Json::Object& expected) {
  31. ASSERT_EQ(actual.size(), expected.size());
  32. auto actual_it = actual.begin();
  33. for (const auto& p : expected) {
  34. EXPECT_EQ(actual_it->first, p.first);
  35. ValidateValue(actual_it->second, p.second);
  36. ++actual_it;
  37. }
  38. }
  39. void ValidateArray(const Json::Array& actual, const Json::Array& expected) {
  40. ASSERT_EQ(actual.size(), expected.size());
  41. for (size_t i = 0; i < expected.size(); ++i) {
  42. ValidateValue(actual[i], expected[i]);
  43. }
  44. }
  45. void ValidateValue(const Json& actual, const Json& expected) {
  46. ASSERT_EQ(actual.type(), expected.type());
  47. switch (expected.type()) {
  48. case Json::Type::JSON_NULL:
  49. case Json::Type::JSON_TRUE:
  50. case Json::Type::JSON_FALSE:
  51. break;
  52. case Json::Type::STRING:
  53. case Json::Type::NUMBER:
  54. EXPECT_EQ(actual.string_value(), expected.string_value());
  55. break;
  56. case Json::Type::OBJECT:
  57. ValidateObject(actual.object_value(), expected.object_value());
  58. break;
  59. case Json::Type::ARRAY:
  60. ValidateArray(actual.array_value(), expected.array_value());
  61. break;
  62. }
  63. }
  64. void RunSuccessTest(const char* input, const Json& expected,
  65. const char* expected_output) {
  66. gpr_log(GPR_INFO, "parsing string \"%s\" - should succeed", input);
  67. grpc_error_handle error = GRPC_ERROR_NONE;
  68. Json json = Json::Parse(input, &error);
  69. ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_std_string(error);
  70. ValidateValue(json, expected);
  71. std::string output = json.Dump();
  72. EXPECT_EQ(output, expected_output);
  73. }
  74. TEST(Json, Whitespace) {
  75. RunSuccessTest(" 0 ", 0, "0");
  76. RunSuccessTest(" 1 ", 1, "1");
  77. RunSuccessTest(" \" \" ", " ", "\" \"");
  78. RunSuccessTest(" \"a\" ", "a", "\"a\"");
  79. RunSuccessTest(" true ", true, "true");
  80. }
  81. TEST(Json, Utf16) {
  82. RunSuccessTest("\"\\u0020\\\\\\u0010\\u000a\\u000D\"", " \\\u0010\n\r",
  83. "\" \\\\\\u0010\\n\\r\"");
  84. }
  85. TEST(Json, Utf8) {
  86. RunSuccessTest("\"ßâñć௵⇒\"", "ßâñć௵⇒",
  87. "\"\\u00df\\u00e2\\u00f1\\u0107\\u0bf5\\u21d2\"");
  88. RunSuccessTest("\"\\u00df\\u00e2\\u00f1\\u0107\\u0bf5\\u21d2\"", "ßâñć௵⇒",
  89. "\"\\u00df\\u00e2\\u00f1\\u0107\\u0bf5\\u21d2\"");
  90. // Testing UTF-8 character "𝄞", U+11D1E.
  91. RunSuccessTest("\"\xf0\x9d\x84\x9e\"", "\xf0\x9d\x84\x9e",
  92. "\"\\ud834\\udd1e\"");
  93. RunSuccessTest("\"\\ud834\\udd1e\"", "\xf0\x9d\x84\x9e",
  94. "\"\\ud834\\udd1e\"");
  95. RunSuccessTest("{\"\\ud834\\udd1e\":0}",
  96. Json::Object{{"\xf0\x9d\x84\x9e", 0}},
  97. "{\"\\ud834\\udd1e\":0}");
  98. }
  99. TEST(Json, NestedEmptyContainers) {
  100. RunSuccessTest(" [ [ ] , { } , [ ] ] ",
  101. Json::Array{
  102. Json::Array(),
  103. Json::Object(),
  104. Json::Array(),
  105. },
  106. "[[],{},[]]");
  107. }
  108. TEST(Json, EscapesAndControlCharactersInKeyStrings) {
  109. RunSuccessTest(" { \"\\u007f\x7f\\n\\r\\\"\\f\\b\\\\a , b\": 1, \"\": 0 } ",
  110. Json::Object{
  111. {"\u007f\u007f\n\r\"\f\b\\a , b", 1},
  112. {"", 0},
  113. },
  114. "{\"\":0,\"\\u007f\\u007f\\n\\r\\\"\\f\\b\\\\a , b\":1}");
  115. }
  116. TEST(Json, WriterCutsOffInvalidUtf8) {
  117. EXPECT_EQ(Json("abc\xf0\x9d\x24").Dump(), "\"abc\"");
  118. EXPECT_EQ(Json("\xff").Dump(), "\"\"");
  119. }
  120. TEST(Json, ValidNumbers) {
  121. RunSuccessTest("[0, 42 , 0.0123, 123.456]",
  122. Json::Array{
  123. 0,
  124. 42,
  125. Json("0.0123", /*is_number=*/true),
  126. Json("123.456", /*is_number=*/true),
  127. },
  128. "[0,42,0.0123,123.456]");
  129. RunSuccessTest("[1e4,-53.235e-31, 0.3e+3]",
  130. Json::Array{
  131. Json("1e4", /*is_number=*/true),
  132. Json("-53.235e-31", /*is_number=*/true),
  133. Json("0.3e+3", /*is_number=*/true),
  134. },
  135. "[1e4,-53.235e-31,0.3e+3]");
  136. }
  137. TEST(Json, Keywords) {
  138. RunSuccessTest("[true, false, null]",
  139. Json::Array{
  140. Json(true),
  141. Json(false),
  142. Json(),
  143. },
  144. "[true,false,null]");
  145. }
  146. void RunParseFailureTest(const char* input) {
  147. gpr_log(GPR_INFO, "parsing string \"%s\" - should fail", input);
  148. grpc_error_handle error = GRPC_ERROR_NONE;
  149. Json json = Json::Parse(input, &error);
  150. gpr_log(GPR_INFO, "error: %s", grpc_error_std_string(error).c_str());
  151. EXPECT_NE(error, GRPC_ERROR_NONE);
  152. GRPC_ERROR_UNREF(error);
  153. }
  154. TEST(Json, InvalidInput) {
  155. RunParseFailureTest("\\");
  156. RunParseFailureTest("nu ll");
  157. RunParseFailureTest("{\"foo\": bar}");
  158. RunParseFailureTest("{\"foo\": bar\"x\"}");
  159. RunParseFailureTest("fals");
  160. RunParseFailureTest("0,0 ");
  161. RunParseFailureTest("\"foo\",[]");
  162. }
  163. TEST(Json, UnterminatedString) { RunParseFailureTest("\"\\x"); }
  164. TEST(Json, InvalidUtf16) {
  165. RunParseFailureTest("\"\\u123x");
  166. RunParseFailureTest("{\"\\u123x");
  167. }
  168. TEST(Json, ImbalancedSurrogatePairs) {
  169. RunParseFailureTest("\"\\ud834f");
  170. RunParseFailureTest("{\"\\ud834f\":0}");
  171. RunParseFailureTest("\"\\ud834\\n");
  172. RunParseFailureTest("{\"\\ud834\\n\":0}");
  173. RunParseFailureTest("\"\\udd1ef");
  174. RunParseFailureTest("{\"\\udd1ef\":0}");
  175. RunParseFailureTest("\"\\ud834\\ud834\"");
  176. RunParseFailureTest("{\"\\ud834\\ud834\"\":0}");
  177. RunParseFailureTest("\"\\ud834\\u1234\"");
  178. RunParseFailureTest("{\"\\ud834\\u1234\"\":0}");
  179. RunParseFailureTest("\"\\ud834]\"");
  180. RunParseFailureTest("{\"\\ud834]\"\":0}");
  181. RunParseFailureTest("\"\\ud834 \"");
  182. RunParseFailureTest("{\"\\ud834 \"\":0}");
  183. RunParseFailureTest("\"\\ud834\\\\\"");
  184. RunParseFailureTest("{\"\\ud834\\\\\"\":0}");
  185. }
  186. TEST(Json, EmbeddedInvalidWhitechars) {
  187. RunParseFailureTest("\"\n\"");
  188. RunParseFailureTest("\"\t\"");
  189. }
  190. TEST(Json, EmptyString) { RunParseFailureTest(""); }
  191. TEST(Json, ExtraCharsAtEndOfParsing) {
  192. RunParseFailureTest("{},");
  193. RunParseFailureTest("{}x");
  194. }
  195. TEST(Json, ImbalancedContainers) {
  196. RunParseFailureTest("{}}");
  197. RunParseFailureTest("[]]");
  198. RunParseFailureTest("{{}");
  199. RunParseFailureTest("[[]");
  200. RunParseFailureTest("[}");
  201. RunParseFailureTest("{]");
  202. }
  203. TEST(Json, BadContainers) {
  204. RunParseFailureTest("{x}");
  205. RunParseFailureTest("{x=0,y}");
  206. }
  207. TEST(Json, DuplicateObjectKeys) { RunParseFailureTest("{\"x\": 1, \"x\": 1}"); }
  208. TEST(Json, TrailingComma) {
  209. RunParseFailureTest("{,}");
  210. RunParseFailureTest("[1,2,3,4,]");
  211. RunParseFailureTest("{\"a\": 1, }");
  212. }
  213. TEST(Json, KeySyntaxInArray) { RunParseFailureTest("[\"x\":0]"); }
  214. TEST(Json, InvalidNumbers) {
  215. RunParseFailureTest("1.");
  216. RunParseFailureTest("1e");
  217. RunParseFailureTest(".12");
  218. RunParseFailureTest("1.x");
  219. RunParseFailureTest("1.12x");
  220. RunParseFailureTest("1ex");
  221. RunParseFailureTest("1e12x");
  222. RunParseFailureTest(".12x");
  223. RunParseFailureTest("000");
  224. };
  225. TEST(Json, Equality) {
  226. // Null.
  227. EXPECT_EQ(Json(), Json());
  228. // Numbers.
  229. EXPECT_EQ(Json(1), Json(1));
  230. EXPECT_NE(Json(1), Json(2));
  231. EXPECT_EQ(Json(1), Json("1", /*is_number=*/true));
  232. EXPECT_EQ(Json("-5e5", /*is_number=*/true), Json("-5e5", /*is_number=*/true));
  233. // Booleans.
  234. EXPECT_EQ(Json(true), Json(true));
  235. EXPECT_EQ(Json(false), Json(false));
  236. EXPECT_NE(Json(true), Json(false));
  237. // Strings.
  238. EXPECT_EQ(Json("foo"), Json("foo"));
  239. EXPECT_NE(Json("foo"), Json("bar"));
  240. // Arrays.
  241. EXPECT_EQ(Json(Json::Array{"foo"}), Json(Json::Array{"foo"}));
  242. EXPECT_NE(Json(Json::Array{"foo"}), Json(Json::Array{"bar"}));
  243. // Objects.
  244. EXPECT_EQ(Json(Json::Object{{"foo", 1}}), Json(Json::Object{{"foo", 1}}));
  245. EXPECT_NE(Json(Json::Object{{"foo", 1}}), Json(Json::Object{{"foo", 2}}));
  246. EXPECT_NE(Json(Json::Object{{"foo", 1}}), Json(Json::Object{{"bar", 1}}));
  247. // Differing types.
  248. EXPECT_NE(Json(1), Json("foo"));
  249. EXPECT_NE(Json(1), Json(true));
  250. EXPECT_NE(Json(1), Json(Json::Array{}));
  251. EXPECT_NE(Json(1), Json(Json::Object{}));
  252. EXPECT_NE(Json(1), Json());
  253. }
  254. } // namespace grpc_core
  255. int main(int argc, char** argv) {
  256. grpc::testing::TestEnvironment env(argc, argv);
  257. ::testing::InitGoogleTest(&argc, argv);
  258. return RUN_ALL_TESTS();
  259. }