Skip to content

Commit ddf9b76

Browse files
committed
[ObjC] Support MessageSet with GPBUnknownFields.
Update the initialization from a message to deal with the current differences. Update some tests to cover the usage. PiperOrigin-RevId: 652892603
1 parent 5fa8cd9 commit ddf9b76

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

objectivec/GPBUnknownFields.m

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#import "GPBCodedInputStream_PackagePrivate.h"
1313
#import "GPBCodedOutputStream.h"
1414
#import "GPBCodedOutputStream_PackagePrivate.h"
15+
#import "GPBDescriptor.h"
1516
#import "GPBMessage.h"
1617
#import "GPBUnknownField.h"
1718
#import "GPBUnknownFieldSet_PackagePrivate.h"
@@ -199,8 +200,19 @@ - (instancetype)initFromMessage:(nonnull GPBMessage *)message {
199200
// updated.
200201
GPBUnknownFieldSet *legacyUnknownFields = [message unknownFields];
201202
if (legacyUnknownFields) {
202-
GPBCodedInputStream *input =
203-
[[GPBCodedInputStream alloc] initWithData:[legacyUnknownFields data]];
203+
NSData *data;
204+
if (message.descriptor.isWireFormat) {
205+
NSMutableData *mutableData =
206+
[NSMutableData dataWithLength:legacyUnknownFields.serializedSizeAsMessageSet];
207+
GPBCodedOutputStream *output = [[GPBCodedOutputStream alloc] initWithData:mutableData];
208+
[legacyUnknownFields writeAsMessageSetTo:output];
209+
[output flush];
210+
[output release];
211+
data = mutableData;
212+
} else {
213+
data = [legacyUnknownFields data];
214+
}
215+
GPBCodedInputStream *input = [[GPBCodedInputStream alloc] initWithData:data];
204216
// Parse until the end of the data (tag will be zero).
205217
if (!MergeFromInputStream(self, input, 0)) {
206218
[input release];

objectivec/Tests/GPBWireFormatTests.m

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#import "GPBUnknownField.h"
1212
#import "GPBUnknownField_PackagePrivate.h"
1313
#import "GPBUnknownFields.h"
14+
#import "GPBWireFormat.h"
1415
#import "objectivec/Tests/Unittest.pbobjc.h"
1516
#import "objectivec/Tests/UnittestMset.pbobjc.h"
1617

@@ -111,32 +112,43 @@ - (void)testParsePackedExtensions {
111112
}
112113

113114
const int kUnknownTypeId = 1550055;
115+
const int kUnknownTypeId2 = 1550056;
114116

115117
- (void)testSerializeMessageSet {
116118
// Set up a MSetMessage with two known messages and an unknown one.
117119
MSetMessage* message_set = [MSetMessage message];
118120
[[message_set getExtension:[MSetMessageExtension1 messageSetExtension]] setI:123];
119121
[[message_set getExtension:[MSetMessageExtension2 messageSetExtension]] setStr:@"foo"];
122+
120123
GPBUnknownField* unknownField =
121124
[[[GPBUnknownField alloc] initWithNumber:kUnknownTypeId] autorelease];
122-
[unknownField addLengthDelimited:[NSData dataWithBytes:"bar" length:3]];
125+
[unknownField addLengthDelimited:DataFromCStr("bar")];
123126
GPBUnknownFieldSet* unknownFieldSet = [[[GPBUnknownFieldSet alloc] init] autorelease];
124127
[unknownFieldSet addField:unknownField];
125128
[message_set setUnknownFields:unknownFieldSet];
126129

130+
GPBUnknownFields* ufs = [[[GPBUnknownFields alloc] init] autorelease];
131+
GPBUnknownFields* group = [ufs addGroupWithFieldNumber:GPBWireFormatMessageSetItem];
132+
[group addFieldNumber:GPBWireFormatMessageSetTypeId varint:kUnknownTypeId2];
133+
[group addFieldNumber:GPBWireFormatMessageSetMessage lengthDelimited:DataFromCStr("baz")];
134+
[message_set mergeUnknownFields:ufs extensionRegistry:[MSetUnittestMsetRoot extensionRegistry]];
135+
127136
NSData* data = [message_set data];
128137

129138
// Parse back using MSetRawMessageSet and check the contents.
130139
MSetRawMessageSet* raw = [MSetRawMessageSet parseFromData:data error:NULL];
131140

141+
GPBUnknownFields* ufs2 = [[[GPBUnknownFields alloc] initFromMessage:raw] autorelease];
142+
XCTAssertTrue(ufs2.empty);
132143
XCTAssertEqual([raw.unknownFields countOfFields], (NSUInteger)0);
133144

134-
XCTAssertEqual(raw.itemArray.count, (NSUInteger)3);
145+
XCTAssertEqual(raw.itemArray.count, (NSUInteger)4);
135146
XCTAssertEqual((uint32_t)[raw.itemArray[0] typeId],
136147
[MSetMessageExtension1 messageSetExtension].fieldNumber);
137148
XCTAssertEqual((uint32_t)[raw.itemArray[1] typeId],
138149
[MSetMessageExtension2 messageSetExtension].fieldNumber);
139150
XCTAssertEqual([raw.itemArray[2] typeId], kUnknownTypeId);
151+
XCTAssertEqual([raw.itemArray[3] typeId], kUnknownTypeId2);
140152

141153
MSetMessageExtension1* message1 =
142154
[MSetMessageExtension1 parseFromData:[((MSetRawMessageSet_Item*)raw.itemArray[0]) message]
@@ -148,7 +160,8 @@ - (void)testSerializeMessageSet {
148160
error:NULL];
149161
XCTAssertEqualObjects(message2.str, @"foo");
150162

151-
XCTAssertEqualObjects([raw.itemArray[2] message], [NSData dataWithBytes:"bar" length:3]);
163+
XCTAssertEqualObjects([raw.itemArray[2] message], DataFromCStr("bar"));
164+
XCTAssertEqualObjects([raw.itemArray[3] message], DataFromCStr("baz"));
152165
}
153166

154167
- (void)testParseMessageSet {
@@ -176,7 +189,7 @@ - (void)testParseMessageSet {
176189
{
177190
MSetRawMessageSet_Item* item = [MSetRawMessageSet_Item message];
178191
item.typeId = kUnknownTypeId;
179-
item.message = [NSData dataWithBytes:"bar" length:3];
192+
item.message = DataFromCStr("bar");
180193
[raw.itemArray addObject:item];
181194
}
182195

@@ -191,11 +204,22 @@ - (void)testParseMessageSet {
191204
XCTAssertEqualObjects([[messageSet getExtension:[MSetMessageExtension2 messageSetExtension]] str],
192205
@"foo");
193206

207+
GPBUnknownFields* ufs = [[[GPBUnknownFields alloc] initFromMessage:messageSet] autorelease];
208+
XCTAssertEqual(ufs.count, (NSUInteger)1);
209+
GPBUnknownFields* group = [ufs firstGroup:GPBWireFormatMessageSetItem];
210+
XCTAssertNotNil(group);
211+
XCTAssertEqual(group.count, (NSUInteger)2);
212+
uint64_t varint = 0;
213+
XCTAssertTrue([group getFirst:GPBWireFormatMessageSetTypeId varint:&varint]);
214+
XCTAssertEqual(varint, kUnknownTypeId);
215+
XCTAssertEqualObjects([group firstLengthDelimited:GPBWireFormatMessageSetMessage],
216+
DataFromCStr("bar"));
217+
194218
XCTAssertEqual([messageSet.unknownFields countOfFields], (NSUInteger)1);
195219
GPBUnknownField* unknownField = [messageSet.unknownFields getField:kUnknownTypeId];
196220
XCTAssertNotNil(unknownField);
197221
XCTAssertEqual(unknownField.lengthDelimitedList.count, (NSUInteger)1);
198-
XCTAssertEqualObjects(unknownField.lengthDelimitedList[0], [NSData dataWithBytes:"bar" length:3]);
222+
XCTAssertEqualObjects(unknownField.lengthDelimitedList[0], DataFromCStr("bar"));
199223
}
200224

201225
- (void)testParseMessageSet_FirstValueSticks {

0 commit comments

Comments
 (0)