Skip to content

Commit

Permalink
[ObjC] Update tests to use both unknown fields apis.
Browse files Browse the repository at this point in the history
Also fixes edge case where merging into an autocreated message for a field
wasn't marking the field as set in the parent.

PiperOrigin-RevId: 655196339
  • Loading branch information
thomasvl authored and copybara-github committed Jul 23, 2024
1 parent af3012b commit 5ceae5f
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 3 deletions.
1 change: 1 addition & 0 deletions objectivec/GPBMessage.m
Original file line number Diff line number Diff line change
Expand Up @@ -2085,6 +2085,7 @@ - (void)mergeFromData:(NSData *)data extensionRegistry:(id<GPBExtensionRegistry>
- (BOOL)mergeFromData:(NSData *)data
extensionRegistry:(nullable id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr {
GPBBecomeVisibleToAutocreator(self);
GPBCodedInputStream *input = [[GPBCodedInputStream alloc] initWithData:data];
@try {
[self mergeFromCodedInputStream:input extensionRegistry:extensionRegistry endingTag:0];
Expand Down
41 changes: 39 additions & 2 deletions objectivec/Tests/GPBCodedInputStreamTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
#import "GPBCodedInputStream_PackagePrivate.h"
#import "GPBCodedOutputStream.h"
#import "GPBTestUtilities.h"
#import "GPBUnknownField.h"
#import "GPBUnknownFieldSet_PackagePrivate.h"
#import "GPBUnknownFields.h"
#import "GPBUtilities_PackagePrivate.h"
#import "GPBWireFormat.h"
#import "objectivec/Tests/Unittest.pbobjc.h"
Expand Down Expand Up @@ -268,20 +270,55 @@ - (void)testSkipWholeMessage {
TestAllTypes* message = [self allSetRepeatedCount:kGPBDefaultRepeatCount];
NSData* rawBytes = message.data;

// Create two parallel inputs. Parse one as unknown fields while using
// skipField() to skip each field on the other. Expect the same tags.
TestEmptyMessage* empty = [TestEmptyMessage parseFromData:rawBytes error:NULL];
XCTAssertNotNil(empty);
GPBUnknownFields* ufs = [[[GPBUnknownFields alloc] initFromMessage:empty] autorelease];
NSMutableArray<NSNumber*>* fieldNumbers = [NSMutableArray arrayWithCapacity:ufs.count];
for (GPBUnknownField* field in ufs) {
GPBWireFormat wireFormat;
switch (field.type) {
case GPBUnknownFieldTypeFixed32:
wireFormat = GPBWireFormatFixed32;
break;
case GPBUnknownFieldTypeFixed64:
wireFormat = GPBWireFormatFixed64;
break;
case GPBUnknownFieldTypeVarint:
wireFormat = GPBWireFormatVarint;
break;
case GPBUnknownFieldTypeLengthDelimited:
wireFormat = GPBWireFormatLengthDelimited;
break;
case GPBUnknownFieldTypeGroup:
wireFormat = GPBWireFormatStartGroup;
break;
case GPBUnknownFieldTypeLegacy:
XCTFail(@"Legacy field type not expected");
wireFormat = GPBWireFormatVarint;
break;
}
uint32_t tag = GPBWireFormatMakeTag(field.number, wireFormat);
[fieldNumbers addObject:@(tag)];
}

// Check the tags compared to what's in the UnknownFields to confirm the stream is
// skipping as expected (this covers the tags within a group also).
GPBCodedInputStream* input1 = [GPBCodedInputStream streamWithData:rawBytes];
GPBCodedInputStream* input2 = [GPBCodedInputStream streamWithData:rawBytes];
GPBUnknownFieldSet* unknownFields = [[[GPBUnknownFieldSet alloc] init] autorelease];

NSUInteger idx = 0;
while (YES) {
int32_t tag = [input1 readTag];
XCTAssertEqual(tag, [input2 readTag]);
if (tag == 0) {
XCTAssertEqual(idx, fieldNumbers.count);
break;
}
XCTAssertEqual(tag, [fieldNumbers[idx] intValue]);
[unknownFields mergeFieldFrom:tag input:input1];
[input2 skipField:tag];
++idx;
}
}

Expand Down
17 changes: 17 additions & 0 deletions objectivec/Tests/GPBMessageTests+Serialization.m
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,17 @@ - (void)testProto2UnknownEnumToUnknownField {

// All the values should be in unknown fields.

GPBUnknownFields *ufs = [[GPBUnknownFields alloc] initFromMessage:msg];
XCTAssertEqual(ufs.count, 3U);
uint64_t varint;
XCTAssertTrue([ufs getFirst:Message2_FieldNumber_OptionalEnum varint:&varint]);
XCTAssertEqual(varint, (uint64_t)Message3_Enum_Extra3);
XCTAssertTrue([ufs getFirst:Message2_FieldNumber_RepeatedEnumArray varint:&varint]);
XCTAssertEqual(varint, (uint64_t)Message3_Enum_Extra3);
XCTAssertTrue([ufs getFirst:Message2_FieldNumber_OneofEnum varint:&varint]);
XCTAssertEqual(varint, (uint64_t)Message3_Enum_Extra3);
[ufs release];

GPBUnknownFieldSet *unknownFields = msg.unknownFields;

XCTAssertEqual([unknownFields countOfFields], 3U);
Expand Down Expand Up @@ -1398,6 +1409,9 @@ - (void)testMap_Proto2UnknownEnum {
int32_t val = -1;
XCTAssertTrue([msg1.knownMapField getEnum:&val forKey:0]);
XCTAssertEqual(val, Proto2MapEnum_Proto2MapEnumFoo);
GPBUnknownFields *ufs = [[GPBUnknownFields alloc] initFromMessage:msg1];
XCTAssertEqual(ufs.count, 1U);
[ufs release];
XCTAssertEqual(msg1.unknownFields.countOfFields, 1U);

data = [msg1 data];
Expand All @@ -1410,6 +1424,9 @@ - (void)testMap_Proto2UnknownEnum {
XCTAssertEqual(msg2.unknownMapField.count, 1U);
XCTAssertTrue([msg2.unknownMapField getEnum:&val forKey:0]);
XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumExtra);
ufs = [[GPBUnknownFields alloc] initFromMessage:msg2];
XCTAssertTrue(ufs.empty);
[ufs release];
XCTAssertEqual(msg2.unknownFields.countOfFields, 0U);

XCTAssertEqualObjects(orig, msg2);
Expand Down
55 changes: 55 additions & 0 deletions objectivec/Tests/GPBMessageTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@
#import "GPBDictionary_PackagePrivate.h"
#import "GPBMessage_PackagePrivate.h"
#import "GPBTestUtilities.h"
#import "GPBUnknownField.h"
#import "GPBUnknownFieldSet_PackagePrivate.h"
#import "GPBUnknownField_PackagePrivate.h"
#import "GPBUnknownFields.h"
#import "objectivec/Tests/Unittest.pbobjc.h"
#import "objectivec/Tests/UnittestImport.pbobjc.h"
#import "objectivec/Tests/UnittestObjc.pbobjc.h"
Expand Down Expand Up @@ -501,6 +503,11 @@ - (void)testDescription {

[message setUnknownFields:unknownFields];

GPBUnknownFields *ufs = [[[GPBUnknownFields alloc] init] autorelease];
[ufs addFieldNumber:1234 fixed32:1234];
[ufs addFieldNumber:2345 varint:54321];
[message mergeUnknownFields:ufs extensionRegistry:nil];

NSString *description = [message description];
XCTAssertGreaterThan([description length], 0U);

Expand Down Expand Up @@ -985,6 +992,19 @@ - (void)testAutocreatedUnknownFields {
XCTAssertFalse([message hasOptionalNestedMessage]);
[message.optionalNestedMessage setUnknownFields:unknownFields];
XCTAssertTrue([message hasOptionalNestedMessage]);

message.optionalNestedMessage = nil;
XCTAssertFalse([message hasOptionalNestedMessage]);
GPBUnknownFields *ufs = [[[GPBUnknownFields alloc] init] autorelease];
[ufs addFieldNumber:1 varint:1];
[message.optionalNestedMessage mergeUnknownFields:ufs extensionRegistry:nil];
XCTAssertTrue([message hasOptionalNestedMessage]);

message.optionalNestedMessage = nil;
XCTAssertFalse([message hasOptionalNestedMessage]);
[ufs clear]; // Also make sure merging zero length forces it to become visible.
[message.optionalNestedMessage mergeUnknownFields:ufs extensionRegistry:nil];
XCTAssertTrue([message hasOptionalNestedMessage]);
}

- (void)testSetAutocreatedSubmessageToSelf {
Expand Down Expand Up @@ -1481,6 +1501,19 @@ - (void)testClosedEnumsInExtensions {
XCTAssertFalse([msg hasExtension:[UnittestRoot repeatedNestedEnumExtension]]);
XCTAssertFalse([msg hasExtension:[UnittestRoot repeatedForeignEnumExtension]]);

GPBUnknownFields *ufs = [[[GPBUnknownFields alloc] initFromMessage:msg] autorelease];
XCTAssertEqual(ufs.count, 3);
uint64_t varint;
XCTAssertTrue([ufs getFirst:[UnittestRoot optionalNestedEnumExtension].fieldNumber
varint:&varint]);
XCTAssertEqual(varint, 10);
XCTAssertTrue([ufs getFirst:[UnittestRoot repeatedNestedEnumExtension].fieldNumber
varint:&varint]);
XCTAssertEqual(varint, 11);
XCTAssertTrue([ufs getFirst:[UnittestRoot repeatedForeignEnumExtension].fieldNumber
varint:&varint]);
XCTAssertEqual(varint, 12);

GPBUnknownFieldSet *unknownFields = msg.unknownFields;
GPBUnknownField *field =
[unknownFields getField:[UnittestRoot optionalNestedEnumExtension].fieldNumber];
Expand Down Expand Up @@ -1523,6 +1556,18 @@ - (void)testClosedEnumsInExtensions {
expected = @[ @4, @6 ];
XCTAssertEqualObjects([msg getExtension:[UnittestRoot repeatedForeignEnumExtension]], expected);

ufs = [[[GPBUnknownFields alloc] initFromMessage:msg] autorelease];
XCTAssertEqual(ufs.count, 3);
XCTAssertTrue([ufs getFirst:[UnittestRoot optionalNestedEnumExtension].fieldNumber
varint:&varint]);
XCTAssertEqual(varint, 10);
XCTAssertTrue([ufs getFirst:[UnittestRoot repeatedNestedEnumExtension].fieldNumber
varint:&varint]);
XCTAssertEqual(varint, 11);
XCTAssertTrue([ufs getFirst:[UnittestRoot repeatedForeignEnumExtension].fieldNumber
varint:&varint]);
XCTAssertEqual(varint, 12);

unknownFields = msg.unknownFields;
field = [unknownFields getField:[UnittestRoot optionalNestedEnumExtension].fieldNumber];
XCTAssertNotNil(field);
Expand Down Expand Up @@ -1840,6 +1885,9 @@ - (void)testGenerateAndParseUnknownMessage {
[unknowns mergeVarintField:123 value:456];
GPBMessage *message = [GPBMessage message];
[message setUnknownFields:unknowns];
GPBUnknownFields *ufs = [[[GPBUnknownFields alloc] init] autorelease];
[ufs addFieldNumber:1234 varint:5678];
[message mergeUnknownFields:ufs extensionRegistry:nil];
NSData *data = [message data];
GPBMessage *message2 = [GPBMessage parseFromData:data extensionRegistry:nil error:NULL];
XCTAssertEqualObjects(message, message2);
Expand All @@ -1850,12 +1898,19 @@ - (void)testDelimitedWriteAndParseMultipleMessages {
[unknowns1 mergeVarintField:123 value:456];
GPBMessage *message1 = [GPBMessage message];
[message1 setUnknownFields:unknowns1];
GPBUnknownFields *ufs1 = [[[GPBUnknownFields alloc] init] autorelease];
[ufs1 addFieldNumber:1234 varint:5678];
[message1 mergeUnknownFields:ufs1 extensionRegistry:nil];

GPBUnknownFieldSet *unknowns2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
[unknowns2 mergeVarintField:789 value:987];
[unknowns2 mergeVarintField:654 value:321];
GPBMessage *message2 = [GPBMessage message];
[message2 setUnknownFields:unknowns2];
GPBUnknownFields *ufs2 = [[[GPBUnknownFields alloc] init] autorelease];
[ufs2 addFieldNumber:2345 fixed32:6789];
[ufs2 addFieldNumber:3456 fixed32:7890];
[message2 mergeUnknownFields:ufs2 extensionRegistry:nil];

NSMutableData *delimitedData = [NSMutableData data];
[delimitedData appendData:[message1 delimitedData]];
Expand Down
4 changes: 4 additions & 0 deletions objectivec/Tests/GPBUnknownFieldSetTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,10 @@ - (void)testMergeFrom {
TestEmptyMessage* destination2 = [TestEmptyMessage message];
[destination2 mergeFrom:source3];

XCTAssertEqualObjects(destination1.unknownFields, destination2.unknownFields);
XCTAssertEqualObjects(destination1.unknownFields, source3.unknownFields);
XCTAssertEqualObjects(destination2.unknownFields, source3.unknownFields);

XCTAssertEqualObjects(destination1.data, destination2.data);
XCTAssertEqualObjects(destination1.data, source3.data);
XCTAssertEqualObjects(destination2.data, source3.data);
Expand Down
1 change: 0 additions & 1 deletion objectivec/Tests/GPBUnknownFieldsTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -918,7 +918,6 @@ - (void)testParsingNestingGroupData {
uint64_t fixed64 = 0;
XCTAssertTrue([group getFirst:3 fixed64:&fixed64]);
XCTAssertEqual(fixed64, 0x123456789abcdef0LL);
XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1);

m = [TestEmptyMessage parseFromData:DataFromBytes(35, 50, 0, 36)
error:NULL]; // length delimited, length 0
Expand Down
Loading

0 comments on commit 5ceae5f

Please sign in to comment.