Index: third_party/protobuf/java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java |
diff --git a/third_party/protobuf/java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java b/third_party/protobuf/java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java |
index 304cec4f871aaa0014c75dc4cc5767714d668cd8..4a42c8970ef450783c6732c9a32a942fa8dde6b6 100644 |
--- a/third_party/protobuf/java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java |
+++ b/third_party/protobuf/java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java |
@@ -31,6 +31,8 @@ |
package com.google.protobuf; |
import com.google.protobuf.Descriptors.Descriptor; |
+import com.google.protobuf.Descriptors.EnumDescriptor; |
+import com.google.protobuf.Descriptors.EnumValueDescriptor; |
import com.google.protobuf.Descriptors.FieldDescriptor; |
import com.google.protobuf.FieldPresenceTestProto.TestAllTypes; |
import com.google.protobuf.FieldPresenceTestProto.TestOptionalFieldsOnly; |
@@ -152,6 +154,26 @@ public class FieldPresenceTest extends TestCase { |
assertFalse(message1.equals(message2)); |
} |
+ public void testLazyField() throws Exception { |
+ // Test default constructed message. |
+ TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
+ TestAllTypes message = builder.build(); |
+ assertFalse(message.hasOptionalLazyMessage()); |
+ assertEquals(0, message.getSerializedSize()); |
+ assertEquals(ByteString.EMPTY, message.toByteString()); |
+ |
+ // Set default instance to the field. |
+ builder.setOptionalLazyMessage(TestAllTypes.NestedMessage.getDefaultInstance()); |
+ message = builder.build(); |
+ assertTrue(message.hasOptionalLazyMessage()); |
+ assertEquals(2, message.getSerializedSize()); |
+ |
+ // Test parse zero-length from wire sets the presence. |
+ TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteString()); |
+ assertTrue(parsed.hasOptionalLazyMessage()); |
+ assertEquals(message.getOptionalLazyMessage(), parsed.getOptionalLazyMessage()); |
+ } |
+ |
public void testFieldPresence() { |
// Optional non-message fields set to their default value are treated the |
// same way as not set. |
@@ -233,6 +255,54 @@ public class FieldPresenceTest extends TestCase { |
assertEquals(4, message.getAllFields().size()); |
} |
+ public void testFieldPresenceDynamicMessage() { |
+ Descriptor descriptor = TestAllTypes.getDescriptor(); |
+ FieldDescriptor optionalInt32Field = descriptor.findFieldByName("optional_int32"); |
+ FieldDescriptor optionalStringField = descriptor.findFieldByName("optional_string"); |
+ FieldDescriptor optionalBytesField = descriptor.findFieldByName("optional_bytes"); |
+ FieldDescriptor optionalNestedEnumField = descriptor.findFieldByName("optional_nested_enum"); |
+ EnumDescriptor enumDescriptor = optionalNestedEnumField.getEnumType(); |
+ EnumValueDescriptor defaultEnumValueDescriptor = enumDescriptor.getValues().get(0); |
+ EnumValueDescriptor nonDefaultEnumValueDescriptor = enumDescriptor.getValues().get(1); |
+ |
+ DynamicMessage defaultInstance = DynamicMessage.getDefaultInstance(descriptor); |
+ // Field not present. |
+ DynamicMessage message = defaultInstance.newBuilderForType().build(); |
+ assertFalse(message.hasField(optionalInt32Field)); |
+ assertFalse(message.hasField(optionalStringField)); |
+ assertFalse(message.hasField(optionalBytesField)); |
+ assertFalse(message.hasField(optionalNestedEnumField)); |
+ assertEquals(0, message.getAllFields().size()); |
+ |
+ // Field set to non-default value is seen as present. |
+ message = |
+ defaultInstance |
+ .newBuilderForType() |
+ .setField(optionalInt32Field, 1) |
+ .setField(optionalStringField, "x") |
+ .setField(optionalBytesField, ByteString.copyFromUtf8("y")) |
+ .setField(optionalNestedEnumField, nonDefaultEnumValueDescriptor) |
+ .build(); |
+ assertTrue(message.hasField(optionalInt32Field)); |
+ assertTrue(message.hasField(optionalStringField)); |
+ assertTrue(message.hasField(optionalBytesField)); |
+ assertTrue(message.hasField(optionalNestedEnumField)); |
+ assertEquals(4, message.getAllFields().size()); |
+ |
+ // Field set to default value is seen as not present. |
+ message = message.toBuilder() |
+ .setField(optionalInt32Field, 0) |
+ .setField(optionalStringField, "") |
+ .setField(optionalBytesField, ByteString.EMPTY) |
+ .setField(optionalNestedEnumField, defaultEnumValueDescriptor) |
+ .build(); |
+ assertFalse(message.hasField(optionalInt32Field)); |
+ assertFalse(message.hasField(optionalStringField)); |
+ assertFalse(message.hasField(optionalBytesField)); |
+ assertFalse(message.hasField(optionalNestedEnumField)); |
+ assertEquals(0, message.getAllFields().size()); |
+ } |
+ |
public void testMessageField() { |
TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
assertFalse(builder.hasOptionalNestedMessage()); |