Skip to content

Commit 0832b52

Browse files
committed
[ObjC] Update tests to use both unknown fields apis.
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
1 parent d1b6f8c commit 0832b52

File tree

7 files changed

+152
-3
lines changed

7 files changed

+152
-3
lines changed

objectivec/GPBMessage.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2085,6 +2085,7 @@ - (void)mergeFromData:(NSData *)data extensionRegistry:(id<GPBExtensionRegistry>
20852085
- (BOOL)mergeFromData:(NSData *)data
20862086
extensionRegistry:(nullable id<GPBExtensionRegistry>)extensionRegistry
20872087
error:(NSError **)errorPtr {
2088+
GPBBecomeVisibleToAutocreator(self);
20882089
GPBCodedInputStream *input = [[GPBCodedInputStream alloc] initWithData:data];
20892090
@try {
20902091
[self mergeFromCodedInputStream:input extensionRegistry:extensionRegistry endingTag:0];

objectivec/Tests/GPBCodedInputStreamTests.m

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
#import "GPBCodedInputStream_PackagePrivate.h"
1212
#import "GPBCodedOutputStream.h"
1313
#import "GPBTestUtilities.h"
14+
#import "GPBUnknownField.h"
1415
#import "GPBUnknownFieldSet_PackagePrivate.h"
16+
#import "GPBUnknownFields.h"
1517
#import "GPBUtilities_PackagePrivate.h"
1618
#import "GPBWireFormat.h"
1719
#import "objectivec/Tests/Unittest.pbobjc.h"
@@ -268,20 +270,55 @@ - (void)testSkipWholeMessage {
268270
TestAllTypes* message = [self allSetRepeatedCount:kGPBDefaultRepeatCount];
269271
NSData* rawBytes = message.data;
270272

271-
// Create two parallel inputs. Parse one as unknown fields while using
272-
// skipField() to skip each field on the other. Expect the same tags.
273+
TestEmptyMessage* empty = [TestEmptyMessage parseFromData:rawBytes error:NULL];
274+
XCTAssertNotNil(empty);
275+
GPBUnknownFields* ufs = [[[GPBUnknownFields alloc] initFromMessage:empty] autorelease];
276+
NSMutableArray<NSNumber*>* fieldNumbers = [NSMutableArray arrayWithCapacity:ufs.count];
277+
for (GPBUnknownField* field in ufs) {
278+
GPBWireFormat wireFormat;
279+
switch (field.type) {
280+
case GPBUnknownFieldTypeFixed32:
281+
wireFormat = GPBWireFormatFixed32;
282+
break;
283+
case GPBUnknownFieldTypeFixed64:
284+
wireFormat = GPBWireFormatFixed64;
285+
break;
286+
case GPBUnknownFieldTypeVarint:
287+
wireFormat = GPBWireFormatVarint;
288+
break;
289+
case GPBUnknownFieldTypeLengthDelimited:
290+
wireFormat = GPBWireFormatLengthDelimited;
291+
break;
292+
case GPBUnknownFieldTypeGroup:
293+
wireFormat = GPBWireFormatStartGroup;
294+
break;
295+
case GPBUnknownFieldTypeLegacy:
296+
XCTFail(@"Legacy field type not expected");
297+
wireFormat = GPBWireFormatVarint;
298+
break;
299+
}
300+
uint32_t tag = GPBWireFormatMakeTag(field.number, wireFormat);
301+
[fieldNumbers addObject:@(tag)];
302+
}
303+
304+
// Check the tags compared to what's in the UnknownFields to confirm the stream is
305+
// skipping as expected (this covers the tags within a group also).
273306
GPBCodedInputStream* input1 = [GPBCodedInputStream streamWithData:rawBytes];
274307
GPBCodedInputStream* input2 = [GPBCodedInputStream streamWithData:rawBytes];
275308
GPBUnknownFieldSet* unknownFields = [[[GPBUnknownFieldSet alloc] init] autorelease];
276309

310+
NSUInteger idx = 0;
277311
while (YES) {
278312
int32_t tag = [input1 readTag];
279313
XCTAssertEqual(tag, [input2 readTag]);
280314
if (tag == 0) {
315+
XCTAssertEqual(idx, fieldNumbers.count);
281316
break;
282317
}
318+
XCTAssertEqual(tag, [fieldNumbers[idx] intValue]);
283319
[unknownFields mergeFieldFrom:tag input:input1];
284320
[input2 skipField:tag];
321+
++idx;
285322
}
286323
}
287324

objectivec/Tests/GPBMessageTests+Serialization.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,17 @@ - (void)testProto2UnknownEnumToUnknownField {
419419

420420
// All the values should be in unknown fields.
421421

422+
GPBUnknownFields *ufs = [[GPBUnknownFields alloc] initFromMessage:msg];
423+
XCTAssertEqual(ufs.count, 3U);
424+
uint64_t varint;
425+
XCTAssertTrue([ufs getFirst:Message2_FieldNumber_OptionalEnum varint:&varint]);
426+
XCTAssertEqual(varint, (uint64_t)Message3_Enum_Extra3);
427+
XCTAssertTrue([ufs getFirst:Message2_FieldNumber_RepeatedEnumArray varint:&varint]);
428+
XCTAssertEqual(varint, (uint64_t)Message3_Enum_Extra3);
429+
XCTAssertTrue([ufs getFirst:Message2_FieldNumber_OneofEnum varint:&varint]);
430+
XCTAssertEqual(varint, (uint64_t)Message3_Enum_Extra3);
431+
[ufs release];
432+
422433
GPBUnknownFieldSet *unknownFields = msg.unknownFields;
423434

424435
XCTAssertEqual([unknownFields countOfFields], 3U);
@@ -1398,6 +1409,9 @@ - (void)testMap_Proto2UnknownEnum {
13981409
int32_t val = -1;
13991410
XCTAssertTrue([msg1.knownMapField getEnum:&val forKey:0]);
14001411
XCTAssertEqual(val, Proto2MapEnum_Proto2MapEnumFoo);
1412+
GPBUnknownFields *ufs = [[GPBUnknownFields alloc] initFromMessage:msg1];
1413+
XCTAssertEqual(ufs.count, 1U);
1414+
[ufs release];
14011415
XCTAssertEqual(msg1.unknownFields.countOfFields, 1U);
14021416

14031417
data = [msg1 data];
@@ -1410,6 +1424,9 @@ - (void)testMap_Proto2UnknownEnum {
14101424
XCTAssertEqual(msg2.unknownMapField.count, 1U);
14111425
XCTAssertTrue([msg2.unknownMapField getEnum:&val forKey:0]);
14121426
XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumExtra);
1427+
ufs = [[GPBUnknownFields alloc] initFromMessage:msg2];
1428+
XCTAssertTrue(ufs.empty);
1429+
[ufs release];
14131430
XCTAssertEqual(msg2.unknownFields.countOfFields, 0U);
14141431

14151432
XCTAssertEqualObjects(orig, msg2);

objectivec/Tests/GPBMessageTests.m

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
#import "GPBDictionary_PackagePrivate.h"
1414
#import "GPBMessage_PackagePrivate.h"
1515
#import "GPBTestUtilities.h"
16+
#import "GPBUnknownField.h"
1617
#import "GPBUnknownFieldSet_PackagePrivate.h"
1718
#import "GPBUnknownField_PackagePrivate.h"
19+
#import "GPBUnknownFields.h"
1820
#import "objectivec/Tests/Unittest.pbobjc.h"
1921
#import "objectivec/Tests/UnittestImport.pbobjc.h"
2022
#import "objectivec/Tests/UnittestObjc.pbobjc.h"
@@ -501,6 +503,11 @@ - (void)testDescription {
501503

502504
[message setUnknownFields:unknownFields];
503505

506+
GPBUnknownFields *ufs = [[[GPBUnknownFields alloc] init] autorelease];
507+
[ufs addFieldNumber:1234 fixed32:1234];
508+
[ufs addFieldNumber:2345 varint:54321];
509+
[message mergeUnknownFields:ufs extensionRegistry:nil];
510+
504511
NSString *description = [message description];
505512
XCTAssertGreaterThan([description length], 0U);
506513

@@ -985,6 +992,19 @@ - (void)testAutocreatedUnknownFields {
985992
XCTAssertFalse([message hasOptionalNestedMessage]);
986993
[message.optionalNestedMessage setUnknownFields:unknownFields];
987994
XCTAssertTrue([message hasOptionalNestedMessage]);
995+
996+
message.optionalNestedMessage = nil;
997+
XCTAssertFalse([message hasOptionalNestedMessage]);
998+
GPBUnknownFields *ufs = [[[GPBUnknownFields alloc] init] autorelease];
999+
[ufs addFieldNumber:1 varint:1];
1000+
[message.optionalNestedMessage mergeUnknownFields:ufs extensionRegistry:nil];
1001+
XCTAssertTrue([message hasOptionalNestedMessage]);
1002+
1003+
message.optionalNestedMessage = nil;
1004+
XCTAssertFalse([message hasOptionalNestedMessage]);
1005+
[ufs clear]; // Also make sure merging zero length forces it to become visible.
1006+
[message.optionalNestedMessage mergeUnknownFields:ufs extensionRegistry:nil];
1007+
XCTAssertTrue([message hasOptionalNestedMessage]);
9881008
}
9891009

9901010
- (void)testSetAutocreatedSubmessageToSelf {
@@ -1481,6 +1501,19 @@ - (void)testClosedEnumsInExtensions {
14811501
XCTAssertFalse([msg hasExtension:[UnittestRoot repeatedNestedEnumExtension]]);
14821502
XCTAssertFalse([msg hasExtension:[UnittestRoot repeatedForeignEnumExtension]]);
14831503

1504+
GPBUnknownFields *ufs = [[[GPBUnknownFields alloc] initFromMessage:msg] autorelease];
1505+
XCTAssertEqual(ufs.count, 3);
1506+
uint64_t varint;
1507+
XCTAssertTrue([ufs getFirst:[UnittestRoot optionalNestedEnumExtension].fieldNumber
1508+
varint:&varint]);
1509+
XCTAssertEqual(varint, 10);
1510+
XCTAssertTrue([ufs getFirst:[UnittestRoot repeatedNestedEnumExtension].fieldNumber
1511+
varint:&varint]);
1512+
XCTAssertEqual(varint, 11);
1513+
XCTAssertTrue([ufs getFirst:[UnittestRoot repeatedForeignEnumExtension].fieldNumber
1514+
varint:&varint]);
1515+
XCTAssertEqual(varint, 12);
1516+
14841517
GPBUnknownFieldSet *unknownFields = msg.unknownFields;
14851518
GPBUnknownField *field =
14861519
[unknownFields getField:[UnittestRoot optionalNestedEnumExtension].fieldNumber];
@@ -1523,6 +1556,18 @@ - (void)testClosedEnumsInExtensions {
15231556
expected = @[ @4, @6 ];
15241557
XCTAssertEqualObjects([msg getExtension:[UnittestRoot repeatedForeignEnumExtension]], expected);
15251558

1559+
ufs = [[[GPBUnknownFields alloc] initFromMessage:msg] autorelease];
1560+
XCTAssertEqual(ufs.count, 3);
1561+
XCTAssertTrue([ufs getFirst:[UnittestRoot optionalNestedEnumExtension].fieldNumber
1562+
varint:&varint]);
1563+
XCTAssertEqual(varint, 10);
1564+
XCTAssertTrue([ufs getFirst:[UnittestRoot repeatedNestedEnumExtension].fieldNumber
1565+
varint:&varint]);
1566+
XCTAssertEqual(varint, 11);
1567+
XCTAssertTrue([ufs getFirst:[UnittestRoot repeatedForeignEnumExtension].fieldNumber
1568+
varint:&varint]);
1569+
XCTAssertEqual(varint, 12);
1570+
15261571
unknownFields = msg.unknownFields;
15271572
field = [unknownFields getField:[UnittestRoot optionalNestedEnumExtension].fieldNumber];
15281573
XCTAssertNotNil(field);
@@ -1840,6 +1885,9 @@ - (void)testGenerateAndParseUnknownMessage {
18401885
[unknowns mergeVarintField:123 value:456];
18411886
GPBMessage *message = [GPBMessage message];
18421887
[message setUnknownFields:unknowns];
1888+
GPBUnknownFields *ufs = [[[GPBUnknownFields alloc] init] autorelease];
1889+
[ufs addFieldNumber:1234 varint:5678];
1890+
[message mergeUnknownFields:ufs extensionRegistry:nil];
18431891
NSData *data = [message data];
18441892
GPBMessage *message2 = [GPBMessage parseFromData:data extensionRegistry:nil error:NULL];
18451893
XCTAssertEqualObjects(message, message2);
@@ -1850,12 +1898,19 @@ - (void)testDelimitedWriteAndParseMultipleMessages {
18501898
[unknowns1 mergeVarintField:123 value:456];
18511899
GPBMessage *message1 = [GPBMessage message];
18521900
[message1 setUnknownFields:unknowns1];
1901+
GPBUnknownFields *ufs1 = [[[GPBUnknownFields alloc] init] autorelease];
1902+
[ufs1 addFieldNumber:1234 varint:5678];
1903+
[message1 mergeUnknownFields:ufs1 extensionRegistry:nil];
18531904

18541905
GPBUnknownFieldSet *unknowns2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
18551906
[unknowns2 mergeVarintField:789 value:987];
18561907
[unknowns2 mergeVarintField:654 value:321];
18571908
GPBMessage *message2 = [GPBMessage message];
18581909
[message2 setUnknownFields:unknowns2];
1910+
GPBUnknownFields *ufs2 = [[[GPBUnknownFields alloc] init] autorelease];
1911+
[ufs2 addFieldNumber:2345 fixed32:6789];
1912+
[ufs2 addFieldNumber:3456 fixed32:7890];
1913+
[message2 mergeUnknownFields:ufs2 extensionRegistry:nil];
18591914

18601915
NSMutableData *delimitedData = [NSMutableData data];
18611916
[delimitedData appendData:[message1 delimitedData]];

objectivec/Tests/GPBUnknownFieldSetTest.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,10 @@ - (void)testMergeFrom {
282282
TestEmptyMessage* destination2 = [TestEmptyMessage message];
283283
[destination2 mergeFrom:source3];
284284

285+
XCTAssertEqualObjects(destination1.unknownFields, destination2.unknownFields);
286+
XCTAssertEqualObjects(destination1.unknownFields, source3.unknownFields);
287+
XCTAssertEqualObjects(destination2.unknownFields, source3.unknownFields);
288+
285289
XCTAssertEqualObjects(destination1.data, destination2.data);
286290
XCTAssertEqualObjects(destination1.data, source3.data);
287291
XCTAssertEqualObjects(destination2.data, source3.data);

objectivec/Tests/GPBUnknownFieldsTest.m

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -918,7 +918,6 @@ - (void)testParsingNestingGroupData {
918918
uint64_t fixed64 = 0;
919919
XCTAssertTrue([group getFirst:3 fixed64:&fixed64]);
920920
XCTAssertEqual(fixed64, 0x123456789abcdef0LL);
921-
XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1);
922921

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

0 commit comments

Comments
 (0)