Index: third_party/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java |
=================================================================== |
--- third_party/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java (revision 216642) |
+++ third_party/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java (working copy) |
@@ -30,6 +30,8 @@ |
package com.google.protobuf; |
+import com.google.protobuf.Descriptors.Descriptor; |
+import com.google.protobuf.Descriptors.FieldDescriptor; |
import com.google.protobuf.UnittestLite.TestAllExtensionsLite; |
import com.google.protobuf.test.UnittestImport; |
import protobuf_unittest.EnumWithNoOuter; |
@@ -53,6 +55,7 @@ |
import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder; |
import protobuf_unittest.UnittestProto.TestAllExtensions; |
import protobuf_unittest.UnittestProto.TestAllTypes; |
+import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage; |
import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; |
import protobuf_unittest.UnittestProto.TestExtremeDefaultValues; |
import protobuf_unittest.UnittestProto.TestPackedTypes; |
@@ -180,6 +183,33 @@ |
assertIsUnmodifiable(value.getRepeatedFloatList()); |
} |
+ public void testParsedMessagesAreImmutable() throws Exception { |
+ TestAllTypes value = TestAllTypes.PARSER.parseFrom( |
+ TestUtil.getAllSet().toByteString()); |
+ assertIsUnmodifiable(value.getRepeatedInt32List()); |
+ assertIsUnmodifiable(value.getRepeatedInt64List()); |
+ assertIsUnmodifiable(value.getRepeatedUint32List()); |
+ assertIsUnmodifiable(value.getRepeatedUint64List()); |
+ assertIsUnmodifiable(value.getRepeatedSint32List()); |
+ assertIsUnmodifiable(value.getRepeatedSint64List()); |
+ assertIsUnmodifiable(value.getRepeatedFixed32List()); |
+ assertIsUnmodifiable(value.getRepeatedFixed64List()); |
+ assertIsUnmodifiable(value.getRepeatedSfixed32List()); |
+ assertIsUnmodifiable(value.getRepeatedSfixed64List()); |
+ assertIsUnmodifiable(value.getRepeatedFloatList()); |
+ assertIsUnmodifiable(value.getRepeatedDoubleList()); |
+ assertIsUnmodifiable(value.getRepeatedBoolList()); |
+ assertIsUnmodifiable(value.getRepeatedStringList()); |
+ assertIsUnmodifiable(value.getRepeatedBytesList()); |
+ assertIsUnmodifiable(value.getRepeatedGroupList()); |
+ assertIsUnmodifiable(value.getRepeatedNestedMessageList()); |
+ assertIsUnmodifiable(value.getRepeatedForeignMessageList()); |
+ assertIsUnmodifiable(value.getRepeatedImportMessageList()); |
+ assertIsUnmodifiable(value.getRepeatedNestedEnumList()); |
+ assertIsUnmodifiable(value.getRepeatedForeignEnumList()); |
+ assertIsUnmodifiable(value.getRepeatedImportEnumList()); |
+ } |
+ |
private void assertIsUnmodifiable(List<?> list) { |
if (list == Collections.emptyList()) { |
// OKAY -- Need to check this b/c EmptyList allows you to call clear. |
@@ -881,7 +911,7 @@ |
builder.setOptionalNestedMessage(nestedMessage1); |
assertEquals(3, mockParent.getInvalidationCount()); |
- // primitive repated |
+ // primitive repeated |
builder.buildPartial(); |
builder.addRepeatedInt32(2); |
builder.addRepeatedInt32(3); |
@@ -977,4 +1007,140 @@ |
assertSame(b1, messageOrBuilderList.get(1)); |
assertSame(m2, messageOrBuilderList.get(2)); |
} |
+ |
+ public void testGetFieldBuilder() { |
+ Descriptor descriptor = TestAllTypes.getDescriptor(); |
+ |
+ FieldDescriptor fieldDescriptor = |
+ descriptor.findFieldByName("optional_nested_message"); |
+ FieldDescriptor foreignFieldDescriptor = |
+ descriptor.findFieldByName("optional_foreign_message"); |
+ FieldDescriptor importFieldDescriptor = |
+ descriptor.findFieldByName("optional_import_message"); |
+ |
+ // Mutate the message with new field builder |
+ // Mutate nested message |
+ TestAllTypes.Builder builder1 = TestAllTypes.newBuilder(); |
+ Message.Builder fieldBuilder1 = builder1.newBuilderForField(fieldDescriptor) |
+ .mergeFrom((Message) builder1.getField(fieldDescriptor)); |
+ FieldDescriptor subFieldDescriptor1 = |
+ fieldBuilder1.getDescriptorForType().findFieldByName("bb"); |
+ fieldBuilder1.setField(subFieldDescriptor1, 1); |
+ builder1.setField(fieldDescriptor, fieldBuilder1.build()); |
+ |
+ // Mutate foreign message |
+ Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField( |
+ foreignFieldDescriptor) |
+ .mergeFrom((Message) builder1.getField(foreignFieldDescriptor)); |
+ FieldDescriptor subForeignFieldDescriptor1 = |
+ foreignFieldBuilder1.getDescriptorForType().findFieldByName("c"); |
+ foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2); |
+ builder1.setField(foreignFieldDescriptor, foreignFieldBuilder1.build()); |
+ |
+ // Mutate import message |
+ Message.Builder importFieldBuilder1 = builder1.newBuilderForField( |
+ importFieldDescriptor) |
+ .mergeFrom((Message) builder1.getField(importFieldDescriptor)); |
+ FieldDescriptor subImportFieldDescriptor1 = |
+ importFieldBuilder1.getDescriptorForType().findFieldByName("d"); |
+ importFieldBuilder1.setField(subImportFieldDescriptor1, 3); |
+ builder1.setField(importFieldDescriptor, importFieldBuilder1.build()); |
+ |
+ Message newMessage1 = builder1.build(); |
+ |
+ // Mutate the message with existing field builder |
+ // Mutate nested message |
+ TestAllTypes.Builder builder2 = TestAllTypes.newBuilder(); |
+ Message.Builder fieldBuilder2 = builder2.getFieldBuilder(fieldDescriptor); |
+ FieldDescriptor subFieldDescriptor2 = |
+ fieldBuilder2.getDescriptorForType().findFieldByName("bb"); |
+ fieldBuilder2.setField(subFieldDescriptor2, 1); |
+ builder2.setField(fieldDescriptor, fieldBuilder2.build()); |
+ |
+ // Mutate foreign message |
+ Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField( |
+ foreignFieldDescriptor) |
+ .mergeFrom((Message) builder2.getField(foreignFieldDescriptor)); |
+ FieldDescriptor subForeignFieldDescriptor2 = |
+ foreignFieldBuilder2.getDescriptorForType().findFieldByName("c"); |
+ foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2); |
+ builder2.setField(foreignFieldDescriptor, foreignFieldBuilder2.build()); |
+ |
+ // Mutate import message |
+ Message.Builder importFieldBuilder2 = builder2.newBuilderForField( |
+ importFieldDescriptor) |
+ .mergeFrom((Message) builder2.getField(importFieldDescriptor)); |
+ FieldDescriptor subImportFieldDescriptor2 = |
+ importFieldBuilder2.getDescriptorForType().findFieldByName("d"); |
+ importFieldBuilder2.setField(subImportFieldDescriptor2, 3); |
+ builder2.setField(importFieldDescriptor, importFieldBuilder2.build()); |
+ |
+ Message newMessage2 = builder2.build(); |
+ |
+ // These two messages should be equal. |
+ assertEquals(newMessage1, newMessage2); |
+ } |
+ |
+ public void testGetFieldBuilderWithInitializedValue() { |
+ Descriptor descriptor = TestAllTypes.getDescriptor(); |
+ FieldDescriptor fieldDescriptor = |
+ descriptor.findFieldByName("optional_nested_message"); |
+ |
+ // Before setting field, builder is initialized by default value. |
+ TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
+ NestedMessage.Builder fieldBuilder = |
+ (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor); |
+ assertEquals(0, fieldBuilder.getBb()); |
+ |
+ // Setting field value with new field builder instance. |
+ builder = TestAllTypes.newBuilder(); |
+ NestedMessage.Builder newFieldBuilder = |
+ builder.getOptionalNestedMessageBuilder(); |
+ newFieldBuilder.setBb(2); |
+ // Then get the field builder instance by getFieldBuilder(). |
+ fieldBuilder = |
+ (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor); |
+ // It should contain new value. |
+ assertEquals(2, fieldBuilder.getBb()); |
+ // These two builder should be equal. |
+ assertSame(fieldBuilder, newFieldBuilder); |
+ } |
+ |
+ public void testGetFieldBuilderNotSupportedException() { |
+ Descriptor descriptor = TestAllTypes.getDescriptor(); |
+ TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
+ try { |
+ builder.getFieldBuilder(descriptor.findFieldByName("optional_int32")); |
+ fail("Exception was not thrown"); |
+ } catch (UnsupportedOperationException e) { |
+ // We expect this exception. |
+ } |
+ try { |
+ builder.getFieldBuilder( |
+ descriptor.findFieldByName("optional_nested_enum")); |
+ fail("Exception was not thrown"); |
+ } catch (UnsupportedOperationException e) { |
+ // We expect this exception. |
+ } |
+ try { |
+ builder.getFieldBuilder(descriptor.findFieldByName("repeated_int32")); |
+ fail("Exception was not thrown"); |
+ } catch (UnsupportedOperationException e) { |
+ // We expect this exception. |
+ } |
+ try { |
+ builder.getFieldBuilder( |
+ descriptor.findFieldByName("repeated_nested_enum")); |
+ fail("Exception was not thrown"); |
+ } catch (UnsupportedOperationException e) { |
+ // We expect this exception. |
+ } |
+ try { |
+ builder.getFieldBuilder( |
+ descriptor.findFieldByName("repeated_nested_message")); |
+ fail("Exception was not thrown"); |
+ } catch (UnsupportedOperationException e) { |
+ // We expect this exception. |
+ } |
+ } |
} |