Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ public void addAllNeededImports(
@Override
public String parseCode() {
if (type == FieldType.MESSAGE) {
return "%s.PROTOBUF.parse(input, strictMode, maxDepth - 1)".formatted(messageType);
return "%s.PROTOBUF.parse(input, strictMode, parseUnknownFields, maxDepth - 1)".formatted(messageType);
} else {
return "input";
}
Expand Down
10 changes: 10 additions & 0 deletions pbj-integration-tests/src/main/proto/bytes.proto
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,13 @@ option java_multiple_files = true;
message MessageWithBytes {
bytes bytesField = 1;
}

/**
* Sample protobuf with MessageWithBytes as a oneof child message field.
*/
message MessageWithBytesWrapper {
oneof message_valid {
MessageWithBytes messageWithBytes = 1;
bool valid = 2;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.hedera.pbj.integration.EverythingTestData;
import com.hedera.pbj.runtime.OneOf;
import com.hedera.pbj.runtime.ProtoConstants;
import com.hedera.pbj.runtime.UnknownField;
import com.hedera.pbj.runtime.io.buffer.BufferedData;
import com.hedera.pbj.runtime.io.buffer.Bytes;
import com.hedera.pbj.test.proto.pbj.Everything;
import com.hedera.pbj.test.proto.pbj.MessageWithBytes;
import com.hedera.pbj.test.proto.pbj.MessageWithBytesAndString;
import com.hedera.pbj.test.proto.pbj.MessageWithBytesWrapper;
import org.junit.jupiter.api.Test;
import pbj.integration.tests.pbj.integration.tests.MessageWithEverythingUnknownFields;

Expand Down Expand Up @@ -95,4 +98,40 @@ void testEverythingRoundTrip() throws Exception {
// and ensure it's equal to what we started with:
assertEquals(EverythingTestData.EVERYTHING, everything);
}

@Test
public void testUnknownFieldsInInnerMessage() throws Exception {
// write MessageWithBytesAndString
MessageWithBytesAndString messageWithBytesAndString = new MessageWithBytesAndString(TEST_BYTES, TEST_STRING);
final Bytes messageWithBytesAndStringBytes =
MessageWithBytesAndString.PROTOBUF.toBytes(messageWithBytesAndString);

// then read it as MessageWithBytes with unknown fields
final MessageWithBytes messageWithBytes = MessageWithBytes.PROTOBUF.parse(
messageWithBytesAndStringBytes.toReadableSequentialData(), false, true, 16);

final MessageWithBytesWrapper messageWithBytesWrapper = new MessageWithBytesWrapper(
new OneOf<>(MessageWithBytesWrapper.MessageValidOneOfType.MESSAGE_WITH_BYTES, messageWithBytes));
assertFalse(
messageWithBytesWrapper.messageWithBytes().getUnknownFields().isEmpty());
assertEquals(
1, messageWithBytesWrapper.messageWithBytes().getUnknownFields().size());

// write to bytes to simulate sending over the wire
final Bytes messageWithBytesWrapperBytes = MessageWithBytesWrapper.PROTOBUF.toBytes(messageWithBytesWrapper);

// parse bytes back as a receiving user would and confirm unknown fields exist in inner message
final MessageWithBytesWrapper parsedWrapper = MessageWithBytesWrapper.PROTOBUF.parse(
messageWithBytesWrapperBytes.toReadableSequentialData(), false, true, 16);
MessageWithBytes parsedBytes = parsedWrapper.messageWithBytes();
assertFalse(parsedBytes.getUnknownFields().isEmpty());
assertEquals(1, parsedBytes.getUnknownFields().size());

// now confirm that user can retrieve unknown fields when using expanded message MessageWithBytesAndString
final Bytes messageWithBytesBytes = MessageWithBytes.PROTOBUF.toBytes(parsedBytes);
final MessageWithBytesAndString messageWithBytesAndStringParsed =
MessageWithBytesAndString.PROTOBUF.parse(messageWithBytesBytes.toReadableSequentialData());
assertTrue(messageWithBytesAndStringParsed.getUnknownFields().isEmpty());
assertEquals(messageWithBytesAndString, messageWithBytesAndStringParsed);
}
}
Loading