+59
-21
lines changedFilter options
+59
-21
lines changed Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
1
-
Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.SubmessageEncoding.NotUnknown.ProtobufOutput # Output was not equivalent to reference message: added: message_set_correct.(protobuf_test_messages.proto2.TestAllTypesProto2.Ext
2
1
Required.*.JsonInput.Int32FieldQuotedExponentialValue.* # Failed to parse input or produce output.
3
2
Required.*.JsonInput.AnyWithNoType.* # Failed to parse input or produce output.
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
1
-
Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.SubmessageEncoding.NotUnknown.ProtobufOutput # Output was not equivalent to reference message: added: message_set_correct.(protobuf_test_messages.proto2.TestAllTypesProto2.Ext
2
1
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
1
-
Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.SubmessageEncoding.NotUnknown.ProtobufOutput # Output was not equivalent to reference message: added: message_set_correct.(protobuf_test_messages.proto2.TestAllTypesProto2.Ext
2
1
Required.*.JsonInput.Int32FieldQuotedExponentialValue.* # Failed to parse input or produce output.
3
-
Required.*.JsonInput.AnyWithNoType.*
2
+
Required.*.JsonInput.AnyWithNoType.*
Original file line number Diff line number Diff line change
@@ -333,6 +333,38 @@ TEST(MessageTest, UnknownMessageSet) {
333
333
EXPECT_FALSE(upb_test_FakeMessageSet_Item_has_unknowngroup(items[0]));
334
334
}
335
335
336
+
TEST(MessageTest, MessageSetSubmessageEncoding) {
337
+
upb::Arena arena;
338
+
339
+
// Create a normal extension message and use the set the doppelgänger message
340
+
// set member extension on it. This will allow us to serialize as a normal
341
+
// extension and then attempt to parse it as a message set.
342
+
// This mimics the behavior of an encoder that is message set unaware.
343
+
upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());
344
+
upb_test_MessageSetMember* ext_member =
345
+
upb_test_MessageSetMember_new(arena.ptr());
346
+
upb_test_MessageSetMember_set_optional_int32(ext_member, 234);
347
+
upb_test_MessageSetMember_set_doppelganger_message_set_extension(
348
+
ext_msg, ext_member, arena.ptr());
349
+
350
+
size_t size;
351
+
char* serialized =
352
+
upb_test_TestExtensions_serialize(ext_msg, arena.ptr(), &size);
353
+
ASSERT_TRUE(serialized != nullptr);
354
+
ASSERT_GE(size, 0);
355
+
356
+
upb::DefPool defpool;
357
+
upb::MessageDefPtr m(upb_test_TestMessageSet_getmsgdef(defpool.ptr()));
358
+
EXPECT_TRUE(m.ptr() != nullptr);
359
+
360
+
upb_test_TestMessageSet* message_set = upb_test_TestMessageSet_parse_ex(
361
+
serialized, size, upb_DefPool_ExtensionRegistry(defpool.ptr()), 0,
362
+
arena.ptr());
363
+
ASSERT_TRUE(message_set != nullptr);
364
+
365
+
VerifyMessageSet(message_set);
366
+
}
367
+
336
368
TEST(MessageTest, Proto2Enum) {
337
369
upb::Arena arena;
338
370
upb_test_Proto2FakeEnumMessage* fake_msg =
Original file line number Diff line number Diff line change
@@ -41,7 +41,12 @@ message TestMessageSet {
41
41
message MessageSetMember {
42
42
optional int32 optional_int32 = 1;
43
43
extend TestMessageSet {
44
-
optional MessageSetMember message_set_extension = 4;
44
+
optional MessageSetMember message_set_extension = 2000;
45
+
}
46
+
// Also extend a non-MessageSet with the same field number. This will allow us
47
+
// to test parsing a normal extension into a MessageSet.
48
+
extend TestExtensions {
49
+
optional MessageSetMember doppelganger_message_set_extension = 2000;
45
50
}
46
51
}
47
52
Original file line number Diff line number Diff line change
@@ -930,7 +930,8 @@ static const char* upb_Decoder_DecodeMessageSetItem(
930
930
static const upb_MiniTableField* _upb_Decoder_FindField(upb_Decoder* d,
931
931
const upb_MiniTable* t,
932
932
uint32_t field_number,
933
-
int* last_field_index) {
933
+
int* last_field_index,
934
+
int wire_type) {
934
935
static upb_MiniTableField none = {
935
936
0, 0, 0, 0, kUpb_FakeFieldType_FieldNotFound, 0};
936
937
if (t == NULL) return &none;
@@ -959,20 +960,22 @@ static const upb_MiniTableField* _upb_Decoder_FindField(upb_Decoder* d,
959
960
}
960
961
961
962
if (d->extreg) {
962
-
switch (t->UPB_PRIVATE(ext)) {
963
-
case kUpb_ExtMode_Extendable: {
964
-
const upb_MiniTableExtension* ext =
965
-
upb_ExtensionRegistry_Lookup(d->extreg, t, field_number);
966
-
if (ext) return &ext->UPB_PRIVATE(field);
967
-
break;
963
+
int ext_mode = t->UPB_PRIVATE(ext);
964
+
// Treat a message set as an extendable message if it is a delimited field.
965
+
// This provides compatibility with encoders that are unaware of message
966
+
// sets and serialize them as normal extensions.
967
+
if (ext_mode == kUpb_ExtMode_Extendable ||
968
+
(ext_mode == kUpb_ExtMode_IsMessageSet &&
969
+
wire_type == kUpb_WireType_Delimited)) {
970
+
const upb_MiniTableExtension* ext =
971
+
upb_ExtensionRegistry_Lookup(d->extreg, t, field_number);
972
+
if (ext) return &ext->UPB_PRIVATE(field);
973
+
} else if (ext_mode == kUpb_ExtMode_IsMessageSet) {
974
+
if (field_number == kUpb_MsgSet_Item) {
975
+
static upb_MiniTableField item = {
976
+
0, 0, 0, 0, kUpb_FakeFieldType_MessageSetItem, 0};
977
+
return &item;
968
978
}
969
-
case kUpb_ExtMode_IsMessageSet:
970
-
if (field_number == kUpb_MsgSet_Item) {
971
-
static upb_MiniTableField item = {
972
-
0, 0, 0, 0, kUpb_FakeFieldType_MessageSetItem, 0};
973
-
return &item;
974
-
}
975
-
break;
976
979
}
977
980
}
978
981
@@ -1073,7 +1076,7 @@ static int _upb_Decoder_GetDelimitedOp(upb_Decoder* d, const upb_MiniTable* mt,
1073
1076
[kUpb_FieldType_SFixed64] = kUpb_DecodeOp_UnknownField,
1074
1077
[kUpb_FieldType_SInt32] = kUpb_DecodeOp_UnknownField,
1075
1078
[kUpb_FieldType_SInt64] = kUpb_DecodeOp_UnknownField,
1076
-
[kUpb_FakeFieldType_MessageSetItem] = kUpb_DecodeOp_UnknownField,
1079
+
[kUpb_FakeFieldType_MessageSetItem] = kUpb_DecodeOp_SubMessage,
1077
1080
// For repeated field type.
1078
1081
[kRepeatedBase + kUpb_FieldType_Double] = OP_FIXPCK_LG2(3),
1079
1082
[kRepeatedBase + kUpb_FieldType_Float] = OP_FIXPCK_LG2(2),
@@ -1320,7 +1323,8 @@ static const char* _upb_Decoder_DecodeMessage(upb_Decoder* d, const char* ptr,
1320
1323
return ptr;
1321
1324
}
1322
1325
1323
-
field = _upb_Decoder_FindField(d, layout, field_number, &last_field_index);
1326
+
field = _upb_Decoder_FindField(d, layout, field_number, &last_field_index,
1327
+
wire_type);
1324
1328
ptr = _upb_Decoder_DecodeWireValue(d, ptr, layout, field, wire_type, &val,
1325
1329
&op);
1326
1330
You can’t perform that action at this time.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4