@@ -581,28 +581,54 @@ TEST(WireFormatTest, ParseMessageSet) {
581
581
EXPECT_EQ(message_set.DebugString(), dynamic_message_set.DebugString());
582
582
}
583
583
584
- TEST(WireFormatTest, ParseMessageSetWithReverseTagOrder) {
584
+ namespace {
585
+ std::string BuildMessageSetItemStart() {
585
586
std::string data;
586
587
{
587
- UNITTEST::TestMessageSetExtension1 message;
588
- message.set_i(123);
589
- // Build a MessageSet manually with its message content put before its
590
- // type_id.
591
588
io::StringOutputStream output_stream(&data);
592
589
io::CodedOutputStream coded_output(&output_stream);
593
590
coded_output.WriteTag(WireFormatLite::kMessageSetItemStartTag);
591
+ }
592
+ return data;
593
+ }
594
+ std::string BuildMessageSetItemEnd() {
595
+ std::string data;
596
+ {
597
+ io::StringOutputStream output_stream(&data);
598
+ io::CodedOutputStream coded_output(&output_stream);
599
+ coded_output.WriteTag(WireFormatLite::kMessageSetItemEndTag);
600
+ }
601
+ return data;
602
+ }
603
+ std::string BuildMessageSetTestExtension1(int value = 123) {
604
+ std::string data;
605
+ {
606
+ UNITTEST::TestMessageSetExtension1 message;
607
+ message.set_i(value);
608
+ io::StringOutputStream output_stream(&data);
609
+ io::CodedOutputStream coded_output(&output_stream);
594
610
// Write the message content first.
595
611
WireFormatLite::WriteTag(WireFormatLite::kMessageSetMessageNumber,
596
612
WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
597
613
&coded_output);
598
614
coded_output.WriteVarint32(message.ByteSizeLong());
599
615
message.SerializeWithCachedSizes(&coded_output);
600
- // Write the type id.
601
- uint32_t type_id = message.GetDescriptor()->extension(0)->number();
616
+ }
617
+ return data;
618
+ }
619
+ std::string BuildMessageSetItemTypeId(int extension_number) {
620
+ std::string data;
621
+ {
622
+ io::StringOutputStream output_stream(&data);
623
+ io::CodedOutputStream coded_output(&output_stream);
602
624
WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber,
603
- type_id, &coded_output);
604
- coded_output.WriteTag(WireFormatLite::kMessageSetItemEndTag);
625
+ extension_number, &coded_output);
605
626
}
627
+ return data;
628
+ }
629
+ void ValidateTestMessageSet(const std::string & test_case,
630
+ const std::string & data) {
631
+ SCOPED_TRACE(test_case);
606
632
{
607
633
PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set;
608
634
ASSERT_TRUE(message_set.ParseFromString(data));
@@ -612,6 +638,11 @@ TEST(WireFormatTest, ParseMessageSetWithReverseTagOrder) {
612
638
.GetExtension(
613
639
UNITTEST::TestMessageSetExtension1::message_set_extension)
614
640
.i());
641
+
642
+ // Make sure it does not contain anything else.
643
+ message_set.ClearExtension(
644
+ UNITTEST::TestMessageSetExtension1::message_set_extension);
645
+ EXPECT_EQ(message_set.SerializeAsString(), "" );
615
646
}
616
647
{
617
648
// Test parse the message via Reflection.
@@ -627,6 +658,61 @@ TEST(WireFormatTest, ParseMessageSetWithReverseTagOrder) {
627
658
UNITTEST::TestMessageSetExtension1::message_set_extension)
628
659
.i());
629
660
}
661
+ {
662
+ // Test parse the message via DynamicMessage.
663
+ DynamicMessageFactory factory;
664
+ std::unique_ptr<Message> msg(
665
+ factory
666
+ .GetPrototype(
667
+ PROTO2_WIREFORMAT_UNITTEST::TestMessageSet::descriptor())
668
+ ->New());
669
+ msg->ParseFromString(data);
670
+ auto* reflection = msg->GetReflection();
671
+ std::vector<const FieldDescriptor*> fields;
672
+ reflection->ListFields(*msg, &fields);
673
+ ASSERT_EQ(fields.size(), 1);
674
+ const auto& sub = reflection->GetMessage(*msg, fields[0]);
675
+ reflection = sub.GetReflection();
676
+ EXPECT_EQ(123, reflection->GetInt32(
677
+ sub, sub.GetDescriptor()->FindFieldByName("i" )));
678
+ }
679
+ }
680
+ } // namespace
681
+
682
+ TEST(WireFormatTest, ParseMessageSetWithAnyTagOrder) {
683
+ std::string start = BuildMessageSetItemStart();
684
+ std::string end = BuildMessageSetItemEnd();
685
+ std::string id = BuildMessageSetItemTypeId(
686
+ UNITTEST::TestMessageSetExtension1::descriptor()->extension(0)->number());
687
+ std::string message = BuildMessageSetTestExtension1();
688
+
689
+ ValidateTestMessageSet("id + message" , start + id + message + end);
690
+ ValidateTestMessageSet("message + id" , start + message + id + end);
691
+ }
692
+
693
+ TEST(WireFormatTest, ParseMessageSetWithDuplicateTags) {
694
+ std::string start = BuildMessageSetItemStart();
695
+ std::string end = BuildMessageSetItemEnd();
696
+ std::string id = BuildMessageSetItemTypeId(
697
+ UNITTEST::TestMessageSetExtension1::descriptor()->extension(0)->number());
698
+ std::string other_id = BuildMessageSetItemTypeId(123456);
699
+ std::string message = BuildMessageSetTestExtension1();
700
+ std::string other_message = BuildMessageSetTestExtension1(321);
701
+
702
+ // Double id
703
+ ValidateTestMessageSet("id + other_id + message" ,
704
+ start + id + other_id + message + end);
705
+ ValidateTestMessageSet("id + message + other_id" ,
706
+ start + id + message + other_id + end);
707
+ ValidateTestMessageSet("message + id + other_id" ,
708
+ start + message + id + other_id + end);
709
+ // Double message
710
+ ValidateTestMessageSet("id + message + other_message" ,
711
+ start + id + message + other_message + end);
712
+ ValidateTestMessageSet("message + id + other_message" ,
713
+ start + message + id + other_message + end);
714
+ ValidateTestMessageSet("message + other_message + id" ,
715
+ start + message + other_message + id + end);
630
716
}
631
717
632
718
void SerializeReverseOrder(
0 commit comments