37 #include <google/protobuf/unittest.pb.h>
38 #include <google/protobuf/unittest_mset.pb.h>
39 #include <google/protobuf/unittest_mset_wire_format.pb.h>
40 #include <google/protobuf/unittest_proto3_arena.pb.h>
54 #include <google/protobuf/port_def.inc>
61 TEST(WireFormatTest, EnumsInSync) {
78 TEST(WireFormatTest, MaxFieldNumber) {
101 TEST(WireFormatTest, ParseExtensions) {
115 TestUtil::ExpectAllExtensionsSet(
dest);
118 TEST(WireFormatTest, ParsePacked) {
123 TestUtil::SetPackedFields(&
source);
132 TestUtil::ExpectPackedFieldsSet(
dest);
135 TEST(WireFormatTest, ParsePackedFromUnpacked) {
137 unittest::TestUnpackedTypes
source;
138 TestUtil::SetUnpackedFields(&
source);
142 unittest::TestPackedTypes
dest;
148 TestUtil::ExpectPackedFieldsSet(
dest);
151 TEST(WireFormatTest, ParseUnpackedFromPacked) {
153 unittest::TestPackedTypes
source;
154 TestUtil::SetPackedFields(&
source);
158 unittest::TestUnpackedTypes
dest;
164 TestUtil::ExpectUnpackedFieldsSet(
dest);
167 TEST(WireFormatTest, ParsePackedExtensions) {
172 TestUtil::SetPackedExtensions(&
source);
181 TestUtil::ExpectPackedExtensionsSet(
dest);
184 TEST(WireFormatTest, ParseOneof) {
189 TestUtil::SetOneof1(&
source);
198 TestUtil::ExpectOneofSet1(
dest);
201 TEST(WireFormatTest, OneofOnlySetLast) {
202 unittest::TestOneofBackwardsCompatible
source;
203 unittest::TestOneof oneof_dest;
208 source.set_foo_string(
"101");
222 unittest::TestAllTypes
message;
231 TEST(WireFormatTest, ByteSizeExtensions) {
232 unittest::TestAllExtensions
message;
241 TEST(WireFormatTest, ByteSizePacked) {
242 unittest::TestPackedTypes
message;
243 TestUtil::SetPackedFields(&
message);
251 TEST(WireFormatTest, ByteSizePackedExtensions) {
252 unittest::TestPackedExtensions
message;
253 TestUtil::SetPackedExtensions(&
message);
261 TEST(WireFormatTest, ByteSizeOneof) {
272 TEST(WireFormatTest, Serialize) {
273 unittest::TestAllTypes
message;
282 io::StringOutputStream raw_output(&generated_data);
283 io::CodedOutputStream
output(&raw_output);
290 io::StringOutputStream raw_output(&dynamic_data);
291 io::CodedOutputStream
output(&raw_output);
302 TEST(WireFormatTest, SerializeExtensions) {
303 unittest::TestAllExtensions
message;
312 io::StringOutputStream raw_output(&generated_data);
313 io::CodedOutputStream
output(&raw_output);
320 io::StringOutputStream raw_output(&dynamic_data);
321 io::CodedOutputStream
output(&raw_output);
332 TEST(WireFormatTest, SerializeFieldsAndExtensions) {
333 unittest::TestFieldOrderings
message;
342 io::StringOutputStream raw_output(&generated_data);
343 io::CodedOutputStream
output(&raw_output);
350 io::StringOutputStream raw_output(&dynamic_data);
351 io::CodedOutputStream
output(&raw_output);
366 TEST(WireFormatTest, SerializeOneof) {
376 io::StringOutputStream raw_output(&generated_data);
377 io::CodedOutputStream
output(&raw_output);
384 io::StringOutputStream raw_output(&dynamic_data);
385 io::CodedOutputStream
output(&raw_output);
396 TEST(WireFormatTest, ParseMultipleExtensionRanges) {
398 unittest::TestFieldOrderings
source;
405 unittest::TestFieldOrderings
dest;
412 unittest::TestFieldOrderings
dest;
414 io::CodedInputStream coded_input(&
raw_input);
420 const int kUnknownTypeId = 1550055;
422 TEST(WireFormatTest, SerializeMessageSet) {
424 proto2_wireformat_unittest::TestMessageSet message_set;
427 unittest::TestMessageSetExtension1::message_set_extension)
431 unittest::TestMessageSetExtension2::message_set_extension)
433 message_set.mutable_unknown_fields()->AddLengthDelimited(kUnknownTypeId,
440 unittest::RawMessageSet raw;
443 EXPECT_EQ(0, raw.unknown_fields().field_count());
448 raw.item(0).type_id());
451 raw.item(1).type_id());
452 EXPECT_EQ(kUnknownTypeId, raw.item(2).type_id());
454 unittest::TestMessageSetExtension1 message1;
455 EXPECT_TRUE(message1.ParseFromString(raw.item(0).message()));
458 unittest::TestMessageSetExtension2 message2;
459 EXPECT_TRUE(message2.ParseFromString(raw.item(1).message()));
465 TEST(WireFormatTest, SerializeMessageSetVariousWaysAreEqual) {
471 proto2_wireformat_unittest::TestMessageSet message_set;
474 unittest::TestMessageSetExtension1::message_set_extension)
478 unittest::TestMessageSetExtension2::message_set_extension)
480 message_set.mutable_unknown_fields()->AddLengthDelimited(kUnknownTypeId,
483 int size = message_set.ByteSize();
490 flat_data.resize(
size);
491 stream_data.resize(
size);
504 io::CodedOutputStream output_stream(&array_stream);
505 message_set.SerializeWithCachedSizes(&output_stream);
511 io::StringOutputStream string_stream(&dynamic_data);
512 io::CodedOutputStream output_stream(&string_stream);
521 TEST(WireFormatTest, ParseMessageSet) {
523 unittest::RawMessageSet raw;
530 unittest::TestMessageSetExtension1
message;
532 message.SerializeToString(
item->mutable_message());
540 unittest::TestMessageSetExtension2
message;
542 message.SerializeToString(
item->mutable_message());
547 item->set_type_id(kUnknownTypeId);
548 item->set_message(
"bar");
555 proto2_wireformat_unittest::TestMessageSet message_set;
561 unittest::TestMessageSetExtension1::message_set_extension)
566 unittest::TestMessageSetExtension2::message_set_extension)
569 ASSERT_EQ(1, message_set.unknown_fields().field_count());
571 message_set.unknown_fields().field(0).type());
572 EXPECT_EQ(
"bar", message_set.unknown_fields().field(0).length_delimited());
575 proto2_wireformat_unittest::TestMessageSet dynamic_message_set;
576 io::CodedInputStream
input(
reinterpret_cast<const uint8*
>(
data.data()),
579 EXPECT_EQ(message_set.DebugString(), dynamic_message_set.DebugString());
582 TEST(WireFormatTest, ParseMessageSetWithReverseTagOrder) {
585 unittest::TestMessageSetExtension1
message;
589 io::StringOutputStream output_stream(&
data);
590 io::CodedOutputStream coded_output(&output_stream);
596 coded_output.WriteVarint32(
message.ByteSize());
597 message.SerializeWithCachedSizes(&coded_output);
599 uint32 type_id =
message.GetDescriptor()->extension(0)->number();
601 type_id, &coded_output);
605 proto2_wireformat_unittest::TestMessageSet message_set;
611 unittest::TestMessageSetExtension1::message_set_extension)
616 proto2_wireformat_unittest::TestMessageSet message_set;
617 io::CodedInputStream
input(
reinterpret_cast<const uint8*
>(
data.data()),
625 unittest::TestMessageSetExtension1::message_set_extension)
630 void SerializeReverseOrder(
631 const proto2_wireformat_unittest::TestMessageSet& mset,
632 io::CodedOutputStream* coded_output);
634 void SerializeReverseOrder(
const unittest::TestMessageSetExtension1&
message,
635 io::CodedOutputStream* coded_output) {
638 coded_output->WriteVarint32(
message.i());
642 coded_output->WriteVarint32(
message.recursive().GetCachedSize());
643 SerializeReverseOrder(
message.recursive(), coded_output);
646 void SerializeReverseOrder(
647 const proto2_wireformat_unittest::TestMessageSet& mset,
648 io::CodedOutputStream* coded_output) {
649 if (!mset.HasExtension(
650 unittest::TestMessageSetExtension1::message_set_extension))
657 auto&
message = mset.GetExtension(
658 unittest::TestMessageSetExtension1::message_set_extension);
659 coded_output->WriteVarint32(
message.GetCachedSize());
660 SerializeReverseOrder(
message, coded_output);
662 uint32 type_id =
message.GetDescriptor()->extension(0)->number();
668 TEST(WireFormatTest, ParseMessageSetWithDeepRecReverseOrder) {
671 proto2_wireformat_unittest::TestMessageSet message_set;
672 proto2_wireformat_unittest::TestMessageSet* mset = &message_set;
673 for (
int i = 0;
i < 200;
i++) {
674 auto m = mset->MutableExtension(
675 unittest::TestMessageSetExtension1::message_set_extension);
677 mset =
m->mutable_recursive();
679 message_set.ByteSizeLong();
681 io::StringOutputStream output_stream(&
data);
682 io::CodedOutputStream coded_output(&output_stream);
683 SerializeReverseOrder(message_set, &coded_output);
685 proto2_wireformat_unittest::TestMessageSet message_set;
689 TEST(WireFormatTest, ParseBrokenMessageSet) {
690 proto2_wireformat_unittest::TestMessageSet message_set;
695 TEST(WireFormatTest, RecursionLimit) {
696 unittest::TestRecursiveMessage
message;
697 message.mutable_a()->mutable_a()->mutable_a()->mutable_a()->set_i(1);
704 input.SetRecursionLimit(4);
705 unittest::TestRecursiveMessage message2;
712 input.SetRecursionLimit(3);
713 unittest::TestRecursiveMessage message2;
718 TEST(WireFormatTest, UnknownFieldRecursionLimit) {
719 unittest::TestEmptyMessage
message;
720 message.mutable_unknown_fields()
725 ->AddVarint(1234, 123);
732 input.SetRecursionLimit(4);
733 unittest::TestEmptyMessage message2;
740 input.SetRecursionLimit(3);
741 unittest::TestEmptyMessage message2;
746 TEST(WireFormatTest, ZigZag) {
748 #define LL(x) PROTOBUF_LONGLONG(x)
749 #define ULL(x) PROTOBUF_ULONGLONG(x)
750 #define ZigZagEncode32(x) WireFormatLite::ZigZagEncode32(x)
751 #define ZigZagDecode32(x) WireFormatLite::ZigZagDecode32(x)
752 #define ZigZagEncode64(x) WireFormatLite::ZigZagEncode64(x)
753 #define ZigZagDecode64(x) WireFormatLite::ZigZagDecode64(x)
815 TEST(WireFormatTest, RepeatedScalarsDifferentTagSizes) {
818 protobuf_unittest::TestRepeatedScalarDifferentTagSizes msg1, msg2;
819 for (
int i = 0;
i < 100; ++
i) {
820 msg1.add_repeated_fixed32(
i);
821 msg1.add_repeated_int32(
i);
822 msg1.add_repeated_fixed64(
i);
823 msg1.add_repeated_int64(
i);
824 msg1.add_repeated_float(
i);
825 msg1.add_repeated_uint64(
i);
831 field =
desc->FindFieldByName(
"repeated_fixed32");
834 field =
desc->FindFieldByName(
"repeated_int32");
837 field =
desc->FindFieldByName(
"repeated_fixed64");
840 field =
desc->FindFieldByName(
"repeated_int64");
843 field =
desc->FindFieldByName(
"repeated_float");
846 field =
desc->FindFieldByName(
"repeated_uint64");
850 EXPECT_TRUE(msg2.ParseFromString(msg1.SerializeAsString()));
851 EXPECT_EQ(msg1.DebugString(), msg2.DebugString());
854 TEST(WireFormatTest, CompatibleTypes) {
856 unittest::Int64Message msg1;
859 msg1.SerializeToString(&serialized);
862 unittest::BoolMessage msg2;
867 unittest::Uint64Message msg3;
872 unittest::Int32Message msg4;
877 unittest::Uint32Message msg5;
884 Proto3PrimitiveRepeatedWireFormatTest()
892 "\xAA\x02\x04\x01\x00\x00\x00"
893 "\xB2\x02\x08\x01\x00\x00\x00\x00\x00\x00\x00"
894 "\xBA\x02\x04\x01\x00\x00\x00"
895 "\xC2\x02\x08\x01\x00\x00\x00\x00\x00\x00\x00"
896 "\xCA\x02\x04\x00\x00\x80\x3f"
897 "\xD2\x02\x08\x00\x00\x00\x00\x00\x00\xf0\x3f"
908 "\x3A\x04\x01\x00\x00\x00"
909 "\x42\x08\x01\x00\x00\x00\x00\x00\x00\x00"
910 "\x4A\x04\x01\x00\x00\x00"
911 "\x52\x08\x01\x00\x00\x00\x00\x00\x00\x00"
912 "\x5A\x04\x00\x00\x80\x3f"
913 "\x62\x08\x00\x00\x00\x00\x00\x00\xf0\x3f"
924 "\xAD\x02\x01\x00\x00\x00"
925 "\xB1\x02\x01\x00\x00\x00\x00\x00\x00\x00"
926 "\xBD\x02\x01\x00\x00\x00"
927 "\xC1\x02\x01\x00\x00\x00\x00\x00\x00\x00"
928 "\xCD\x02\x00\x00\x80\x3f"
929 "\xD1\x02\x00\x00\x00\x00\x00\x00\xf0\x3f"
940 "\x3D\x01\x00\x00\x00"
941 "\x41\x01\x00\x00\x00\x00\x00\x00\x00"
942 "\x4D\x01\x00\x00\x00"
943 "\x51\x01\x00\x00\x00\x00\x00\x00\x00"
944 "\x5D\x00\x00\x80\x3f"
945 "\x61\x00\x00\x00\x00\x00\x00\xf0\x3f"
949 template <
class Proto>
950 void SetProto3PrimitiveRepeatedFields(Proto*
message) {
951 message->add_repeated_int32(1);
952 message->add_repeated_int64(1);
953 message->add_repeated_uint32(1);
954 message->add_repeated_uint64(1);
955 message->add_repeated_sint32(1);
956 message->add_repeated_sint64(1);
957 message->add_repeated_fixed32(1);
958 message->add_repeated_fixed64(1);
959 message->add_repeated_sfixed32(1);
960 message->add_repeated_sfixed64(1);
961 message->add_repeated_float(1.0);
962 message->add_repeated_double(1.0);
963 message->add_repeated_bool(
true);
964 message->add_repeated_nested_enum(
965 proto3_arena_unittest::TestAllTypes_NestedEnum_FOO);
968 template <
class Proto>
969 void ExpectProto3PrimitiveRepeatedFieldsSet(
const Proto&
message) {
983 EXPECT_EQ(proto3_arena_unittest::TestAllTypes_NestedEnum_FOO,
984 message.repeated_nested_enum(0));
987 template <
class Proto>
989 SetProto3PrimitiveRepeatedFields(
message);
996 io::StringOutputStream raw_output(&generated_data);
997 io::CodedOutputStream
output(&raw_output);
1006 io::StringOutputStream raw_output(&dynamic_data);
1007 io::CodedOutputStream
output(&raw_output);
1014 template <
class Proto>
1017 message->ParseFromString(compatible_data);
1018 ExpectProto3PrimitiveRepeatedFieldsSet(*
message);
1021 io::CodedInputStream
input(
1022 reinterpret_cast<const uint8*
>(compatible_data.data()),
1023 compatible_data.size());
1025 ExpectProto3PrimitiveRepeatedFieldsSet(*
message);
1034 TEST_F(Proto3PrimitiveRepeatedWireFormatTest, Proto3PrimitiveRepeated) {
1035 proto3_arena_unittest::TestAllTypes packed_message;
1036 proto3_arena_unittest::TestUnpackedTypes unpacked_message;
1052 "optional_nested_message");
1058 io::StringOutputStream raw_output(&result);
1059 io::CodedOutputStream
output(&raw_output);
1072 bool include_end_tag) {
1080 io::StringOutputStream raw_output(&result);
1081 io::CodedOutputStream
output(&raw_output);
1085 if (include_end_tag) {
1095 TEST_F(WireFormatInvalidInputTest, InvalidSubMessage) {
1096 unittest::TestAllTypes
message;
1114 TEST_F(WireFormatInvalidInputTest, InvalidMessageWithExtraZero) {
1118 unittest::TestAllTypes
message;
1119 message.set_optional_int32(1);
1126 io::ArrayInputStream ais(
data.data(),
data.size());
1127 io::CodedInputStream is(&ais);
1128 unittest::TestAllTypes
message;
1136 TEST_F(WireFormatInvalidInputTest, InvalidGroup) {
1137 unittest::TestAllTypes
message;
1158 TEST_F(WireFormatInvalidInputTest, InvalidUnknownGroup) {
1161 unittest::TestEmptyMessage
message;
1182 TEST_F(WireFormatInvalidInputTest, InvalidStringInUnknownGroup) {
1186 unittest::TestAllTypes
message;
1187 message.set_optional_string(
"foo foo foo foo");
1197 io::CodedInputStream coded_input(&
raw_input);
1211 const char* kInvalidUTF8String =
"Invalid UTF-8: \xA0\xB0\xC0\xD0";
1214 const char* kValidUTF8String =
"Valid UTF-8: \x01\x02\350\260\267\346\255\214";
1216 template <
typename T>
1219 wire_buffer->clear();
1220 message->AppendToString(wire_buffer);
1221 return (wire_buffer->size() > 0);
1224 template <
typename T>
1226 return message->ParseFromArray(wire_buffer.data(), wire_buffer.size());
1231 Utf8ValidationTest() {}
1232 virtual ~Utf8ValidationTest() {}
1233 virtual void SetUp() {
1238 TEST_F(Utf8ValidationTest, WriteInvalidUTF8String) {
1240 protobuf_unittest::OneString
input;
1241 std::vector<std::string>
errors;
1243 ScopedMemoryLog log;
1244 WriteMessage(kInvalidUTF8String, &
input, &wire_buffer);
1247 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1251 "String field 'protobuf_unittest.OneString.data' "
1252 "contains invalid UTF-8 data when "
1253 "serializing a protocol buffer. Use the "
1254 "'bytes' type if you intend to send raw bytes."));
1257 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1261 TEST_F(Utf8ValidationTest, ReadInvalidUTF8String) {
1263 protobuf_unittest::OneString
input;
1264 WriteMessage(kInvalidUTF8String, &
input, &wire_buffer);
1265 protobuf_unittest::OneString
output;
1266 std::vector<std::string>
errors;
1268 ScopedMemoryLog log;
1269 ReadMessage(wire_buffer, &
output);
1272 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1276 "String field 'protobuf_unittest.OneString.data' "
1277 "contains invalid UTF-8 data when "
1278 "parsing a protocol buffer. Use the "
1279 "'bytes' type if you intend to send raw bytes."));
1283 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1287 TEST_F(Utf8ValidationTest, WriteValidUTF8String) {
1289 protobuf_unittest::OneString
input;
1290 std::vector<std::string>
errors;
1292 ScopedMemoryLog log;
1293 WriteMessage(kValidUTF8String, &
input, &wire_buffer);
1299 TEST_F(Utf8ValidationTest, ReadValidUTF8String) {
1301 protobuf_unittest::OneString
input;
1302 WriteMessage(kValidUTF8String, &
input, &wire_buffer);
1303 protobuf_unittest::OneString
output;
1304 std::vector<std::string>
errors;
1306 ScopedMemoryLog log;
1307 ReadMessage(wire_buffer, &
output);
1315 TEST_F(Utf8ValidationTest, WriteArbitraryBytes) {
1317 protobuf_unittest::OneBytes
input;
1318 std::vector<std::string>
errors;
1320 ScopedMemoryLog log;
1321 WriteMessage(kInvalidUTF8String, &
input, &wire_buffer);
1327 TEST_F(Utf8ValidationTest, ReadArbitraryBytes) {
1329 protobuf_unittest::OneBytes
input;
1330 WriteMessage(kInvalidUTF8String, &
input, &wire_buffer);
1331 protobuf_unittest::OneBytes
output;
1332 std::vector<std::string>
errors;
1334 ScopedMemoryLog log;
1335 ReadMessage(wire_buffer, &
output);
1342 TEST_F(Utf8ValidationTest, ParseRepeatedString) {
1343 protobuf_unittest::MoreBytes
input;
1344 input.add_data(kValidUTF8String);
1345 input.add_data(kInvalidUTF8String);
1346 input.add_data(kInvalidUTF8String);
1349 protobuf_unittest::MoreString
output;
1350 std::vector<std::string>
errors;
1352 ScopedMemoryLog log;
1353 ReadMessage(wire_buffer, &
output);
1356 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1360 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1366 TEST_F(Utf8ValidationTest, OldVerifyUTF8String) {
1369 std::vector<std::string>
errors;
1371 ScopedMemoryLog log;
1376 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
1380 "String field contains invalid UTF-8 data when "
1381 "serializing a protocol buffer. Use the "
1382 "'bytes' type if you intend to send raw bytes."));
1393 for (
int n = 0;
n < 10;
n++) {
1396 v.Add((1 <<
n) - 1);
1400 size_t expected = 0;
1401 for (
int i = 0;
i <
v.size();
i++) {
1412 for (
int n = 0;
n < 10;
n++) {
1415 v.Add((1 <<
n) - 1);
1419 size_t expected = 0;
1420 for (
int i = 0;
i <
v.size();
i++) {
1427 TEST(RepeatedVarint, SInt32) {
1431 for (
int n = 0;
n < 10;
n++) {
1434 v.Add((1 <<
n) - 1);
1438 size_t expected = 0;
1439 for (
int i = 0;
i <
v.size();
i++) {
1446 TEST(RepeatedVarint, SInt64) {
1450 for (
int n = 0;
n < 10;
n++) {
1453 v.Add((1 <<
n) - 1);
1457 size_t expected = 0;
1458 for (
int i = 0;
i <
v.size();
i++) {
1469 for (
int n = 0;
n < 10;
n++) {
1471 v.Add((1 <<
n) - 1);
1475 size_t expected = 0;
1476 for (
int i = 0;
i <
v.size();
i++) {
1487 for (
int n = 0;
n < 10;
n++) {
1489 v.Add((1 <<
n) - 1);
1493 size_t expected = 0;
1494 for (
int i = 0;
i <
v.size();
i++) {
1505 for (
int n = 0;
n < 10;
n++) {
1507 v.Add((1 <<
n) - 1);
1511 size_t expected = 0;
1512 for (
int i = 0;
i <
v.size();
i++) {