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