@@ -471,6 +471,43 @@ TEST(DecodeTest, MaxDepthPayloadParsesSuccessfully) {
471471 }
472472}
473473
474+ TEST (DecodeTest, DecodeGroupFieldFromDelimitedWireFormatAsUnknown) {
475+ upb::Arena mt_arena;
476+ upb::Arena msg_arena;
477+
478+ // 1. Create Parent MiniTable containing a repeated Group field directly.
479+ auto [parent_mt, parent_field] =
480+ test::MiniTable::MakeSingleFieldTable<test::field_types::Group>(
481+ 5 , kUpb_DecodeFast_Repeated , mt_arena.ptr ());
482+
483+ // 2. Build length-delimited wire payload for Group field 5:
484+ // Tag 5 Delimited = 42 (0x2a), length = 2, child field 1 = 123 ("\x08\x7b").
485+ std::string payload (" \x2a\x02\x08\x7b " , 4 );
486+
487+ // 3. Parse the payload into Parent Message.
488+ upb_Message* parent_msg = upb_Message_New (parent_mt, msg_arena.ptr ());
489+ upb_DecodeStatus result =
490+ upb_Decode (payload.data (), payload.size (), parent_msg, parent_mt, nullptr ,
491+ 0 , msg_arena.ptr ());
492+
493+ // 4. Verify parsing succeeded cleanly.
494+ ASSERT_EQ (result, kUpb_DecodeStatus_Ok ) << upb_DecodeStatus_String (result);
495+
496+ // 5. Verify repeated Group field 5 was NOT populated as a known field.
497+ const upb_Array* arr = upb_Message_GetArray (parent_msg, parent_field);
498+ EXPECT_EQ (arr, nullptr );
499+
500+ // 6. Verify the wire payload was instead preserved inside the Unknown field
501+ // set.
502+ EXPECT_TRUE (upb_Message_HasUnknown (parent_msg));
503+
504+ uintptr_t iter = kUpb_Message_UnknownBegin ;
505+ upb_StringView data;
506+ ASSERT_TRUE (upb_Message_NextUnknown (parent_msg, &data, &iter));
507+ EXPECT_EQ (absl::string_view (data.data , data.size ), payload);
508+ EXPECT_FALSE (upb_Message_NextUnknown (parent_msg, &data, &iter));
509+ }
510+
474511} // namespace
475512
476513} // namespace test
0 commit comments