44 #include <google/protobuf/util/internal/testdata/anys.pb.h>
45 #include <google/protobuf/util/internal/testdata/books.pb.h>
46 #include <google/protobuf/util/internal/testdata/field_mask.pb.h>
47 #include <google/protobuf/util/internal/testdata/maps.pb.h>
48 #include <google/protobuf/util/internal/testdata/oneofs.pb.h>
49 #include <google/protobuf/util/internal/testdata/proto3.pb.h>
50 #include <google/protobuf/util/internal/testdata/struct.pb.h>
51 #include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
52 #include <google/protobuf/util/internal/testdata/wrappers.pb.h>
66 using proto_util_converter::testing::AnyM;
67 using proto_util_converter::testing::AnyOut;
68 using proto_util_converter::testing::Author;
69 using proto_util_converter::testing::Book;
70 using proto_util_converter::testing::FieldMaskTest;
71 using proto_util_converter::testing::Int32Wrapper;
72 using proto_util_converter::testing::MapIn;
73 using proto_util_converter::testing::Primitive;
74 using proto_util_converter::testing::Proto3Message;
75 using proto_util_converter::testing::Publisher;
76 using proto_util_converter::testing::StructType;
77 using proto_util_converter::testing::TestJsonName1;
78 using proto_util_converter::testing::TestJsonName2;
79 using proto_util_converter::testing::TimestampDuration;
80 using proto_util_converter::testing::ValueWrapper;
81 using proto_util_converter::testing::oneofs::OneOfsRequest;
82 using strings::GrowingArrayByteSink;
93 #if __cplusplus >= 201103L
105 output_(new GrowingArrayByteSink(1000)),
111 output_(new GrowingArrayByteSink(1000)),
113 std::vector<const Descriptor*> descriptors;
119 std::vector<const Descriptor*> descriptors)
122 output_(new GrowingArrayByteSink(1000)),
128 GOOGLE_CHECK(!descriptors.empty()) <<
"Must have at least one descriptor!";
135 std::vector<const Descriptor*> descriptors;
145 if (expected_length >= 0) {
150 std::stringbuf str_buf(
str, std::ios_base::in);
151 std::istream istream(&str_buf);
152 std::unique_ptr<Message>
message(expected.
New());
153 message->ParsePartialFromIstream(&istream);
164 std::unique_ptr<GrowingArrayByteSink>
output_;
165 std::unique_ptr<ProtoStreamObjectWriter>
ow_;
170 "Verifies the expected object location") {
172 if (actual.compare(expected) == 0)
return true;
173 *result_listener <<
"actual location is: " << actual;
188 ProtoStreamObjectWriterTest,
194 ow_->StartObject(
"")->EndObject();
195 CheckOutput(empty, 0);
202 book.set_title(
"My Title");
203 book.set_length(222);
204 book.set_content(content);
207 ->RenderString(
"title",
"My Title")
208 ->RenderInt32(
"length", 222)
209 ->RenderBytes(
"content", content)
216 book.set_title(
"Some Book");
217 book.set_length(102);
218 Publisher* publisher = book.mutable_publisher();
219 publisher->set_name(
"My Publisher");
220 Author* robert = book.mutable_author();
221 robert->set_alive(
true);
222 robert->set_name(
"robert");
223 robert->add_pseudonym(
"bob");
224 robert->add_pseudonym(
"bobby");
225 robert->add_friend_()->set_name(
"john");
228 ->RenderString(
"title",
"Some Book")
229 ->RenderInt32(
"length", 102)
230 ->StartObject(
"publisher")
231 ->RenderString(
"name",
"My Publisher")
233 ->StartObject(
"author")
234 ->RenderBool(
"alive",
true)
235 ->RenderString(
"name",
"robert")
236 ->StartList(
"pseudonym")
237 ->RenderString(
"",
"bob")
238 ->RenderString(
"",
"bobby")
240 ->StartList(
"friend")
242 ->RenderString(
"name",
"john")
252 Author* robert = book.mutable_author();
253 robert->set_id(12345);
254 robert->set_name(
"robert");
257 ->StartObject(
"author")
258 ->RenderUint64(
"@id", 12345)
259 ->RenderString(
"name",
"robert")
269 TestJsonName1 message1;
270 message1.set_one_value(12345);
271 ow_->StartObject(
"")->RenderInt32(
"value", 12345)->EndObject();
272 CheckOutput(message1);
275 TestJsonName2 message2;
276 message2.set_another_value(12345);
277 ow_->StartObject(
"")->RenderInt32(
"value", 12345)->EndObject();
278 CheckOutput(message2);
283 book.set_title(
"Some Book");
284 book.set_type(proto_util_converter::testing::Book_Type_KIDS);
285 Author* robert = book.mutable_author();
286 robert->set_name(
"robert");
289 ->RenderString(
"title",
"Some Book")
290 ->RenderString(
"type",
"2")
291 ->StartObject(
"author")
292 ->RenderString(
"name",
"robert")
300 book.set_title(
"Some Book");
301 Author* robert = book.mutable_author();
302 robert->set_name(
"robert");
304 options_.case_insensitive_enum_parsing =
false;
308 ->RenderString(
"title",
"Some Book")
309 ->RenderString(
"type",
"action_and_adventure")
310 ->StartObject(
"author")
311 ->RenderString(
"name",
"robert")
319 book.set_title(
"Some Book");
320 book.set_type(proto_util_converter::testing::Book_Type_ACTION_AND_ADVENTURE);
321 Author* robert = book.mutable_author();
322 robert->set_name(
"robert");
324 options_.case_insensitive_enum_parsing =
false;
328 ->RenderString(
"title",
"Some Book")
329 ->RenderString(
"type",
"ACTION_AND_ADVENTURE")
330 ->StartObject(
"author")
331 ->RenderString(
"name",
"robert")
339 book.set_title(
"Some Book");
340 book.set_type(proto_util_converter::testing::Book_Type_ACTION_AND_ADVENTURE);
341 Author* robert = book.mutable_author();
342 robert->set_name(
"robert");
344 options_.case_insensitive_enum_parsing =
true;
348 ->RenderString(
"title",
"Some Book")
349 ->RenderString(
"type",
"action_AND_adventure")
350 ->StartObject(
"author")
351 ->RenderString(
"name",
"robert")
359 book.set_title(
"Some Book");
360 book.set_type(proto_util_converter::testing::Book_Type_ACTION_AND_ADVENTURE);
361 Author* robert = book.mutable_author();
362 robert->set_name(
"robert");
364 options_.use_lower_camel_for_enums =
true;
368 ->RenderString(
"title",
"Some Book")
369 ->RenderString(
"type",
"ACTIONANDADVENTURE")
370 ->StartObject(
"author")
371 ->RenderString(
"name",
"robert")
379 book.set_title(
"Some Book");
380 book.set_type(proto_util_converter::testing::Book_Type_ACTION_AND_ADVENTURE);
381 Author* robert = book.mutable_author();
382 robert->set_name(
"robert");
384 options_.use_lower_camel_for_enums =
true;
388 ->RenderString(
"title",
"Some Book")
389 ->RenderString(
"type",
"actionAndAdventure")
390 ->StartObject(
"author")
391 ->RenderString(
"name",
"robert")
398 EnumValuesInCamelCaseRemoveDashAndUnderscoreAreAccepted) {
400 book.set_title(
"Some Book");
401 book.set_type(proto_util_converter::testing::Book_Type_ACTION_AND_ADVENTURE);
402 Author* robert = book.mutable_author();
403 robert->set_name(
"robert");
405 options_.use_lower_camel_for_enums =
true;
406 options_.case_insensitive_enum_parsing =
false;
410 ->RenderString(
"title",
"Some Book")
411 ->RenderString(
"type",
"action-And_Adventure")
412 ->StartObject(
"author")
413 ->RenderString(
"name",
"robert")
420 EnumValuesInCamelCaseWithNameNotUppercaseAreAccepted) {
422 book.set_title(
"Some Book");
423 book.set_type(proto_util_converter::testing::Book_Type_arts_and_photography);
424 Author* robert = book.mutable_author();
425 robert->set_name(
"robert");
427 options_.use_lower_camel_for_enums =
true;
431 ->RenderString(
"title",
"Some Book")
432 ->RenderString(
"type",
"artsAndPhotography")
433 ->StartObject(
"author")
434 ->RenderString(
"name",
"robert")
447 full.set_fix64(40000000001L);
448 full.set_u64(40000000002L);
449 full.set_i64(-40000000003L);
450 full.set_sf64(-40000000004L);
451 full.set_s64(-40000000005L);
452 full.set_str(
"string1");
453 full.set_bytes(
"Some Bytes");
454 full.set_float_(3.14
f);
455 full.set_double_(-4.05L);
456 full.set_bool_(
true);
457 full.add_rep_fix32(201);
458 full.add_rep_u32(202);
459 full.add_rep_i32(-203);
460 full.add_rep_sf32(-204);
461 full.add_rep_s32(-205);
462 full.add_rep_fix64(80000000001L);
463 full.add_rep_u64(80000000002L);
464 full.add_rep_i64(-80000000003L);
465 full.add_rep_sf64(-80000000004L);
466 full.add_rep_s64(-80000000005L);
467 full.add_rep_str(
"string2");
468 full.add_rep_bytes(
"More Bytes");
469 full.add_rep_float(6.14
f);
470 full.add_rep_double(-8.05L);
471 full.add_rep_bool(
false);
476 ->RenderString(
"fix32",
"101")
477 ->RenderString(
"u32",
"102")
478 ->RenderString(
"i32",
"-103")
479 ->RenderString(
"sf32",
"-104")
480 ->RenderString(
"s32",
"-105")
481 ->RenderString(
"fix64",
"40000000001")
482 ->RenderString(
"u64",
"40000000002")
483 ->RenderString(
"i64",
"-40000000003")
484 ->RenderString(
"sf64",
"-40000000004")
485 ->RenderString(
"s64",
"-40000000005")
486 ->RenderString(
"str",
"string1")
487 ->RenderString(
"bytes",
"U29tZSBCeXRlcw==")
488 ->RenderString(
"float",
"3.14")
489 ->RenderString(
"double",
"-4.05")
490 ->RenderString(
"bool",
"true")
491 ->StartList(
"rep_fix32")
492 ->RenderString(
"",
"201")
494 ->StartList(
"rep_u32")
495 ->RenderString(
"",
"202")
497 ->StartList(
"rep_i32")
498 ->RenderString(
"",
"-203")
500 ->StartList(
"rep_sf32")
501 ->RenderString(
"",
"-204")
503 ->StartList(
"rep_s32")
504 ->RenderString(
"",
"-205")
506 ->StartList(
"rep_fix64")
507 ->RenderString(
"",
"80000000001")
509 ->StartList(
"rep_u64")
510 ->RenderString(
"",
"80000000002")
512 ->StartList(
"rep_i64")
513 ->RenderString(
"",
"-80000000003")
515 ->StartList(
"rep_sf64")
516 ->RenderString(
"",
"-80000000004")
518 ->StartList(
"rep_s64")
519 ->RenderString(
"",
"-80000000005")
521 ->StartList(
"rep_str")
522 ->RenderString(
"",
"string2")
524 ->StartList(
"rep_bytes")
525 ->RenderString(
"",
"TW9yZSBCeXRlcw==")
527 ->StartList(
"rep_float")
528 ->RenderString(
"",
"6.14")
530 ->StartList(
"rep_double")
531 ->RenderString(
"",
"-8.05")
533 ->StartList(
"rep_bool")
534 ->RenderString(
"",
"false")
542 full.set_double_(std::numeric_limits<double>::infinity());
543 full.set_float_(std::numeric_limits<float>::infinity());
544 full.set_str(
"-Infinity");
550 .With(Args<0>(HasObjectLocation(
"i32")));
553 .With(Args<0>(HasObjectLocation(
"u32")));
556 .With(Args<0>(HasObjectLocation(
"sf64")));
559 .With(Args<0>(HasObjectLocation(
"bool")));
562 ->RenderString(
"double",
"Infinity")
563 ->RenderString(
"float",
"Infinity")
564 ->RenderString(
"i32",
"Infinity")
565 ->RenderString(
"u32",
"Infinity")
566 ->RenderString(
"sf64",
"-Infinity")
567 ->RenderString(
"str",
"-Infinity")
568 ->RenderString(
"bool",
"Infinity")
575 full.set_double_(std::numeric_limits<double>::quiet_NaN());
576 full.set_float_(std::numeric_limits<float>::quiet_NaN());
583 .With(Args<0>(HasObjectLocation(
"i32")));
586 .With(Args<0>(HasObjectLocation(
"u32")));
589 .With(Args<0>(HasObjectLocation(
"sf64")));
592 .With(Args<0>(HasObjectLocation(
"bool")));
595 ->RenderString(
"double",
"NaN")
596 ->RenderString(
"float",
"NaN")
597 ->RenderString(
"i32",
"NaN")
598 ->RenderString(
"u32",
"NaN")
599 ->RenderString(
"sf64",
"NaN")
600 ->RenderString(
"str",
"NaN")
601 ->RenderString(
"bool",
"NaN")
609 Author* author = expected.mutable_author();
610 author->set_name(
"The Author");
611 author->add_pseudonym(
"first");
612 author->add_pseudonym(
"second");
615 ->StartObject(
"author")
616 ->RenderString(
"name",
"The Author")
617 ->RenderString(
"pseudonym",
"first")
618 ->RenderString(
"pseudonym",
"second")
621 CheckOutput(expected);
625 LastWriteWinsOnNonRepeatedPrimitiveFieldWithDuplicates) {
627 Author* author = expected.mutable_author();
628 author->set_name(
"second");
631 ->StartObject(
"author")
632 ->RenderString(
"name",
"first")
633 ->RenderString(
"name",
"second")
636 CheckOutput(expected);
641 Author* author = expected.mutable_author();
642 author->set_name(
"The Author");
643 author->add_pseudonym(
"first");
644 author->add_pseudonym(
"second");
647 ->StartObject(
"author")
648 ->RenderString(
"name",
"The Author")
649 ->StartList(
"pseudonym")
650 ->RenderString(
"",
"first")
651 ->RenderString(
"",
"second")
655 CheckOutput(expected);
660 expected.set_allocated_author(
new Author());
666 "Proto field is not repeating, cannot start list.")))
667 .With(Args<0>(HasObjectLocation(
"author")));
669 ->StartObject(
"author")
671 ->RenderString(
"",
"first")
672 ->RenderString(
"",
"second")
676 CheckOutput(expected);
681 Author* outer = expected.mutable_author();
682 outer->set_name(
"outer");
683 outer->set_alive(
true);
684 Author*
first = outer->add_friend_();
685 first->set_name(
"first");
686 Author* second = outer->add_friend_();
687 second->set_name(
"second");
690 ->StartObject(
"author")
691 ->RenderString(
"name",
"outer")
692 ->RenderBool(
"alive",
true)
693 ->StartObject(
"friend")
694 ->RenderString(
"name",
"first")
696 ->StartObject(
"friend")
697 ->RenderString(
"name",
"second")
701 CheckOutput(expected);
705 LastWriteWinsOnNonRepeatedMessageFieldWithDuplicates) {
707 Author* author = expected.mutable_author();
708 author->set_name(
"The Author");
709 Publisher* publisher = expected.mutable_publisher();
710 publisher->set_name(
"second");
713 ->StartObject(
"author")
714 ->RenderString(
"name",
"The Author")
716 ->StartObject(
"publisher")
717 ->RenderString(
"name",
"first")
719 ->StartObject(
"publisher")
720 ->RenderString(
"name",
"second")
723 CheckOutput(expected);
728 Author* outer = expected.mutable_author();
729 outer->set_name(
"outer");
730 outer->set_alive(
true);
731 Author*
first = outer->add_friend_();
732 first->set_name(
"first");
733 Author* second = outer->add_friend_();
734 second->set_name(
"second");
737 ->StartObject(
"author")
738 ->RenderString(
"name",
"outer")
739 ->RenderBool(
"alive",
true)
740 ->StartList(
"friend")
742 ->RenderString(
"name",
"first")
745 ->RenderString(
"name",
"second")
750 CheckOutput(expected);
755 Author* author = expected.mutable_author();
756 author->set_name(
"The Author");
762 "Proto field is not repeating, cannot start list.")))
763 .With(Args<0>(HasObjectLocation(
"")));
765 ->StartObject(
"author")
766 ->RenderString(
"name",
"The Author")
768 ->StartList(
"publisher")
770 ->RenderString(
"name",
"first")
773 ->RenderString(
"name",
"second")
777 CheckOutput(expected);
785 .With(Args<0>(HasObjectLocation(
"")));
786 ow_->StartObject(
"")->RenderString(
"unknown",
"Nope!")->EndObject();
787 CheckOutput(empty, 0);
792 Author* paul = expected.mutable_author();
793 paul->set_name(
"Paul");
794 Author* mark = paul->add_friend_();
795 mark->set_name(
"Mark");
796 Author* john = paul->add_friend_();
797 john->set_name(
"John");
798 Author* luke = paul->add_friend_();
799 luke->set_name(
"Luke");
803 .With(Args<0>(HasObjectLocation(
"author.friend[1]")));
805 ->StartObject(
"author")
806 ->RenderString(
"name",
"Paul")
807 ->StartList(
"friend")
809 ->RenderString(
"name",
"Mark")
812 ->RenderString(
"name",
"John")
813 ->RenderString(
"address",
"Patmos")
816 ->RenderString(
"name",
"Luke")
821 CheckOutput(expected);
829 .With(Args<0>(HasObjectLocation(
"")));
830 ow_->StartObject(
"")->StartObject(
"unknown")->EndObject()->EndObject();
831 CheckOutput(empty, 0);
836 Author* author = expected.mutable_author();
837 author->set_name(
"William");
838 author->add_pseudonym(
"Bill");
842 .With(Args<0>(HasObjectLocation(
"author")));
844 ->StartObject(
"author")
845 ->RenderString(
"name",
"William")
846 ->StartObject(
"wife")
847 ->RenderString(
"name",
"Hilary")
849 ->RenderString(
"pseudonym",
"Bill")
852 CheckOutput(expected);
860 .With(Args<0>(HasObjectLocation(
"")));
861 ow_->StartObject(
"")->StartList(
"unknown")->EndList()->EndObject();
862 CheckOutput(empty, 0);
867 expected.set_title(
"Brainwashing");
868 Publisher* publisher = expected.mutable_publisher();
869 publisher->set_name(
"propaganda");
873 .With(Args<0>(HasObjectLocation(
"publisher")));
875 ->StartObject(
"publisher")
876 ->RenderString(
"name",
"propaganda")
877 ->StartList(
"alliance")
880 ->RenderString(
"title",
"Brainwashing")
882 CheckOutput(expected);
888 options_.ignore_unknown_fields =
true;
892 ow_->StartObject(
"")->RenderString(
"unknown",
"Nope!")->EndObject();
893 CheckOutput(empty, 0);
898 Author* paul = expected.mutable_author();
899 paul->set_name(
"Paul");
900 Author* mark = paul->add_friend_();
901 mark->set_name(
"Mark");
902 Author* john = paul->add_friend_();
903 john->set_name(
"John");
904 Author* luke = paul->add_friend_();
905 luke->set_name(
"Luke");
907 options_.ignore_unknown_fields =
true;
912 ->StartObject(
"author")
913 ->RenderString(
"name",
"Paul")
914 ->StartList(
"friend")
916 ->RenderString(
"name",
"Mark")
919 ->RenderString(
"name",
"John")
920 ->RenderString(
"address",
"Patmos")
923 ->RenderString(
"name",
"Luke")
928 CheckOutput(expected);
934 options_.ignore_unknown_fields =
true;
940 ow_->StartObject(
"")->StartObject(
"unknown")->EndObject()->EndObject();
941 CheckOutput(empty, 0);
946 Author* author = expected.mutable_author();
947 author->set_name(
"William");
948 author->add_pseudonym(
"Bill");
950 options_.ignore_unknown_fields =
true;
955 ->StartObject(
"author")
956 ->RenderString(
"name",
"William")
957 ->StartObject(
"wife")
958 ->RenderString(
"name",
"Hilary")
960 ->RenderString(
"pseudonym",
"Bill")
963 CheckOutput(expected);
969 options_.ignore_unknown_fields =
true;
973 ow_->StartObject(
"")->StartList(
"unknown")->EndList()->EndObject();
974 CheckOutput(empty, 0);
979 expected.set_title(
"Brainwashing");
980 Publisher* publisher = expected.mutable_publisher();
981 publisher->set_name(
"propaganda");
983 options_.ignore_unknown_fields =
true;
988 ->StartObject(
"publisher")
989 ->RenderString(
"name",
"propaganda")
990 ->StartList(
"alliance")
993 ->RenderString(
"title",
"Brainwashing")
995 CheckOutput(expected);
999 IgnoreUnknownFieldsDontIgnoreUnknownEnumValues) {
1002 Proto3Message expected;
1006 StringPiece(
"\"someunknownvalueyouwillneverknow\"")))
1007 .With(Args<0>(HasObjectLocation(
"enum_value")));
1008 ow_->StartObject(
"")
1009 ->RenderString(
"enumValue",
"someunknownvalueyouwillneverknow")
1011 CheckOutput(expected);
1017 Proto3Message expected;
1018 expected.set_enum_value(
static_cast<Proto3Message::NestedEnum
>(12345));
1021 ow_->StartObject(
"")->RenderInt32(
"enumValue", 12345)->EndObject();
1022 CheckOutput(expected);
1027 expected.set_title(
"My Title");
1028 expected.set_allocated_publisher(
new Publisher());
1031 .With(Args<0>(HasObjectLocation(
"publisher")));
1032 ow_->StartObject(
"")
1033 ->StartObject(
"publisher")
1035 ->RenderString(
"title",
"My Title")
1037 CheckOutput(expected);
1045 .With(Args<0>(HasObjectLocation(
"length")));
1046 ow_->StartObject(
"")->RenderString(
"length",
"garbage")->EndObject();
1047 CheckOutput(empty, 0);
1052 expected.set_title(
"My Title");
1056 .With(Args<0>(HasObjectLocation(
"length")));
1059 .With(Args<0>(HasObjectLocation(
"published")));
1060 ow_->StartObject(
"")
1061 ->RenderString(
"length",
"-400")
1062 ->RenderString(
"published",
"3.14")
1063 ->RenderString(
"title",
"My Title")
1065 CheckOutput(expected);
1074 .With(Args<0>(HasObjectLocation(
"")));
1075 ow_->StartObject(
"")->RenderFloat(
"", 3.14)->EndObject();
1076 CheckOutput(empty, 0);
1081 expected.set_title(
"noname");
1082 expected.set_allocated_author(
new Author());
1087 .With(Args<0>(HasObjectLocation(
"author")));
1088 ow_->StartObject(
"")
1089 ->StartObject(
"author")
1090 ->RenderInt32(
"", 123)
1092 ->RenderString(
"title",
"noname")
1094 CheckOutput(expected);
1099 expected.set_title(
"noname");
1104 .With(Args<0>(HasObjectLocation(
"")));
1105 ow_->StartObject(
"")
1108 ->RenderString(
"title",
"noname")
1110 CheckOutput(expected);
1115 expected.set_title(
"Annie");
1120 StringPiece(
"Root element should not be named.")))
1121 .With(Args<0>(HasObjectLocation(
"")));
1122 ow_->StartObject(
"oops")->RenderString(
"title",
"Annie")->EndObject();
1123 CheckOutput(expected, 7);
1132 StringPiece(
"Root element should not be named.")))
1133 .With(Args<0>(HasObjectLocation(
"")));
1134 ow_->StartList(
"oops")->RenderString(
"",
"item")->EndList();
1135 CheckOutput(empty, 0);
1144 .With(Args<0>(HasObjectLocation(
"")));
1145 ow_->RenderBool(
"",
true);
1146 CheckOutput(empty, 0);
1155 .With(Args<0>(HasObjectLocation(
"")));
1156 ow_->RenderBool(
"oops",
true);
1157 CheckOutput(empty, 0);
1163 ow_->RenderNull(
"");
1164 CheckOutput(empty, 0);
1170 ow_->RenderNull(
"author");
1171 CheckOutput(empty, 0);
1177 ow_->RenderNull(
"length");
1178 CheckOutput(empty, 0);
1185 std::vector<const Descriptor*> descriptors;
1194 ProtoStreamObjectWriterTimestampDurationTest,
1199 TimestampDuration timestamp;
1201 ts->set_seconds(1448249855);
1202 ts->set_nanos(33155000);
1204 ow_->StartObject(
"")
1205 ->RenderString(
"ts",
"2015-11-23T03:37:35.033155Z")
1207 CheckOutput(timestamp);
1211 ParseTimestampYearNotZeroPadded) {
1212 TimestampDuration timestamp;
1214 ts->set_seconds(-61665654145);
1215 ts->set_nanos(33155000);
1217 ow_->StartObject(
"")
1218 ->RenderString(
"ts",
"15-11-23T03:37:35.033155Z")
1220 CheckOutput(timestamp);
1224 ParseTimestampYearZeroPadded) {
1225 TimestampDuration timestamp;
1227 ts->set_seconds(-61665654145);
1228 ts->set_nanos(33155000);
1230 ow_->StartObject(
"")
1231 ->RenderString(
"ts",
"0015-11-23T03:37:35.033155Z")
1233 CheckOutput(timestamp);
1237 ParseTimestampWithPositiveOffset) {
1238 TimestampDuration timestamp;
1240 ts->set_seconds(1448249855);
1241 ts->set_nanos(33155000);
1243 ow_->StartObject(
"")
1244 ->RenderString(
"ts",
"2015-11-23T11:47:35.033155+08:10")
1246 CheckOutput(timestamp);
1250 ParseTimestampWithNegativeOffset) {
1251 TimestampDuration timestamp;
1253 ts->set_seconds(1448249855);
1254 ts->set_nanos(33155000);
1256 ow_->StartObject(
"")
1257 ->RenderString(
"ts",
"2015-11-22T19:47:35.033155-07:50")
1259 CheckOutput(timestamp);
1263 TimestampWithInvalidOffset1) {
1264 TimestampDuration timestamp;
1269 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1271 "2016-03-07T15:14:23+")));
1273 ow_->StartObject(
"")->RenderString(
"ts",
"2016-03-07T15:14:23+")->EndObject();
1274 CheckOutput(timestamp);
1278 TimestampWithInvalidOffset2) {
1279 TimestampDuration timestamp;
1284 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1286 "2016-03-07T15:14:23+08-10")));
1288 ow_->StartObject(
"")
1289 ->RenderString(
"ts",
"2016-03-07T15:14:23+08-10")
1291 CheckOutput(timestamp);
1295 TimestampWithInvalidOffset3) {
1296 TimestampDuration timestamp;
1301 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1303 "2016-03-07T15:14:23+24:10")));
1305 ow_->StartObject(
"")
1306 ->RenderString(
"ts",
"2016-03-07T15:14:23+24:10")
1308 CheckOutput(timestamp);
1312 TimestampWithInvalidOffset4) {
1313 TimestampDuration timestamp;
1318 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1320 "2016-03-07T15:14:23+04:60")));
1322 ow_->StartObject(
"")
1323 ->RenderString(
"ts",
"2016-03-07T15:14:23+04:60")
1325 CheckOutput(timestamp);
1329 TimestampDuration timestamp;
1334 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1335 StringPiece(
"Field 'ts', Invalid time format: ")));
1337 ow_->StartObject(
"")->RenderString(
"ts",
"")->EndObject();
1338 CheckOutput(timestamp);
1342 TimestampDuration timestamp;
1347 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1348 StringPiece(
"Field 'ts', Invalid time format: Z")));
1350 ow_->StartObject(
"")->RenderString(
"ts",
"Z")->EndObject();
1351 CheckOutput(timestamp);
1355 TimestampDuration timestamp;
1360 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1362 "1970-01-01T00:00:00.ABZ")));
1364 ow_->StartObject(
"")
1365 ->RenderString(
"ts",
"1970-01-01T00:00:00.ABZ")
1367 CheckOutput(timestamp);
1371 TimestampDuration timestamp;
1376 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1378 "-8031-10-18T00:00:00.000Z")));
1380 ow_->StartObject(
"")
1381 ->RenderString(
"ts",
"-8031-10-18T00:00:00.000Z")
1383 CheckOutput(timestamp);
1387 TimestampDuration timestamp;
1392 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1394 "2015-11-23T03:37:35.033155 Z")));
1396 ow_->StartObject(
"")
1398 ->RenderString(
"ts",
"2015-11-23T03:37:35.033155 Z")
1400 CheckOutput(timestamp);
1404 TimestampDuration timestamp;
1409 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1411 "2015-11-23T03:37:35.033155 1234Z")));
1413 ow_->StartObject(
"")
1415 ->RenderString(
"ts",
"2015-11-23T03:37:35.033155 1234Z")
1417 CheckOutput(timestamp);
1421 TimestampDuration timestamp;
1426 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1428 "2015-11-23T03:37:35.033abc155Z")));
1430 ow_->StartObject(
"")
1432 ->RenderString(
"ts",
"2015-11-23T03:37:35.033abc155Z")
1434 CheckOutput(timestamp);
1438 TimestampDuration timestamp;
1443 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1445 "0-12-31T23:59:59.000Z")));
1447 ow_->StartObject(
"")
1448 ->RenderString(
"ts",
"0-12-31T23:59:59.000Z")
1450 CheckOutput(timestamp);
1454 TimestampDuration duration;
1457 dur->set_nanos(132262000);
1459 ow_->StartObject(
"")->RenderString(
"dur",
"1448216930.132262s")->EndObject();
1460 CheckOutput(duration);
1464 TimestampDuration duration;
1469 _,
StringPiece(
"type.googleapis.com/google.protobuf.Duration"),
1471 "Field 'dur', Illegal duration format; duration must "
1474 ow_->StartObject(
"")->RenderString(
"dur",
"")->EndObject();
1475 CheckOutput(duration);
1479 TimestampDuration duration;
1484 _,
StringPiece(
"type.googleapis.com/google.protobuf.Duration"),
1486 "Field 'dur', Invalid duration format, failed to parse "
1489 ow_->StartObject(
"")->RenderString(
"dur",
"s")->EndObject();
1490 CheckOutput(duration);
1494 TimestampDuration duration;
1499 _,
StringPiece(
"type.googleapis.com/google.protobuf.Duration"),
1500 StringPiece(
"Field 'dur', Invalid duration format, failed to "
1501 "parse nano seconds")));
1503 ow_->StartObject(
"")->RenderString(
"dur",
"123.DEFs")->EndObject();
1504 CheckOutput(duration);
1508 TimestampDuration duration;
1513 _,
StringPiece(
"type.googleapis.com/google.protobuf.Duration"),
1514 StringPiece(
"Field 'dur', Duration value exceeds limits")));
1516 ow_->StartObject(
"")->RenderString(
"dur",
"315576000002s")->EndObject();
1517 CheckOutput(duration);
1521 TimestampDuration duration;
1526 _,
StringPiece(
"type.googleapis.com/google.protobuf.Duration"),
1527 StringPiece(
"Field 'dur', Duration value exceeds limits")));
1529 ow_->StartObject(
"")->RenderString(
"dur",
"0.1000000001s")->EndObject();
1530 CheckOutput(duration);
1534 MismatchedTimestampTypeInput) {
1535 TimestampDuration timestamp;
1539 _,
StringPiece(
"type.googleapis.com/google.protobuf.Timestamp"),
1541 "Field 'ts', Invalid data type for timestamp, value is 1")))
1542 .With(Args<0>(HasObjectLocation(
"ts")));
1543 ow_->StartObject(
"")->RenderInt32(
"ts", 1)->EndObject();
1544 CheckOutput(timestamp);
1548 MismatchedDurationTypeInput) {
1549 TimestampDuration duration;
1553 _,
StringPiece(
"type.googleapis.com/google.protobuf.Duration"),
1555 "Field 'dur', Invalid data type for duration, value is 1")))
1556 .With(Args<0>(HasObjectLocation(
"dur")));
1557 ow_->StartObject(
"")->RenderInt32(
"dur", 1)->EndObject();
1558 CheckOutput(duration);
1562 TimestampDuration timestamp;
1564 ow_->StartObject(
"")->RenderNull(
"ts")->EndObject();
1565 CheckOutput(timestamp);
1569 TimestampDuration duration;
1571 ow_->StartObject(
"")->RenderNull(
"dur")->EndObject();
1572 CheckOutput(duration);
1582 std::vector<const Descriptor*> descriptors;
1590 ProtoStreamObjectWriterStructTest,
1598 s->mutable_fields()->operator[](
"k1").set_number_value(123);
1599 s->mutable_fields()->operator[](
"k2").set_bool_value(
true);
1601 ow_->StartObject(
"")
1602 ->StartObject(
"object")
1603 ->RenderDouble(
"k1", 123)
1604 ->RenderBool(
"k2",
true)
1615 .With(Args<0>(HasObjectLocation(
"")));
1616 ow_->StartObject(
"")->RenderNull(
"")->EndObject();
1625 _,
StringPiece(
"type.googleapis.com/google.protobuf.Struct"),
1627 .With(Args<0>(HasObjectLocation(
"object")));
1629 ow_->StartObject(
"")->RenderBool(
"object",
true)->EndObject();
1637 ow_->StartObject(
"")->RenderNull(
"object")->EndObject();
1643 (*
struct_type.mutable_object()->mutable_fields())[
"key"].set_null_value(
1647 ow_->StartObject(
"")
1648 ->StartObject(
"object")
1659 "Repeated map key: 'gBike' is already set.")));
1660 ow_->StartObject(
"")
1661 ->StartObject(
"object")
1662 ->RenderString(
"gBike",
"v1")
1663 ->RenderString(
"gBike",
"v2")
1672 StringPiece(
"Repeated map key: 'k1' is already set.")));
1673 ow_->StartObject(
"")
1674 ->StartObject(
"object")
1675 ->RenderString(
"k1",
"v1")
1677 ->RenderString(
"",
"v2")
1687 StringPiece(
"Repeated map key: 'k1' is already set.")));
1688 ow_->StartObject(
"")
1689 ->StartObject(
"object")
1691 ->RenderString(
"sub_k1",
"v1")
1694 ->RenderString(
"sub_k2",
"v2")
1703 s->mutable_fields()->operator[](
"k1").set_string_value(
"123");
1704 s->mutable_fields()->operator[](
"k2").set_bool_value(
true);
1705 s->mutable_fields()->operator[](
"k3").set_string_value(
"-222222222");
1706 s->mutable_fields()->operator[](
"k4").set_string_value(
"33333333");
1708 options_.struct_integers_as_strings =
true;
1711 ow_->StartObject(
"")
1712 ->StartObject(
"object")
1713 ->RenderDouble(
"k1", 123)
1714 ->RenderBool(
"k2",
true)
1715 ->RenderInt64(
"k3", -222222222)
1716 ->RenderUint64(
"k4", 33333333)
1727 ow_->StartObject(
"")->RenderNull(
"value")->EndObject();
1734 std::vector<const Descriptor*> descriptors;
1742 ProtoStreamObjectWriterMapTest,
1752 "Cannot bind a list to map for field 'map_input'.")));
1753 ow_->StartObject(
"")
1754 ->StartList(
"map_input")
1755 ->RenderString(
"a",
"b")
1766 (*mm.mutable_map_input())[
"a"] =
"b";
1767 (*mm.mutable_map_input())[
"x"] =
"";
1768 ow_->StartObject(
"")
1769 ->StartObject(
"map_input")
1770 ->RenderString(
"a",
"b")
1778 options_.ignore_null_value_map_entry =
true;
1781 (*mm.mutable_map_input())[
"a"] =
"b";
1782 ow_->StartObject(
"")
1783 ->StartObject(
"map_input")
1784 ->RenderString(
"a",
"b")
1795 StringPiece(
"Repeated map key: 'k1' is already set.")));
1796 ow_->StartObject(
"")
1797 ->RenderString(
"other",
"test")
1798 ->StartObject(
"map_input")
1799 ->RenderString(
"k1",
"v1")
1800 ->RenderString(
"k1",
"v2")
1809 (*mm.mutable_map_any())[
"foo"].PackFrom(
d);
1810 ow_->StartObject(
"")
1811 ->StartObject(
"map_any")
1812 ->StartObject(
"foo")
1813 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.DoubleValue")
1814 ->RenderDouble(
"value", 40.2)
1824 std::vector<const Descriptor*> descriptors;
1839 ProtoStreamObjectWriterAnyTest,
1846 any_type->set_type_url(
"type.googleapis.com/google.protobuf.DoubleValue");
1849 any_type->set_value(
d.SerializeAsString());
1851 ow_->StartObject(
"")
1852 ->StartObject(
"any")
1853 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.DoubleValue")
1854 ->RenderDouble(
"value", 40.2)
1863 any->
set_type_url(
"type.googleapis.com/google.protobuf.Any");
1867 "type.googleapis.com/proto_util_converter.testing.AnyM");
1870 m.set_foo(
"foovalue");
1871 nested_any.set_value(
m.SerializeAsString());
1873 any->set_value(nested_any.SerializeAsString());
1875 ow_->StartObject(
"")
1876 ->StartObject(
"any")
1877 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
1878 ->StartObject(
"value")
1879 ->RenderString(
"@type",
1880 "type.googleapis.com/proto_util_converter.testing.AnyM")
1881 ->RenderString(
"foo",
"foovalue")
1885 CheckOutput(out, 112);
1891 any->
set_type_url(
"type.googleapis.com/google.protobuf.Any");
1894 nested_any.
set_type_url(
"type.googleapis.com/google.protobuf.Any");
1898 "type.googleapis.com/proto_util_converter.testing.AnyM");
1901 m.set_foo(
"foovalue");
1902 second_nested_any.set_value(
m.SerializeAsString());
1904 nested_any.set_value(second_nested_any.SerializeAsString());
1905 any->set_value(nested_any.SerializeAsString());
1907 ow_->StartObject(
"")
1908 ->StartObject(
"any")
1909 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
1910 ->StartObject(
"value")
1911 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
1912 ->StartObject(
"value")
1913 ->RenderString(
"@type",
1914 "type.googleapis.com/proto_util_converter.testing.AnyM")
1915 ->RenderString(
"foo",
"foovalue")
1920 CheckOutput(out, 156);
1925 book.set_title(
"C++");
1926 book.set_length(1234);
1927 book.set_content(
"Hello World!");
1936 out.mutable_any()->PackFrom(outer_any);
1940 ow_->StartObject(
"")
1941 ->StartObject(
"any")
1942 ->StartObject(
"value")
1943 ->StartObject(
"value")
1944 ->RenderString(
"title",
"C++")
1945 ->RenderInt32(
"length", 1234)
1946 ->RenderBytes(
"content",
"Hello World!")
1947 ->RenderString(
"@type",
1948 "type.googleapis.com/proto_util_converter.testing.Book")
1950 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
1952 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
1962 book.set_title(
"C++");
1963 book.set_length(1234);
1964 book.set_content(
"Hello World!");
1973 out.mutable_any()->PackFrom(outer_any);
1978 ow_->StartObject(
"")->StartObject(
"any");
1980 ow_->StartObject(
"value");
1982 ow_->StartObject(
"value");
1988 ow_->RenderInt32(
name, 1234);
1990 value =
"Hello World!";
1993 value =
"type.googleapis.com/proto_util_converter.testing.Book";
1999 value =
"type.googleapis.com/google.protobuf.Any";
2005 value =
"type.googleapis.com/google.protobuf.Any";
2008 ow_->EndObject()->EndObject();
2018 ow_->StartObject(
"")->StartObject(
"any")->EndObject()->EndObject();
2020 CheckOutput(out, 2);
2030 "proto_util_converter.testing.AnyOut")));
2032 ow_->StartObject(
"")
2033 ->StartObject(
"any")
2034 ->StartObject(
"another")
2048 "proto_util_converter.testing.AnyOut")));
2050 ow_->StartObject(
"")
2051 ->StartObject(
"any")
2052 ->StartList(
"another")
2066 "proto_util_converter.testing.AnyOut")));
2068 ow_->StartObject(
"")
2069 ->StartObject(
"any")
2070 ->RenderString(
"value",
"somevalue")
2083 StringPiece(
"Invalid type URL, type URLs must be of the form "
2084 "'type.googleapis.com/<typename>', got: "
2085 "type.other.com/some.Type")));
2087 ow_->StartObject(
"")
2088 ->StartObject(
"any")
2089 ->RenderString(
"@type",
"type.other.com/some.Type")
2090 ->RenderDouble(
"value", 40.2)
2102 "Invalid type URL, unknown type: some.Type")));
2103 ow_->StartObject(
"")
2104 ->StartObject(
"any")
2105 ->RenderString(
"@type",
"type.googleapis.com/some.Type")
2106 ->RenderDouble(
"value", 40.2)
2118 StringPiece(
"type.googleapis.com/google.protobuf.Any"),
2120 ow_->StartObject(
"")->RenderInt32(
"any", 1)->EndObject();
2128 ow_->StartObject(
"")->RenderNull(
"any")->EndObject();
2138 any_type->set_type_url(
"type.googleapis.com/google.protobuf.Timestamp");
2140 ow_->StartObject(
"")
2141 ->StartObject(
"any")
2142 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Timestamp")
2143 ->RenderString(
"value",
"")
2162 value.set_string_value(
"abc");
2163 any->PackFrom(
value);
2165 ow_->StartObject(
"")
2166 ->StartObject(
"any")
2167 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Value")
2168 ->RenderString(
"value",
"abc")
2189 (*
value.mutable_struct_value()->mutable_fields())[
"foo"].set_string_value(
2191 any->PackFrom(
value);
2193 ow_->StartObject(
"")
2194 ->StartObject(
"any")
2195 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Value")
2196 ->StartObject(
"value")
2197 ->RenderString(
"foo",
"abc")
2217 value.mutable_list_value()->add_values()->set_string_value(
"hello");
2218 any->PackFrom(
value);
2220 ow_->StartObject(
"")
2221 ->StartObject(
"any")
2222 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Value")
2223 ->StartList(
"value")
2224 ->RenderString(
"",
"hello")
2241 AnyWellKnownTypesNoValueFieldForPrimitive) {
2246 StringPiece(
"Expect a \"value\" field for well-known types.")));
2249 any_type->set_type_url(
"type.googleapis.com/google.protobuf.Value");
2251 ow_->StartObject(
"")
2252 ->StartObject(
"any")
2253 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Value")
2254 ->RenderString(
"not_value",
"")
2273 StringPiece(
"Expect a \"value\" field for well-known types.")));
2276 any_type->set_type_url(
"type.googleapis.com/google.protobuf.Value");
2278 ow_->StartObject(
"")
2279 ->StartObject(
"any")
2280 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Value")
2281 ->StartObject(
"not_value")
2301 StringPiece(
"Expect a \"value\" field for well-known types.")));
2304 any_type->set_type_url(
"type.googleapis.com/google.protobuf.Value");
2306 ow_->StartObject(
"")
2307 ->StartObject(
"any")
2308 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Value")
2309 ->StartList(
"not_value")
2331 any_type->set_type_url(
"type.googleapis.com/google.protobuf.Struct");
2333 ow_->StartObject(
"")
2334 ->StartObject(
"any")
2335 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Struct")
2336 ->RenderString(
"value",
"")
2356 any_type->set_type_url(
"type.googleapis.com/google.protobuf.Any");
2358 ow_->StartObject(
"")
2359 ->StartObject(
"any")
2360 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
2361 ->RenderString(
"value",
"")
2376 out.mutable_any()->
PackFrom(empty);
2379 ow_->StartObject(
"")
2380 ->StartObject(
"any")
2381 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Any")
2382 ->RenderNull(
"value")
2397 out.mutable_any()->PackFrom(empty);
2400 ow_->StartObject(
"")
2401 ->StartObject(
"any")
2402 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Timestamp")
2403 ->RenderNull(
"value")
2418 out.mutable_any()->PackFrom(empty);
2421 ow_->StartObject(
"")
2422 ->StartObject(
"any")
2423 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Duration")
2424 ->RenderNull(
"value")
2439 out.mutable_any()->PackFrom(empty);
2442 ow_->StartObject(
"")
2443 ->StartObject(
"any")
2444 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.FieldMask")
2445 ->RenderNull(
"value")
2460 out.mutable_any()->PackFrom(empty);
2463 ow_->StartObject(
"")
2464 ->StartObject(
"any")
2465 ->RenderString(
"@type",
"type.googleapis.com/google.protobuf.Int32Value")
2466 ->RenderNull(
"value")
2476 std::vector<const Descriptor*> descriptors;
2484 ProtoStreamObjectWriterFieldMaskTest,
2489 FieldMaskTest expected;
2490 expected.set_id(
"1");
2491 expected.mutable_single_mask()->add_paths(
"path1");
2493 ow_->StartObject(
"");
2494 ow_->RenderString(
"id",
"1");
2495 ow_->RenderString(
"single_mask",
"path1");
2498 CheckOutput(expected);
2502 FieldMaskTest expected;
2503 expected.set_id(
"1");
2504 expected.mutable_single_mask()->add_paths(
"camel_case1");
2505 expected.mutable_single_mask()->add_paths(
"camel_case2");
2506 expected.mutable_single_mask()->add_paths(
"camel_case3");
2508 ow_->StartObject(
"");
2509 ow_->RenderString(
"id",
"1");
2510 ow_->RenderString(
"single_mask",
"camelCase1,camelCase2,camelCase3");
2513 CheckOutput(expected);
2517 FieldMaskTest expected;
2518 expected.set_id(
"1");
2520 mask->add_paths(
"field1");
2521 mask->add_paths(
"field2");
2522 expected.add_repeated_mask()->add_paths(
"field3");
2524 ow_->StartObject(
"");
2525 ow_->RenderString(
"id",
"1");
2526 ow_->StartList(
"repeated_mask");
2527 ow_->RenderString(
"",
"field1,field2");
2528 ow_->RenderString(
"",
"field3");
2532 CheckOutput(expected);
2536 FieldMaskTest expected;
2537 expected.set_id(
"1");
2539 ow_->StartObject(
"");
2540 ow_->RenderString(
"id",
"1");
2541 ow_->RenderString(
"single_mask",
"");
2544 CheckOutput(expected);
2548 FieldMaskTest expected;
2549 expected.set_id(
"1");
2551 ow_->StartObject(
"");
2552 ow_->RenderString(
"id",
"1");
2554 ow_->RenderString(
"single_mask",
2555 "outerField(camelCase1,camelCase2,camelCase3)");
2556 expected.mutable_single_mask()->add_paths(
"outer_field.camel_case1");
2557 expected.mutable_single_mask()->add_paths(
"outer_field.camel_case2");
2558 expected.mutable_single_mask()->add_paths(
"outer_field.camel_case3");
2560 ow_->StartList(
"repeated_mask");
2562 ow_->RenderString(
"",
"a(field1,field2)");
2564 mask->add_paths(
"a.field1");
2565 mask->add_paths(
"a.field2");
2567 ow_->RenderString(
"",
"a(field3)");
2568 mask = expected.add_repeated_mask();
2569 mask->add_paths(
"a.field3");
2571 ow_->RenderString(
"",
"a()");
2572 expected.add_repeated_mask();
2574 ow_->RenderString(
"",
"a(,)");
2575 expected.add_repeated_mask();
2577 ow_->RenderString(
"",
"a(field1(field2(field3)))");
2578 mask = expected.add_repeated_mask();
2579 mask->add_paths(
"a.field1.field2.field3");
2581 ow_->RenderString(
"",
"a(field1(field2(field3,field4),field5),field6)");
2582 mask = expected.add_repeated_mask();
2583 mask->add_paths(
"a.field1.field2.field3");
2584 mask->add_paths(
"a.field1.field2.field4");
2585 mask->add_paths(
"a.field1.field5");
2586 mask->add_paths(
"a.field6");
2588 ow_->RenderString(
"",
"a(id,field1(id,field2(field3,field4),field5),field6)");
2589 mask = expected.add_repeated_mask();
2590 mask->add_paths(
"a.id");
2591 mask->add_paths(
"a.field1.id");
2592 mask->add_paths(
"a.field1.field2.field3");
2593 mask->add_paths(
"a.field1.field2.field4");
2594 mask->add_paths(
"a.field1.field5");
2595 mask->add_paths(
"a.field6");
2597 ow_->RenderString(
"",
"a(((field3,field4)))");
2598 mask = expected.add_repeated_mask();
2599 mask->add_paths(
"a.field3");
2600 mask->add_paths(
"a.field4");
2605 CheckOutput(expected);
2612 _,
StringPiece(
"type.googleapis.com/google.protobuf.FieldMask"),
2613 StringPiece(
"Field 'single_mask', Invalid FieldMask 'a(b,c))'. "
2614 "Cannot find matching '(' for all ')'.")));
2616 ow_->StartObject(
"");
2617 ow_->RenderString(
"id",
"1");
2618 ow_->RenderString(
"single_mask",
"a(b,c))");
2626 _,
StringPiece(
"type.googleapis.com/google.protobuf.FieldMask"),
2628 "Field 'single_mask', Invalid FieldMask 'a(((b,c)'. Cannot "
2629 "find matching ')' for all '('.")));
2631 ow_->StartObject(
"");
2632 ow_->RenderString(
"id",
"1");
2633 ow_->RenderString(
"single_mask",
"a(((b,c)");
2638 FieldMaskTest expected;
2639 expected.mutable_single_mask()->add_paths(
"path.to.map[\"key1\"]");
2640 expected.mutable_single_mask()->add_paths(
2641 "path.to.map[\"e\\\"[]][scape\\\"\"]");
2642 expected.mutable_single_mask()->add_paths(
"path.to.map[\"key2\"]");
2644 ow_->StartObject(
"");
2645 ow_->RenderString(
"single_mask",
2646 "path.to.map[\"key1\"],path.to.map[\"e\\\"[]][scape\\\"\"],"
2647 "path.to.map[\"key2\"]");
2650 CheckOutput(expected);
2654 MapKeyMustBeAtTheEndOfAPathSegment) {
2658 _,
StringPiece(
"type.googleapis.com/google.protobuf.FieldMask"),
2660 "Field 'single_mask', Invalid FieldMask "
2661 "'path.to.map[\"key1\"]a,path.to.map[\"key2\"]'. "
2662 "Map keys should be at the end of a path segment.")));
2664 ow_->StartObject(
"");
2665 ow_->RenderString(
"single_mask",
2666 "path.to.map[\"key1\"]a,path.to.map[\"key2\"]");
2674 _,
StringPiece(
"type.googleapis.com/google.protobuf.FieldMask"),
2675 StringPiece(
"Field 'single_mask', Invalid FieldMask "
2676 "'path.to.map[\"key1\"'. Map keys should be "
2677 "represented as [\"some_key\"].")));
2679 ow_->StartObject(
"");
2680 ow_->RenderString(
"single_mask",
"path.to.map[\"key1\"");
2688 _,
StringPiece(
"type.googleapis.com/google.protobuf.FieldMask"),
2689 StringPiece(
"Field 'single_mask', Invalid FieldMask "
2690 "'path.to.map[\"ke\"y1\"]'. Map keys should be "
2691 "represented as [\"some_key\"].")));
2693 ow_->StartObject(
"");
2694 ow_->RenderString(
"single_mask",
"path.to.map[\"ke\"y1\"]");
2699 FieldMaskTest expected;
2700 expected.mutable_single_mask()->add_paths(
2705 "path.to.map[\"(),[],\\\"'!@#$%^&*123_|War\xE5\xAD\x99,./?><\\\\\"]");
2706 expected.mutable_single_mask()->add_paths(
"path.to.map[\"key2\"]");
2708 ow_->StartObject(
"");
2711 "path.to.map[\"(),[],\\\"'!@#$%^&*123_|War\xE5\xAD\x99,./?><\\\\\"],"
2712 "path.to.map[\"key2\"]");
2715 CheckOutput(expected);
2719 FieldMaskTest expected;
2721 ow_->StartObject(
"")->RenderNull(
"single_mask")->EndObject();
2722 CheckOutput(expected);
2729 std::vector<const Descriptor*> descriptors;
2737 ProtoStreamObjectWriterWrappersTest,
2742 Int32Wrapper wrapper;
2744 ow_->StartObject(
"")->RenderNull(
"int32")->EndObject();
2745 CheckOutput(wrapper);
2752 std::vector<const Descriptor*> descriptors;
2760 ProtoStreamObjectWriterOneOfsTest,
2765 MultipleOneofsFailForPrimitiveTypesTest) {
2771 "oneof field 'data' is already set. Cannot set 'intData'")));
2773 ow_->StartObject(
"");
2774 ow_->RenderString(
"strData",
"blah");
2775 ow_->RenderString(
"intData",
"123");
2780 MultipleOneofsFailForMessageTypesPrimitiveFirstTest) {
2784 "oneof field 'data' is already set. "
2785 "Cannot set 'messageData'")));
2788 ow_->StartObject(
"");
2789 ow_->RenderString(
"strData",
"blah");
2790 ow_->StartObject(
"messageData");
2791 ow_->RenderInt32(
"dataValue", 123);
2797 MultipleOneofsFailForMessageTypesMessageFirstTest) {
2801 "oneof field 'data' is already set. "
2802 "Cannot set 'strData'")));
2805 ow_->StartObject(
"");
2806 ow_->StartObject(
"messageData");
2807 ow_->RenderInt32(
"dataValue", 123);
2809 ow_->RenderString(
"strData",
"blah");
2814 MultipleOneofsFailForStructTypesPrimitiveFirstTest) {
2817 "oneof field 'data' is already set. "
2818 "Cannot set 'structData'")));
2821 ow_->StartObject(
"");
2822 ow_->RenderString(
"strData",
"blah");
2823 ow_->StartObject(
"structData");
2824 ow_->RenderString(
"a",
"b");
2830 MultipleOneofsFailForStructTypesStructFirstTest) {
2833 "oneof field 'data' is already set. "
2834 "Cannot set 'strData'")));
2837 ow_->StartObject(
"");
2838 ow_->StartObject(
"structData");
2839 ow_->RenderString(
"a",
"b");
2841 ow_->RenderString(
"strData",
"blah");
2846 MultipleOneofsFailForStructValueTypesTest) {
2849 "oneof field 'data' is already set. "
2850 "Cannot set 'valueData'")));
2853 ow_->StartObject(
"");
2854 ow_->StartObject(
"messageData");
2855 ow_->RenderInt32(
"dataValue", 123);
2857 ow_->StartObject(
"valueData");
2858 ow_->RenderString(
"a",
"b");
2864 MultipleOneofsFailForWellKnownTypesPrimitiveFirstTest) {
2867 "oneof field 'data' is already set. "
2868 "Cannot set 'tsData'")));
2871 ow_->StartObject(
"");
2872 ow_->RenderInt32(
"intData", 123);
2873 ow_->RenderString(
"tsData",
"1970-01-02T01:00:00.000Z");
2878 MultipleOneofsFailForWellKnownTypesWktFirstTest) {
2881 "oneof field 'data' is already set. "
2882 "Cannot set 'intData'")));
2885 ow_->StartObject(
"");
2886 ow_->RenderString(
"tsData",
"1970-01-02T01:00:00.000Z");
2887 ow_->RenderInt32(
"intData", 123);
2892 MultipleOneofsFailForWellKnownTypesAndMessageTest) {
2895 "oneof field 'data' is already set. "
2896 "Cannot set 'messageData'")));
2900 ow_->StartObject(
"");
2901 ow_->RenderString(
"tsData",
"1970-01-02T01:00:00.000Z");
2902 ow_->StartObject(
"messageData");
2903 ow_->RenderInt32(
"dataValue", 123);
2909 MultipleOneofsFailForOneofWithinAnyTest) {
2912 "oneof field 'data' is already set. "
2913 "Cannot set 'intData'")));
2923 ow_->StartObject(
"");
2924 ow_->StartObject(
"anyData");
2927 "type.googleapis.com/proto_util_converter.testing.oneofs.OneOfsRequest");
2928 ow_->RenderString(
"strData",
"blah");
2929 ow_->RenderInt32(
"intData", 123);