Skip to content

Commit e4b7805

Browse files
authored
fix: Add support for parseUnknownFields in sub messages (#695)
Signed-off-by: Nana Essilfie-Conduah <nana@swirldslabs.com>
1 parent 6c0c316 commit e4b7805

File tree

3 files changed

+50
-1
lines changed

3 files changed

+50
-1
lines changed

pbj-core/pbj-compiler/src/main/java/com/hedera/pbj/compiler/impl/SingleField.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ public void addAllNeededImports(
216216
@Override
217217
public String parseCode() {
218218
if (type == FieldType.MESSAGE) {
219-
return "%s.PROTOBUF.parse(input, strictMode, maxDepth - 1)".formatted(messageType);
219+
return "%s.PROTOBUF.parse(input, strictMode, parseUnknownFields, maxDepth - 1)".formatted(messageType);
220220
} else {
221221
return "input";
222222
}

pbj-integration-tests/src/main/proto/bytes.proto

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,13 @@ option java_multiple_files = true;
1313
message MessageWithBytes {
1414
bytes bytesField = 1;
1515
}
16+
17+
/**
18+
* Sample protobuf with MessageWithBytes as a oneof child message field.
19+
*/
20+
message MessageWithBytesWrapper {
21+
oneof message_valid {
22+
MessageWithBytes messageWithBytes = 1;
23+
bool valid = 2;
24+
}
25+
}

pbj-integration-tests/src/test/java/com/hedera/pbj/integration/test/UnknownFieldsTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@
33

44
import static org.junit.jupiter.api.Assertions.assertEquals;
55
import static org.junit.jupiter.api.Assertions.assertFalse;
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
67

78
import com.hedera.pbj.integration.EverythingTestData;
9+
import com.hedera.pbj.runtime.OneOf;
810
import com.hedera.pbj.runtime.ProtoConstants;
911
import com.hedera.pbj.runtime.UnknownField;
1012
import com.hedera.pbj.runtime.io.buffer.BufferedData;
1113
import com.hedera.pbj.runtime.io.buffer.Bytes;
1214
import com.hedera.pbj.test.proto.pbj.Everything;
1315
import com.hedera.pbj.test.proto.pbj.MessageWithBytes;
1416
import com.hedera.pbj.test.proto.pbj.MessageWithBytesAndString;
17+
import com.hedera.pbj.test.proto.pbj.MessageWithBytesWrapper;
1518
import org.junit.jupiter.api.Test;
1619
import pbj.integration.tests.pbj.integration.tests.MessageWithEverythingUnknownFields;
1720

@@ -95,4 +98,40 @@ void testEverythingRoundTrip() throws Exception {
9598
// and ensure it's equal to what we started with:
9699
assertEquals(EverythingTestData.EVERYTHING, everything);
97100
}
101+
102+
@Test
103+
public void testUnknownFieldsInInnerMessage() throws Exception {
104+
// write MessageWithBytesAndString
105+
MessageWithBytesAndString messageWithBytesAndString = new MessageWithBytesAndString(TEST_BYTES, TEST_STRING);
106+
final Bytes messageWithBytesAndStringBytes =
107+
MessageWithBytesAndString.PROTOBUF.toBytes(messageWithBytesAndString);
108+
109+
// then read it as MessageWithBytes with unknown fields
110+
final MessageWithBytes messageWithBytes = MessageWithBytes.PROTOBUF.parse(
111+
messageWithBytesAndStringBytes.toReadableSequentialData(), false, true, 16);
112+
113+
final MessageWithBytesWrapper messageWithBytesWrapper = new MessageWithBytesWrapper(
114+
new OneOf<>(MessageWithBytesWrapper.MessageValidOneOfType.MESSAGE_WITH_BYTES, messageWithBytes));
115+
assertFalse(
116+
messageWithBytesWrapper.messageWithBytes().getUnknownFields().isEmpty());
117+
assertEquals(
118+
1, messageWithBytesWrapper.messageWithBytes().getUnknownFields().size());
119+
120+
// write to bytes to simulate sending over the wire
121+
final Bytes messageWithBytesWrapperBytes = MessageWithBytesWrapper.PROTOBUF.toBytes(messageWithBytesWrapper);
122+
123+
// parse bytes back as a receiving user would and confirm unknown fields exist in inner message
124+
final MessageWithBytesWrapper parsedWrapper = MessageWithBytesWrapper.PROTOBUF.parse(
125+
messageWithBytesWrapperBytes.toReadableSequentialData(), false, true, 16);
126+
MessageWithBytes parsedBytes = parsedWrapper.messageWithBytes();
127+
assertFalse(parsedBytes.getUnknownFields().isEmpty());
128+
assertEquals(1, parsedBytes.getUnknownFields().size());
129+
130+
// now confirm that user can retrieve unknown fields when using expanded message MessageWithBytesAndString
131+
final Bytes messageWithBytesBytes = MessageWithBytes.PROTOBUF.toBytes(parsedBytes);
132+
final MessageWithBytesAndString messageWithBytesAndStringParsed =
133+
MessageWithBytesAndString.PROTOBUF.parse(messageWithBytesBytes.toReadableSequentialData());
134+
assertTrue(messageWithBytesAndStringParsed.getUnknownFields().isEmpty());
135+
assertEquals(messageWithBytesAndString, messageWithBytesAndStringParsed);
136+
}
98137
}

0 commit comments

Comments
 (0)