protobuf/src/google/protobuf/util/json_util_test.cc
Go to the documentation of this file.
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 #include <google/protobuf/util/json_util.h>
32 
33 #include <cstdint>
34 #include <list>
35 #include <string>
36 
37 #include <google/protobuf/io/zero_copy_stream.h>
38 #include <google/protobuf/io/zero_copy_stream_impl.h>
39 #include <google/protobuf/descriptor_database.h>
40 #include <google/protobuf/dynamic_message.h>
41 #include <google/protobuf/util/internal/testdata/maps.pb.h>
42 #include <google/protobuf/util/json_format.pb.h>
43 #include <google/protobuf/util/json_format_proto3.pb.h>
44 #include <google/protobuf/util/type_resolver.h>
45 #include <google/protobuf/util/type_resolver_util.h>
46 #include <gtest/gtest.h>
47 
48 namespace google {
49 namespace protobuf {
50 namespace util {
51 namespace {
52 
53 using proto3::BAR;
54 using proto3::FOO;
55 using proto3::TestAny;
56 using proto3::TestEnumValue;
57 using proto3::TestMap;
58 using proto3::TestMessage;
59 using proto3::TestOneof;
60 using proto_util_converter::testing::MapIn;
61 
62 // As functions defined in json_util.h are just thin wrappers around the
63 // JSON conversion code in //net/proto2/util/converter, in this test we
64 // only cover some very basic cases to make sure the wrappers have forwarded
65 // parameters to the underlying implementation correctly. More detailed
66 // tests are contained in the //net/proto2/util/converter directory.
67 class JsonUtilTest : public ::testing::Test {
68  protected:
69  JsonUtilTest() {}
70 
71  std::string ToJson(const Message& message, const JsonPrintOptions& options) {
74  return result;
75  }
76 
77  bool FromJson(const std::string& json, Message* message,
78  const JsonParseOptions& options) {
79  return JsonStringToMessage(json, message, options).ok();
80  }
81 
82  bool FromJson(const std::string& json, Message* message) {
83  return FromJson(json, message, JsonParseOptions());
84  }
85 
86  std::unique_ptr<TypeResolver> resolver_;
87 };
88 
89 TEST_F(JsonUtilTest, TestWhitespaces) {
90  TestMessage m;
91  m.mutable_message_value();
92 
93  JsonPrintOptions options;
94  EXPECT_EQ("{\"messageValue\":{}}", ToJson(m, options));
95  options.add_whitespace = true;
96  EXPECT_EQ(
97  "{\n"
98  " \"messageValue\": {}\n"
99  "}\n",
100  ToJson(m, options));
101 }
102 
103 TEST_F(JsonUtilTest, TestDefaultValues) {
104  TestMessage m;
105  JsonPrintOptions options;
106  EXPECT_EQ("{}", ToJson(m, options));
107  options.always_print_primitive_fields = true;
108  EXPECT_EQ(
109  "{\"boolValue\":false,"
110  "\"int32Value\":0,"
111  "\"int64Value\":\"0\","
112  "\"uint32Value\":0,"
113  "\"uint64Value\":\"0\","
114  "\"floatValue\":0,"
115  "\"doubleValue\":0,"
116  "\"stringValue\":\"\","
117  "\"bytesValue\":\"\","
118  "\"enumValue\":\"FOO\","
119  "\"repeatedBoolValue\":[],"
120  "\"repeatedInt32Value\":[],"
121  "\"repeatedInt64Value\":[],"
122  "\"repeatedUint32Value\":[],"
123  "\"repeatedUint64Value\":[],"
124  "\"repeatedFloatValue\":[],"
125  "\"repeatedDoubleValue\":[],"
126  "\"repeatedStringValue\":[],"
127  "\"repeatedBytesValue\":[],"
128  "\"repeatedEnumValue\":[],"
129  "\"repeatedMessageValue\":[]"
130  "}",
131  ToJson(m, options));
132 
133  options.always_print_primitive_fields = true;
134  m.set_string_value("i am a test string value");
135  m.set_bytes_value("i am a test bytes value");
136  EXPECT_EQ(
137  "{\"boolValue\":false,"
138  "\"int32Value\":0,"
139  "\"int64Value\":\"0\","
140  "\"uint32Value\":0,"
141  "\"uint64Value\":\"0\","
142  "\"floatValue\":0,"
143  "\"doubleValue\":0,"
144  "\"stringValue\":\"i am a test string value\","
145  "\"bytesValue\":\"aSBhbSBhIHRlc3QgYnl0ZXMgdmFsdWU=\","
146  "\"enumValue\":\"FOO\","
147  "\"repeatedBoolValue\":[],"
148  "\"repeatedInt32Value\":[],"
149  "\"repeatedInt64Value\":[],"
150  "\"repeatedUint32Value\":[],"
151  "\"repeatedUint64Value\":[],"
152  "\"repeatedFloatValue\":[],"
153  "\"repeatedDoubleValue\":[],"
154  "\"repeatedStringValue\":[],"
155  "\"repeatedBytesValue\":[],"
156  "\"repeatedEnumValue\":[],"
157  "\"repeatedMessageValue\":[]"
158  "}",
159  ToJson(m, options));
160 
161  options.preserve_proto_field_names = true;
162  m.set_string_value("i am a test string value");
163  m.set_bytes_value("i am a test bytes value");
164  EXPECT_EQ(
165  "{\"bool_value\":false,"
166  "\"int32_value\":0,"
167  "\"int64_value\":\"0\","
168  "\"uint32_value\":0,"
169  "\"uint64_value\":\"0\","
170  "\"float_value\":0,"
171  "\"double_value\":0,"
172  "\"string_value\":\"i am a test string value\","
173  "\"bytes_value\":\"aSBhbSBhIHRlc3QgYnl0ZXMgdmFsdWU=\","
174  "\"enum_value\":\"FOO\","
175  "\"repeated_bool_value\":[],"
176  "\"repeated_int32_value\":[],"
177  "\"repeated_int64_value\":[],"
178  "\"repeated_uint32_value\":[],"
179  "\"repeated_uint64_value\":[],"
180  "\"repeated_float_value\":[],"
181  "\"repeated_double_value\":[],"
182  "\"repeated_string_value\":[],"
183  "\"repeated_bytes_value\":[],"
184  "\"repeated_enum_value\":[],"
185  "\"repeated_message_value\":[]"
186  "}",
187  ToJson(m, options));
188 }
189 
190 TEST_F(JsonUtilTest, TestPreserveProtoFieldNames) {
191  TestMessage m;
192  m.mutable_message_value();
193 
194  JsonPrintOptions options;
195  options.preserve_proto_field_names = true;
196  EXPECT_EQ("{\"message_value\":{}}", ToJson(m, options));
197 }
198 
199 TEST_F(JsonUtilTest, TestAlwaysPrintEnumsAsInts) {
200  TestMessage orig;
201  orig.set_enum_value(proto3::BAR);
202  orig.add_repeated_enum_value(proto3::FOO);
203  orig.add_repeated_enum_value(proto3::BAR);
204 
205  JsonPrintOptions print_options;
206  print_options.always_print_enums_as_ints = true;
207 
208  std::string expected_json = "{\"enumValue\":1,\"repeatedEnumValue\":[0,1]}";
209  EXPECT_EQ(expected_json, ToJson(orig, print_options));
210 
211  TestMessage parsed;
212  JsonParseOptions parse_options;
213  ASSERT_TRUE(FromJson(expected_json, &parsed, parse_options));
214 
215  EXPECT_EQ(proto3::BAR, parsed.enum_value());
216  EXPECT_EQ(2, parsed.repeated_enum_value_size());
217  EXPECT_EQ(proto3::FOO, parsed.repeated_enum_value(0));
218  EXPECT_EQ(proto3::BAR, parsed.repeated_enum_value(1));
219 }
220 
221 TEST_F(JsonUtilTest, TestPrintEnumsAsIntsWithDefaultValue) {
222  TestEnumValue orig;
223  // orig.set_enum_value1(proto3::FOO)
224  orig.set_enum_value2(proto3::FOO);
225  orig.set_enum_value3(proto3::BAR);
226 
227  JsonPrintOptions print_options;
228  print_options.always_print_enums_as_ints = true;
229  print_options.always_print_primitive_fields = true;
230 
231  std::string expected_json =
232  "{\"enumValue1\":0,\"enumValue2\":0,\"enumValue3\":1}";
233  EXPECT_EQ(expected_json, ToJson(orig, print_options));
234 
235  TestEnumValue parsed;
236  JsonParseOptions parse_options;
237  ASSERT_TRUE(FromJson(expected_json, &parsed, parse_options));
238 
239  EXPECT_EQ(proto3::FOO, parsed.enum_value1());
240  EXPECT_EQ(proto3::FOO, parsed.enum_value2());
241  EXPECT_EQ(proto3::BAR, parsed.enum_value3());
242 }
243 
244 TEST_F(JsonUtilTest, TestPrintProto2EnumAsIntWithDefaultValue) {
245  protobuf_unittest::TestDefaultEnumValue orig;
246 
247  JsonPrintOptions print_options;
248  // use enum as int
249  print_options.always_print_enums_as_ints = true;
250  print_options.always_print_primitive_fields = true;
251 
252  // result should be int rather than string
253  std::string expected_json = "{\"enumValue\":2}";
254  EXPECT_EQ(expected_json, ToJson(orig, print_options));
255 
256  protobuf_unittest::TestDefaultEnumValue parsed;
257  JsonParseOptions parse_options;
258  ASSERT_TRUE(FromJson(expected_json, &parsed, parse_options));
259 
260  EXPECT_EQ(protobuf_unittest::DEFAULT, parsed.enum_value());
261 }
262 
263 TEST_F(JsonUtilTest, ParseMessage) {
264  // Some random message but good enough to verify that the parsing wrapper
265  // functions are working properly.
267  "{\n"
268  " \"int32Value\": 1024,\n"
269  " \"repeatedInt32Value\": [1, 2],\n"
270  " \"messageValue\": {\n"
271  " \"value\": 2048\n"
272  " },\n"
273  " \"repeatedMessageValue\": [\n"
274  " {\"value\": 40}, {\"value\": 96}\n"
275  " ]\n"
276  "}\n";
277  JsonParseOptions options;
278  TestMessage m;
279  ASSERT_TRUE(FromJson(input, &m, options));
280  EXPECT_EQ(1024, m.int32_value());
281  ASSERT_EQ(2, m.repeated_int32_value_size());
282  EXPECT_EQ(1, m.repeated_int32_value(0));
283  EXPECT_EQ(2, m.repeated_int32_value(1));
284  EXPECT_EQ(2048, m.message_value().value());
285  ASSERT_EQ(2, m.repeated_message_value_size());
286  EXPECT_EQ(40, m.repeated_message_value(0).value());
287  EXPECT_EQ(96, m.repeated_message_value(1).value());
288 }
289 
290 TEST_F(JsonUtilTest, ParseMap) {
291  TestMap message;
292  (*message.mutable_string_map())["hello"] = 1234;
293  JsonPrintOptions print_options;
294  JsonParseOptions parse_options;
295  EXPECT_EQ("{\"stringMap\":{\"hello\":1234}}", ToJson(message, print_options));
296  TestMap other;
297  ASSERT_TRUE(FromJson(ToJson(message, print_options), &other, parse_options));
298  EXPECT_EQ(message.DebugString(), other.DebugString());
299 }
300 
301 TEST_F(JsonUtilTest, ParsePrimitiveMapIn) {
302  MapIn message;
303  JsonPrintOptions print_options;
304  print_options.always_print_primitive_fields = true;
305  JsonParseOptions parse_options;
306  EXPECT_EQ("{\"other\":\"\",\"things\":[],\"mapInput\":{},\"mapAny\":{}}",
307  ToJson(message, print_options));
308  MapIn other;
309  ASSERT_TRUE(FromJson(ToJson(message, print_options), &other, parse_options));
310  EXPECT_EQ(message.DebugString(), other.DebugString());
311 }
312 
313 TEST_F(JsonUtilTest, PrintPrimitiveOneof) {
314  TestOneof message;
315  JsonPrintOptions options;
316  options.always_print_primitive_fields = true;
317  message.mutable_oneof_message_value();
318  EXPECT_EQ("{\"oneofMessageValue\":{\"value\":0}}", ToJson(message, options));
319 
320  message.set_oneof_int32_value(1);
321  EXPECT_EQ("{\"oneofInt32Value\":1}", ToJson(message, options));
322 }
323 
324 TEST_F(JsonUtilTest, TestParseIgnoreUnknownFields) {
325  TestMessage m;
326  JsonParseOptions options;
327  options.ignore_unknown_fields = true;
328  EXPECT_TRUE(FromJson("{\"unknownName\":0}", &m, options));
329 }
330 
331 TEST_F(JsonUtilTest, TestParseErrors) {
332  TestMessage m;
333  JsonParseOptions options;
334  // Parsing should fail if the field name can not be recognized.
335  EXPECT_FALSE(FromJson("{\"unknownName\":0}", &m, options));
336  // Parsing should fail if the value is invalid.
337  EXPECT_FALSE(FromJson("{\"int32Value\":2147483648}", &m, options));
338 }
339 
340 TEST_F(JsonUtilTest, TestDynamicMessage) {
341  // Some random message but good enough to test the wrapper functions.
343  "{\n"
344  " \"int32Value\": 1024,\n"
345  " \"repeatedInt32Value\": [1, 2],\n"
346  " \"messageValue\": {\n"
347  " \"value\": 2048\n"
348  " },\n"
349  " \"repeatedMessageValue\": [\n"
350  " {\"value\": 40}, {\"value\": 96}\n"
351  " ]\n"
352  "}\n";
353 
354  // Create a new DescriptorPool with the same protos as the generated one.
357  // A dynamic version of the test proto.
358  DynamicMessageFactory factory;
359  std::unique_ptr<Message> message(
360  factory.GetPrototype(pool.FindMessageTypeByName("proto3.TestMessage"))
361  ->New());
362  EXPECT_TRUE(FromJson(input, message.get()));
363 
364  // Convert to generated message for easy inspection.
365  TestMessage generated;
366  EXPECT_TRUE(generated.ParseFromString(message->SerializeAsString()));
367  EXPECT_EQ(1024, generated.int32_value());
368  ASSERT_EQ(2, generated.repeated_int32_value_size());
369  EXPECT_EQ(1, generated.repeated_int32_value(0));
370  EXPECT_EQ(2, generated.repeated_int32_value(1));
371  EXPECT_EQ(2048, generated.message_value().value());
372  ASSERT_EQ(2, generated.repeated_message_value_size());
373  EXPECT_EQ(40, generated.repeated_message_value(0).value());
374  EXPECT_EQ(96, generated.repeated_message_value(1).value());
375 
377  EXPECT_EQ(ToJson(generated, options), ToJson(*message, options));
378 }
379 
380 TEST_F(JsonUtilTest, TestParsingUnknownAnyFields) {
382  "{\n"
383  " \"value\": {\n"
384  " \"@type\": \"type.googleapis.com/proto3.TestMessage\",\n"
385  " \"unknown_field\": \"UNKNOWN_VALUE\",\n"
386  " \"string_value\": \"expected_value\"\n"
387  " }\n"
388  "}";
389 
390  TestAny m;
391  JsonParseOptions options;
392  EXPECT_FALSE(FromJson(input, &m, options));
393 
394  options.ignore_unknown_fields = true;
395  EXPECT_TRUE(FromJson(input, &m, options));
396 
397  TestMessage t;
398  EXPECT_TRUE(m.value().UnpackTo(&t));
399  EXPECT_EQ("expected_value", t.string_value());
400 }
401 
402 TEST_F(JsonUtilTest, TestParsingUnknownEnumsProto2) {
404  "{\n"
405  " \"a\": \"UNKNOWN_VALUE\"\n"
406  "}";
407  protobuf_unittest::TestNumbers m;
408  JsonParseOptions options;
409  EXPECT_FALSE(FromJson(input, &m, options));
410 
411  options.ignore_unknown_fields = true;
412  EXPECT_TRUE(FromJson(input, &m, options));
413  EXPECT_FALSE(m.has_a());
414 }
415 
416 TEST_F(JsonUtilTest, TestParsingUnknownEnumsProto3) {
417  TestMessage m;
418  {
419  JsonParseOptions options;
420  ASSERT_FALSE(options.ignore_unknown_fields);
422  "{\n"
423  " \"enum_value\":\"UNKNOWN_VALUE\"\n"
424  "}";
425  m.set_enum_value(proto3::BAR);
426  EXPECT_FALSE(FromJson(input, &m, options));
427  ASSERT_EQ(proto3::BAR, m.enum_value()); // Keep previous value
428 
429  options.ignore_unknown_fields = true;
430  EXPECT_TRUE(FromJson(input, &m, options));
431  EXPECT_EQ(0, m.enum_value()); // Unknown enum value must be decoded as 0
432  }
433  // Integer values are read as usual
434  {
435  JsonParseOptions options;
437  "{\n"
438  " \"enum_value\":12345\n"
439  "}";
440  m.set_enum_value(proto3::BAR);
441  EXPECT_TRUE(FromJson(input, &m, options));
442  ASSERT_EQ(12345, m.enum_value());
443 
444  options.ignore_unknown_fields = true;
445  EXPECT_TRUE(FromJson(input, &m, options));
446  EXPECT_EQ(12345, m.enum_value());
447  }
448 
449  // Trying to pass an object as an enum field value is always treated as an
450  // error
451  {
452  JsonParseOptions options;
454  "{\n"
455  " \"enum_value\":{}\n"
456  "}";
457  options.ignore_unknown_fields = true;
458  EXPECT_FALSE(FromJson(input, &m, options));
459  options.ignore_unknown_fields = false;
460  EXPECT_FALSE(FromJson(input, &m, options));
461  }
462  // Trying to pass an array as an enum field value is always treated as an
463  // error
464  {
465  JsonParseOptions options;
467  "{\n"
468  " \"enum_value\":[]\n"
469  "}";
470  EXPECT_FALSE(FromJson(input, &m, options));
471  options.ignore_unknown_fields = true;
472  EXPECT_FALSE(FromJson(input, &m, options));
473  }
474 }
475 
476 TEST_F(JsonUtilTest, TestParsingEnumIgnoreCase) {
477  TestMessage m;
478  {
479  JsonParseOptions options;
481  "{\n"
482  " \"enum_value\":\"bar\"\n"
483  "}";
484  m.set_enum_value(proto3::FOO);
485  EXPECT_FALSE(FromJson(input, &m, options));
486  // Default behavior is case-sensitive, so keep previous value.
487  ASSERT_EQ(proto3::FOO, m.enum_value());
488  }
489  {
490  JsonParseOptions options;
491  options.case_insensitive_enum_parsing = false;
493  "{\n"
494  " \"enum_value\":\"bar\"\n"
495  "}";
496  m.set_enum_value(proto3::FOO);
497  EXPECT_FALSE(FromJson(input, &m, options));
498  ASSERT_EQ(proto3::FOO, m.enum_value()); // Keep previous value
499  }
500  {
501  JsonParseOptions options;
502  options.case_insensitive_enum_parsing = true;
504  "{\n"
505  " \"enum_value\":\"bar\"\n"
506  "}";
507  m.set_enum_value(proto3::FOO);
508  EXPECT_TRUE(FromJson(input, &m, options));
509  ASSERT_EQ(proto3::BAR, m.enum_value());
510  }
511 }
512 
513 typedef std::pair<char*, int> Segment;
514 // A ZeroCopyOutputStream that writes to multiple buffers.
515 class SegmentedZeroCopyOutputStream : public io::ZeroCopyOutputStream {
516  public:
517  explicit SegmentedZeroCopyOutputStream(std::list<Segment> segments)
518  : segments_(segments),
519  last_segment_(static_cast<char*>(NULL), 0),
520  byte_count_(0) {}
521 
522  bool Next(void** buffer, int* length) override {
523  if (segments_.empty()) {
524  return false;
525  }
526  last_segment_ = segments_.front();
527  segments_.pop_front();
528  *buffer = last_segment_.first;
529  *length = last_segment_.second;
530  byte_count_ += *length;
531  return true;
532  }
533 
534  void BackUp(int length) override {
535  GOOGLE_CHECK(length <= last_segment_.second);
536  segments_.push_front(
537  Segment(last_segment_.first + last_segment_.second - length, length));
538  last_segment_ = Segment(last_segment_.first, last_segment_.second - length);
539  byte_count_ -= length;
540  }
541 
542  int64_t ByteCount() const override { return byte_count_; }
543 
544  private:
545  std::list<Segment> segments_;
546  Segment last_segment_;
548 };
549 
550 // This test splits the output buffer and also the input data into multiple
551 // segments and checks that the implementation of ZeroCopyStreamByteSink
552 // handles all possible cases correctly.
553 TEST(ZeroCopyStreamByteSinkTest, TestAllInputOutputPatterns) {
554  static const int kOutputBufferLength = 10;
555  // An exhaustive test takes too long, skip some combinations to make the test
556  // run faster.
557  static const int kSkippedPatternCount = 7;
558 
559  char buffer[kOutputBufferLength];
560  for (int split_pattern = 0; split_pattern < (1 << (kOutputBufferLength - 1));
561  split_pattern += kSkippedPatternCount) {
562  // Split the buffer into small segments according to the split_pattern.
563  std::list<Segment> segments;
564  int segment_start = 0;
565  for (int i = 0; i < kOutputBufferLength - 1; ++i) {
566  if (split_pattern & (1 << i)) {
567  segments.push_back(
568  Segment(buffer + segment_start, i - segment_start + 1));
569  segment_start = i + 1;
570  }
571  }
572  segments.push_back(
573  Segment(buffer + segment_start, kOutputBufferLength - segment_start));
574 
575  // Write exactly 10 bytes through the ByteSink.
576  std::string input_data = "0123456789";
577  for (int input_pattern = 0; input_pattern < (1 << (input_data.size() - 1));
578  input_pattern += kSkippedPatternCount) {
579  memset(buffer, 0, sizeof(buffer));
580  {
581  SegmentedZeroCopyOutputStream output_stream(segments);
582  internal::ZeroCopyStreamByteSink byte_sink(&output_stream);
583  int start = 0;
584  for (int j = 0; j < input_data.length() - 1; ++j) {
585  if (input_pattern & (1 << j)) {
586  byte_sink.Append(&input_data[start], j - start + 1);
587  start = j + 1;
588  }
589  }
590  byte_sink.Append(&input_data[start], input_data.length() - start);
591  }
592  EXPECT_EQ(input_data, std::string(buffer, input_data.length()));
593  }
594 
595  // Write only 9 bytes through the ByteSink.
596  input_data = "012345678";
597  for (int input_pattern = 0; input_pattern < (1 << (input_data.size() - 1));
598  input_pattern += kSkippedPatternCount) {
599  memset(buffer, 0, sizeof(buffer));
600  {
601  SegmentedZeroCopyOutputStream output_stream(segments);
602  internal::ZeroCopyStreamByteSink byte_sink(&output_stream);
603  int start = 0;
604  for (int j = 0; j < input_data.length() - 1; ++j) {
605  if (input_pattern & (1 << j)) {
606  byte_sink.Append(&input_data[start], j - start + 1);
607  start = j + 1;
608  }
609  }
610  byte_sink.Append(&input_data[start], input_data.length() - start);
611  }
612  EXPECT_EQ(input_data, std::string(buffer, input_data.length()));
613  EXPECT_EQ(0, buffer[input_data.length()]);
614  }
615 
616  // Write 11 bytes through the ByteSink. The extra byte will just
617  // be ignored.
618  input_data = "0123456789A";
619  for (int input_pattern = 0; input_pattern < (1 << (input_data.size() - 1));
620  input_pattern += kSkippedPatternCount) {
621  memset(buffer, 0, sizeof(buffer));
622  {
623  SegmentedZeroCopyOutputStream output_stream(segments);
624  internal::ZeroCopyStreamByteSink byte_sink(&output_stream);
625  int start = 0;
626  for (int j = 0; j < input_data.length() - 1; ++j) {
627  if (input_pattern & (1 << j)) {
628  byte_sink.Append(&input_data[start], j - start + 1);
629  start = j + 1;
630  }
631  }
632  byte_sink.Append(&input_data[start], input_data.length() - start);
633  }
634  EXPECT_EQ(input_data.substr(0, kOutputBufferLength),
635  std::string(buffer, kOutputBufferLength));
636  }
637  }
638 }
639 
640 TEST_F(JsonUtilTest, TestWrongJsonInput) {
641  const char json[] = "{\"unknown_field\":\"some_value\"}";
642  io::ArrayInputStream input_stream(json, strlen(json));
643  char proto_buffer[10000];
644  io::ArrayOutputStream output_stream(proto_buffer, sizeof(proto_buffer));
645  std::string message_type = "type.googleapis.com/proto3.TestMessage";
646  TypeResolver* resolver = NewTypeResolverForDescriptorPool(
647  "type.googleapis.com", DescriptorPool::generated_pool());
648 
649  auto result_status = util::JsonToBinaryStream(resolver, message_type,
650  &input_stream, &output_stream);
651 
652  delete resolver;
653 
654  EXPECT_FALSE(result_status.ok());
655  EXPECT_TRUE(util::IsInvalidArgument(result_status));
656 }
657 
658 TEST_F(JsonUtilTest, HtmlEscape) {
659  TestMessage m;
660  m.set_string_value("</script>");
661  JsonPrintOptions options;
662  EXPECT_EQ("{\"stringValue\":\"\\u003c/script\\u003e\"}", ToJson(m, options));
663 }
664 
665 } // namespace
666 } // namespace util
667 } // namespace protobuf
668 } // namespace google
google::protobuf::util::JsonOptions
JsonPrintOptions JsonOptions
Definition: third_party/bloaty/third_party/protobuf/src/google/protobuf/util/json_util.h:90
EXPECT_FALSE
#define EXPECT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1970
grpc::protobuf::DescriptorPoolDatabase
GRPC_CUSTOM_DESCRIPTORPOOLDATABASE DescriptorPoolDatabase
Definition: config_grpc_cli.h:56
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
google::protobuf.internal::ParseMap
bool ParseMap(io::CodedInputStream *input, void *map_field)
Definition: bloaty/third_party/protobuf/src/google/protobuf/generated_message_table_driven.h:224
absl::str_format_internal::LengthMod::j
@ j
memset
return memset(p, 0, total)
google::protobuf::util::TEST
TEST(DelimitedMessageUtilTest, DelimitedMessages)
Definition: bloaty/third_party/protobuf/src/google/protobuf/util/delimited_message_util_test.cc:47
phone_pb2.message_type
message_type
Definition: phone_pb2.py:200
options
double_dict options[]
Definition: capstone_test.c:55
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
google::protobuf
Definition: bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:12
grpc::protobuf::DynamicMessageFactory
GRPC_CUSTOM_DYNAMICMESSAGEFACTORY DynamicMessageFactory
Definition: config_grpc_cli.h:54
google::protobuf::util::JsonToBinaryStream
util::Status JsonToBinaryStream(TypeResolver *resolver, const std::string &type_url, io::ZeroCopyInputStream *json_input, io::ZeroCopyOutputStream *binary_output, const JsonParseOptions &options)
Definition: third_party/bloaty/third_party/protobuf/src/google/protobuf/util/json_util.cc:175
grpc::protobuf::io::ZeroCopyOutputStream
GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM ZeroCopyOutputStream
Definition: include/grpcpp/impl/codegen/config_protobuf.h:100
google::protobuf::util::NewTypeResolverForDescriptorPool
TypeResolver * NewTypeResolverForDescriptorPool(const std::string &url_prefix, const DescriptorPool *pool)
Definition: bloaty/third_party/protobuf/src/google/protobuf/util/type_resolver_util.cc:365
absl::base_internal::Next
static AllocList * Next(int i, AllocList *prev, LowLevelAlloc::Arena *arena)
Definition: abseil-cpp/absl/base/internal/low_level_alloc.cc:453
message
char * message
Definition: libuv/docs/code/tty-gravity/main.c:12
testing::Test
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:402
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
segments_
std::list< Segment > segments_
Definition: protobuf/src/google/protobuf/util/json_util_test.cc:545
start
static uint64_t start
Definition: benchmark-pound.c:74
byte_count_
int64_t byte_count_
Definition: protobuf/src/google/protobuf/util/json_util_test.cc:547
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
google::protobuf.reflection.ParseMessage
def ParseMessage(descriptor, byte_str)
Definition: third_party/bloaty/third_party/protobuf/python/google/protobuf/reflection.py:62
database
database
Definition: benchmark/.ycm_extra_conf.py:35
absl::IsInvalidArgument
bool IsInvalidArgument(const Status &status)
Definition: third_party/abseil-cpp/absl/status/status.cc:415
buffer
char buffer[1024]
Definition: libuv/docs/code/idle-compute/main.c:8
resolver_
std::unique_ptr< TypeResolver > resolver_
Definition: protobuf/src/google/protobuf/util/json_util_test.cc:86
google::protobuf::util::Status::ok
bool ok() const
Definition: third_party/bloaty/third_party/protobuf/src/google/protobuf/stubs/status.h:87
absl::str_format_internal::LengthMod::t
@ t
google::protobuf::TEST_F
TEST_F(DynamicMessageTest, Descriptor)
Definition: bloaty/third_party/protobuf/src/google/protobuf/dynamic_message_unittest.cc:126
google::protobuf::DescriptorPool::generated_pool
static const DescriptorPool * generated_pool()
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.cc:1326
last_segment_
Segment last_segment_
Definition: protobuf/src/google/protobuf/util/json_util_test.cc:546
ASSERT_TRUE
#define ASSERT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1973
ASSERT_FALSE
#define ASSERT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1976
GOOGLE_CHECK
#define GOOGLE_CHECK(EXPRESSION)
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/logging.h:153
input
std::string input
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc:197
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
pool
InternalDescriptorPool * pool
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:807
google::protobuf::util::MessageToJsonString
util::Status MessageToJsonString(const Message &message, std::string *output, const JsonOptions &options)
Definition: third_party/bloaty/third_party/protobuf/src/google/protobuf/util/json_util.cc:242
google::protobuf::util::JsonStringToMessage
util::Status JsonStringToMessage(StringPiece input, Message *message, const JsonParseOptions &options)
Definition: third_party/bloaty/third_party/protobuf/src/google/protobuf/util/json_util.cc:258
length
std::size_t length
Definition: abseil-cpp/absl/time/internal/test_util.cc:57
regress.m
m
Definition: regress/regress.py:25
DescriptorPool
Definition: bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:110
google
Definition: bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:11
Message
Definition: protobuf/php/ext/google/protobuf/message.c:53
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
GOOGLE_CHECK_OK
#define GOOGLE_CHECK_OK(A)
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/logging.h:155
ASSERT_EQ
#define ASSERT_EQ(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2056


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:12