Skip to content

Commit

Permalink
Fixed message equality for extensions.
Browse files Browse the repository at this point in the history
  • Loading branch information
haberman committed Dec 31, 2021
1 parent 627c44b commit 480a33f
Show file tree
Hide file tree
Showing 8 changed files with 16 additions and 132 deletions.
28 changes: 16 additions & 12 deletions python/convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -319,22 +319,23 @@ bool PyUpb_Array_IsEqual(const upb_array *arr1, const upb_array *arr2,

bool PyUpb_Message_IsEqual(const upb_msg *msg1, const upb_msg *msg2,
const upb_msgdef *m) {
const upb_symtab* symtab = upb_filedef_symtab(upb_msgdef_file(m));
size_t iter1 = UPB_MSG_BEGIN;
size_t iter2 = UPB_MSG_BEGIN;

if (msg1 == msg2) return true;
if (upb_msg_extcount(msg1) != upb_msg_extcount(msg2)) return false;

while (true) {
const upb_fielddef *f1, *f2;
upb_msgval val1, val2;
bool ok1 = msg1 && upb_msg_next(msg1, m, NULL, &f1, &val1, &iter1);
bool ok2 = msg2 && upb_msg_next(msg2, m, NULL, &f2, &val2, &iter2);
if (ok1 != ok2) return false;
if (!ok1) break; // Both messages are at end.

// If the two messages yielded different "next" fields, then the set of
// present fields is different.
if (f1 != f2) return false;
const upb_fielddef *f1, *f2;
upb_msgval val1, val2;
while (upb_msg_next(msg1, m, symtab, &f1, &val1, &iter1)) {
if (upb_fielddef_isextension(f1)) {
val2 = upb_msg_get(msg2, f1);
} else {
if (!upb_msg_next(msg2, m, NULL, &f2, &val2, &iter2) || f1 != f2) {
return false;
}
}

if (upb_fielddef_ismap(f1)) {
if (!PyUpb_Map_IsEqual(val1.map_val, val2.map_val, f1)) return false;
Expand All @@ -347,10 +348,13 @@ bool PyUpb_Message_IsEqual(const upb_msg *msg1, const upb_msg *msg2,
}
}

if (upb_msg_next(msg2, m, NULL, &f2, &val2, &iter2)) return false;

size_t usize1, usize2;
const char *uf1 = upb_msg_getunknown(msg1, &usize1);
const char *uf2 = upb_msg_getunknown(msg2, &usize2);
// 100 is arbitrary, we're trying to prevent stack overflow but it's not
// obvious how deep we should allow here.
return upb_Message_UnknownFieldsAreEqual(uf1, usize1, uf2, usize2, 100);
return upb_Message_UnknownFieldsAreEqual(uf1, usize1, uf2, usize2, 100) ==
kUpb_UnknownCompareResult_Equal;
}
10 changes: 0 additions & 10 deletions python/pb_unit_tests/descriptor_test_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,6 @@
from google.protobuf.internal import descriptor_test
import unittest

descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_AllExtensions.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_EmptyMessage.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_FileDescriptor.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_ForeignEnum.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_ForeignNestedMessage.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_MethodDescriptor.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_NestedMessage.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_Options.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_ServiceDescriptor.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_SeveralExtensions.__unittest_expecting_failure__ = True
descriptor_test.DescriptorCopyToProtoTest.testCopyToProto_TypeError.__unittest_expecting_failure__ = True
descriptor_test.GeneratedDescriptorTest.testDescriptor.__unittest_expecting_failure__ = True
descriptor_test.MakeDescriptorTest.testCamelcaseName.__unittest_expecting_failure__ = True
Expand Down
21 changes: 0 additions & 21 deletions python/pb_unit_tests/json_format_test_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,33 +26,12 @@
from google.protobuf.internal import json_format_test
import unittest

json_format_test.JsonFormatTest.testAllFieldsToJson.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testAlwaysSeriliaze.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testAnyMessage.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testDurationMessage.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testEmptyMessageToJson.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testExtensionSerializationDictMatchesProto3Spec.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testExtensionSerializationJsonMatchesProto3Spec.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testExtensionToDictAndBack.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testExtensionToDictAndBackWithScalar.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testExtensionToJsonAndBack.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testFieldMaskMessage.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testFloatPrecision.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testInvalidMap.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testJsonEscapeString.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testJsonName.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testListValueMessage.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testMapFields.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testNullValue.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testOneofFields.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testParseNull.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testPartialMessageToJson.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testStructMessage.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testTimestampMessage.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testUnknownEnumToJsonAndBack.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testValueMessage.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testWellKnownInAnyMessage.__unittest_expecting_failure__ = True
json_format_test.JsonFormatTest.testWrapperMessage.__unittest_expecting_failure__ = True

if __name__ == '__main__':
unittest.main(module=json_format_test, verbosity=2)
12 changes: 0 additions & 12 deletions python/pb_unit_tests/message_test_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,27 +44,15 @@
message_test.MessageTest.testHighPrecisionDoublePrinting_proto3.__unittest_expecting_failure__ = True
message_test.MessageTest.testInsertRepeatedCompositeField_proto2.__unittest_expecting_failure__ = True
message_test.MessageTest.testInsertRepeatedCompositeField_proto3.__unittest_expecting_failure__ = True
message_test.MessageTest.testPickleNestedMessage_proto2.__unittest_expecting_failure__ = True
message_test.MessageTest.testPickleNestedMessage_proto3.__unittest_expecting_failure__ = True
message_test.MessageTest.testPickleNestedNestedMessage_proto2.__unittest_expecting_failure__ = True
message_test.MessageTest.testPickleNestedNestedMessage_proto3.__unittest_expecting_failure__ = True
message_test.MessageTest.testPickleSupport_proto2.__unittest_expecting_failure__ = True
message_test.MessageTest.testPickleSupport_proto3.__unittest_expecting_failure__ = True
message_test.MessageTest.testRepeatedContains_proto2.__unittest_expecting_failure__ = True
message_test.MessageTest.testRepeatedContains_proto3.__unittest_expecting_failure__ = True
message_test.Proto2Test.testExtensionsErrors.__unittest_expecting_failure__ = True
message_test.Proto2Test.testGoldenExtensions.__unittest_expecting_failure__ = True
message_test.Proto2Test.testGoldenPackedExtensions.__unittest_expecting_failure__ = True
message_test.Proto2Test.testParsingMerge.__unittest_expecting_failure__ = True
message_test.Proto2Test.testPickleIncompleteProto.__unittest_expecting_failure__ = True
message_test.Proto2Test.testPythonicInit.__unittest_expecting_failure__ = True
message_test.Proto2Test.test_documentation.__unittest_expecting_failure__ = True
message_test.Proto3Test.testCopyFromBadType.__unittest_expecting_failure__ = True
message_test.Proto3Test.testMapAssignmentCausesPresence.__unittest_expecting_failure__ = True
message_test.Proto3Test.testMapAssignmentCausesPresenceForSubmessages.__unittest_expecting_failure__ = True
message_test.Proto3Test.testMapDeterministicSerialization.__unittest_expecting_failure__ = True
message_test.Proto3Test.testMapMergeFrom.__unittest_expecting_failure__ = True
message_test.Proto3Test.testMergeFrom.__unittest_expecting_failure__ = True
message_test.Proto3Test.testMergeFromBadType.__unittest_expecting_failure__ = True
message_test.OversizeProtosTest.testAssertOversizeProto.__unittest_expecting_failure__ = True
message_test.OversizeProtosTest.testSucceedOversizeProto.__unittest_expecting_failure__ = True
Expand Down
27 changes: 0 additions & 27 deletions python/pb_unit_tests/reflection_test_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,18 @@
reflection_test.ByteSizeTest.testRepeatedCompositesDelete.__unittest_expecting_failure__ = True
reflection_test.ByteSizeTest.testRepeatedScalarsRemove.__unittest_expecting_failure__ = True
reflection_test.ClassAPITest.testMakeClassWithNestedDescriptor.__unittest_expecting_failure__ = True
reflection_test.ExtensionEqualityTest.testExtensionEquality.__unittest_expecting_failure__ = True
reflection_test.MutualRecursionEqualityTest.testEqualityWithMutualRecursion.__unittest_expecting_failure__ = True
reflection_test.OptionsTest.testMessageOptions.__unittest_expecting_failure__ = True
reflection_test.OptionsTest.testPackedOptions.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testClear.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testExtensionContainsError.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testExtensionDelete.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testExtensionFailureModes.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testExtensionIter.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testIsInitialized.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testListFieldsAndExtensions.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testNestedExtensions.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedCompositeConstructor.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedCompositeRemove.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedCompositeReverse_Empty.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedCompositeReverse_NonEmpty.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedComposites.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedListExtensions.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedScalars.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedScalarsRemove.__unittest_expecting_failure__ = True
Expand All @@ -61,8 +56,6 @@
reflection_test.ReflectionTest.testClearFieldWithUnknownFieldName_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testConstructorTypeError_proto2.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testConstructorTypeError_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testCopyFromAllFields_proto2.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testCopyFromAllFields_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testDeepCopy_proto2.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testDeepCopy_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testDisconnectingBeforeClear_proto2.__unittest_expecting_failure__ = True
Expand All @@ -75,16 +68,10 @@
reflection_test.ReflectionTest.testEnum_Value_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testIllegalValuesForIntegers_proto2.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testIllegalValuesForIntegers_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testMergeFromAllFields_proto2.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testMergeFromAllFields_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testMixedConstructor_proto2.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testMixedConstructor_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testRepeatedScalarTypeSafety_proto2.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testRepeatedScalarTypeSafety_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testSingleScalarTypeSafety_proto2.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testSingleScalarTypeSafety_proto3.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testStaticParseFrom_proto2.__unittest_expecting_failure__ = True
reflection_test.ReflectionTest.testStaticParseFrom_proto3.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testCanonicalSerializationOrder.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testCanonicalSerializationOrderSameAsCpp.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testExtensionFieldNumbers.__unittest_expecting_failure__ = True
Expand All @@ -97,22 +84,8 @@
reflection_test.SerializationTest.testInitRequiredForeignKwargs.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testInitRequiredKwargs.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testMessageSetWireFormat.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testParsePackedFromUnpacked.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testParseUnpackedFromPacked.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeAllExtensions.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeAllFields.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeAllPackedExtensions.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeAllPackedFields.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeEmtpyMessage.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeNegativeValues.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeUninitialized.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeUninitializedSubMessage.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeWithOptionalGroup.__unittest_expecting_failure__ = True
reflection_test.TestAllTypesEqualityTest.testEmptyProtosEqual.__unittest_expecting_failure__ = True
reflection_test.FullProtosEqualityTest.testAllFieldsFilledEquality.__unittest_expecting_failure__ = True
reflection_test.FullProtosEqualityTest.testNonRepeatedComposite.__unittest_expecting_failure__ = True
reflection_test.FullProtosEqualityTest.testNonRepeatedCompositeHasBits.__unittest_expecting_failure__ = True
reflection_test.FullProtosEqualityTest.testRepeatedComposite.__unittest_expecting_failure__ = True

if __name__ == '__main__':
unittest.main(module=reflection_test, verbosity=2)
Loading

0 comments on commit 480a33f

Please sign in to comment.