@@ -580,28 +580,54 @@ TEST(WireFormatTest, ParseMessageSet) {
580580 EXPECT_EQ (message_set.DebugString (), dynamic_message_set.DebugString ());
581581}
582582
583- TEST (WireFormatTest, ParseMessageSetWithReverseTagOrder) {
583+ namespace {
584+ std ::string BuildMessageSetItemStart () {
584585 std ::string data;
585586 {
586- UNITTEST ::TestMessageSetExtension1 message;
587- message.set_i (123 );
588- // Build a MessageSet manually with its message content put before its
589- // type_id.
590587 io ::StringOutputStream output_stream (& data);
591588 io ::CodedOutputStream coded_output (& output_stream);
592589 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);
593609 // Write the message content first.
594610 WireFormatLite ::WriteTag (WireFormatLite ::kMessageSetMessageNumber,
595611 WireFormatLite ::WIRETYPE_LENGTH_DELIMITED,
596612 & coded_output);
597613 coded_output.WriteVarint32 (message.ByteSizeLong ());
598614 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);
601623 WireFormatLite ::WriteUInt32 (WireFormatLite ::kMessageSetTypeIdNumber,
602- type_id, & coded_output);
603- coded_output.WriteTag (WireFormatLite ::kMessageSetItemEndTag);
624+ extension_number, & coded_output);
604625 }
626+ return data;
627+ }
628+ void ValidateTestMessageSet (const std ::string& test_case,
629+ const std ::string& data) {
630+ SCOPED_TRACE (test_case);
605631 {
606632 PROTO2_WIREFORMAT_UNITTEST ::TestMessageSet message_set;
607633 ASSERT_TRUE (message_set.ParseFromString (data));
@@ -611,6 +637,11 @@ TEST(WireFormatTest, ParseMessageSetWithReverseTagOrder) {
611637 .GetExtension (
612638 UNITTEST ::TestMessageSetExtension1 ::message_set_extension)
613639 .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 (), " " );
614645 }
615646 {
616647 // Test parse the message via Reflection.
@@ -626,6 +657,61 @@ TEST(WireFormatTest, ParseMessageSetWithReverseTagOrder) {
626657 UNITTEST ::TestMessageSetExtension1 ::message_set_extension)
627658 .i ());
628659 }
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);
629715}
630716
631717void SerializeReverseOrder (
0 commit comments