Home | History | Annotate | Download | only in protobuf
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2008 Google Inc.  All rights reserved.
      3 // https://developers.google.com/protocol-buffers/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 package com.google.protobuf;
     32 
     33 import com.google.protobuf.Descriptors.Descriptor;
     34 import com.google.protobuf.Descriptors.FieldDescriptor;
     35 import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
     36 import com.google.protobuf.test.UnittestImport;
     37 import protobuf_unittest.EnumWithNoOuter;
     38 import protobuf_unittest.MessageWithNoOuter;
     39 import protobuf_unittest.MultipleFilesTestProto;
     40 import protobuf_unittest.NestedExtension.MyNestedExtension;
     41 import protobuf_unittest.NestedExtensionLite.MyNestedExtensionLite;
     42 import protobuf_unittest.NonNestedExtension;
     43 import protobuf_unittest.NonNestedExtension.MessageToBeExtended;
     44 import protobuf_unittest.NonNestedExtension.MyNonNestedExtension;
     45 import protobuf_unittest.NonNestedExtensionLite;
     46 import protobuf_unittest.NonNestedExtensionLite.MessageLiteToBeExtended;
     47 import protobuf_unittest.NonNestedExtensionLite.MyNonNestedExtensionLite;
     48 import protobuf_unittest.OuterClassNameTest2OuterClass;
     49 import protobuf_unittest.OuterClassNameTest3OuterClass;
     50 import protobuf_unittest.OuterClassNameTestOuterClass;
     51 import protobuf_unittest.ServiceWithNoOuter;
     52 import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize;
     53 import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize;
     54 import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize;
     55 import protobuf_unittest.UnittestProto;
     56 import protobuf_unittest.UnittestProto.ForeignEnum;
     57 import protobuf_unittest.UnittestProto.ForeignMessage;
     58 import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder;
     59 import protobuf_unittest.UnittestProto.NestedTestAllTypes;
     60 import protobuf_unittest.UnittestProto.TestAllExtensions;
     61 import protobuf_unittest.UnittestProto.TestAllTypes;
     62 import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage;
     63 import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;
     64 import protobuf_unittest.UnittestProto.TestExtremeDefaultValues;
     65 import protobuf_unittest.UnittestProto.TestOneof2;
     66 import protobuf_unittest.UnittestProto.TestPackedTypes;
     67 import protobuf_unittest.UnittestProto.TestUnpackedTypes;
     68 
     69 import junit.framework.TestCase;
     70 
     71 import java.io.ByteArrayInputStream;
     72 import java.io.ByteArrayOutputStream;
     73 import java.io.ObjectInputStream;
     74 import java.io.ObjectOutputStream;
     75 import java.util.Arrays;
     76 import java.util.Collections;
     77 import java.util.Iterator;
     78 import java.util.List;
     79 
     80 /**
     81  * Unit test for generated messages and generated code.  See also
     82  * {@link MessageTest}, which tests some generated message functionality.
     83  *
     84  * @author kenton (at) google.com Kenton Varda
     85  */
     86 public class GeneratedMessageTest extends TestCase {
     87   TestUtil.ReflectionTester reflectionTester =
     88     new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);
     89 
     90   public void testDefaultInstance() throws Exception {
     91     assertSame(TestAllTypes.getDefaultInstance(),
     92                TestAllTypes.getDefaultInstance().getDefaultInstanceForType());
     93     assertSame(TestAllTypes.getDefaultInstance(),
     94                TestAllTypes.newBuilder().getDefaultInstanceForType());
     95   }
     96 
     97   public void testMessageOrBuilder() throws Exception {
     98     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
     99     TestUtil.setAllFields(builder);
    100     TestAllTypes message = builder.build();
    101     TestUtil.assertAllFieldsSet(message);
    102   }
    103 
    104   public void testUsingBuilderMultipleTimes() throws Exception {
    105     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    106     // primitive field scalar and repeated
    107     builder.setOptionalSfixed64(100);
    108     builder.addRepeatedInt32(100);
    109     // enum field scalar and repeated
    110     builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
    111     builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
    112     // proto field scalar and repeated
    113     builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(1));
    114     builder.addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(1));
    115 
    116     TestAllTypes value1 = builder.build();
    117 
    118     assertEquals(100, value1.getOptionalSfixed64());
    119     assertEquals(100, value1.getRepeatedInt32(0));
    120     assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
    121         value1.getOptionalImportEnum());
    122     assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
    123         value1.getRepeatedImportEnum(0));
    124     assertEquals(1, value1.getOptionalForeignMessage().getC());
    125     assertEquals(1, value1.getRepeatedForeignMessage(0).getC());
    126 
    127     // Make sure that builder didn't update previously created values
    128     builder.setOptionalSfixed64(200);
    129     builder.setRepeatedInt32(0, 200);
    130     builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_FOO);
    131     builder.setRepeatedImportEnum(0, UnittestImport.ImportEnum.IMPORT_FOO);
    132     builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(2));
    133     builder.setRepeatedForeignMessage(0, ForeignMessage.newBuilder().setC(2));
    134 
    135     TestAllTypes value2 = builder.build();
    136 
    137     // Make sure value1 didn't change.
    138     assertEquals(100, value1.getOptionalSfixed64());
    139     assertEquals(100, value1.getRepeatedInt32(0));
    140     assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
    141         value1.getOptionalImportEnum());
    142     assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
    143         value1.getRepeatedImportEnum(0));
    144     assertEquals(1, value1.getOptionalForeignMessage().getC());
    145     assertEquals(1, value1.getRepeatedForeignMessage(0).getC());
    146 
    147     // Make sure value2 is correct
    148     assertEquals(200, value2.getOptionalSfixed64());
    149     assertEquals(200, value2.getRepeatedInt32(0));
    150     assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,
    151         value2.getOptionalImportEnum());
    152     assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,
    153         value2.getRepeatedImportEnum(0));
    154     assertEquals(2, value2.getOptionalForeignMessage().getC());
    155     assertEquals(2, value2.getRepeatedForeignMessage(0).getC());
    156   }
    157 
    158   public void testProtosShareRepeatedArraysIfDidntChange() throws Exception {
    159     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    160     builder.addRepeatedInt32(100);
    161     builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance());
    162 
    163     TestAllTypes value1 = builder.build();
    164     TestAllTypes value2 = value1.toBuilder().build();
    165 
    166     assertSame(value1.getRepeatedInt32List(), value2.getRepeatedInt32List());
    167     assertSame(value1.getRepeatedForeignMessageList(),
    168         value2.getRepeatedForeignMessageList());
    169   }
    170 
    171   public void testRepeatedArraysAreImmutable() throws Exception {
    172     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    173     builder.addRepeatedInt32(100);
    174     builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
    175     builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance());
    176     assertIsUnmodifiable(builder.getRepeatedInt32List());
    177     assertIsUnmodifiable(builder.getRepeatedImportEnumList());
    178     assertIsUnmodifiable(builder.getRepeatedForeignMessageList());
    179     assertIsUnmodifiable(builder.getRepeatedFloatList());
    180 
    181 
    182     TestAllTypes value = builder.build();
    183     assertIsUnmodifiable(value.getRepeatedInt32List());
    184     assertIsUnmodifiable(value.getRepeatedImportEnumList());
    185     assertIsUnmodifiable(value.getRepeatedForeignMessageList());
    186     assertIsUnmodifiable(value.getRepeatedFloatList());
    187   }
    188 
    189   public void testParsedMessagesAreImmutable() throws Exception {
    190     TestAllTypes value = TestAllTypes.parser().parseFrom(TestUtil.getAllSet().toByteString());
    191     assertIsUnmodifiable(value.getRepeatedInt32List());
    192     assertIsUnmodifiable(value.getRepeatedInt64List());
    193     assertIsUnmodifiable(value.getRepeatedUint32List());
    194     assertIsUnmodifiable(value.getRepeatedUint64List());
    195     assertIsUnmodifiable(value.getRepeatedSint32List());
    196     assertIsUnmodifiable(value.getRepeatedSint64List());
    197     assertIsUnmodifiable(value.getRepeatedFixed32List());
    198     assertIsUnmodifiable(value.getRepeatedFixed64List());
    199     assertIsUnmodifiable(value.getRepeatedSfixed32List());
    200     assertIsUnmodifiable(value.getRepeatedSfixed64List());
    201     assertIsUnmodifiable(value.getRepeatedFloatList());
    202     assertIsUnmodifiable(value.getRepeatedDoubleList());
    203     assertIsUnmodifiable(value.getRepeatedBoolList());
    204     assertIsUnmodifiable(value.getRepeatedStringList());
    205     assertIsUnmodifiable(value.getRepeatedBytesList());
    206     assertIsUnmodifiable(value.getRepeatedGroupList());
    207     assertIsUnmodifiable(value.getRepeatedNestedMessageList());
    208     assertIsUnmodifiable(value.getRepeatedForeignMessageList());
    209     assertIsUnmodifiable(value.getRepeatedImportMessageList());
    210     assertIsUnmodifiable(value.getRepeatedNestedEnumList());
    211     assertIsUnmodifiable(value.getRepeatedForeignEnumList());
    212     assertIsUnmodifiable(value.getRepeatedImportEnumList());
    213   }
    214 
    215   private void assertIsUnmodifiable(List<?> list) {
    216     if (list == Collections.emptyList()) {
    217       // OKAY -- Need to check this b/c EmptyList allows you to call clear.
    218     } else {
    219       try {
    220         list.clear();
    221         fail("List wasn't immutable");
    222       } catch (UnsupportedOperationException e) {
    223         // good
    224       }
    225     }
    226   }
    227 
    228   public void testSettersRejectNull() throws Exception {
    229     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    230     try {
    231       builder.setOptionalString(null);
    232       fail("Exception was not thrown");
    233     } catch (NullPointerException e) {
    234       // We expect this exception.
    235     }
    236     try {
    237       builder.setOptionalBytes(null);
    238       fail("Exception was not thrown");
    239     } catch (NullPointerException e) {
    240       // We expect this exception.
    241     }
    242     try {
    243       builder.setOptionalNestedMessage((TestAllTypes.NestedMessage) null);
    244       fail("Exception was not thrown");
    245     } catch (NullPointerException e) {
    246       // We expect this exception.
    247     }
    248     try {
    249       builder.setOptionalNestedMessage(
    250           (TestAllTypes.NestedMessage.Builder) null);
    251       fail("Exception was not thrown");
    252     } catch (NullPointerException e) {
    253       // We expect this exception.
    254     }
    255     try {
    256       builder.setOptionalNestedEnum(null);
    257       fail("Exception was not thrown");
    258     } catch (NullPointerException e) {
    259       // We expect this exception.
    260     }
    261     try {
    262       builder.addRepeatedString(null);
    263       fail("Exception was not thrown");
    264     } catch (NullPointerException e) {
    265       // We expect this exception.
    266     }
    267     try {
    268       builder.addRepeatedBytes(null);
    269       fail("Exception was not thrown");
    270     } catch (NullPointerException e) {
    271       // We expect this exception.
    272     }
    273     try {
    274       builder.addRepeatedNestedMessage((TestAllTypes.NestedMessage) null);
    275       fail("Exception was not thrown");
    276     } catch (NullPointerException e) {
    277       // We expect this exception.
    278     }
    279     try {
    280       builder.addRepeatedNestedMessage(
    281           (TestAllTypes.NestedMessage.Builder) null);
    282       fail("Exception was not thrown");
    283     } catch (NullPointerException e) {
    284       // We expect this exception.
    285     }
    286     try {
    287       builder.addRepeatedNestedEnum(null);
    288       fail("Exception was not thrown");
    289     } catch (NullPointerException e) {
    290       // We expect this exception.
    291     }
    292   }
    293 
    294   public void testRepeatedSetters() throws Exception {
    295     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    296     TestUtil.setAllFields(builder);
    297     TestUtil.modifyRepeatedFields(builder);
    298     TestAllTypes message = builder.build();
    299     TestUtil.assertRepeatedFieldsModified(message);
    300   }
    301 
    302   public void testRepeatedSettersRejectNull() throws Exception {
    303     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    304 
    305     builder.addRepeatedString("one");
    306     builder.addRepeatedString("two");
    307     try {
    308       builder.setRepeatedString(1, null);
    309       fail("Exception was not thrown");
    310     } catch (NullPointerException e) {
    311       // We expect this exception.
    312     }
    313 
    314     builder.addRepeatedBytes(TestUtil.toBytes("one"));
    315     builder.addRepeatedBytes(TestUtil.toBytes("two"));
    316     try {
    317       builder.setRepeatedBytes(1, null);
    318       fail("Exception was not thrown");
    319     } catch (NullPointerException e) {
    320       // We expect this exception.
    321     }
    322 
    323     builder.addRepeatedNestedMessage(
    324       TestAllTypes.NestedMessage.newBuilder().setBb(218).build());
    325     builder.addRepeatedNestedMessage(
    326       TestAllTypes.NestedMessage.newBuilder().setBb(456).build());
    327     try {
    328       builder.setRepeatedNestedMessage(1, (TestAllTypes.NestedMessage) null);
    329       fail("Exception was not thrown");
    330     } catch (NullPointerException e) {
    331       // We expect this exception.
    332     }
    333     try {
    334       builder.setRepeatedNestedMessage(
    335           1, (TestAllTypes.NestedMessage.Builder) null);
    336       fail("Exception was not thrown");
    337     } catch (NullPointerException e) {
    338       // We expect this exception.
    339     }
    340 
    341     builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.FOO);
    342     builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR);
    343     try {
    344       builder.setRepeatedNestedEnum(1, null);
    345       fail("Exception was not thrown");
    346     } catch (NullPointerException e) {
    347       // We expect this exception.
    348     }
    349   }
    350 
    351   public void testRepeatedAppend() throws Exception {
    352     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    353 
    354     builder.addAllRepeatedInt32(Arrays.asList(1, 2, 3, 4));
    355     builder.addAllRepeatedForeignEnum(Arrays.asList(ForeignEnum.FOREIGN_BAZ));
    356 
    357     ForeignMessage foreignMessage =
    358         ForeignMessage.newBuilder().setC(12).build();
    359     builder.addAllRepeatedForeignMessage(Arrays.asList(foreignMessage));
    360 
    361     TestAllTypes message = builder.build();
    362     assertEquals(message.getRepeatedInt32List(), Arrays.asList(1, 2, 3, 4));
    363     assertEquals(message.getRepeatedForeignEnumList(),
    364         Arrays.asList(ForeignEnum.FOREIGN_BAZ));
    365     assertEquals(1, message.getRepeatedForeignMessageCount());
    366     assertEquals(12, message.getRepeatedForeignMessage(0).getC());
    367   }
    368 
    369   public void testRepeatedAppendRejectsNull() throws Exception {
    370     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    371 
    372     ForeignMessage foreignMessage =
    373         ForeignMessage.newBuilder().setC(12).build();
    374     try {
    375       builder.addAllRepeatedForeignMessage(
    376           Arrays.asList(foreignMessage, (ForeignMessage) null));
    377       fail("Exception was not thrown");
    378     } catch (NullPointerException e) {
    379       // We expect this exception.
    380     }
    381 
    382     try {
    383       builder.addAllRepeatedForeignEnum(
    384           Arrays.asList(ForeignEnum.FOREIGN_BAZ, null));
    385       fail("Exception was not thrown");
    386     } catch (NullPointerException e) {
    387       // We expect this exception.
    388     }
    389 
    390     try {
    391       builder.addAllRepeatedString(Arrays.asList("one", null));
    392       fail("Exception was not thrown");
    393     } catch (NullPointerException e) {
    394       // We expect this exception.
    395     }
    396 
    397     try {
    398       builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null));
    399       fail("Exception was not thrown");
    400     } catch (NullPointerException e) {
    401       // We expect this exception.
    402     }
    403   }
    404 
    405   public void testRepeatedAppendIterateOnlyOnce() throws Exception {
    406     // Create a Iterable that can only be iterated once.
    407     Iterable<String> stringIterable = new Iterable<String>() {
    408       private boolean called = false;
    409       @Override
    410       public Iterator<String> iterator() {
    411         if (called) {
    412           throw new IllegalStateException();
    413         }
    414         called = true;
    415         return Arrays.asList("one", "two", "three").iterator();
    416       }
    417     };
    418     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    419     builder.addAllRepeatedString(stringIterable);
    420     assertEquals(3, builder.getRepeatedStringCount());
    421     assertEquals("one", builder.getRepeatedString(0));
    422     assertEquals("two", builder.getRepeatedString(1));
    423     assertEquals("three", builder.getRepeatedString(2));
    424 
    425     try {
    426       builder.addAllRepeatedString(stringIterable);
    427       fail("Exception was not thrown");
    428     } catch (IllegalStateException e) {
    429       // We expect this exception.
    430     }
    431   }
    432 
    433   public void testMergeFromOtherRejectsNull() throws Exception {
    434     try {
    435       TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    436       builder.mergeFrom((TestAllTypes) null);
    437       fail("Exception was not thrown");
    438     } catch (NullPointerException e) {
    439       // We expect this exception.
    440     }
    441   }
    442 
    443   public void testSettingForeignMessageUsingBuilder() throws Exception {
    444     TestAllTypes message = TestAllTypes.newBuilder()
    445         // Pass builder for foreign message instance.
    446         .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123))
    447         .build();
    448     TestAllTypes expectedMessage = TestAllTypes.newBuilder()
    449         // Create expected version passing foreign message instance explicitly.
    450         .setOptionalForeignMessage(
    451             ForeignMessage.newBuilder().setC(123).build())
    452         .build();
    453     // TODO(ngd): Upgrade to using real #equals method once implemented
    454     assertEquals(expectedMessage.toString(), message.toString());
    455   }
    456 
    457   public void testSettingRepeatedForeignMessageUsingBuilder() throws Exception {
    458     TestAllTypes message = TestAllTypes.newBuilder()
    459         // Pass builder for foreign message instance.
    460         .addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(456))
    461         .build();
    462     TestAllTypes expectedMessage = TestAllTypes.newBuilder()
    463         // Create expected version passing foreign message instance explicitly.
    464         .addRepeatedForeignMessage(
    465             ForeignMessage.newBuilder().setC(456).build())
    466         .build();
    467     assertEquals(expectedMessage.toString(), message.toString());
    468   }
    469 
    470   public void testDefaults() throws Exception {
    471     TestUtil.assertClear(TestAllTypes.getDefaultInstance());
    472     TestUtil.assertClear(TestAllTypes.newBuilder().build());
    473 
    474     TestExtremeDefaultValues message =
    475         TestExtremeDefaultValues.getDefaultInstance();
    476     assertEquals("\u1234", message.getUtf8String());
    477     assertEquals(Double.POSITIVE_INFINITY, message.getInfDouble());
    478     assertEquals(Double.NEGATIVE_INFINITY, message.getNegInfDouble());
    479     assertTrue(Double.isNaN(message.getNanDouble()));
    480     assertEquals(Float.POSITIVE_INFINITY, message.getInfFloat());
    481     assertEquals(Float.NEGATIVE_INFINITY, message.getNegInfFloat());
    482     assertTrue(Float.isNaN(message.getNanFloat()));
    483     assertEquals("? ? ?? ?? ??? ??/ ??-", message.getCppTrigraph());
    484   }
    485 
    486   public void testClear() throws Exception {
    487     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    488     TestUtil.assertClear(builder);
    489     TestUtil.setAllFields(builder);
    490     builder.clear();
    491     TestUtil.assertClear(builder);
    492   }
    493 
    494   public void testReflectionGetters() throws Exception {
    495     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    496     TestUtil.setAllFields(builder);
    497     reflectionTester.assertAllFieldsSetViaReflection(builder);
    498 
    499     TestAllTypes message = builder.build();
    500     reflectionTester.assertAllFieldsSetViaReflection(message);
    501   }
    502 
    503   public void testReflectionSetters() throws Exception {
    504     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    505     reflectionTester.setAllFieldsViaReflection(builder);
    506     TestUtil.assertAllFieldsSet(builder);
    507 
    508     TestAllTypes message = builder.build();
    509     TestUtil.assertAllFieldsSet(message);
    510   }
    511 
    512   public void testReflectionSettersRejectNull() throws Exception {
    513     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    514     reflectionTester.assertReflectionSettersRejectNull(builder);
    515   }
    516 
    517   public void testReflectionRepeatedSetters() throws Exception {
    518     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    519     reflectionTester.setAllFieldsViaReflection(builder);
    520     reflectionTester.modifyRepeatedFieldsViaReflection(builder);
    521     TestUtil.assertRepeatedFieldsModified(builder);
    522 
    523     TestAllTypes message = builder.build();
    524     TestUtil.assertRepeatedFieldsModified(message);
    525   }
    526 
    527   public void testReflectionRepeatedSettersRejectNull() throws Exception {
    528     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    529     reflectionTester.assertReflectionRepeatedSettersRejectNull(builder);
    530   }
    531 
    532   public void testReflectionDefaults() throws Exception {
    533     reflectionTester.assertClearViaReflection(
    534       TestAllTypes.getDefaultInstance());
    535     reflectionTester.assertClearViaReflection(
    536       TestAllTypes.newBuilder().build());
    537   }
    538 
    539   public void testReflectionGetOneof() throws Exception {
    540     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    541     reflectionTester.setAllFieldsViaReflection(builder);
    542     Descriptors.OneofDescriptor oneof =
    543         TestAllTypes.getDescriptor().getOneofs().get(0);
    544     Descriptors.FieldDescriptor field =
    545         TestAllTypes.getDescriptor().findFieldByName("oneof_bytes");
    546     assertSame(field, builder.getOneofFieldDescriptor(oneof));
    547 
    548     TestAllTypes message = builder.build();
    549     assertSame(field, message.getOneofFieldDescriptor(oneof));
    550   }
    551 
    552   public void testReflectionClearOneof() throws Exception {
    553     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    554     reflectionTester.setAllFieldsViaReflection(builder);
    555     Descriptors.OneofDescriptor oneof =
    556         TestAllTypes.getDescriptor().getOneofs().get(0);
    557     Descriptors.FieldDescriptor field =
    558         TestAllTypes.getDescriptor().findFieldByName("oneof_bytes");
    559 
    560     assertTrue(builder.hasOneof(oneof));
    561     assertTrue(builder.hasField(field));
    562     builder.clearOneof(oneof);
    563     assertFalse(builder.hasOneof(oneof));
    564     assertFalse(builder.hasField(field));
    565   }
    566 
    567   public void testEnumInterface() throws Exception {
    568     assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum()
    569         instanceof ProtocolMessageEnum);
    570   }
    571 
    572   public void testEnumMap() throws Exception {
    573     Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap();
    574 
    575     for (ForeignEnum value : ForeignEnum.values()) {
    576       assertEquals(value, map.findValueByNumber(value.getNumber()));
    577     }
    578 
    579     assertTrue(map.findValueByNumber(12345) == null);
    580   }
    581 
    582   public void testParsePackedToUnpacked() throws Exception {
    583     TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder();
    584     TestUnpackedTypes message =
    585       builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build();
    586     TestUtil.assertUnpackedFieldsSet(message);
    587   }
    588 
    589   public void testParseUnpackedToPacked() throws Exception {
    590     TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();
    591     TestPackedTypes message =
    592       builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build();
    593     TestUtil.assertPackedFieldsSet(message);
    594   }
    595 
    596   // =================================================================
    597   // Extensions.
    598 
    599   TestUtil.ReflectionTester extensionsReflectionTester =
    600     new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),
    601                                   TestUtil.getExtensionRegistry());
    602 
    603   public void testExtensionMessageOrBuilder() throws Exception {
    604     TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
    605     TestUtil.setAllExtensions(builder);
    606     TestAllExtensions message = builder.build();
    607     TestUtil.assertAllExtensionsSet(message);
    608   }
    609 
    610   public void testExtensionRepeatedSetters() throws Exception {
    611     TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
    612     TestUtil.setAllExtensions(builder);
    613     TestUtil.modifyRepeatedExtensions(builder);
    614     TestAllExtensions message = builder.build();
    615     TestUtil.assertRepeatedExtensionsModified(message);
    616   }
    617 
    618   public void testExtensionDefaults() throws Exception {
    619     TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance());
    620     TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build());
    621   }
    622 
    623   public void testUnsetRepeatedExtensionGetField() {
    624     TestAllExtensions message = TestAllExtensions.getDefaultInstance();
    625     Object value;
    626 
    627     value = message.getField(UnittestProto.repeatedStringExtension.getDescriptor());
    628     assertTrue(value instanceof List);
    629     assertTrue(((List<?>) value).isEmpty());
    630     assertIsUnmodifiable((List<?>) value);
    631 
    632     value = message.getField(UnittestProto.repeatedNestedMessageExtension.getDescriptor());
    633     assertTrue(value instanceof List);
    634     assertTrue(((List<?>) value).isEmpty());
    635     assertIsUnmodifiable((List<?>) value);
    636   }
    637 
    638   public void testExtensionReflectionGetters() throws Exception {
    639     TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
    640     TestUtil.setAllExtensions(builder);
    641     extensionsReflectionTester.assertAllFieldsSetViaReflection(builder);
    642 
    643     TestAllExtensions message = builder.build();
    644     extensionsReflectionTester.assertAllFieldsSetViaReflection(message);
    645   }
    646 
    647   public void testExtensionReflectionSetters() throws Exception {
    648     TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
    649     extensionsReflectionTester.setAllFieldsViaReflection(builder);
    650     TestUtil.assertAllExtensionsSet(builder);
    651 
    652     TestAllExtensions message = builder.build();
    653     TestUtil.assertAllExtensionsSet(message);
    654   }
    655 
    656   public void testExtensionReflectionSettersRejectNull() throws Exception {
    657     TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
    658     extensionsReflectionTester.assertReflectionSettersRejectNull(builder);
    659   }
    660 
    661   public void testExtensionReflectionRepeatedSetters() throws Exception {
    662     TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
    663     extensionsReflectionTester.setAllFieldsViaReflection(builder);
    664     extensionsReflectionTester.modifyRepeatedFieldsViaReflection(builder);
    665     TestUtil.assertRepeatedExtensionsModified(builder);
    666 
    667     TestAllExtensions message = builder.build();
    668     TestUtil.assertRepeatedExtensionsModified(message);
    669   }
    670 
    671   public void testExtensionReflectionRepeatedSettersRejectNull()
    672       throws Exception {
    673     TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
    674     extensionsReflectionTester.assertReflectionRepeatedSettersRejectNull(
    675         builder);
    676   }
    677 
    678   public void testExtensionReflectionDefaults() throws Exception {
    679     extensionsReflectionTester.assertClearViaReflection(
    680       TestAllExtensions.getDefaultInstance());
    681     extensionsReflectionTester.assertClearViaReflection(
    682       TestAllExtensions.newBuilder().build());
    683   }
    684 
    685   public void testClearExtension() throws Exception {
    686     // clearExtension() is not actually used in TestUtil, so try it manually.
    687     assertFalse(
    688       TestAllExtensions.newBuilder()
    689         .setExtension(UnittestProto.optionalInt32Extension, 1)
    690         .clearExtension(UnittestProto.optionalInt32Extension)
    691         .hasExtension(UnittestProto.optionalInt32Extension));
    692     assertEquals(0,
    693       TestAllExtensions.newBuilder()
    694         .addExtension(UnittestProto.repeatedInt32Extension, 1)
    695         .clearExtension(UnittestProto.repeatedInt32Extension)
    696         .getExtensionCount(UnittestProto.repeatedInt32Extension));
    697   }
    698 
    699   public void testExtensionCopy() throws Exception {
    700     TestAllExtensions original = TestUtil.getAllExtensionsSet();
    701     TestAllExtensions copy = TestAllExtensions.newBuilder(original).build();
    702     TestUtil.assertAllExtensionsSet(copy);
    703   }
    704 
    705   public void testExtensionMergeFrom() throws Exception {
    706     TestAllExtensions original =
    707       TestAllExtensions.newBuilder()
    708         .setExtension(UnittestProto.optionalInt32Extension, 1).build();
    709     TestAllExtensions merged =
    710         TestAllExtensions.newBuilder().mergeFrom(original).build();
    711     assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension));
    712     assertEquals(
    713         1, (int) merged.getExtension(UnittestProto.optionalInt32Extension));
    714   }
    715 
    716   // =================================================================
    717   // Lite Extensions.
    718 
    719   // We test lite extensions directly because they have a separate
    720   // implementation from full extensions.  In contrast, we do not test
    721   // lite fields directly since they are implemented exactly the same as
    722   // regular fields.
    723 
    724   public void testLiteExtensionMessageOrBuilder() throws Exception {
    725     TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();
    726     TestUtilLite.setAllExtensions(builder);
    727     TestUtil.assertAllExtensionsSet(builder);
    728 
    729     TestAllExtensionsLite message = builder.build();
    730     TestUtil.assertAllExtensionsSet(message);
    731   }
    732 
    733   public void testLiteExtensionRepeatedSetters() throws Exception {
    734     TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();
    735     TestUtilLite.setAllExtensions(builder);
    736     TestUtilLite.modifyRepeatedExtensions(builder);
    737     TestUtil.assertRepeatedExtensionsModified(builder);
    738 
    739     TestAllExtensionsLite message = builder.build();
    740     TestUtil.assertRepeatedExtensionsModified(message);
    741   }
    742 
    743   public void testLiteExtensionDefaults() throws Exception {
    744     TestUtil.assertExtensionsClear(TestAllExtensionsLite.getDefaultInstance());
    745     TestUtil.assertExtensionsClear(TestAllExtensionsLite.newBuilder().build());
    746   }
    747 
    748   public void testClearLiteExtension() throws Exception {
    749     // clearExtension() is not actually used in TestUtil, so try it manually.
    750     assertFalse(
    751       TestAllExtensionsLite.newBuilder()
    752         .setExtension(UnittestLite.optionalInt32ExtensionLite, 1)
    753         .clearExtension(UnittestLite.optionalInt32ExtensionLite)
    754         .hasExtension(UnittestLite.optionalInt32ExtensionLite));
    755     assertEquals(0,
    756       TestAllExtensionsLite.newBuilder()
    757         .addExtension(UnittestLite.repeatedInt32ExtensionLite, 1)
    758         .clearExtension(UnittestLite.repeatedInt32ExtensionLite)
    759         .getExtensionCount(UnittestLite.repeatedInt32ExtensionLite));
    760   }
    761 
    762   public void testLiteExtensionCopy() throws Exception {
    763     TestAllExtensionsLite original = TestUtilLite.getAllLiteExtensionsSet();
    764     TestAllExtensionsLite copy =
    765         TestAllExtensionsLite.newBuilder(original).build();
    766     TestUtil.assertAllExtensionsSet(copy);
    767   }
    768 
    769   public void testLiteExtensionMergeFrom() throws Exception {
    770     TestAllExtensionsLite original =
    771       TestAllExtensionsLite.newBuilder()
    772         .setExtension(UnittestLite.optionalInt32ExtensionLite, 1).build();
    773     TestAllExtensionsLite merged =
    774         TestAllExtensionsLite.newBuilder().mergeFrom(original).build();
    775     assertTrue(merged.hasExtension(UnittestLite.optionalInt32ExtensionLite));
    776     assertEquals(
    777         1, (int) merged.getExtension(UnittestLite.optionalInt32ExtensionLite));
    778   }
    779 
    780   // =================================================================
    781   // multiple_files_test
    782 
    783   // Test that custom options of an file level enum are properly initialized.
    784   // This test needs to be put before any other access to MultipleFilesTestProto
    785   // or messages defined in multiple_files_test.proto because the class loading
    786   // order affects initialization process of custom options.
    787   public void testEnumValueOptionsInMultipleFilesMode() throws Exception {
    788     assertEquals(12345, EnumWithNoOuter.FOO.getValueDescriptor().getOptions()
    789         .getExtension(MultipleFilesTestProto.enumValueOption).intValue());
    790   }
    791 
    792   public void testMultipleFilesOption() throws Exception {
    793     // We mostly just want to check that things compile.
    794     MessageWithNoOuter message =
    795       MessageWithNoOuter.newBuilder()
    796         .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1))
    797         .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1))
    798         .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ)
    799         .setForeignEnum(EnumWithNoOuter.BAR)
    800         .build();
    801     assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString()));
    802 
    803     assertEquals(MultipleFilesTestProto.getDescriptor(),
    804                  MessageWithNoOuter.getDescriptor().getFile());
    805 
    806     Descriptors.FieldDescriptor field =
    807       MessageWithNoOuter.getDescriptor().findFieldByName("foreign_enum");
    808     assertEquals(EnumWithNoOuter.BAR.getValueDescriptor(),
    809                  message.getField(field));
    810 
    811     assertEquals(MultipleFilesTestProto.getDescriptor(),
    812                  ServiceWithNoOuter.getDescriptor().getFile());
    813 
    814     assertFalse(
    815       TestAllExtensions.getDefaultInstance().hasExtension(
    816         MultipleFilesTestProto.extensionWithOuter));
    817   }
    818 
    819   public void testOptionalFieldWithRequiredSubfieldsOptimizedForSize()
    820     throws Exception {
    821     TestOptionalOptimizedForSize message =
    822         TestOptionalOptimizedForSize.getDefaultInstance();
    823     assertTrue(message.isInitialized());
    824 
    825     message = TestOptionalOptimizedForSize.newBuilder().setO(
    826         TestRequiredOptimizedForSize.newBuilder().buildPartial()
    827         ).buildPartial();
    828     assertFalse(message.isInitialized());
    829 
    830     message = TestOptionalOptimizedForSize.newBuilder().setO(
    831         TestRequiredOptimizedForSize.newBuilder().setX(5).buildPartial()
    832         ).buildPartial();
    833     assertTrue(message.isInitialized());
    834   }
    835 
    836   public void testUninitializedExtensionInOptimizedForSize()
    837       throws Exception {
    838     TestOptimizedForSize.Builder builder = TestOptimizedForSize.newBuilder();
    839     builder.setExtension(TestOptimizedForSize.testExtension2,
    840         TestRequiredOptimizedForSize.newBuilder().buildPartial());
    841     assertFalse(builder.isInitialized());
    842     assertFalse(builder.buildPartial().isInitialized());
    843 
    844     builder = TestOptimizedForSize.newBuilder();
    845     builder.setExtension(TestOptimizedForSize.testExtension2,
    846         TestRequiredOptimizedForSize.newBuilder().setX(10).buildPartial());
    847     assertTrue(builder.isInitialized());
    848     assertTrue(builder.buildPartial().isInitialized());
    849   }
    850 
    851   public void testToBuilder() throws Exception {
    852     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    853     TestUtil.setAllFields(builder);
    854     TestAllTypes message = builder.build();
    855     TestUtil.assertAllFieldsSet(message);
    856     TestUtil.assertAllFieldsSet(message.toBuilder().build());
    857   }
    858 
    859   public void testFieldConstantValues() throws Exception {
    860     assertEquals(TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1);
    861     assertEquals(TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1);
    862     assertEquals(TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16);
    863     assertEquals(TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18);
    864     assertEquals(TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21);
    865     assertEquals(TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31);
    866     assertEquals(TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46);
    867     assertEquals(TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48);
    868     assertEquals(TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51);
    869   }
    870 
    871   public void testExtensionConstantValues() throws Exception {
    872     assertEquals(UnittestProto.TestRequired.SINGLE_FIELD_NUMBER, 1000);
    873     assertEquals(UnittestProto.TestRequired.MULTI_FIELD_NUMBER, 1001);
    874     assertEquals(UnittestProto.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1);
    875     assertEquals(UnittestProto.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16);
    876     assertEquals(
    877       UnittestProto.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18);
    878     assertEquals(UnittestProto.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 21);
    879     assertEquals(UnittestProto.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31);
    880     assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46);
    881     assertEquals(
    882       UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48);
    883     assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51);
    884   }
    885 
    886   public void testRecursiveMessageDefaultInstance() throws Exception {
    887     UnittestProto.TestRecursiveMessage message =
    888         UnittestProto.TestRecursiveMessage.getDefaultInstance();
    889     assertTrue(message != null);
    890     assertNotNull(message.getA());
    891     assertTrue(message.getA() == message);
    892   }
    893 
    894   public void testSerialize() throws Exception {
    895     ByteArrayOutputStream baos = new ByteArrayOutputStream();
    896     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    897     TestUtil.setAllFields(builder);
    898     TestAllTypes expected = builder.build();
    899     ObjectOutputStream out = new ObjectOutputStream(baos);
    900     try {
    901       out.writeObject(expected);
    902     } finally {
    903       out.close();
    904     }
    905     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    906     ObjectInputStream in = new ObjectInputStream(bais);
    907     TestAllTypes actual = (TestAllTypes) in.readObject();
    908     assertEquals(expected, actual);
    909   }
    910 
    911   public void testSerializePartial() throws Exception {
    912     ByteArrayOutputStream baos = new ByteArrayOutputStream();
    913     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
    914     TestAllTypes expected = builder.buildPartial();
    915     ObjectOutputStream out = new ObjectOutputStream(baos);
    916     try {
    917       out.writeObject(expected);
    918     } finally {
    919       out.close();
    920     }
    921     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    922     ObjectInputStream in = new ObjectInputStream(bais);
    923     TestAllTypes actual = (TestAllTypes) in.readObject();
    924     assertEquals(expected, actual);
    925   }
    926 
    927   public void testEnumValues() {
    928      assertEquals(
    929          TestAllTypes.NestedEnum.BAR.getNumber(),
    930          TestAllTypes.NestedEnum.BAR_VALUE);
    931     assertEquals(
    932         TestAllTypes.NestedEnum.BAZ.getNumber(),
    933         TestAllTypes.NestedEnum.BAZ_VALUE);
    934     assertEquals(
    935         TestAllTypes.NestedEnum.FOO.getNumber(),
    936         TestAllTypes.NestedEnum.FOO_VALUE);
    937   }
    938 
    939   public void testNonNestedExtensionInitialization() {
    940     assertTrue(NonNestedExtension.nonNestedExtension
    941                .getMessageDefaultInstance() instanceof MyNonNestedExtension);
    942     assertEquals("nonNestedExtension",
    943                  NonNestedExtension.nonNestedExtension.getDescriptor().getName());
    944   }
    945 
    946   public void testNestedExtensionInitialization() {
    947     assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance()
    948                instanceof MessageToBeExtended);
    949     assertEquals("recursiveExtension",
    950                  MyNestedExtension.recursiveExtension.getDescriptor().getName());
    951   }
    952 
    953   public void testNonNestedExtensionLiteInitialization() {
    954     assertTrue(NonNestedExtensionLite.nonNestedExtensionLite
    955                .getMessageDefaultInstance() instanceof MyNonNestedExtensionLite);
    956   }
    957 
    958   public void testNestedExtensionLiteInitialization() {
    959     assertTrue(MyNestedExtensionLite.recursiveExtensionLite
    960                .getMessageDefaultInstance() instanceof MessageLiteToBeExtended);
    961   }
    962 
    963   public void testInvalidations() throws Exception {
    964     GeneratedMessage.enableAlwaysUseFieldBuildersForTesting();
    965     TestAllTypes.NestedMessage nestedMessage1 =
    966         TestAllTypes.NestedMessage.newBuilder().build();
    967     TestAllTypes.NestedMessage nestedMessage2 =
    968         TestAllTypes.NestedMessage.newBuilder().build();
    969 
    970     // Set all three flavors (enum, primitive, message and singular/repeated)
    971     // and verify no invalidations fired
    972     TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
    973 
    974     TestAllTypes.Builder builder = (TestAllTypes.Builder)
    975         ((GeneratedMessage) TestAllTypes.getDefaultInstance()).
    976             newBuilderForType(mockParent);
    977     builder.setOptionalInt32(1);
    978     builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR);
    979     builder.setOptionalNestedMessage(nestedMessage1);
    980     builder.addRepeatedInt32(1);
    981     builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR);
    982     builder.addRepeatedNestedMessage(nestedMessage1);
    983     assertEquals(0, mockParent.getInvalidationCount());
    984 
    985     // Now tell it we want changes and make sure it's only fired once
    986     // And do this for each flavor
    987 
    988     // primitive single
    989     builder.buildPartial();
    990     builder.setOptionalInt32(2);
    991     builder.setOptionalInt32(3);
    992     assertEquals(1, mockParent.getInvalidationCount());
    993 
    994     // enum single
    995     builder.buildPartial();
    996     builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ);
    997     builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR);
    998     assertEquals(2, mockParent.getInvalidationCount());
    999 
   1000     // message single
   1001     builder.buildPartial();
   1002     builder.setOptionalNestedMessage(nestedMessage2);
   1003     builder.setOptionalNestedMessage(nestedMessage1);
   1004     assertEquals(3, mockParent.getInvalidationCount());
   1005 
   1006     // primitive repeated
   1007     builder.buildPartial();
   1008     builder.addRepeatedInt32(2);
   1009     builder.addRepeatedInt32(3);
   1010     assertEquals(4, mockParent.getInvalidationCount());
   1011 
   1012     // enum repeated
   1013     builder.buildPartial();
   1014     builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ);
   1015     builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ);
   1016     assertEquals(5, mockParent.getInvalidationCount());
   1017 
   1018     // message repeated
   1019     builder.buildPartial();
   1020     builder.addRepeatedNestedMessage(nestedMessage2);
   1021     builder.addRepeatedNestedMessage(nestedMessage1);
   1022     assertEquals(6, mockParent.getInvalidationCount());
   1023 
   1024   }
   1025 
   1026   public void testInvalidations_Extensions() throws Exception {
   1027     TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
   1028 
   1029     TestAllExtensions.Builder builder = (TestAllExtensions.Builder)
   1030         ((GeneratedMessage) TestAllExtensions.getDefaultInstance()).
   1031             newBuilderForType(mockParent);
   1032 
   1033     builder.addExtension(UnittestProto.repeatedInt32Extension, 1);
   1034     builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 2);
   1035     builder.clearExtension(UnittestProto.repeatedInt32Extension);
   1036     assertEquals(0, mockParent.getInvalidationCount());
   1037 
   1038     // Now tell it we want changes and make sure it's only fired once
   1039     builder.buildPartial();
   1040     builder.addExtension(UnittestProto.repeatedInt32Extension, 2);
   1041     builder.addExtension(UnittestProto.repeatedInt32Extension, 3);
   1042     assertEquals(1, mockParent.getInvalidationCount());
   1043 
   1044     builder.buildPartial();
   1045     builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 4);
   1046     builder.setExtension(UnittestProto.repeatedInt32Extension, 1, 5);
   1047     assertEquals(2, mockParent.getInvalidationCount());
   1048 
   1049     builder.buildPartial();
   1050     builder.clearExtension(UnittestProto.repeatedInt32Extension);
   1051     builder.clearExtension(UnittestProto.repeatedInt32Extension);
   1052     assertEquals(3, mockParent.getInvalidationCount());
   1053   }
   1054 
   1055   public void testBaseMessageOrBuilder() {
   1056     // Mostly just makes sure the base interface exists and has some methods.
   1057     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
   1058     TestAllTypes message = builder.buildPartial();
   1059     TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder;
   1060     TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message;
   1061 
   1062     assertEquals(
   1063         messageAsInterface.getDefaultBool(),
   1064         messageAsInterface.getDefaultBool());
   1065     assertEquals(
   1066         messageAsInterface.getOptionalDouble(),
   1067         messageAsInterface.getOptionalDouble());
   1068   }
   1069 
   1070   public void testMessageOrBuilderGetters() {
   1071     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
   1072 
   1073     // single fields
   1074     assertSame(ForeignMessage.getDefaultInstance(),
   1075         builder.getOptionalForeignMessageOrBuilder());
   1076     ForeignMessage.Builder subBuilder =
   1077         builder.getOptionalForeignMessageBuilder();
   1078     assertSame(subBuilder, builder.getOptionalForeignMessageOrBuilder());
   1079 
   1080     // repeated fields
   1081     ForeignMessage m0 = ForeignMessage.newBuilder().buildPartial();
   1082     ForeignMessage m1 = ForeignMessage.newBuilder().buildPartial();
   1083     ForeignMessage m2 = ForeignMessage.newBuilder().buildPartial();
   1084     builder.addRepeatedForeignMessage(m0);
   1085     builder.addRepeatedForeignMessage(m1);
   1086     builder.addRepeatedForeignMessage(m2);
   1087     assertSame(m0, builder.getRepeatedForeignMessageOrBuilder(0));
   1088     assertSame(m1, builder.getRepeatedForeignMessageOrBuilder(1));
   1089     assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));
   1090     ForeignMessage.Builder b0 = builder.getRepeatedForeignMessageBuilder(0);
   1091     ForeignMessage.Builder b1 = builder.getRepeatedForeignMessageBuilder(1);
   1092     assertSame(b0, builder.getRepeatedForeignMessageOrBuilder(0));
   1093     assertSame(b1, builder.getRepeatedForeignMessageOrBuilder(1));
   1094     assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));
   1095 
   1096     List<? extends ForeignMessageOrBuilder> messageOrBuilderList =
   1097         builder.getRepeatedForeignMessageOrBuilderList();
   1098     assertSame(b0, messageOrBuilderList.get(0));
   1099     assertSame(b1, messageOrBuilderList.get(1));
   1100     assertSame(m2, messageOrBuilderList.get(2));
   1101   }
   1102 
   1103   public void testGetFieldBuilder() {
   1104     Descriptor descriptor = TestAllTypes.getDescriptor();
   1105 
   1106     FieldDescriptor fieldDescriptor =
   1107         descriptor.findFieldByName("optional_nested_message");
   1108     FieldDescriptor foreignFieldDescriptor =
   1109         descriptor.findFieldByName("optional_foreign_message");
   1110     FieldDescriptor importFieldDescriptor =
   1111         descriptor.findFieldByName("optional_import_message");
   1112 
   1113     // Mutate the message with new field builder
   1114     // Mutate nested message
   1115     TestAllTypes.Builder builder1 = TestAllTypes.newBuilder();
   1116     Message.Builder fieldBuilder1 = builder1.newBuilderForField(fieldDescriptor)
   1117         .mergeFrom((Message) builder1.getField(fieldDescriptor));
   1118     FieldDescriptor subFieldDescriptor1 =
   1119         fieldBuilder1.getDescriptorForType().findFieldByName("bb");
   1120     fieldBuilder1.setField(subFieldDescriptor1, 1);
   1121     builder1.setField(fieldDescriptor, fieldBuilder1.build());
   1122 
   1123     // Mutate foreign message
   1124     Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField(
   1125         foreignFieldDescriptor)
   1126         .mergeFrom((Message) builder1.getField(foreignFieldDescriptor));
   1127     FieldDescriptor subForeignFieldDescriptor1 =
   1128         foreignFieldBuilder1.getDescriptorForType().findFieldByName("c");
   1129     foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2);
   1130     builder1.setField(foreignFieldDescriptor, foreignFieldBuilder1.build());
   1131 
   1132     // Mutate import message
   1133     Message.Builder importFieldBuilder1 = builder1.newBuilderForField(
   1134         importFieldDescriptor)
   1135         .mergeFrom((Message) builder1.getField(importFieldDescriptor));
   1136     FieldDescriptor subImportFieldDescriptor1 =
   1137         importFieldBuilder1.getDescriptorForType().findFieldByName("d");
   1138     importFieldBuilder1.setField(subImportFieldDescriptor1, 3);
   1139     builder1.setField(importFieldDescriptor, importFieldBuilder1.build());
   1140 
   1141     Message newMessage1 = builder1.build();
   1142 
   1143     // Mutate the message with existing field builder
   1144     // Mutate nested message
   1145     TestAllTypes.Builder builder2 = TestAllTypes.newBuilder();
   1146     Message.Builder fieldBuilder2 = builder2.getFieldBuilder(fieldDescriptor);
   1147     FieldDescriptor subFieldDescriptor2 =
   1148         fieldBuilder2.getDescriptorForType().findFieldByName("bb");
   1149     fieldBuilder2.setField(subFieldDescriptor2, 1);
   1150     builder2.setField(fieldDescriptor, fieldBuilder2.build());
   1151 
   1152     // Mutate foreign message
   1153     Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField(
   1154         foreignFieldDescriptor)
   1155         .mergeFrom((Message) builder2.getField(foreignFieldDescriptor));
   1156     FieldDescriptor subForeignFieldDescriptor2 =
   1157         foreignFieldBuilder2.getDescriptorForType().findFieldByName("c");
   1158     foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2);
   1159     builder2.setField(foreignFieldDescriptor, foreignFieldBuilder2.build());
   1160 
   1161     // Mutate import message
   1162     Message.Builder importFieldBuilder2 = builder2.newBuilderForField(
   1163         importFieldDescriptor)
   1164         .mergeFrom((Message) builder2.getField(importFieldDescriptor));
   1165     FieldDescriptor subImportFieldDescriptor2 =
   1166         importFieldBuilder2.getDescriptorForType().findFieldByName("d");
   1167     importFieldBuilder2.setField(subImportFieldDescriptor2, 3);
   1168     builder2.setField(importFieldDescriptor, importFieldBuilder2.build());
   1169 
   1170     Message newMessage2 = builder2.build();
   1171 
   1172     // These two messages should be equal.
   1173     assertEquals(newMessage1, newMessage2);
   1174   }
   1175 
   1176   public void testGetFieldBuilderWithInitializedValue() {
   1177     Descriptor descriptor = TestAllTypes.getDescriptor();
   1178     FieldDescriptor fieldDescriptor =
   1179         descriptor.findFieldByName("optional_nested_message");
   1180 
   1181     // Before setting field, builder is initialized by default value.
   1182     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
   1183     NestedMessage.Builder fieldBuilder =
   1184         (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor);
   1185     assertEquals(0, fieldBuilder.getBb());
   1186 
   1187     // Setting field value with new field builder instance.
   1188     builder = TestAllTypes.newBuilder();
   1189     NestedMessage.Builder newFieldBuilder =
   1190         builder.getOptionalNestedMessageBuilder();
   1191     newFieldBuilder.setBb(2);
   1192     // Then get the field builder instance by getFieldBuilder().
   1193     fieldBuilder =
   1194         (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor);
   1195     // It should contain new value.
   1196     assertEquals(2, fieldBuilder.getBb());
   1197     // These two builder should be equal.
   1198     assertSame(fieldBuilder, newFieldBuilder);
   1199   }
   1200 
   1201   public void testGetFieldBuilderNotSupportedException() {
   1202     Descriptor descriptor = TestAllTypes.getDescriptor();
   1203     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
   1204     try {
   1205       builder.getFieldBuilder(descriptor.findFieldByName("optional_int32"));
   1206       fail("Exception was not thrown");
   1207     } catch (UnsupportedOperationException e) {
   1208       // We expect this exception.
   1209     }
   1210     try {
   1211       builder.getFieldBuilder(
   1212           descriptor.findFieldByName("optional_nested_enum"));
   1213       fail("Exception was not thrown");
   1214     } catch (UnsupportedOperationException e) {
   1215       // We expect this exception.
   1216     }
   1217     try {
   1218       builder.getFieldBuilder(descriptor.findFieldByName("repeated_int32"));
   1219       fail("Exception was not thrown");
   1220     } catch (UnsupportedOperationException e) {
   1221       // We expect this exception.
   1222     }
   1223     try {
   1224       builder.getFieldBuilder(
   1225           descriptor.findFieldByName("repeated_nested_enum"));
   1226       fail("Exception was not thrown");
   1227     } catch (UnsupportedOperationException e) {
   1228       // We expect this exception.
   1229     }
   1230     try {
   1231       builder.getFieldBuilder(
   1232           descriptor.findFieldByName("repeated_nested_message"));
   1233       fail("Exception was not thrown");
   1234     } catch (UnsupportedOperationException e) {
   1235       // We expect this exception.
   1236     }
   1237   }
   1238 
   1239   // Test that when the default outer class name conflicts with another type
   1240   // defined in the proto the compiler will append a suffix to avoid the
   1241   // conflict.
   1242   public void testConflictingOuterClassName() {
   1243     // We just need to make sure we can refer to the outer class with the
   1244     // expected name. There is nothing else to test.
   1245     OuterClassNameTestOuterClass.OuterClassNameTest message =
   1246         OuterClassNameTestOuterClass.OuterClassNameTest.newBuilder().build();
   1247     assertTrue(message.getDescriptorForType() ==
   1248         OuterClassNameTestOuterClass.OuterClassNameTest.getDescriptor());
   1249 
   1250     OuterClassNameTest2OuterClass.TestMessage2.NestedMessage.OuterClassNameTest2
   1251         message2 = OuterClassNameTest2OuterClass.TestMessage2.NestedMessage
   1252             .OuterClassNameTest2.newBuilder().build();
   1253     assertEquals(0, message2.getSerializedSize());
   1254 
   1255     OuterClassNameTest3OuterClass.TestMessage3.NestedMessage.OuterClassNameTest3
   1256         enumValue = OuterClassNameTest3OuterClass.TestMessage3.NestedMessage
   1257             .OuterClassNameTest3.DUMMY_VALUE;
   1258     assertEquals(1, enumValue.getNumber());
   1259   }
   1260 
   1261   // =================================================================
   1262   // oneof generated code test
   1263   public void testOneofEnumCase() throws Exception {
   1264     TestOneof2 message = TestOneof2.newBuilder()
   1265         .setFooInt(123).setFooString("foo").setFooCord("bar").build();
   1266     TestUtil.assertAtMostOneFieldSetOneof(message);
   1267   }
   1268 
   1269   public void testClearOneof() throws Exception {
   1270     TestOneof2.Builder builder = TestOneof2.newBuilder().setFooInt(123);
   1271     assertEquals(TestOneof2.FooCase.FOO_INT, builder.getFooCase());
   1272     builder.clearFoo();
   1273     assertEquals(TestOneof2.FooCase.FOO_NOT_SET, builder.getFooCase());
   1274   }
   1275 
   1276   public void testSetOneofClearsOthers() throws Exception {
   1277     TestOneof2.Builder builder = TestOneof2.newBuilder();
   1278     TestOneof2 message =
   1279         builder.setFooInt(123).setFooString("foo").buildPartial();
   1280     assertTrue(message.hasFooString());
   1281     TestUtil.assertAtMostOneFieldSetOneof(message);
   1282 
   1283     message = builder.setFooCord("bar").buildPartial();
   1284     assertTrue(message.hasFooCord());
   1285     TestUtil.assertAtMostOneFieldSetOneof(message);
   1286 
   1287     message = builder.setFooStringPiece("baz").buildPartial();
   1288     assertTrue(message.hasFooStringPiece());
   1289     TestUtil.assertAtMostOneFieldSetOneof(message);
   1290 
   1291     message = builder.setFooBytes(TestUtil.toBytes("qux")).buildPartial();
   1292     assertTrue(message.hasFooBytes());
   1293     TestUtil.assertAtMostOneFieldSetOneof(message);
   1294 
   1295     message = builder.setFooEnum(TestOneof2.NestedEnum.FOO).buildPartial();
   1296     assertTrue(message.hasFooEnum());
   1297     TestUtil.assertAtMostOneFieldSetOneof(message);
   1298 
   1299     message = builder.setFooMessage(
   1300         TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).buildPartial();
   1301     assertTrue(message.hasFooMessage());
   1302     TestUtil.assertAtMostOneFieldSetOneof(message);
   1303 
   1304     message = builder.setFooInt(123).buildPartial();
   1305     assertTrue(message.hasFooInt());
   1306     TestUtil.assertAtMostOneFieldSetOneof(message);
   1307   }
   1308 
   1309   public void testOneofTypes() throws Exception {
   1310     // Primitive
   1311     {
   1312       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1313       assertEquals(builder.getFooInt(), 0);
   1314       assertFalse(builder.hasFooInt());
   1315       assertTrue(builder.setFooInt(123).hasFooInt());
   1316       assertEquals(builder.getFooInt(), 123);
   1317       TestOneof2 message = builder.buildPartial();
   1318       assertTrue(message.hasFooInt());
   1319       assertEquals(message.getFooInt(), 123);
   1320 
   1321       assertFalse(builder.clearFooInt().hasFooInt());
   1322       TestOneof2 message2 = builder.build();
   1323       assertFalse(message2.hasFooInt());
   1324       assertEquals(message2.getFooInt(), 0);
   1325     }
   1326 
   1327     // Enum
   1328     {
   1329       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1330       assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.FOO);
   1331       assertTrue(builder.setFooEnum(TestOneof2.NestedEnum.BAR).hasFooEnum());
   1332       assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.BAR);
   1333       TestOneof2 message = builder.buildPartial();
   1334       assertTrue(message.hasFooEnum());
   1335       assertEquals(message.getFooEnum(), TestOneof2.NestedEnum.BAR);
   1336 
   1337       assertFalse(builder.clearFooEnum().hasFooEnum());
   1338       TestOneof2 message2 = builder.build();
   1339       assertFalse(message2.hasFooEnum());
   1340       assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.FOO);
   1341     }
   1342 
   1343     // String
   1344     {
   1345       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1346       assertEquals(builder.getFooString(), "");
   1347       builder.setFooString("foo");
   1348       assertTrue(builder.hasFooString());
   1349       assertEquals(builder.getFooString(), "foo");
   1350       TestOneof2 message = builder.buildPartial();
   1351       assertTrue(message.hasFooString());
   1352       assertEquals(message.getFooString(), "foo");
   1353       assertEquals(message.getFooStringBytes(), TestUtil.toBytes("foo"));
   1354 
   1355       assertFalse(builder.clearFooString().hasFooString());
   1356       TestOneof2 message2 = builder.buildPartial();
   1357       assertFalse(message2.hasFooString());
   1358       assertEquals(message2.getFooString(), "");
   1359       assertEquals(message2.getFooStringBytes(), TestUtil.toBytes(""));
   1360 
   1361       // Get method should not change the oneof value.
   1362       builder.setFooInt(123);
   1363       assertEquals(builder.getFooString(), "");
   1364       assertEquals(builder.getFooStringBytes(), TestUtil.toBytes(""));
   1365       assertEquals(123, builder.getFooInt());
   1366 
   1367       message = builder.build();
   1368       assertEquals(message.getFooString(), "");
   1369       assertEquals(message.getFooStringBytes(), TestUtil.toBytes(""));
   1370       assertEquals(123, message.getFooInt());
   1371     }
   1372 
   1373     // Cord
   1374     {
   1375       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1376       assertEquals(builder.getFooCord(), "");
   1377       builder.setFooCord("foo");
   1378       assertTrue(builder.hasFooCord());
   1379       assertEquals(builder.getFooCord(), "foo");
   1380       TestOneof2 message = builder.buildPartial();
   1381       assertTrue(message.hasFooCord());
   1382       assertEquals(message.getFooCord(), "foo");
   1383       assertEquals(message.getFooCordBytes(), TestUtil.toBytes("foo"));
   1384 
   1385       assertFalse(builder.clearFooCord().hasFooCord());
   1386       TestOneof2 message2 = builder.build();
   1387       assertFalse(message2.hasFooCord());
   1388       assertEquals(message2.getFooCord(), "");
   1389       assertEquals(message2.getFooCordBytes(), TestUtil.toBytes(""));
   1390     }
   1391 
   1392     // StringPiece
   1393     {
   1394       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1395       assertEquals(builder.getFooStringPiece(), "");
   1396       builder.setFooStringPiece("foo");
   1397       assertTrue(builder.hasFooStringPiece());
   1398       assertEquals(builder.getFooStringPiece(), "foo");
   1399       TestOneof2 message = builder.buildPartial();
   1400       assertTrue(message.hasFooStringPiece());
   1401       assertEquals(message.getFooStringPiece(), "foo");
   1402       assertEquals(message.getFooStringPieceBytes(), TestUtil.toBytes("foo"));
   1403 
   1404       assertFalse(builder.clearFooStringPiece().hasFooStringPiece());
   1405       TestOneof2 message2 = builder.build();
   1406       assertFalse(message2.hasFooStringPiece());
   1407       assertEquals(message2.getFooStringPiece(), "");
   1408       assertEquals(message2.getFooStringPieceBytes(), TestUtil.toBytes(""));
   1409     }
   1410 
   1411     // Message
   1412     {
   1413       // set
   1414       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1415       assertEquals(builder.getFooMessage().getQuxInt(), 0);
   1416       builder.setFooMessage(
   1417           TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build());
   1418       assertTrue(builder.hasFooMessage());
   1419       assertEquals(builder.getFooMessage().getQuxInt(), 234);
   1420       TestOneof2 message = builder.buildPartial();
   1421       assertTrue(message.hasFooMessage());
   1422       assertEquals(message.getFooMessage().getQuxInt(), 234);
   1423 
   1424       // clear
   1425       assertFalse(builder.clearFooMessage().hasFooString());
   1426       message = builder.build();
   1427       assertFalse(message.hasFooMessage());
   1428       assertEquals(message.getFooMessage().getQuxInt(), 0);
   1429 
   1430       // nested builder
   1431       builder = TestOneof2.newBuilder();
   1432       assertSame(builder.getFooMessageOrBuilder(),
   1433           TestOneof2.NestedMessage.getDefaultInstance());
   1434       assertFalse(builder.hasFooMessage());
   1435       builder.getFooMessageBuilder().setQuxInt(123);
   1436       assertTrue(builder.hasFooMessage());
   1437       assertEquals(builder.getFooMessage().getQuxInt(), 123);
   1438       message = builder.build();
   1439       assertTrue(message.hasFooMessage());
   1440       assertEquals(message.getFooMessage().getQuxInt(), 123);
   1441     }
   1442 
   1443     // LazyMessage is tested in LazyMessageLiteTest.java
   1444   }
   1445 
   1446   public void testOneofMerge() throws Exception {
   1447     // Primitive Type
   1448     {
   1449       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1450       TestOneof2 message = builder.setFooInt(123).build();
   1451       TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
   1452       assertTrue(message2.hasFooInt());
   1453       assertEquals(message2.getFooInt(), 123);
   1454     }
   1455 
   1456     // String
   1457     {
   1458       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1459       TestOneof2 message = builder.setFooString("foo").build();
   1460       TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
   1461       assertTrue(message2.hasFooString());
   1462       assertEquals(message2.getFooString(), "foo");
   1463     }
   1464 
   1465     // Enum
   1466     {
   1467       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1468       TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build();
   1469       TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
   1470       assertTrue(message2.hasFooEnum());
   1471       assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR);
   1472     }
   1473 
   1474     // Message
   1475     {
   1476       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1477       TestOneof2 message = builder.setFooMessage(
   1478           TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).build();
   1479       TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build();
   1480       assertTrue(message2.hasFooMessage());
   1481       assertEquals(message2.getFooMessage().getQuxInt(), 234);
   1482     }
   1483   }
   1484 
   1485   public void testOneofSerialization() throws Exception {
   1486     // Primitive Type
   1487     {
   1488       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1489       TestOneof2 message = builder.setFooInt(123).build();
   1490       ByteString serialized = message.toByteString();
   1491       TestOneof2 message2 = TestOneof2.parseFrom(serialized);
   1492       assertTrue(message2.hasFooInt());
   1493       assertEquals(message2.getFooInt(), 123);
   1494     }
   1495 
   1496     // String
   1497     {
   1498       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1499       TestOneof2 message = builder.setFooString("foo").build();
   1500       ByteString serialized = message.toByteString();
   1501       TestOneof2 message2 = TestOneof2.parseFrom(serialized);
   1502       assertTrue(message2.hasFooString());
   1503       assertEquals(message2.getFooString(), "foo");
   1504     }
   1505 
   1506     // Enum
   1507     {
   1508       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1509       TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build();
   1510       ByteString serialized = message.toByteString();
   1511       TestOneof2 message2 = TestOneof2.parseFrom(serialized);
   1512       assertTrue(message2.hasFooEnum());
   1513       assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR);
   1514     }
   1515 
   1516     // Message
   1517     {
   1518       TestOneof2.Builder builder = TestOneof2.newBuilder();
   1519       TestOneof2 message = builder.setFooMessage(
   1520           TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).build();
   1521       ByteString serialized = message.toByteString();
   1522       TestOneof2 message2 = TestOneof2.parseFrom(serialized);
   1523       assertTrue(message2.hasFooMessage());
   1524       assertEquals(message2.getFooMessage().getQuxInt(), 234);
   1525     }
   1526   }
   1527 
   1528   public void testOneofNestedBuilderOnChangePropagation() {
   1529     NestedTestAllTypes.Builder parentBuilder = NestedTestAllTypes.newBuilder();
   1530     TestAllTypes.Builder builder = parentBuilder.getPayloadBuilder();
   1531     builder.getOneofNestedMessageBuilder();
   1532     assertTrue(builder.hasOneofNestedMessage());
   1533     assertTrue(parentBuilder.hasPayload());
   1534     NestedTestAllTypes message = parentBuilder.build();
   1535     assertTrue(message.hasPayload());
   1536     assertTrue(message.getPayload().hasOneofNestedMessage());
   1537   }
   1538 
   1539   public void testGetRepeatedFieldBuilder() {
   1540     Descriptor descriptor = TestAllTypes.getDescriptor();
   1541 
   1542     FieldDescriptor fieldDescriptor =
   1543         descriptor.findFieldByName("repeated_nested_message");
   1544     FieldDescriptor foreignFieldDescriptor =
   1545         descriptor.findFieldByName("repeated_foreign_message");
   1546     FieldDescriptor importFieldDescriptor =
   1547         descriptor.findFieldByName("repeated_import_message");
   1548 
   1549     // Mutate the message with new field builder
   1550     // Mutate nested message
   1551     TestAllTypes.Builder builder1 = TestAllTypes.newBuilder();
   1552     Message.Builder fieldBuilder1 = builder1.newBuilderForField(
   1553         fieldDescriptor);
   1554     FieldDescriptor subFieldDescriptor1 =
   1555         fieldBuilder1.getDescriptorForType().findFieldByName("bb");
   1556     fieldBuilder1.setField(subFieldDescriptor1, 1);
   1557     builder1.addRepeatedField(fieldDescriptor, fieldBuilder1.build());
   1558 
   1559     // Mutate foreign message
   1560     Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField(
   1561         foreignFieldDescriptor);
   1562     FieldDescriptor subForeignFieldDescriptor1 =
   1563         foreignFieldBuilder1.getDescriptorForType().findFieldByName("c");
   1564     foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2);
   1565     builder1.addRepeatedField(foreignFieldDescriptor,
   1566         foreignFieldBuilder1.build());
   1567 
   1568     // Mutate import message
   1569     Message.Builder importFieldBuilder1 = builder1.newBuilderForField(
   1570         importFieldDescriptor);
   1571     FieldDescriptor subImportFieldDescriptor1 =
   1572         importFieldBuilder1.getDescriptorForType().findFieldByName("d");
   1573     importFieldBuilder1.setField(subImportFieldDescriptor1, 3);
   1574     builder1.addRepeatedField(importFieldDescriptor,
   1575         importFieldBuilder1.build());
   1576 
   1577     Message newMessage1 = builder1.build();
   1578 
   1579     // Mutate the message with existing field builder
   1580     // Mutate nested message
   1581     TestAllTypes.Builder builder2 = TestAllTypes.newBuilder();
   1582     builder2.addRepeatedNestedMessageBuilder();
   1583     Message.Builder fieldBuilder2 = builder2.getRepeatedFieldBuilder(
   1584         fieldDescriptor, 0);
   1585     FieldDescriptor subFieldDescriptor2 =
   1586         fieldBuilder2.getDescriptorForType().findFieldByName("bb");
   1587     fieldBuilder2.setField(subFieldDescriptor2, 1);
   1588 
   1589     // Mutate foreign message
   1590     Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField(
   1591         foreignFieldDescriptor);
   1592     FieldDescriptor subForeignFieldDescriptor2 =
   1593         foreignFieldBuilder2.getDescriptorForType().findFieldByName("c");
   1594     foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2);
   1595     builder2.addRepeatedField(foreignFieldDescriptor,
   1596         foreignFieldBuilder2.build());
   1597 
   1598     // Mutate import message
   1599     Message.Builder importFieldBuilder2 = builder2.newBuilderForField(
   1600         importFieldDescriptor);
   1601     FieldDescriptor subImportFieldDescriptor2 =
   1602         importFieldBuilder2.getDescriptorForType().findFieldByName("d");
   1603     importFieldBuilder2.setField(subImportFieldDescriptor2, 3);
   1604     builder2.addRepeatedField(importFieldDescriptor,
   1605         importFieldBuilder2.build());
   1606 
   1607     Message newMessage2 = builder2.build();
   1608 
   1609     // These two messages should be equal.
   1610     assertEquals(newMessage1, newMessage2);
   1611   }
   1612 
   1613   public void testGetRepeatedFieldBuilderWithInitializedValue() {
   1614     Descriptor descriptor = TestAllTypes.getDescriptor();
   1615     FieldDescriptor fieldDescriptor =
   1616         descriptor.findFieldByName("repeated_nested_message");
   1617 
   1618     // Before setting field, builder is initialized by default value.
   1619     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
   1620     builder.addRepeatedNestedMessageBuilder();
   1621     NestedMessage.Builder fieldBuilder =
   1622         (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor, 0);
   1623     assertEquals(0, fieldBuilder.getBb());
   1624 
   1625     // Setting field value with new field builder instance.
   1626     builder = TestAllTypes.newBuilder();
   1627     NestedMessage.Builder newFieldBuilder =
   1628         builder.addRepeatedNestedMessageBuilder();
   1629     newFieldBuilder.setBb(2);
   1630     // Then get the field builder instance by getRepeatedFieldBuilder().
   1631     fieldBuilder =
   1632         (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor, 0);
   1633     // It should contain new value.
   1634     assertEquals(2, fieldBuilder.getBb());
   1635     // These two builder should be equal.
   1636     assertSame(fieldBuilder, newFieldBuilder);
   1637   }
   1638 
   1639   public void testGetRepeatedFieldBuilderNotSupportedException() {
   1640     Descriptor descriptor = TestAllTypes.getDescriptor();
   1641     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
   1642     try {
   1643       builder.getRepeatedFieldBuilder(descriptor.findFieldByName("repeated_int32"), 0);
   1644       fail("Exception was not thrown");
   1645     } catch (UnsupportedOperationException e) {
   1646       // We expect this exception.
   1647     }
   1648     try {
   1649       builder.getRepeatedFieldBuilder(
   1650           descriptor.findFieldByName("repeated_nested_enum"), 0);
   1651       fail("Exception was not thrown");
   1652     } catch (UnsupportedOperationException e) {
   1653       // We expect this exception.
   1654     }
   1655     try {
   1656       builder.getRepeatedFieldBuilder(descriptor.findFieldByName("optional_int32"), 0);
   1657       fail("Exception was not thrown");
   1658     } catch (UnsupportedOperationException e) {
   1659       // We expect this exception.
   1660     }
   1661     try {
   1662       builder.getRepeatedFieldBuilder(
   1663           descriptor.findFieldByName("optional_nested_enum"), 0);
   1664       fail("Exception was not thrown");
   1665     } catch (UnsupportedOperationException e) {
   1666       // We expect this exception.
   1667     }
   1668     try {
   1669       builder.getRepeatedFieldBuilder(
   1670           descriptor.findFieldByName("optional_nested_message"), 0);
   1671       fail("Exception was not thrown");
   1672     } catch (UnsupportedOperationException e) {
   1673       // We expect this exception.
   1674     }
   1675   }
   1676 }
   1677