41 #include <google/protobuf/util/internal/testdata/anys.pb.h>
42 #include <google/protobuf/util/internal/testdata/books.pb.h>
43 #include <google/protobuf/util/internal/testdata/field_mask.pb.h>
44 #include <google/protobuf/util/internal/testdata/maps.pb.h>
45 #include <google/protobuf/util/internal/testdata/proto3.pb.h>
46 #include <google/protobuf/util/internal/testdata/struct.pb.h>
47 #include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
60 using io::ArrayInputStream;
61 using io::CodedInputStream;
62 using proto_util_converter::testing::AnyM;
63 using proto_util_converter::testing::AnyOut;
64 using proto_util_converter::testing::Author;
65 using proto_util_converter::testing::BadAuthor;
66 using proto_util_converter::testing::BadNestedBook;
67 using proto_util_converter::testing::Book;
68 using proto_util_converter::testing::Book_Label;
69 using proto_util_converter::testing::Cyclic;
70 using proto_util_converter::testing::FieldMaskTest;
71 using proto_util_converter::testing::MapOut;
72 using proto_util_converter::testing::MapOutWireFormat;
73 using proto_util_converter::testing::NestedBook;
74 using proto_util_converter::testing::NestedFieldMask;
75 using proto_util_converter::testing::PackedPrimitive;
76 using proto_util_converter::testing::Primitive;
77 using proto_util_converter::testing::Proto3Message;
78 using proto_util_converter::testing::StructType;
79 using proto_util_converter::testing::TimestampDuration;
113 std::ostringstream oss;
119 std::unique_ptr<ProtoStreamObjectSource> os(
124 os->set_preserve_proto_field_names(
true);
125 os->set_max_recursion_depth(64);
126 return os->WriteTo(&
mock_);
194 primitive.add_rep_fix32(3201);
195 primitive.add_rep_fix32(0);
196 primitive.add_rep_fix32(3202);
197 primitive.add_rep_u32(3203);
198 primitive.add_rep_u32(0);
199 primitive.add_rep_i32(0);
200 primitive.add_rep_i32(3204);
201 primitive.add_rep_i32(3205);
202 primitive.add_rep_sf32(3206);
203 primitive.add_rep_sf32(0);
204 primitive.add_rep_s32(0);
205 primitive.add_rep_s32(3207);
206 primitive.add_rep_s32(3208);
207 primitive.add_rep_fix64(6401L);
208 primitive.add_rep_fix64(0L);
209 primitive.add_rep_u64(0L);
210 primitive.add_rep_u64(6402L);
211 primitive.add_rep_u64(6403L);
212 primitive.add_rep_i64(6404L);
213 primitive.add_rep_i64(0L);
214 primitive.add_rep_sf64(0L);
215 primitive.add_rep_sf64(6405L);
216 primitive.add_rep_sf64(6406L);
217 primitive.add_rep_s64(6407L);
218 primitive.add_rep_s64(0L);
219 primitive.add_rep_float(0.0
f);
220 primitive.add_rep_float(32.1
f);
221 primitive.add_rep_float(32.2
f);
222 primitive.add_rep_double(64.1L);
223 primitive.add_rep_double(0.0);
224 primitive.add_rep_bool(
true);
225 primitive.add_rep_bool(
false);
232 PackedPrimitive primitive;
233 primitive.add_rep_fix32(3201);
234 primitive.add_rep_fix32(0);
235 primitive.add_rep_fix32(3202);
236 primitive.add_rep_u32(3203);
237 primitive.add_rep_u32(0);
238 primitive.add_rep_i32(0);
239 primitive.add_rep_i32(3204);
240 primitive.add_rep_i32(3205);
241 primitive.add_rep_sf32(3206);
242 primitive.add_rep_sf32(0);
243 primitive.add_rep_s32(0);
244 primitive.add_rep_s32(3207);
245 primitive.add_rep_s32(3208);
246 primitive.add_rep_fix64(6401L);
247 primitive.add_rep_fix64(0L);
248 primitive.add_rep_u64(0L);
249 primitive.add_rep_u64(6402L);
250 primitive.add_rep_u64(6403L);
251 primitive.add_rep_i64(6404L);
252 primitive.add_rep_i64(0L);
253 primitive.add_rep_sf64(0L);
254 primitive.add_rep_sf64(6405L);
255 primitive.add_rep_sf64(6406L);
256 primitive.add_rep_s64(6407L);
257 primitive.add_rep_s64(0L);
258 primitive.add_rep_float(0.0
f);
259 primitive.add_rep_float(32.1
f);
260 primitive.add_rep_float(32.2
f);
261 primitive.add_rep_double(64.1L);
262 primitive.add_rep_double(0.0);
263 primitive.add_rep_bool(
true);
264 primitive.add_rep_bool(
false);
300 ow_.StartObject(
"")->EndObject();
306 primitive.set_fix32(3201);
307 primitive.set_u32(3202);
308 primitive.set_i32(3203);
309 primitive.set_sf32(3204);
310 primitive.set_s32(3205);
311 primitive.set_fix64(6401L);
312 primitive.set_u64(6402L);
313 primitive.set_i64(6403L);
314 primitive.set_sf64(6404L);
315 primitive.set_s64(6405L);
316 primitive.set_str(
"String Value");
317 primitive.set_bytes(
"Some Bytes");
318 primitive.set_float_(32.1
f);
319 primitive.set_double_(64.1L);
320 primitive.set_bool_(
true);
323 ->RenderUint32(
"fix32", bit_cast<uint32>(3201))
324 ->RenderUint32(
"u32", bit_cast<uint32>(3202))
325 ->RenderInt32(
"i32", 3203)
326 ->RenderInt32(
"sf32", 3204)
327 ->RenderInt32(
"s32", 3205)
328 ->RenderUint64(
"fix64", bit_cast<uint64>(6401
LL))
329 ->RenderUint64(
"u64", bit_cast<uint64>(6402
LL))
330 ->RenderInt64(
"i64", 6403L)
331 ->RenderInt64(
"sf64", 6404L)
332 ->RenderInt64(
"s64", 6405L)
333 ->RenderString(
"str",
"String Value")
334 ->RenderBytes(
"bytes",
"Some Bytes")
335 ->RenderFloat(
"float", 32.1
f)
336 ->RenderDouble(
"double", 64.1L)
337 ->RenderBool(
"bool",
true)
343 Primitive primitive = PrepareRepeatedPrimitive();
344 primitive.add_rep_str(
"String One");
345 primitive.add_rep_str(
"String Two");
346 primitive.add_rep_bytes(
"Some Bytes");
348 ow_.StartList(
"repStr")
349 ->RenderString(
"",
"String One")
350 ->RenderString(
"",
"String Two")
352 ->StartList(
"repBytes")
353 ->RenderBytes(
"",
"Some Bytes")
360 author.set_id(12345);
362 ow_.StartObject(
"")->RenderUint64(
"@id", 12345)->EndObject();
367 Author* author =
new Author();
368 author->set_name(
"Tolstoy");
370 book.set_title(
"My Book");
371 book.set_allocated_author(author);
374 ->RenderString(
"title",
"My Book")
375 ->StartObject(
"author")
376 ->RenderString(
"name",
"Tolstoy")
384 author.set_alive(
false);
385 author.set_name(
"john");
386 author.add_pseudonym(
"phil");
387 author.add_pseudonym(
"bob");
390 ->RenderBool(
"alive",
false)
391 ->RenderString(
"name",
"john")
392 ->StartList(
"pseudonym")
393 ->RenderString(
"",
"phil")
394 ->RenderString(
"",
"bob")
416 author.set_alive(
false);
417 author.set_name(
"john");
418 author.set_id(1234L);
419 author.add_pseudonym(
"phil");
420 author.add_pseudonym(
"bob");
424 ->RenderBool(
"",
false)
427 ->RenderUint64(
"",
static_cast<uint64>(
'j'))
428 ->RenderUint64(
"",
static_cast<uint64>(
'o'))
429 ->RenderUint64(
"",
static_cast<uint64>(
'h'))
430 ->RenderUint64(
"",
static_cast<uint64>(
'n'))
432 ->RenderString(
"pseudonym",
"phil")
433 ->RenderString(
"pseudonym",
"bob")
440 Book* book =
new Book();
441 book->set_length(250);
442 book->set_published(2014L);
444 nested.set_allocated_book(book);
448 ->RenderUint32(
"", 24)
449 ->RenderUint32(
"", 250)
450 ->RenderUint32(
"", 32)
451 ->RenderUint32(
"", 2014)
459 BadNestedBook nested;
468 ow_.StartObject(
"")->StartObject(
"book")->EndObject()->EndObject();
474 LongRepeatedListDoesNotBreakIntoMultipleJsonLists) {
478 for (
int i = 0;
i < repeat; ++
i) {
479 Book_Label*
label = book.add_labels();
494 book.set_type(Book::ACTION_AND_ADVENTURE);
496 UseLowerCamelForEnums();
498 ow_.StartObject(
"")->RenderString(
"type",
"actionAndAdventure")->EndObject();
504 book.set_type(Book::arts_and_photography);
506 UseLowerCamelForEnums();
508 ow_.StartObject(
"")->RenderString(
"type",
"artsAndPhotography")->EndObject();
514 book.set_type(Book::I18N_Tech);
516 UseLowerCamelForEnums();
518 ow_.StartObject(
"")->RenderString(
"type",
"i18nTech")->EndObject();
524 book.set_type(Book::ACTION_AND_ADVENTURE);
526 ->RenderString(
"type",
"ACTION_AND_ADVENTURE")
533 book.set_type(Book::ACTION_AND_ADVENTURE);
537 ow_.StartObject(
"")->RenderInt32(
"type", 3)->EndObject();
543 book.set_snake_field(
"foo");
545 UsePreserveProtoFieldNames();
547 ow_.StartObject(
"")->RenderString(
"snake_field",
"foo")->EndObject();
552 UnknownEnumAreDroppedWhenRenderUnknownEnumValuesIsUnset) {
554 message.set_enum_value(
static_cast<Proto3Message::NestedEnum
>(1234));
556 SetRenderUnknownEnumValues(
false);
559 ow_.StartObject(
"")->EndObject();
564 UnknownEnumAreOutputWhenRenderUnknownEnumValuesIsSet) {
566 message.set_enum_value(
static_cast<Proto3Message::NestedEnum
>(1234));
568 SetRenderUnknownEnumValues(
true);
571 ow_.StartObject(
"")->RenderInt32(
"enumValue", 1234)->EndObject();
577 cyclic.set_m_int(123);
579 Book* book = cyclic.mutable_m_book();
580 book->set_title(
"book title");
581 Cyclic* current = cyclic.mutable_m_cyclic();
582 Author* current_author = cyclic.add_m_author();
583 for (
int i = 0;
i < 63; ++
i) {
584 Author*
next = current_author->add_friend_();
587 next->set_alive(
true);
588 current_author =
next;
592 for (
int i = 0;
i < 64; ++
i) {
593 Cyclic*
next = current->mutable_m_cyclic();
610 ProtostreamObjectSourceMapsTest,
643 (*out.mutable_map1())[
"key1"].set_foo(
"foovalue");
644 (*out.mutable_map1())[
"key2"].set_foo(
"barvalue");
646 MapOut* nested_value = &(*out.mutable_map2())[
"nestedself"];
647 (*nested_value->mutable_map1())[
"nested_key1"].set_foo(
"nested_foo");
648 nested_value->set_bar(
"nested_bar_string");
650 (*out.mutable_map3())[111] =
"one one one";
652 out.set_bar(
"top bar");
655 ->StartObject(
"map1")
656 ->StartObject(
"key1")
657 ->RenderString(
"foo",
"foovalue")
659 ->StartObject(
"key2")
660 ->RenderString(
"foo",
"barvalue")
662 ->StartObject(
"map2")
663 ->StartObject(
"nestedself")
664 ->StartObject(
"map1")
665 ->StartObject(
"nested_key1")
666 ->RenderString(
"foo",
"nested_foo")
669 ->RenderString(
"bar",
"nested_bar_string")
672 ->StartObject(
"map3")
673 ->RenderString(
"111",
"one one one")
676 ->RenderString(
"bar",
"top bar")
686 MapOutWireFormat out;
711 out.add_map1()->mutable_value()->set_foo(
"foovalue");
712 MapOut* nested = out.add_map2()->mutable_value();
713 (*nested->mutable_map1())[
"nested_key1"].set_foo(
"nested_foo");
714 out.add_map3()->set_value(
"one one one");
715 out.add_map4()->set_value(
"bool");
718 ->StartObject(
"map1")
720 ->RenderString(
"foo",
"foovalue")
723 ->StartObject(
"map2")
725 ->StartObject(
"map1")
726 ->StartObject(
"nested_key1")
727 ->RenderString(
"foo",
"nested_foo")
732 ->StartObject(
"map3")
733 ->RenderString(
"0",
"one one one")
735 ->StartObject(
"map4")
736 ->RenderString(
"false",
"bool")
752 ProtostreamObjectSourceAnysTest,
770 m.set_foo(
"foovalue");
775 ->RenderString(
"@type",
776 "type.googleapis.com/proto_util_converter.testing.AnyM")
777 ->RenderString(
"foo",
"foovalue")
789 book.set_type(Book::arts_and_photography);
792 UseLowerCamelForEnums();
796 ->RenderString(
"@type",
797 "type.googleapis.com/proto_util_converter.testing.Book")
798 ->RenderString(
"type",
"artsAndPhotography")
810 book.set_type(Book::ACTION_AND_ADVENTURE);
817 ->RenderString(
"@type",
818 "type.googleapis.com/proto_util_converter.testing.Book")
819 ->RenderInt32(
"type", 3)
831 book.set_snake_field(
"foo");
834 UsePreserveProtoFieldNames();
838 ->RenderString(
"@type",
839 "type.googleapis.com/proto_util_converter.testing.Book")
840 ->RenderString(
"snake_field",
"foo")
850 any->
set_type_url(
"type.googleapis.com/google.protobuf.Any");
854 "type.googleapis.com/proto_util_converter.testing.AnyM");
857 m.set_foo(
"foovalue");
858 nested_any.set_value(
m.SerializeAsString());
860 any->set_value(nested_any.SerializeAsString());
864 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
865 ->StartObject(
"value")
866 ->RenderString(
"@type",
867 "type.googleapis.com/proto_util_converter.testing.AnyM")
868 ->RenderString(
"foo",
"foovalue")
879 any->
set_type_url(
"type.googleapis.com/google.protobuf.Any");
882 nested_any.
set_type_url(
"type.googleapis.com/google.protobuf.Any");
886 "type.googleapis.com/proto_util_converter.testing.AnyM");
889 m.set_foo(
"foovalue");
890 second_nested_any.set_value(
m.SerializeAsString());
891 nested_any.set_value(second_nested_any.SerializeAsString());
892 any->set_value(nested_any.SerializeAsString());
896 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
897 ->StartObject(
"value")
898 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
899 ->StartObject(
"value")
900 ->RenderString(
"@type",
901 "type.googleapis.com/proto_util_converter.testing.AnyM")
902 ->RenderString(
"foo",
"foovalue")
915 ow_.StartObject(
"")->StartObject(
"any")->EndObject()->EndObject();
922 out.mutable_any()->set_type_url(
"foo.googleapis.com/my.Type");
926 ->RenderString(
"@type",
"foo.googleapis.com/my.Type")
938 m.set_foo(
"foovalue");
939 any->set_value(
m.SerializeAsString());
954 m.set_foo(
"foovalue");
955 any->set_value(
m.SerializeAsString());
970 m.set_foo(
"foovalue");
971 any->set_value(
m.SerializeAsString());
989 ProtostreamObjectSourceStructTest,
1002 s->mutable_fields()->operator[](
"k1").set_number_value(123);
1003 s->mutable_fields()->operator[](
"k2").set_bool_value(
true);
1006 ->StartObject(
"object")
1007 ->RenderDouble(
"k1", 123)
1008 ->RenderBool(
"k2",
true)
1018 s->mutable_fields()->operator[](
"k1");
1020 ow_.StartObject(
"")->StartObject(
"object")->EndObject()->EndObject();
1035 ProtostreamObjectSourceFieldMaskTest,
1042 out.mutable_single_mask()->add_paths(
"path1");
1043 out.mutable_single_mask()->add_paths(
"snake_case_path2");
1046 mask = out.add_repeated_mask();
1047 mask->add_paths(
"snake_case_path4");
1048 mask->add_paths(
"path5");
1049 NestedFieldMask* nested = out.add_nested_mask();
1050 nested->set_data(
"data");
1051 nested->mutable_single_mask()->add_paths(
"nested.path1");
1052 nested->mutable_single_mask()->add_paths(
"nested_field.snake_case_path2");
1053 mask = nested->add_repeated_mask();
1054 mask->add_paths(
"nested_field.path3");
1055 mask->add_paths(
"nested.snake_case_path4");
1056 mask = nested->add_repeated_mask();
1057 mask->add_paths(
"nested.path5");
1058 mask = nested->add_repeated_mask();
1060 "snake_case.map_field[\"map_key_should_be_ignored\"].nested_snake_case."
1061 "map_field[\"map_key_sho\\\"uld_be_ignored\"]");
1064 ->RenderString(
"id",
"1")
1065 ->RenderString(
"singleMask",
"path1,snakeCasePath2")
1066 ->StartList(
"repeatedMask")
1067 ->RenderString(
"",
"path3")
1068 ->RenderString(
"",
"snakeCasePath4,path5")
1070 ->StartList(
"nestedMask")
1072 ->RenderString(
"data",
"data")
1073 ->RenderString(
"singleMask",
"nested.path1,nestedField.snakeCasePath2")
1074 ->StartList(
"repeatedMask")
1075 ->RenderString(
"",
"nestedField.path3,nested.snakeCasePath4")
1076 ->RenderString(
"",
"nested.path5")
1078 "snakeCase.mapField[\"map_key_should_be_ignored\"]."
1079 "nestedSnakeCase.mapField[\"map_key_sho\\\"uld_be_"
1098 ProtostreamObjectSourceTimestampTest,
1103 TimestampDuration out;
1107 ow_.StartObject(
"");
1114 TimestampDuration out;
1118 ow_.StartObject(
"");
1125 TimestampDuration out;
1129 ow_.StartObject(
"");
1136 TimestampDuration out;
1140 ow_.StartObject(
"");
1147 TimestampDuration out;
1148 out.mutable_ts()->set_seconds(0);
1149 out.mutable_dur()->set_seconds(0);
1152 ->RenderString(
"ts",
"1970-01-01T00:00:00Z")
1153 ->RenderString(
"dur",
"0s")