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 static java.util.Collections.emptyList;
     34 import static java.util.Collections.singletonList;
     35 
     36 import com.google.protobuf.UnittestImportLite.ImportEnumLite;
     37 import com.google.protobuf.UnittestImportPublicLite.PublicImportMessageLite;
     38 import com.google.protobuf.UnittestLite;
     39 import com.google.protobuf.UnittestLite.ForeignEnumLite;
     40 import com.google.protobuf.UnittestLite.ForeignMessageLite;
     41 import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
     42 import com.google.protobuf.UnittestLite.TestAllTypesLite;
     43 import com.google.protobuf.UnittestLite.TestAllTypesLite.NestedEnum;
     44 import com.google.protobuf.UnittestLite.TestAllTypesLite.NestedMessage;
     45 import com.google.protobuf.UnittestLite.TestAllTypesLite.OneofFieldCase;
     46 import com.google.protobuf.UnittestLite.TestAllTypesLite.OptionalGroup;
     47 import com.google.protobuf.UnittestLite.TestAllTypesLite.RepeatedGroup;
     48 import com.google.protobuf.UnittestLite.TestAllTypesLiteOrBuilder;
     49 import com.google.protobuf.UnittestLite.TestNestedExtensionLite;
     50 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.Bar;
     51 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.BarPrime;
     52 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.Foo;
     53 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.TestOneofEquals;
     54 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.TestRecursiveOneof;
     55 
     56 import junit.framework.TestCase;
     57 
     58 import java.io.ByteArrayInputStream;
     59 import java.io.ByteArrayOutputStream;
     60 import java.io.NotSerializableException;
     61 import java.io.ObjectInputStream;
     62 import java.io.ObjectOutputStream;
     63 
     64 /**
     65  * Test lite runtime.
     66  *
     67  * @author kenton (at) google.com Kenton Varda
     68  */
     69 public class LiteTest extends TestCase {
     70   @Override
     71   public void setUp() throws Exception {
     72     // Test that nested extensions are initialized correctly even if the outer
     73     // class has not been accessed directly.  This was once a bug with lite
     74     // messages.
     75     //
     76     // We put this in setUp() rather than in its own test method because we
     77     // need to make sure it runs before any actual tests.
     78     assertTrue(TestNestedExtensionLite.nestedExtension != null);
     79   }
     80 
     81   public void testLite() throws Exception {
     82     // Since lite messages are a subset of regular messages, we can mostly
     83     // assume that the functionality of lite messages is already thoroughly
     84     // tested by the regular tests.  All this test really verifies is that
     85     // a proto with optimize_for = LITE_RUNTIME compiles correctly when
     86     // linked only against the lite library.  That is all tested at compile
     87     // time, leaving not much to do in this method.  Let's just do some random
     88     // stuff to make sure the lite message is actually here and usable.
     89 
     90     TestAllTypesLite message =
     91       TestAllTypesLite.newBuilder()
     92                       .setOptionalInt32(123)
     93                       .addRepeatedString("hello")
     94                       .setOptionalNestedMessage(
     95                           TestAllTypesLite.NestedMessage.newBuilder().setBb(7))
     96                       .build();
     97 
     98     ByteString data = message.toByteString();
     99 
    100     TestAllTypesLite message2 = TestAllTypesLite.parseFrom(data);
    101 
    102     assertEquals(123, message2.getOptionalInt32());
    103     assertEquals(1, message2.getRepeatedStringCount());
    104     assertEquals("hello", message2.getRepeatedString(0));
    105     assertEquals(7, message2.getOptionalNestedMessage().getBb());
    106   }
    107 
    108   public void testLiteExtensions() throws Exception {
    109     // TODO(kenton):  Unlike other features of the lite library, extensions are
    110     //   implemented completely differently from the regular library.  We
    111     //   should probably test them more thoroughly.
    112 
    113     TestAllExtensionsLite message =
    114       TestAllExtensionsLite.newBuilder()
    115         .setExtension(UnittestLite.optionalInt32ExtensionLite, 123)
    116         .addExtension(UnittestLite.repeatedStringExtensionLite, "hello")
    117         .setExtension(UnittestLite.optionalNestedEnumExtensionLite,
    118             TestAllTypesLite.NestedEnum.BAZ)
    119         .setExtension(UnittestLite.optionalNestedMessageExtensionLite,
    120             TestAllTypesLite.NestedMessage.newBuilder().setBb(7).build())
    121         .build();
    122 
    123     // Test copying a message, since coping extensions actually does use a
    124     // different code path between lite and regular libraries, and as of this
    125     // writing, parsing hasn't been implemented yet.
    126     TestAllExtensionsLite message2 = message.toBuilder().build();
    127 
    128     assertEquals(123, (int) message2.getExtension(
    129         UnittestLite.optionalInt32ExtensionLite));
    130     assertEquals(1, message2.getExtensionCount(
    131         UnittestLite.repeatedStringExtensionLite));
    132     assertEquals(1, message2.getExtension(
    133         UnittestLite.repeatedStringExtensionLite).size());
    134     assertEquals("hello", message2.getExtension(
    135         UnittestLite.repeatedStringExtensionLite, 0));
    136     assertEquals(TestAllTypesLite.NestedEnum.BAZ, message2.getExtension(
    137         UnittestLite.optionalNestedEnumExtensionLite));
    138     assertEquals(7, message2.getExtension(
    139         UnittestLite.optionalNestedMessageExtensionLite).getBb());
    140   }
    141 
    142 
    143   public void testClone() {
    144     TestAllTypesLite.Builder expected = TestAllTypesLite.newBuilder()
    145         .setOptionalInt32(123);
    146     assertEquals(
    147         expected.getOptionalInt32(), expected.clone().getOptionalInt32());
    148 
    149     TestAllExtensionsLite.Builder expected2 = TestAllExtensionsLite.newBuilder()
    150         .setExtension(UnittestLite.optionalInt32ExtensionLite, 123);
    151     assertEquals(
    152         expected2.getExtension(UnittestLite.optionalInt32ExtensionLite),
    153         expected2.clone().getExtension(UnittestLite.optionalInt32ExtensionLite));
    154   }
    155 
    156   public void testAddAll() {
    157     try {
    158       TestAllTypesLite.newBuilder()
    159           .addAllRepeatedBytes(null);
    160       fail();
    161     } catch (NullPointerException e) {
    162       // expected.
    163     }
    164   }
    165 
    166   public void testSanityCopyOnWrite() throws InvalidProtocolBufferException {
    167     // Since builders are implemented as a thin wrapper around a message
    168     // instance, we attempt to verify that we can't cause the builder to modify
    169     // a produced message.
    170 
    171     TestAllTypesLite.Builder builder = TestAllTypesLite.newBuilder();
    172     TestAllTypesLite message = builder.build();
    173     TestAllTypesLite messageAfterBuild;
    174     builder.setOptionalBool(true);
    175     assertEquals(false, message.getOptionalBool());
    176     assertEquals(true, builder.getOptionalBool());
    177     messageAfterBuild = builder.build();
    178     assertEquals(true, messageAfterBuild.getOptionalBool());
    179     assertEquals(false, message.getOptionalBool());
    180     builder.clearOptionalBool();
    181     assertEquals(false, builder.getOptionalBool());
    182     assertEquals(true, messageAfterBuild.getOptionalBool());
    183 
    184     message = builder.build();
    185     builder.setOptionalBytes(ByteString.copyFromUtf8("hi"));
    186     assertEquals(ByteString.EMPTY, message.getOptionalBytes());
    187     assertEquals(ByteString.copyFromUtf8("hi"), builder.getOptionalBytes());
    188     messageAfterBuild = builder.build();
    189     assertEquals(
    190         ByteString.copyFromUtf8("hi"), messageAfterBuild.getOptionalBytes());
    191     assertEquals(ByteString.EMPTY, message.getOptionalBytes());
    192     builder.clearOptionalBytes();
    193     assertEquals(ByteString.EMPTY, builder.getOptionalBytes());
    194     assertEquals(
    195         ByteString.copyFromUtf8("hi"), messageAfterBuild.getOptionalBytes());
    196 
    197     message = builder.build();
    198     builder.setOptionalCord("hi");
    199     assertEquals("", message.getOptionalCord());
    200     assertEquals("hi", builder.getOptionalCord());
    201     messageAfterBuild = builder.build();
    202     assertEquals("hi", messageAfterBuild.getOptionalCord());
    203     assertEquals("", message.getOptionalCord());
    204     builder.clearOptionalCord();
    205     assertEquals("", builder.getOptionalCord());
    206     assertEquals("hi", messageAfterBuild.getOptionalCord());
    207 
    208     message = builder.build();
    209     builder.setOptionalCordBytes(ByteString.copyFromUtf8("no"));
    210     assertEquals(ByteString.EMPTY, message.getOptionalCordBytes());
    211     assertEquals(ByteString.copyFromUtf8("no"), builder.getOptionalCordBytes());
    212     messageAfterBuild = builder.build();
    213     assertEquals(
    214         ByteString.copyFromUtf8("no"),
    215         messageAfterBuild.getOptionalCordBytes());
    216     assertEquals(ByteString.EMPTY, message.getOptionalCordBytes());
    217     builder.clearOptionalCord();
    218     assertEquals(ByteString.EMPTY, builder.getOptionalCordBytes());
    219     assertEquals(
    220         ByteString.copyFromUtf8("no"),
    221         messageAfterBuild.getOptionalCordBytes());
    222 
    223     message = builder.build();
    224     builder.setOptionalDouble(1);
    225     assertEquals(0D, message.getOptionalDouble());
    226     assertEquals(1D, builder.getOptionalDouble());
    227     messageAfterBuild = builder.build();
    228     assertEquals(1D, messageAfterBuild.getOptionalDouble());
    229     assertEquals(0D, message.getOptionalDouble());
    230     builder.clearOptionalDouble();
    231     assertEquals(0D, builder.getOptionalDouble());
    232     assertEquals(1D, messageAfterBuild.getOptionalDouble());
    233 
    234     message = builder.build();
    235     builder.setOptionalFixed32(1);
    236     assertEquals(0, message.getOptionalFixed32());
    237     assertEquals(1, builder.getOptionalFixed32());
    238     messageAfterBuild = builder.build();
    239     assertEquals(1, messageAfterBuild.getOptionalFixed32());
    240     assertEquals(0, message.getOptionalFixed32());
    241     builder.clearOptionalFixed32();
    242     assertEquals(0, builder.getOptionalFixed32());
    243     assertEquals(1, messageAfterBuild.getOptionalFixed32());
    244 
    245     message = builder.build();
    246     builder.setOptionalFixed64(1);
    247     assertEquals(0L, message.getOptionalFixed64());
    248     assertEquals(1L, builder.getOptionalFixed64());
    249     messageAfterBuild = builder.build();
    250     assertEquals(1L, messageAfterBuild.getOptionalFixed64());
    251     assertEquals(0L, message.getOptionalFixed64());
    252     builder.clearOptionalFixed64();
    253     assertEquals(0L, builder.getOptionalFixed64());
    254     assertEquals(1L, messageAfterBuild.getOptionalFixed64());
    255 
    256     message = builder.build();
    257     builder.setOptionalFloat(1);
    258     assertEquals(0F, message.getOptionalFloat());
    259     assertEquals(1F, builder.getOptionalFloat());
    260     messageAfterBuild = builder.build();
    261     assertEquals(1F, messageAfterBuild.getOptionalFloat());
    262     assertEquals(0F, message.getOptionalFloat());
    263     builder.clearOptionalFloat();
    264     assertEquals(0F, builder.getOptionalFloat());
    265     assertEquals(1F, messageAfterBuild.getOptionalFloat());
    266 
    267     message = builder.build();
    268     builder.setOptionalForeignEnum(ForeignEnumLite.FOREIGN_LITE_BAR);
    269     assertEquals(
    270         ForeignEnumLite.FOREIGN_LITE_FOO, message.getOptionalForeignEnum());
    271     assertEquals(
    272         ForeignEnumLite.FOREIGN_LITE_BAR, builder.getOptionalForeignEnum());
    273     messageAfterBuild = builder.build();
    274     assertEquals(
    275         ForeignEnumLite.FOREIGN_LITE_BAR,
    276         messageAfterBuild.getOptionalForeignEnum());
    277     assertEquals(
    278         ForeignEnumLite.FOREIGN_LITE_FOO, message.getOptionalForeignEnum());
    279     builder.clearOptionalForeignEnum();
    280     assertEquals(
    281         ForeignEnumLite.FOREIGN_LITE_FOO, builder.getOptionalForeignEnum());
    282     assertEquals(
    283         ForeignEnumLite.FOREIGN_LITE_BAR,
    284         messageAfterBuild.getOptionalForeignEnum());
    285 
    286     message = builder.build();
    287     ForeignMessageLite foreignMessage = ForeignMessageLite.newBuilder()
    288         .setC(1)
    289         .build();
    290     builder.setOptionalForeignMessage(foreignMessage);
    291     assertEquals(
    292         ForeignMessageLite.getDefaultInstance(),
    293         message.getOptionalForeignMessage());
    294     assertEquals(foreignMessage, builder.getOptionalForeignMessage());
    295     messageAfterBuild = builder.build();
    296     assertEquals(foreignMessage, messageAfterBuild.getOptionalForeignMessage());
    297     assertEquals(
    298         ForeignMessageLite.getDefaultInstance(),
    299         message.getOptionalForeignMessage());
    300     builder.clearOptionalForeignMessage();
    301     assertEquals(
    302         ForeignMessageLite.getDefaultInstance(),
    303         builder.getOptionalForeignMessage());
    304     assertEquals(foreignMessage, messageAfterBuild.getOptionalForeignMessage());
    305 
    306     message = builder.build();
    307     ForeignMessageLite.Builder foreignMessageBuilder =
    308         ForeignMessageLite.newBuilder()
    309             .setC(3);
    310     builder.setOptionalForeignMessage(foreignMessageBuilder);
    311     assertEquals(
    312         ForeignMessageLite.getDefaultInstance(),
    313         message.getOptionalForeignMessage());
    314     assertEquals(foreignMessageBuilder.build(), builder.getOptionalForeignMessage());
    315     messageAfterBuild = builder.build();
    316     assertEquals(foreignMessageBuilder.build(), messageAfterBuild.getOptionalForeignMessage());
    317     assertEquals(
    318         ForeignMessageLite.getDefaultInstance(),
    319         message.getOptionalForeignMessage());
    320     builder.clearOptionalForeignMessage();
    321     assertEquals(
    322         ForeignMessageLite.getDefaultInstance(),
    323         builder.getOptionalForeignMessage());
    324     assertEquals(foreignMessageBuilder.build(), messageAfterBuild.getOptionalForeignMessage());
    325 
    326     message = builder.build();
    327     OptionalGroup optionalGroup = OptionalGroup.newBuilder()
    328         .setA(1)
    329         .build();
    330     builder.setOptionalGroup(optionalGroup);
    331     assertEquals(
    332         OptionalGroup.getDefaultInstance(), message.getOptionalGroup());
    333     assertEquals(optionalGroup, builder.getOptionalGroup());
    334     messageAfterBuild = builder.build();
    335     assertEquals(optionalGroup, messageAfterBuild.getOptionalGroup());
    336     assertEquals(
    337         OptionalGroup.getDefaultInstance(), message.getOptionalGroup());
    338     builder.clearOptionalGroup();
    339     assertEquals(
    340         OptionalGroup.getDefaultInstance(), builder.getOptionalGroup());
    341     assertEquals(optionalGroup, messageAfterBuild.getOptionalGroup());
    342 
    343     message = builder.build();
    344     OptionalGroup.Builder optionalGroupBuilder = OptionalGroup.newBuilder()
    345         .setA(3);
    346     builder.setOptionalGroup(optionalGroupBuilder);
    347     assertEquals(
    348         OptionalGroup.getDefaultInstance(), message.getOptionalGroup());
    349     assertEquals(optionalGroupBuilder.build(), builder.getOptionalGroup());
    350     messageAfterBuild = builder.build();
    351     assertEquals(optionalGroupBuilder.build(), messageAfterBuild.getOptionalGroup());
    352     assertEquals(
    353         OptionalGroup.getDefaultInstance(), message.getOptionalGroup());
    354     builder.clearOptionalGroup();
    355     assertEquals(
    356         OptionalGroup.getDefaultInstance(), builder.getOptionalGroup());
    357     assertEquals(optionalGroupBuilder.build(), messageAfterBuild.getOptionalGroup());
    358 
    359     message = builder.build();
    360     builder.setOptionalInt32(1);
    361     assertEquals(0, message.getOptionalInt32());
    362     assertEquals(1, builder.getOptionalInt32());
    363     messageAfterBuild = builder.build();
    364     assertEquals(1, messageAfterBuild.getOptionalInt32());
    365     assertEquals(0, message.getOptionalInt32());
    366     builder.clearOptionalInt32();
    367     assertEquals(0, builder.getOptionalInt32());
    368     assertEquals(1, messageAfterBuild.getOptionalInt32());
    369 
    370     message = builder.build();
    371     builder.setOptionalInt64(1);
    372     assertEquals(0L, message.getOptionalInt64());
    373     assertEquals(1L, builder.getOptionalInt64());
    374     messageAfterBuild = builder.build();
    375     assertEquals(1L, messageAfterBuild.getOptionalInt64());
    376     assertEquals(0L, message.getOptionalInt64());
    377     builder.clearOptionalInt64();
    378     assertEquals(0L, builder.getOptionalInt64());
    379     assertEquals(1L, messageAfterBuild.getOptionalInt64());
    380 
    381     message = builder.build();
    382     NestedMessage nestedMessage = NestedMessage.newBuilder()
    383         .setBb(1)
    384         .build();
    385     builder.setOptionalLazyMessage(nestedMessage);
    386     assertEquals(
    387         NestedMessage.getDefaultInstance(),
    388         message.getOptionalLazyMessage());
    389     assertEquals(nestedMessage, builder.getOptionalLazyMessage());
    390     messageAfterBuild = builder.build();
    391     assertEquals(nestedMessage, messageAfterBuild.getOptionalLazyMessage());
    392     assertEquals(
    393         NestedMessage.getDefaultInstance(),
    394         message.getOptionalLazyMessage());
    395     builder.clearOptionalLazyMessage();
    396     assertEquals(
    397         NestedMessage.getDefaultInstance(), builder.getOptionalLazyMessage());
    398     assertEquals(nestedMessage, messageAfterBuild.getOptionalLazyMessage());
    399 
    400     message = builder.build();
    401     NestedMessage.Builder nestedMessageBuilder =
    402         NestedMessage.newBuilder()
    403             .setBb(3);
    404     builder.setOptionalLazyMessage(nestedMessageBuilder);
    405     assertEquals(
    406         NestedMessage.getDefaultInstance(),
    407         message.getOptionalLazyMessage());
    408     assertEquals(nestedMessageBuilder.build(), builder.getOptionalLazyMessage());
    409     messageAfterBuild = builder.build();
    410     assertEquals(nestedMessageBuilder.build(), messageAfterBuild.getOptionalLazyMessage());
    411     assertEquals(
    412         NestedMessage.getDefaultInstance(),
    413         message.getOptionalLazyMessage());
    414     builder.clearOptionalLazyMessage();
    415     assertEquals(
    416         NestedMessage.getDefaultInstance(), builder.getOptionalLazyMessage());
    417     assertEquals(nestedMessageBuilder.build(), messageAfterBuild.getOptionalLazyMessage());
    418 
    419     message = builder.build();
    420     builder.setOptionalSfixed32(1);
    421     assertEquals(0, message.getOptionalSfixed32());
    422     assertEquals(1, builder.getOptionalSfixed32());
    423     messageAfterBuild = builder.build();
    424     assertEquals(1, messageAfterBuild.getOptionalSfixed32());
    425     assertEquals(0, message.getOptionalSfixed32());
    426     builder.clearOptionalSfixed32();
    427     assertEquals(0, builder.getOptionalSfixed32());
    428     assertEquals(1, messageAfterBuild.getOptionalSfixed32());
    429 
    430     message = builder.build();
    431     builder.setOptionalSfixed64(1);
    432     assertEquals(0L, message.getOptionalSfixed64());
    433     assertEquals(1L, builder.getOptionalSfixed64());
    434     messageAfterBuild = builder.build();
    435     assertEquals(1L, messageAfterBuild.getOptionalSfixed64());
    436     assertEquals(0L, message.getOptionalSfixed64());
    437     builder.clearOptionalSfixed64();
    438     assertEquals(0L, builder.getOptionalSfixed64());
    439     assertEquals(1L, messageAfterBuild.getOptionalSfixed64());
    440 
    441     message = builder.build();
    442     builder.setOptionalSint32(1);
    443     assertEquals(0, message.getOptionalSint32());
    444     assertEquals(1, builder.getOptionalSint32());
    445     messageAfterBuild = builder.build();
    446     assertEquals(1, messageAfterBuild.getOptionalSint32());
    447     builder.clearOptionalSint32();
    448     assertEquals(0, builder.getOptionalSint32());
    449     assertEquals(1, messageAfterBuild.getOptionalSint32());
    450 
    451     message = builder.build();
    452     builder.setOptionalSint64(1);
    453     assertEquals(0L, message.getOptionalSint64());
    454     assertEquals(1L, builder.getOptionalSint64());
    455     messageAfterBuild = builder.build();
    456     assertEquals(1L, messageAfterBuild.getOptionalSint64());
    457     assertEquals(0L, message.getOptionalSint64());
    458     builder.clearOptionalSint64();
    459     assertEquals(0L, builder.getOptionalSint64());
    460     assertEquals(1L, messageAfterBuild.getOptionalSint64());
    461 
    462     message = builder.build();
    463     builder.setOptionalString("hi");
    464     assertEquals("", message.getOptionalString());
    465     assertEquals("hi", builder.getOptionalString());
    466     messageAfterBuild = builder.build();
    467     assertEquals("hi", messageAfterBuild.getOptionalString());
    468     assertEquals("", message.getOptionalString());
    469     builder.clearOptionalString();
    470     assertEquals("", builder.getOptionalString());
    471     assertEquals("hi", messageAfterBuild.getOptionalString());
    472 
    473     message = builder.build();
    474     builder.setOptionalStringBytes(ByteString.copyFromUtf8("no"));
    475     assertEquals(ByteString.EMPTY, message.getOptionalStringBytes());
    476     assertEquals(
    477         ByteString.copyFromUtf8("no"), builder.getOptionalStringBytes());
    478     messageAfterBuild = builder.build();
    479     assertEquals(
    480         ByteString.copyFromUtf8("no"),
    481         messageAfterBuild.getOptionalStringBytes());
    482     assertEquals(ByteString.EMPTY, message.getOptionalStringBytes());
    483     builder.clearOptionalString();
    484     assertEquals(ByteString.EMPTY, builder.getOptionalStringBytes());
    485     assertEquals(
    486         ByteString.copyFromUtf8("no"),
    487         messageAfterBuild.getOptionalStringBytes());
    488 
    489     message = builder.build();
    490     builder.setOptionalStringPiece("hi");
    491     assertEquals("", message.getOptionalStringPiece());
    492     assertEquals("hi", builder.getOptionalStringPiece());
    493     messageAfterBuild = builder.build();
    494     assertEquals("hi", messageAfterBuild.getOptionalStringPiece());
    495     assertEquals("", message.getOptionalStringPiece());
    496     builder.clearOptionalStringPiece();
    497     assertEquals("", builder.getOptionalStringPiece());
    498     assertEquals("hi", messageAfterBuild.getOptionalStringPiece());
    499 
    500     message = builder.build();
    501     builder.setOptionalStringPieceBytes(ByteString.copyFromUtf8("no"));
    502     assertEquals(ByteString.EMPTY, message.getOptionalStringPieceBytes());
    503     assertEquals(
    504         ByteString.copyFromUtf8("no"), builder.getOptionalStringPieceBytes());
    505     messageAfterBuild = builder.build();
    506     assertEquals(
    507         ByteString.copyFromUtf8("no"),
    508         messageAfterBuild.getOptionalStringPieceBytes());
    509     assertEquals(ByteString.EMPTY, message.getOptionalStringPieceBytes());
    510     builder.clearOptionalStringPiece();
    511     assertEquals(ByteString.EMPTY, builder.getOptionalStringPieceBytes());
    512     assertEquals(
    513         ByteString.copyFromUtf8("no"),
    514         messageAfterBuild.getOptionalStringPieceBytes());
    515 
    516     message = builder.build();
    517     builder.setOptionalUint32(1);
    518     assertEquals(0, message.getOptionalUint32());
    519     assertEquals(1, builder.getOptionalUint32());
    520     messageAfterBuild = builder.build();
    521     assertEquals(1, messageAfterBuild.getOptionalUint32());
    522     assertEquals(0, message.getOptionalUint32());
    523     builder.clearOptionalUint32();
    524     assertEquals(0, builder.getOptionalUint32());
    525     assertEquals(1, messageAfterBuild.getOptionalUint32());
    526 
    527     message = builder.build();
    528     builder.setOptionalUint64(1);
    529     assertEquals(0L, message.getOptionalUint64());
    530     assertEquals(1L, builder.getOptionalUint64());
    531     messageAfterBuild = builder.build();
    532     assertEquals(1L, messageAfterBuild.getOptionalUint64());
    533     assertEquals(0L, message.getOptionalUint64());
    534     builder.clearOptionalUint64();
    535     assertEquals(0L, builder.getOptionalUint64());
    536     assertEquals(1L, messageAfterBuild.getOptionalUint64());
    537 
    538     message = builder.build();
    539     builder.addAllRepeatedBool(singletonList(true));
    540     assertEquals(emptyList(), message.getRepeatedBoolList());
    541     assertEquals(singletonList(true), builder.getRepeatedBoolList());
    542     assertEquals(emptyList(), message.getRepeatedBoolList());
    543     messageAfterBuild = builder.build();
    544     builder.clearRepeatedBool();
    545     assertEquals(emptyList(), builder.getRepeatedBoolList());
    546     assertEquals(singletonList(true), messageAfterBuild.getRepeatedBoolList());
    547 
    548     message = builder.build();
    549     builder.addAllRepeatedBytes(singletonList(ByteString.copyFromUtf8("hi")));
    550     assertEquals(emptyList(), message.getRepeatedBytesList());
    551     assertEquals(
    552         singletonList(ByteString.copyFromUtf8("hi")),
    553         builder.getRepeatedBytesList());
    554     assertEquals(emptyList(), message.getRepeatedBytesList());
    555     messageAfterBuild = builder.build();
    556     builder.clearRepeatedBytes();
    557     assertEquals(emptyList(), builder.getRepeatedBytesList());
    558     assertEquals(
    559         singletonList(ByteString.copyFromUtf8("hi")),
    560         messageAfterBuild.getRepeatedBytesList());
    561 
    562     message = builder.build();
    563     builder.addAllRepeatedCord(singletonList("hi"));
    564     assertEquals(emptyList(), message.getRepeatedCordList());
    565     assertEquals(singletonList("hi"), builder.getRepeatedCordList());
    566     assertEquals(emptyList(), message.getRepeatedCordList());
    567     messageAfterBuild = builder.build();
    568     builder.clearRepeatedCord();
    569     assertEquals(emptyList(), builder.getRepeatedCordList());
    570     assertEquals(singletonList("hi"), messageAfterBuild.getRepeatedCordList());
    571 
    572     message = builder.build();
    573     builder.addAllRepeatedDouble(singletonList(1D));
    574     assertEquals(emptyList(), message.getRepeatedDoubleList());
    575     assertEquals(singletonList(1D), builder.getRepeatedDoubleList());
    576     assertEquals(emptyList(), message.getRepeatedDoubleList());
    577     messageAfterBuild = builder.build();
    578     builder.clearRepeatedDouble();
    579     assertEquals(emptyList(), builder.getRepeatedDoubleList());
    580     assertEquals(singletonList(1D), messageAfterBuild.getRepeatedDoubleList());
    581 
    582     message = builder.build();
    583     builder.addAllRepeatedFixed32(singletonList(1));
    584     assertEquals(emptyList(), message.getRepeatedFixed32List());
    585     assertEquals(singletonList(1), builder.getRepeatedFixed32List());
    586     assertEquals(emptyList(), message.getRepeatedFixed32List());
    587     messageAfterBuild = builder.build();
    588     builder.clearRepeatedFixed32();
    589     assertEquals(emptyList(), builder.getRepeatedFixed32List());
    590     assertEquals(singletonList(1), messageAfterBuild.getRepeatedFixed32List());
    591 
    592     message = builder.build();
    593     builder.addAllRepeatedFixed64(singletonList(1L));
    594     assertEquals(emptyList(), message.getRepeatedFixed64List());
    595     assertEquals(singletonList(1L), builder.getRepeatedFixed64List());
    596     assertEquals(emptyList(), message.getRepeatedFixed64List());
    597     messageAfterBuild = builder.build();
    598     builder.clearRepeatedFixed64();
    599     assertEquals(emptyList(), builder.getRepeatedFixed64List());
    600     assertEquals(singletonList(1L), messageAfterBuild.getRepeatedFixed64List());
    601 
    602     message = builder.build();
    603     builder.addAllRepeatedFloat(singletonList(1F));
    604     assertEquals(emptyList(), message.getRepeatedFloatList());
    605     assertEquals(singletonList(1F), builder.getRepeatedFloatList());
    606     assertEquals(emptyList(), message.getRepeatedFloatList());
    607     messageAfterBuild = builder.build();
    608     builder.clearRepeatedFloat();
    609     assertEquals(emptyList(), builder.getRepeatedFloatList());
    610     assertEquals(singletonList(1F), messageAfterBuild.getRepeatedFloatList());
    611 
    612     message = builder.build();
    613     builder.addAllRepeatedForeignEnum(
    614         singletonList(ForeignEnumLite.FOREIGN_LITE_BAR));
    615     assertEquals(emptyList(), message.getRepeatedForeignEnumList());
    616     assertEquals(
    617         singletonList(ForeignEnumLite.FOREIGN_LITE_BAR),
    618         builder.getRepeatedForeignEnumList());
    619     assertEquals(emptyList(), message.getRepeatedForeignEnumList());
    620     messageAfterBuild = builder.build();
    621     builder.clearRepeatedForeignEnum();
    622     assertEquals(emptyList(), builder.getRepeatedForeignEnumList());
    623     assertEquals(
    624         singletonList(ForeignEnumLite.FOREIGN_LITE_BAR),
    625         messageAfterBuild.getRepeatedForeignEnumList());
    626 
    627     message = builder.build();
    628     builder.addAllRepeatedForeignMessage(singletonList(foreignMessage));
    629     assertEquals(emptyList(), message.getRepeatedForeignMessageList());
    630     assertEquals(
    631         singletonList(foreignMessage), builder.getRepeatedForeignMessageList());
    632     assertEquals(emptyList(), message.getRepeatedForeignMessageList());
    633     messageAfterBuild = builder.build();
    634     builder.clearRepeatedForeignMessage();
    635     assertEquals(emptyList(), builder.getRepeatedForeignMessageList());
    636     assertEquals(
    637         singletonList(foreignMessage),
    638         messageAfterBuild.getRepeatedForeignMessageList());
    639 
    640     message = builder.build();
    641     builder.addAllRepeatedGroup(
    642         singletonList(RepeatedGroup.getDefaultInstance()));
    643     assertEquals(emptyList(), message.getRepeatedGroupList());
    644     assertEquals(
    645         singletonList(RepeatedGroup.getDefaultInstance()),
    646         builder.getRepeatedGroupList());
    647     assertEquals(emptyList(), message.getRepeatedGroupList());
    648     messageAfterBuild = builder.build();
    649     builder.clearRepeatedGroup();
    650     assertEquals(emptyList(), builder.getRepeatedGroupList());
    651     assertEquals(
    652         singletonList(RepeatedGroup.getDefaultInstance()),
    653         messageAfterBuild.getRepeatedGroupList());
    654 
    655     message = builder.build();
    656     builder.addAllRepeatedInt32(singletonList(1));
    657     assertEquals(emptyList(), message.getRepeatedInt32List());
    658     assertEquals(singletonList(1), builder.getRepeatedInt32List());
    659     assertEquals(emptyList(), message.getRepeatedInt32List());
    660     messageAfterBuild = builder.build();
    661     builder.clearRepeatedInt32();
    662     assertEquals(emptyList(), builder.getRepeatedInt32List());
    663     assertEquals(singletonList(1), messageAfterBuild.getRepeatedInt32List());
    664 
    665     message = builder.build();
    666     builder.addAllRepeatedInt64(singletonList(1L));
    667     assertEquals(emptyList(), message.getRepeatedInt64List());
    668     assertEquals(singletonList(1L), builder.getRepeatedInt64List());
    669     assertEquals(emptyList(), message.getRepeatedInt64List());
    670     messageAfterBuild = builder.build();
    671     builder.clearRepeatedInt64();
    672     assertEquals(emptyList(), builder.getRepeatedInt64List());
    673     assertEquals(singletonList(1L), messageAfterBuild.getRepeatedInt64List());
    674 
    675     message = builder.build();
    676     builder.addAllRepeatedLazyMessage(singletonList(nestedMessage));
    677     assertEquals(emptyList(), message.getRepeatedLazyMessageList());
    678     assertEquals(
    679         singletonList(nestedMessage), builder.getRepeatedLazyMessageList());
    680     assertEquals(emptyList(), message.getRepeatedLazyMessageList());
    681     messageAfterBuild = builder.build();
    682     builder.clearRepeatedLazyMessage();
    683     assertEquals(emptyList(), builder.getRepeatedLazyMessageList());
    684     assertEquals(
    685         singletonList(nestedMessage),
    686         messageAfterBuild.getRepeatedLazyMessageList());
    687 
    688     message = builder.build();
    689     builder.addAllRepeatedSfixed32(singletonList(1));
    690     assertEquals(emptyList(), message.getRepeatedSfixed32List());
    691     assertEquals(singletonList(1), builder.getRepeatedSfixed32List());
    692     assertEquals(emptyList(), message.getRepeatedSfixed32List());
    693     messageAfterBuild = builder.build();
    694     builder.clearRepeatedSfixed32();
    695     assertEquals(emptyList(), builder.getRepeatedSfixed32List());
    696     assertEquals(singletonList(1), messageAfterBuild.getRepeatedSfixed32List());
    697 
    698     message = builder.build();
    699     builder.addAllRepeatedSfixed64(singletonList(1L));
    700     assertEquals(emptyList(), message.getRepeatedSfixed64List());
    701     assertEquals(singletonList(1L), builder.getRepeatedSfixed64List());
    702     assertEquals(emptyList(), message.getRepeatedSfixed64List());
    703     messageAfterBuild = builder.build();
    704     builder.clearRepeatedSfixed64();
    705     assertEquals(emptyList(), builder.getRepeatedSfixed64List());
    706     assertEquals(
    707         singletonList(1L), messageAfterBuild.getRepeatedSfixed64List());
    708 
    709     message = builder.build();
    710     builder.addAllRepeatedSint32(singletonList(1));
    711     assertEquals(emptyList(), message.getRepeatedSint32List());
    712     assertEquals(singletonList(1), builder.getRepeatedSint32List());
    713     assertEquals(emptyList(), message.getRepeatedSint32List());
    714     messageAfterBuild = builder.build();
    715     builder.clearRepeatedSint32();
    716     assertEquals(emptyList(), builder.getRepeatedSint32List());
    717     assertEquals(singletonList(1), messageAfterBuild.getRepeatedSint32List());
    718 
    719     message = builder.build();
    720     builder.addAllRepeatedSint64(singletonList(1L));
    721     assertEquals(emptyList(), message.getRepeatedSint64List());
    722     assertEquals(singletonList(1L), builder.getRepeatedSint64List());
    723     assertEquals(emptyList(), message.getRepeatedSint64List());
    724     messageAfterBuild = builder.build();
    725     builder.clearRepeatedSint64();
    726     assertEquals(emptyList(), builder.getRepeatedSint64List());
    727     assertEquals(singletonList(1L), messageAfterBuild.getRepeatedSint64List());
    728 
    729     message = builder.build();
    730     builder.addAllRepeatedString(singletonList("hi"));
    731     assertEquals(emptyList(), message.getRepeatedStringList());
    732     assertEquals(singletonList("hi"), builder.getRepeatedStringList());
    733     assertEquals(emptyList(), message.getRepeatedStringList());
    734     messageAfterBuild = builder.build();
    735     builder.clearRepeatedString();
    736     assertEquals(emptyList(), builder.getRepeatedStringList());
    737     assertEquals(
    738         singletonList("hi"), messageAfterBuild.getRepeatedStringList());
    739 
    740     message = builder.build();
    741     builder.addAllRepeatedStringPiece(singletonList("hi"));
    742     assertEquals(emptyList(), message.getRepeatedStringPieceList());
    743     assertEquals(singletonList("hi"), builder.getRepeatedStringPieceList());
    744     assertEquals(emptyList(), message.getRepeatedStringPieceList());
    745     messageAfterBuild = builder.build();
    746     builder.clearRepeatedStringPiece();
    747     assertEquals(emptyList(), builder.getRepeatedStringPieceList());
    748     assertEquals(
    749         singletonList("hi"), messageAfterBuild.getRepeatedStringPieceList());
    750 
    751     message = builder.build();
    752     builder.addAllRepeatedUint32(singletonList(1));
    753     assertEquals(emptyList(), message.getRepeatedUint32List());
    754     assertEquals(singletonList(1), builder.getRepeatedUint32List());
    755     assertEquals(emptyList(), message.getRepeatedUint32List());
    756     messageAfterBuild = builder.build();
    757     builder.clearRepeatedUint32();
    758     assertEquals(emptyList(), builder.getRepeatedUint32List());
    759     assertEquals(singletonList(1), messageAfterBuild.getRepeatedUint32List());
    760 
    761     message = builder.build();
    762     builder.addAllRepeatedUint64(singletonList(1L));
    763     assertEquals(emptyList(), message.getRepeatedUint64List());
    764     assertEquals(singletonList(1L), builder.getRepeatedUint64List());
    765     assertEquals(emptyList(), message.getRepeatedUint64List());
    766     messageAfterBuild = builder.build();
    767     builder.clearRepeatedUint64();
    768     assertEquals(emptyList(), builder.getRepeatedUint64List());
    769     assertEquals(singletonList(1L), messageAfterBuild.getRepeatedUint64List());
    770 
    771     message = builder.build();
    772     builder.addRepeatedBool(true);
    773     assertEquals(emptyList(), message.getRepeatedBoolList());
    774     assertEquals(singletonList(true), builder.getRepeatedBoolList());
    775     assertEquals(emptyList(), message.getRepeatedBoolList());
    776     messageAfterBuild = builder.build();
    777     builder.clearRepeatedBool();
    778     assertEquals(emptyList(), builder.getRepeatedBoolList());
    779     assertEquals(singletonList(true), messageAfterBuild.getRepeatedBoolList());
    780 
    781     message = builder.build();
    782     builder.addRepeatedBytes(ByteString.copyFromUtf8("hi"));
    783     assertEquals(emptyList(), message.getRepeatedBytesList());
    784     assertEquals(
    785         singletonList(ByteString.copyFromUtf8("hi")),
    786         builder.getRepeatedBytesList());
    787     assertEquals(emptyList(), message.getRepeatedBytesList());
    788     messageAfterBuild = builder.build();
    789     builder.clearRepeatedBytes();
    790     assertEquals(emptyList(), builder.getRepeatedBytesList());
    791     assertEquals(
    792         singletonList(ByteString.copyFromUtf8("hi")),
    793         messageAfterBuild.getRepeatedBytesList());
    794 
    795     message = builder.build();
    796     builder.addRepeatedCord("hi");
    797     assertEquals(emptyList(), message.getRepeatedCordList());
    798     assertEquals(singletonList("hi"), builder.getRepeatedCordList());
    799     assertEquals(emptyList(), message.getRepeatedCordList());
    800     messageAfterBuild = builder.build();
    801     builder.clearRepeatedCord();
    802     assertEquals(emptyList(), builder.getRepeatedCordList());
    803     assertEquals(singletonList("hi"), messageAfterBuild.getRepeatedCordList());
    804 
    805     message = builder.build();
    806     builder.addRepeatedDouble(1D);
    807     assertEquals(emptyList(), message.getRepeatedDoubleList());
    808     assertEquals(singletonList(1D), builder.getRepeatedDoubleList());
    809     assertEquals(emptyList(), message.getRepeatedDoubleList());
    810     messageAfterBuild = builder.build();
    811     builder.clearRepeatedDouble();
    812     assertEquals(emptyList(), builder.getRepeatedDoubleList());
    813     assertEquals(singletonList(1D), messageAfterBuild.getRepeatedDoubleList());
    814 
    815     message = builder.build();
    816     builder.addRepeatedFixed32(1);
    817     assertEquals(emptyList(), message.getRepeatedFixed32List());
    818     assertEquals(singletonList(1), builder.getRepeatedFixed32List());
    819     assertEquals(emptyList(), message.getRepeatedFixed32List());
    820     messageAfterBuild = builder.build();
    821     builder.clearRepeatedFixed32();
    822     assertEquals(emptyList(), builder.getRepeatedFixed32List());
    823     assertEquals(singletonList(1), messageAfterBuild.getRepeatedFixed32List());
    824 
    825     message = builder.build();
    826     builder.addRepeatedFixed64(1L);
    827     assertEquals(emptyList(), message.getRepeatedFixed64List());
    828     assertEquals(singletonList(1L), builder.getRepeatedFixed64List());
    829     assertEquals(emptyList(), message.getRepeatedFixed64List());
    830     messageAfterBuild = builder.build();
    831     builder.clearRepeatedFixed64();
    832     assertEquals(emptyList(), builder.getRepeatedFixed64List());
    833     assertEquals(singletonList(1L), messageAfterBuild.getRepeatedFixed64List());
    834 
    835     message = builder.build();
    836     builder.addRepeatedFloat(1F);
    837     assertEquals(emptyList(), message.getRepeatedFloatList());
    838     assertEquals(singletonList(1F), builder.getRepeatedFloatList());
    839     assertEquals(emptyList(), message.getRepeatedFloatList());
    840     messageAfterBuild = builder.build();
    841     builder.clearRepeatedFloat();
    842     assertEquals(emptyList(), builder.getRepeatedFloatList());
    843     assertEquals(singletonList(1F), messageAfterBuild.getRepeatedFloatList());
    844 
    845     message = builder.build();
    846     builder.addRepeatedForeignEnum(ForeignEnumLite.FOREIGN_LITE_BAR);
    847     assertEquals(emptyList(), message.getRepeatedForeignEnumList());
    848     assertEquals(
    849         singletonList(ForeignEnumLite.FOREIGN_LITE_BAR),
    850         builder.getRepeatedForeignEnumList());
    851     assertEquals(emptyList(), message.getRepeatedForeignEnumList());
    852     messageAfterBuild = builder.build();
    853     builder.clearRepeatedForeignEnum();
    854     assertEquals(emptyList(), builder.getRepeatedForeignEnumList());
    855     assertEquals(
    856         singletonList(ForeignEnumLite.FOREIGN_LITE_BAR),
    857         messageAfterBuild.getRepeatedForeignEnumList());
    858 
    859     message = builder.build();
    860     builder.addRepeatedForeignMessage(foreignMessage);
    861     assertEquals(emptyList(), message.getRepeatedForeignMessageList());
    862     assertEquals(
    863         singletonList(foreignMessage), builder.getRepeatedForeignMessageList());
    864     assertEquals(emptyList(), message.getRepeatedForeignMessageList());
    865     messageAfterBuild = builder.build();
    866     builder.removeRepeatedForeignMessage(0);
    867     assertEquals(emptyList(), builder.getRepeatedForeignMessageList());
    868     assertEquals(
    869         singletonList(foreignMessage),
    870         messageAfterBuild.getRepeatedForeignMessageList());
    871 
    872     message = builder.build();
    873     builder.addRepeatedGroup(RepeatedGroup.getDefaultInstance());
    874     assertEquals(emptyList(), message.getRepeatedGroupList());
    875     assertEquals(
    876         singletonList(RepeatedGroup.getDefaultInstance()),
    877         builder.getRepeatedGroupList());
    878     assertEquals(emptyList(), message.getRepeatedGroupList());
    879     messageAfterBuild = builder.build();
    880     builder.removeRepeatedGroup(0);
    881     assertEquals(emptyList(), builder.getRepeatedGroupList());
    882     assertEquals(
    883         singletonList(RepeatedGroup.getDefaultInstance()),
    884         messageAfterBuild.getRepeatedGroupList());
    885 
    886     message = builder.build();
    887     builder.addRepeatedInt32(1);
    888     assertEquals(emptyList(), message.getRepeatedInt32List());
    889     assertEquals(singletonList(1), builder.getRepeatedInt32List());
    890     assertEquals(emptyList(), message.getRepeatedInt32List());
    891     messageAfterBuild = builder.build();
    892     builder.clearRepeatedInt32();
    893     assertEquals(emptyList(), builder.getRepeatedInt32List());
    894     assertEquals(singletonList(1), messageAfterBuild.getRepeatedInt32List());
    895 
    896     message = builder.build();
    897     builder.addRepeatedInt64(1L);
    898     assertEquals(emptyList(), message.getRepeatedInt64List());
    899     assertEquals(singletonList(1L), builder.getRepeatedInt64List());
    900     assertEquals(emptyList(), message.getRepeatedInt64List());
    901     messageAfterBuild = builder.build();
    902     builder.clearRepeatedInt64();
    903     assertEquals(emptyList(), builder.getRepeatedInt64List());
    904     assertEquals(singletonList(1L), messageAfterBuild.getRepeatedInt64List());
    905 
    906     message = builder.build();
    907     builder.addRepeatedLazyMessage(nestedMessage);
    908     assertEquals(emptyList(), message.getRepeatedLazyMessageList());
    909     assertEquals(
    910         singletonList(nestedMessage), builder.getRepeatedLazyMessageList());
    911     assertEquals(emptyList(), message.getRepeatedLazyMessageList());
    912     messageAfterBuild = builder.build();
    913     builder.removeRepeatedLazyMessage(0);
    914     assertEquals(emptyList(), builder.getRepeatedLazyMessageList());
    915     assertEquals(
    916         singletonList(nestedMessage),
    917         messageAfterBuild.getRepeatedLazyMessageList());
    918 
    919     message = builder.build();
    920     builder.addRepeatedSfixed32(1);
    921     assertEquals(emptyList(), message.getRepeatedSfixed32List());
    922     assertEquals(singletonList(1), builder.getRepeatedSfixed32List());
    923     assertEquals(emptyList(), message.getRepeatedSfixed32List());
    924     messageAfterBuild = builder.build();
    925     builder.clearRepeatedSfixed32();
    926     assertEquals(emptyList(), builder.getRepeatedSfixed32List());
    927     assertEquals(singletonList(1), messageAfterBuild.getRepeatedSfixed32List());
    928 
    929     message = builder.build();
    930     builder.addRepeatedSfixed64(1L);
    931     assertEquals(emptyList(), message.getRepeatedSfixed64List());
    932     assertEquals(singletonList(1L), builder.getRepeatedSfixed64List());
    933     assertEquals(emptyList(), message.getRepeatedSfixed64List());
    934     messageAfterBuild = builder.build();
    935     builder.clearRepeatedSfixed64();
    936     assertEquals(emptyList(), builder.getRepeatedSfixed64List());
    937     assertEquals(
    938         singletonList(1L), messageAfterBuild.getRepeatedSfixed64List());
    939 
    940     message = builder.build();
    941     builder.addRepeatedSint32(1);
    942     assertEquals(emptyList(), message.getRepeatedSint32List());
    943     assertEquals(singletonList(1), builder.getRepeatedSint32List());
    944     assertEquals(emptyList(), message.getRepeatedSint32List());
    945     messageAfterBuild = builder.build();
    946     builder.clearRepeatedSint32();
    947     assertEquals(emptyList(), builder.getRepeatedSint32List());
    948     assertEquals(singletonList(1), messageAfterBuild.getRepeatedSint32List());
    949 
    950     message = builder.build();
    951     builder.addRepeatedSint64(1L);
    952     assertEquals(emptyList(), message.getRepeatedSint64List());
    953     assertEquals(singletonList(1L), builder.getRepeatedSint64List());
    954     assertEquals(emptyList(), message.getRepeatedSint64List());
    955     messageAfterBuild = builder.build();
    956     builder.clearRepeatedSint64();
    957     assertEquals(emptyList(), builder.getRepeatedSint64List());
    958     assertEquals(singletonList(1L), messageAfterBuild.getRepeatedSint64List());
    959 
    960     message = builder.build();
    961     builder.addRepeatedString("hi");
    962     assertEquals(emptyList(), message.getRepeatedStringList());
    963     assertEquals(singletonList("hi"), builder.getRepeatedStringList());
    964     assertEquals(emptyList(), message.getRepeatedStringList());
    965     messageAfterBuild = builder.build();
    966     builder.clearRepeatedString();
    967     assertEquals(emptyList(), builder.getRepeatedStringList());
    968     assertEquals(
    969         singletonList("hi"), messageAfterBuild.getRepeatedStringList());
    970 
    971     message = builder.build();
    972     builder.addRepeatedStringPiece("hi");
    973     assertEquals(emptyList(), message.getRepeatedStringPieceList());
    974     assertEquals(singletonList("hi"), builder.getRepeatedStringPieceList());
    975     assertEquals(emptyList(), message.getRepeatedStringPieceList());
    976     messageAfterBuild = builder.build();
    977     builder.clearRepeatedStringPiece();
    978     assertEquals(emptyList(), builder.getRepeatedStringPieceList());
    979     assertEquals(
    980         singletonList("hi"), messageAfterBuild.getRepeatedStringPieceList());
    981 
    982     message = builder.build();
    983     builder.addRepeatedUint32(1);
    984     assertEquals(emptyList(), message.getRepeatedUint32List());
    985     assertEquals(singletonList(1), builder.getRepeatedUint32List());
    986     assertEquals(emptyList(), message.getRepeatedUint32List());
    987     messageAfterBuild = builder.build();
    988     builder.clearRepeatedUint32();
    989     assertEquals(emptyList(), builder.getRepeatedUint32List());
    990     assertEquals(singletonList(1), messageAfterBuild.getRepeatedUint32List());
    991 
    992     message = builder.build();
    993     builder.addRepeatedUint64(1L);
    994     assertEquals(emptyList(), message.getRepeatedUint64List());
    995     assertEquals(singletonList(1L), builder.getRepeatedUint64List());
    996     assertEquals(emptyList(), message.getRepeatedUint64List());
    997     messageAfterBuild = builder.build();
    998     builder.clearRepeatedUint64();
    999     assertEquals(emptyList(), builder.getRepeatedUint64List());
   1000     assertEquals(singletonList(1L), messageAfterBuild.getRepeatedUint64List());
   1001 
   1002     message = builder.build();
   1003     builder.addRepeatedBool(true);
   1004     messageAfterBuild = builder.build();
   1005     assertEquals(0, message.getRepeatedBoolCount());
   1006     builder.setRepeatedBool(0, false);
   1007     assertEquals(true, messageAfterBuild.getRepeatedBool(0));
   1008     assertEquals(false, builder.getRepeatedBool(0));
   1009     builder.clearRepeatedBool();
   1010 
   1011     message = builder.build();
   1012     builder.addRepeatedBytes(ByteString.copyFromUtf8("hi"));
   1013     messageAfterBuild = builder.build();
   1014     assertEquals(0, message.getRepeatedBytesCount());
   1015     builder.setRepeatedBytes(0, ByteString.EMPTY);
   1016     assertEquals(
   1017         ByteString.copyFromUtf8("hi"), messageAfterBuild.getRepeatedBytes(0));
   1018     assertEquals(ByteString.EMPTY, builder.getRepeatedBytes(0));
   1019     builder.clearRepeatedBytes();
   1020 
   1021     message = builder.build();
   1022     builder.addRepeatedCord("hi");
   1023     messageAfterBuild = builder.build();
   1024     assertEquals(0, message.getRepeatedCordCount());
   1025     builder.setRepeatedCord(0, "");
   1026     assertEquals("hi", messageAfterBuild.getRepeatedCord(0));
   1027     assertEquals("", builder.getRepeatedCord(0));
   1028     builder.clearRepeatedCord();
   1029     message = builder.build();
   1030 
   1031     builder.addRepeatedCordBytes(ByteString.copyFromUtf8("hi"));
   1032     messageAfterBuild = builder.build();
   1033     assertEquals(0, message.getRepeatedCordCount());
   1034     builder.setRepeatedCord(0, "");
   1035     assertEquals(
   1036         ByteString.copyFromUtf8("hi"), messageAfterBuild.getRepeatedCordBytes(0));
   1037     assertEquals(ByteString.EMPTY, builder.getRepeatedCordBytes(0));
   1038     builder.clearRepeatedCord();
   1039 
   1040     message = builder.build();
   1041     builder.addRepeatedDouble(1D);
   1042     messageAfterBuild = builder.build();
   1043     assertEquals(0, message.getRepeatedDoubleCount());
   1044     builder.setRepeatedDouble(0, 0D);
   1045     assertEquals(1D, messageAfterBuild.getRepeatedDouble(0));
   1046     assertEquals(0D, builder.getRepeatedDouble(0));
   1047     builder.clearRepeatedDouble();
   1048 
   1049     message = builder.build();
   1050     builder.addRepeatedFixed32(1);
   1051     messageAfterBuild = builder.build();
   1052     assertEquals(0, message.getRepeatedFixed32Count());
   1053     builder.setRepeatedFixed32(0, 0);
   1054     assertEquals(1, messageAfterBuild.getRepeatedFixed32(0));
   1055     assertEquals(0, builder.getRepeatedFixed32(0));
   1056     builder.clearRepeatedFixed32();
   1057 
   1058     message = builder.build();
   1059     builder.addRepeatedFixed64(1L);
   1060     messageAfterBuild = builder.build();
   1061     assertEquals(0, message.getRepeatedFixed64Count());
   1062     builder.setRepeatedFixed64(0, 0L);
   1063     assertEquals(1L, messageAfterBuild.getRepeatedFixed64(0));
   1064     assertEquals(0L, builder.getRepeatedFixed64(0));
   1065     builder.clearRepeatedFixed64();
   1066 
   1067     message = builder.build();
   1068     builder.addRepeatedFloat(1F);
   1069     messageAfterBuild = builder.build();
   1070     assertEquals(0, message.getRepeatedFloatCount());
   1071     builder.setRepeatedFloat(0, 0F);
   1072     assertEquals(1F, messageAfterBuild.getRepeatedFloat(0));
   1073     assertEquals(0F, builder.getRepeatedFloat(0));
   1074     builder.clearRepeatedFloat();
   1075 
   1076     message = builder.build();
   1077     builder.addRepeatedForeignEnum(ForeignEnumLite.FOREIGN_LITE_BAR);
   1078     messageAfterBuild = builder.build();
   1079     assertEquals(0, message.getRepeatedForeignEnumCount());
   1080     builder.setRepeatedForeignEnum(0, ForeignEnumLite.FOREIGN_LITE_FOO);
   1081     assertEquals(
   1082         ForeignEnumLite.FOREIGN_LITE_BAR,
   1083         messageAfterBuild.getRepeatedForeignEnum(0));
   1084     assertEquals(
   1085         ForeignEnumLite.FOREIGN_LITE_FOO, builder.getRepeatedForeignEnum(0));
   1086     builder.clearRepeatedForeignEnum();
   1087 
   1088     message = builder.build();
   1089     builder.addRepeatedForeignMessage(foreignMessage);
   1090     messageAfterBuild = builder.build();
   1091     assertEquals(0, message.getRepeatedForeignMessageCount());
   1092     builder.setRepeatedForeignMessage(
   1093         0, ForeignMessageLite.getDefaultInstance());
   1094     assertEquals(
   1095         foreignMessage, messageAfterBuild.getRepeatedForeignMessage(0));
   1096     assertEquals(
   1097         ForeignMessageLite.getDefaultInstance(),
   1098         builder.getRepeatedForeignMessage(0));
   1099     builder.clearRepeatedForeignMessage();
   1100 
   1101     message = builder.build();
   1102     builder.addRepeatedForeignMessage(foreignMessageBuilder);
   1103     messageAfterBuild = builder.build();
   1104     assertEquals(0, message.getRepeatedForeignMessageCount());
   1105     builder.setRepeatedForeignMessage(
   1106         0, ForeignMessageLite.getDefaultInstance());
   1107     assertEquals(foreignMessageBuilder.build(), messageAfterBuild.getRepeatedForeignMessage(0));
   1108     assertEquals(
   1109         ForeignMessageLite.getDefaultInstance(),
   1110         builder.getRepeatedForeignMessage(0));
   1111     builder.clearRepeatedForeignMessage();
   1112 
   1113     message = builder.build();
   1114     builder.addRepeatedForeignMessage(0, foreignMessage);
   1115     messageAfterBuild = builder.build();
   1116     assertEquals(0, message.getRepeatedForeignMessageCount());
   1117     builder.setRepeatedForeignMessage(0, foreignMessageBuilder);
   1118     assertEquals(
   1119         foreignMessage, messageAfterBuild.getRepeatedForeignMessage(0));
   1120     assertEquals(foreignMessageBuilder.build(), builder.getRepeatedForeignMessage(0));
   1121     builder.clearRepeatedForeignMessage();
   1122 
   1123     message = builder.build();
   1124     RepeatedGroup repeatedGroup = RepeatedGroup.newBuilder()
   1125         .setA(1)
   1126         .build();
   1127     builder.addRepeatedGroup(repeatedGroup);
   1128     messageAfterBuild = builder.build();
   1129     assertEquals(0, message.getRepeatedGroupCount());
   1130     builder.setRepeatedGroup(0, RepeatedGroup.getDefaultInstance());
   1131     assertEquals(repeatedGroup, messageAfterBuild.getRepeatedGroup(0));
   1132     assertEquals(
   1133         RepeatedGroup.getDefaultInstance(), builder.getRepeatedGroup(0));
   1134     builder.clearRepeatedGroup();
   1135 
   1136     message = builder.build();
   1137     builder.addRepeatedGroup(0, repeatedGroup);
   1138     messageAfterBuild = builder.build();
   1139     assertEquals(0, message.getRepeatedGroupCount());
   1140     builder.setRepeatedGroup(0, RepeatedGroup.getDefaultInstance());
   1141     assertEquals(repeatedGroup, messageAfterBuild.getRepeatedGroup(0));
   1142     assertEquals(
   1143         RepeatedGroup.getDefaultInstance(), builder.getRepeatedGroup(0));
   1144     builder.clearRepeatedGroup();
   1145 
   1146     message = builder.build();
   1147     RepeatedGroup.Builder repeatedGroupBuilder = RepeatedGroup.newBuilder()
   1148         .setA(3);
   1149     builder.addRepeatedGroup(repeatedGroupBuilder);
   1150     messageAfterBuild = builder.build();
   1151     assertEquals(0, message.getRepeatedGroupCount());
   1152     builder.setRepeatedGroup(0, RepeatedGroup.getDefaultInstance());
   1153     assertEquals(repeatedGroupBuilder.build(), messageAfterBuild.getRepeatedGroup(0));
   1154     assertEquals(
   1155         RepeatedGroup.getDefaultInstance(), builder.getRepeatedGroup(0));
   1156     builder.clearRepeatedGroup();
   1157 
   1158     message = builder.build();
   1159     builder.addRepeatedGroup(0, repeatedGroupBuilder);
   1160     messageAfterBuild = builder.build();
   1161     assertEquals(0, message.getRepeatedGroupCount());
   1162     builder.setRepeatedGroup(0, RepeatedGroup.getDefaultInstance());
   1163     assertEquals(repeatedGroupBuilder.build(), messageAfterBuild.getRepeatedGroup(0));
   1164     assertEquals(
   1165         RepeatedGroup.getDefaultInstance(), builder.getRepeatedGroup(0));
   1166     builder.clearRepeatedGroup();
   1167 
   1168     message = builder.build();
   1169     builder.addRepeatedInt32(1);
   1170     messageAfterBuild = builder.build();
   1171     assertEquals(0, message.getRepeatedInt32Count());
   1172     builder.setRepeatedInt32(0, 0);
   1173     assertEquals(1, messageAfterBuild.getRepeatedInt32(0));
   1174     assertEquals(0, builder.getRepeatedInt32(0));
   1175     builder.clearRepeatedInt32();
   1176 
   1177     message = builder.build();
   1178     builder.addRepeatedInt64(1L);
   1179     messageAfterBuild = builder.build();
   1180     assertEquals(0L, message.getRepeatedInt64Count());
   1181     builder.setRepeatedInt64(0, 0L);
   1182     assertEquals(1L, messageAfterBuild.getRepeatedInt64(0));
   1183     assertEquals(0L, builder.getRepeatedInt64(0));
   1184     builder.clearRepeatedInt64();
   1185 
   1186     message = builder.build();
   1187     builder.addRepeatedLazyMessage(nestedMessage);
   1188     messageAfterBuild = builder.build();
   1189     assertEquals(0, message.getRepeatedLazyMessageCount());
   1190     builder.setRepeatedLazyMessage(0, NestedMessage.getDefaultInstance());
   1191     assertEquals(nestedMessage, messageAfterBuild.getRepeatedLazyMessage(0));
   1192     assertEquals(
   1193         NestedMessage.getDefaultInstance(), builder.getRepeatedLazyMessage(0));
   1194     builder.clearRepeatedLazyMessage();
   1195 
   1196     message = builder.build();
   1197     builder.addRepeatedLazyMessage(0, nestedMessage);
   1198     messageAfterBuild = builder.build();
   1199     assertEquals(0, message.getRepeatedLazyMessageCount());
   1200     builder.setRepeatedLazyMessage(0, NestedMessage.getDefaultInstance());
   1201     assertEquals(nestedMessage, messageAfterBuild.getRepeatedLazyMessage(0));
   1202     assertEquals(
   1203         NestedMessage.getDefaultInstance(), builder.getRepeatedLazyMessage(0));
   1204     builder.clearRepeatedLazyMessage();
   1205 
   1206     message = builder.build();
   1207     builder.addRepeatedLazyMessage(nestedMessageBuilder);
   1208     messageAfterBuild = builder.build();
   1209     assertEquals(0, message.getRepeatedLazyMessageCount());
   1210     builder.setRepeatedLazyMessage(0, NestedMessage.getDefaultInstance());
   1211     assertEquals(nestedMessageBuilder.build(), messageAfterBuild.getRepeatedLazyMessage(0));
   1212     assertEquals(
   1213         NestedMessage.getDefaultInstance(), builder.getRepeatedLazyMessage(0));
   1214     builder.clearRepeatedLazyMessage();
   1215 
   1216     message = builder.build();
   1217     builder.addRepeatedLazyMessage(0, nestedMessageBuilder);
   1218     messageAfterBuild = builder.build();
   1219     assertEquals(0, message.getRepeatedLazyMessageCount());
   1220     builder.setRepeatedLazyMessage(0, NestedMessage.getDefaultInstance());
   1221     assertEquals(nestedMessageBuilder.build(), messageAfterBuild.getRepeatedLazyMessage(0));
   1222     assertEquals(
   1223         NestedMessage.getDefaultInstance(), builder.getRepeatedLazyMessage(0));
   1224     builder.clearRepeatedLazyMessage();
   1225 
   1226     message = builder.build();
   1227     builder.addRepeatedSfixed32(1);
   1228     messageAfterBuild = builder.build();
   1229     assertEquals(0, message.getRepeatedSfixed32Count());
   1230     builder.setRepeatedSfixed32(0, 0);
   1231     assertEquals(1, messageAfterBuild.getRepeatedSfixed32(0));
   1232     assertEquals(0, builder.getRepeatedSfixed32(0));
   1233     builder.clearRepeatedSfixed32();
   1234 
   1235     message = builder.build();
   1236     builder.addRepeatedSfixed64(1L);
   1237     messageAfterBuild = builder.build();
   1238     assertEquals(0L, message.getRepeatedSfixed64Count());
   1239     builder.setRepeatedSfixed64(0, 0L);
   1240     assertEquals(1L, messageAfterBuild.getRepeatedSfixed64(0));
   1241     assertEquals(0L, builder.getRepeatedSfixed64(0));
   1242     builder.clearRepeatedSfixed64();
   1243 
   1244     message = builder.build();
   1245     builder.addRepeatedSint32(1);
   1246     messageAfterBuild = builder.build();
   1247     assertEquals(0, message.getRepeatedSint32Count());
   1248     builder.setRepeatedSint32(0, 0);
   1249     assertEquals(1, messageAfterBuild.getRepeatedSint32(0));
   1250     assertEquals(0, builder.getRepeatedSint32(0));
   1251     builder.clearRepeatedSint32();
   1252 
   1253     message = builder.build();
   1254     builder.addRepeatedSint64(1L);
   1255     messageAfterBuild = builder.build();
   1256     assertEquals(0L, message.getRepeatedSint64Count());
   1257     builder.setRepeatedSint64(0, 0L);
   1258     assertEquals(1L, messageAfterBuild.getRepeatedSint64(0));
   1259     assertEquals(0L, builder.getRepeatedSint64(0));
   1260     builder.clearRepeatedSint64();
   1261 
   1262     message = builder.build();
   1263     builder.addRepeatedString("hi");
   1264     messageAfterBuild = builder.build();
   1265     assertEquals(0L, message.getRepeatedStringCount());
   1266     builder.setRepeatedString(0, "");
   1267     assertEquals("hi", messageAfterBuild.getRepeatedString(0));
   1268     assertEquals("", builder.getRepeatedString(0));
   1269     builder.clearRepeatedString();
   1270 
   1271     message = builder.build();
   1272     builder.addRepeatedStringBytes(ByteString.copyFromUtf8("hi"));
   1273     messageAfterBuild = builder.build();
   1274     assertEquals(0L, message.getRepeatedStringCount());
   1275     builder.setRepeatedString(0, "");
   1276     assertEquals(
   1277         ByteString.copyFromUtf8("hi"),
   1278         messageAfterBuild.getRepeatedStringBytes(0));
   1279     assertEquals(ByteString.EMPTY, builder.getRepeatedStringBytes(0));
   1280     builder.clearRepeatedString();
   1281 
   1282     message = builder.build();
   1283     builder.addRepeatedStringPiece("hi");
   1284     messageAfterBuild = builder.build();
   1285     assertEquals(0L, message.getRepeatedStringPieceCount());
   1286     builder.setRepeatedStringPiece(0, "");
   1287     assertEquals("hi", messageAfterBuild.getRepeatedStringPiece(0));
   1288     assertEquals("", builder.getRepeatedStringPiece(0));
   1289     builder.clearRepeatedStringPiece();
   1290 
   1291     message = builder.build();
   1292     builder.addRepeatedStringPieceBytes(ByteString.copyFromUtf8("hi"));
   1293     messageAfterBuild = builder.build();
   1294     assertEquals(0L, message.getRepeatedStringPieceCount());
   1295     builder.setRepeatedStringPiece(0, "");
   1296     assertEquals(
   1297         ByteString.copyFromUtf8("hi"),
   1298         messageAfterBuild.getRepeatedStringPieceBytes(0));
   1299     assertEquals(ByteString.EMPTY, builder.getRepeatedStringPieceBytes(0));
   1300     builder.clearRepeatedStringPiece();
   1301 
   1302     message = builder.build();
   1303     builder.addRepeatedUint32(1);
   1304     messageAfterBuild = builder.build();
   1305     assertEquals(0, message.getRepeatedUint32Count());
   1306     builder.setRepeatedUint32(0, 0);
   1307     assertEquals(1, messageAfterBuild.getRepeatedUint32(0));
   1308     assertEquals(0, builder.getRepeatedUint32(0));
   1309     builder.clearRepeatedUint32();
   1310 
   1311     message = builder.build();
   1312     builder.addRepeatedUint64(1L);
   1313     messageAfterBuild = builder.build();
   1314     assertEquals(0L, message.getRepeatedUint64Count());
   1315     builder.setRepeatedUint64(0, 0L);
   1316     assertEquals(1L, messageAfterBuild.getRepeatedUint64(0));
   1317     assertEquals(0L, builder.getRepeatedUint64(0));
   1318     builder.clearRepeatedUint64();
   1319 
   1320     message = builder.build();
   1321     assertEquals(0, message.getSerializedSize());
   1322     builder.mergeFrom(TestAllTypesLite.newBuilder()
   1323         .setOptionalBool(true)
   1324         .build());
   1325     assertEquals(0, message.getSerializedSize());
   1326     assertEquals(true, builder.build().getOptionalBool());
   1327     builder.clearOptionalBool();
   1328 
   1329     message = builder.build();
   1330     assertEquals(0, message.getSerializedSize());
   1331     builder.mergeFrom(TestAllTypesLite.newBuilder()
   1332         .setOptionalBool(true)
   1333         .build());
   1334     assertEquals(0, message.getSerializedSize());
   1335     assertEquals(true, builder.build().getOptionalBool());
   1336     builder.clear();
   1337     assertEquals(0, builder.build().getSerializedSize());
   1338 
   1339     message = builder.build();
   1340     assertEquals(0, message.getSerializedSize());
   1341     builder.mergeOptionalForeignMessage(foreignMessage);
   1342     assertEquals(0, message.getSerializedSize());
   1343     assertEquals(
   1344         foreignMessage.getC(),
   1345         builder.build().getOptionalForeignMessage().getC());
   1346     builder.clearOptionalForeignMessage();
   1347 
   1348     message = builder.build();
   1349     assertEquals(0, message.getSerializedSize());
   1350     builder.mergeOptionalLazyMessage(nestedMessage);
   1351     assertEquals(0, message.getSerializedSize());
   1352     assertEquals(
   1353         nestedMessage.getBb(),
   1354         builder.build().getOptionalLazyMessage().getBb());
   1355     builder.clearOptionalLazyMessage();
   1356 
   1357     message = builder.build();
   1358     builder.setOneofString("hi");
   1359     assertEquals(
   1360         OneofFieldCase.ONEOFFIELD_NOT_SET, message.getOneofFieldCase());
   1361     assertEquals(OneofFieldCase.ONEOF_STRING, builder.getOneofFieldCase());
   1362     assertEquals("hi", builder.getOneofString());
   1363     messageAfterBuild = builder.build();
   1364     assertEquals(
   1365         OneofFieldCase.ONEOF_STRING, messageAfterBuild.getOneofFieldCase());
   1366     assertEquals("hi", messageAfterBuild.getOneofString());
   1367     builder.setOneofUint32(1);
   1368     assertEquals(
   1369         OneofFieldCase.ONEOF_STRING, messageAfterBuild.getOneofFieldCase());
   1370     assertEquals("hi", messageAfterBuild.getOneofString());
   1371     assertEquals(OneofFieldCase.ONEOF_UINT32, builder.getOneofFieldCase());
   1372     assertEquals(1, builder.getOneofUint32());
   1373     TestAllTypesLiteOrBuilder messageOrBuilder = builder;
   1374     assertEquals(OneofFieldCase.ONEOF_UINT32, messageOrBuilder.getOneofFieldCase());
   1375 
   1376     TestAllExtensionsLite.Builder extendableMessageBuilder =
   1377         TestAllExtensionsLite.newBuilder();
   1378     TestAllExtensionsLite extendableMessage = extendableMessageBuilder.build();
   1379     extendableMessageBuilder.setExtension(
   1380         UnittestLite.optionalInt32ExtensionLite, 1);
   1381     assertFalse(extendableMessage.hasExtension(
   1382         UnittestLite.optionalInt32ExtensionLite));
   1383     extendableMessage = extendableMessageBuilder.build();
   1384     assertEquals(
   1385         1, (int) extendableMessageBuilder.getExtension(
   1386             UnittestLite.optionalInt32ExtensionLite));
   1387     assertEquals(
   1388         1, (int) extendableMessage.getExtension(
   1389             UnittestLite.optionalInt32ExtensionLite));
   1390     extendableMessageBuilder.setExtension(
   1391         UnittestLite.optionalInt32ExtensionLite, 3);
   1392     assertEquals(
   1393         3, (int) extendableMessageBuilder.getExtension(
   1394             UnittestLite.optionalInt32ExtensionLite));
   1395     assertEquals(
   1396         1, (int) extendableMessage.getExtension(
   1397             UnittestLite.optionalInt32ExtensionLite));
   1398     extendableMessage = extendableMessageBuilder.build();
   1399     assertEquals(
   1400         3, (int) extendableMessageBuilder.getExtension(
   1401             UnittestLite.optionalInt32ExtensionLite));
   1402     assertEquals(
   1403         3, (int) extendableMessage.getExtension(
   1404             UnittestLite.optionalInt32ExtensionLite));
   1405 
   1406     // No extension registry, so it should be in unknown fields.
   1407     extendableMessage =
   1408         TestAllExtensionsLite.parseFrom(extendableMessage.toByteArray());
   1409     assertFalse(extendableMessage.hasExtension(
   1410         UnittestLite.optionalInt32ExtensionLite));
   1411 
   1412     extendableMessageBuilder = extendableMessage.toBuilder();
   1413     extendableMessageBuilder.mergeFrom(TestAllExtensionsLite.newBuilder()
   1414         .setExtension(UnittestLite.optionalFixed32ExtensionLite, 11)
   1415         .build());
   1416 
   1417     extendableMessage = extendableMessageBuilder.build();
   1418     ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance();
   1419     UnittestLite.registerAllExtensions(registry);
   1420     extendableMessage = TestAllExtensionsLite.parseFrom(
   1421         extendableMessage.toByteArray(), registry);
   1422 
   1423     // The unknown field was preserved.
   1424     assertEquals(
   1425         3, (int) extendableMessage.getExtension(
   1426             UnittestLite.optionalInt32ExtensionLite));
   1427     assertEquals(
   1428         11, (int) extendableMessage.getExtension(
   1429             UnittestLite.optionalFixed32ExtensionLite));
   1430   }
   1431 
   1432   public void testToStringDefaultInstance() throws Exception {
   1433     assertToStringEquals("", TestAllTypesLite.getDefaultInstance());
   1434   }
   1435 
   1436   public void testToStringPrimitives() throws Exception {
   1437     TestAllTypesLite proto = TestAllTypesLite.newBuilder()
   1438         .setOptionalInt32(1)
   1439         .setOptionalInt64(9223372036854775807L)
   1440         .build();
   1441     assertToStringEquals("optional_int32: 1\noptional_int64: 9223372036854775807", proto);
   1442 
   1443     proto = TestAllTypesLite.newBuilder()
   1444         .setOptionalBool(true)
   1445         .setOptionalNestedEnum(TestAllTypesLite.NestedEnum.BAZ)
   1446         .build();
   1447     assertToStringEquals("optional_bool: true\noptional_nested_enum: BAZ", proto);
   1448 
   1449     proto = TestAllTypesLite.newBuilder()
   1450         .setOptionalFloat(2.72f)
   1451         .setOptionalDouble(3.14)
   1452         .build();
   1453     assertToStringEquals("optional_double: 3.14\noptional_float: 2.72", proto);
   1454   }
   1455 
   1456   public void testToStringStringFields() throws Exception {
   1457     TestAllTypesLite proto = TestAllTypesLite.newBuilder()
   1458         .setOptionalString("foo\"bar\nbaz\\")
   1459         .build();
   1460     assertToStringEquals("optional_string: \"foo\\\"bar\\nbaz\\\\\"", proto);
   1461 
   1462     proto = TestAllTypesLite.newBuilder()
   1463         .setOptionalString("\u6587")
   1464         .build();
   1465     assertToStringEquals("optional_string: \"\\346\\226\\207\"", proto);
   1466   }
   1467 
   1468   public void testToStringNestedMessage() throws Exception {
   1469     TestAllTypesLite proto = TestAllTypesLite.newBuilder()
   1470         .setOptionalNestedMessage(TestAllTypesLite.NestedMessage.getDefaultInstance())
   1471         .build();
   1472     assertToStringEquals("optional_nested_message {\n}", proto);
   1473 
   1474     proto = TestAllTypesLite.newBuilder()
   1475         .setOptionalNestedMessage(
   1476             TestAllTypesLite.NestedMessage.newBuilder().setBb(7))
   1477         .build();
   1478     assertToStringEquals("optional_nested_message {\n  bb: 7\n}", proto);
   1479   }
   1480 
   1481   public void testToStringRepeatedFields() throws Exception {
   1482     TestAllTypesLite proto = TestAllTypesLite.newBuilder()
   1483         .addRepeatedInt32(32)
   1484         .addRepeatedInt32(32)
   1485         .addRepeatedInt64(64)
   1486         .build();
   1487     assertToStringEquals("repeated_int32: 32\nrepeated_int32: 32\nrepeated_int64: 64", proto);
   1488 
   1489     proto = TestAllTypesLite.newBuilder()
   1490         .addRepeatedLazyMessage(
   1491             TestAllTypesLite.NestedMessage.newBuilder().setBb(7))
   1492         .addRepeatedLazyMessage(
   1493             TestAllTypesLite.NestedMessage.newBuilder().setBb(8))
   1494         .build();
   1495     assertToStringEquals(
   1496         "repeated_lazy_message {\n  bb: 7\n}\nrepeated_lazy_message {\n  bb: 8\n}",
   1497         proto);
   1498   }
   1499 
   1500   public void testToStringForeignFields() throws Exception {
   1501     TestAllTypesLite proto = TestAllTypesLite.newBuilder()
   1502         .setOptionalForeignEnum(ForeignEnumLite.FOREIGN_LITE_BAR)
   1503         .setOptionalForeignMessage(
   1504             ForeignMessageLite.newBuilder()
   1505             .setC(3))
   1506         .build();
   1507     assertToStringEquals(
   1508         "optional_foreign_enum: FOREIGN_LITE_BAR\noptional_foreign_message {\n  c: 3\n}",
   1509         proto);
   1510   }
   1511 
   1512   public void testToStringExtensions() throws Exception {
   1513     TestAllExtensionsLite message = TestAllExtensionsLite.newBuilder()
   1514         .setExtension(UnittestLite.optionalInt32ExtensionLite, 123)
   1515         .addExtension(UnittestLite.repeatedStringExtensionLite, "spam")
   1516         .addExtension(UnittestLite.repeatedStringExtensionLite, "eggs")
   1517         .setExtension(UnittestLite.optionalNestedEnumExtensionLite,
   1518             TestAllTypesLite.NestedEnum.BAZ)
   1519         .setExtension(UnittestLite.optionalNestedMessageExtensionLite,
   1520             TestAllTypesLite.NestedMessage.newBuilder().setBb(7).build())
   1521         .build();
   1522     assertToStringEquals(
   1523         "[1]: 123\n[18] {\n  bb: 7\n}\n[21]: 3\n[44]: \"spam\"\n[44]: \"eggs\"",
   1524         message);
   1525   }
   1526 
   1527   public void testToStringUnknownFields() throws Exception {
   1528     TestAllExtensionsLite messageWithExtensions = TestAllExtensionsLite.newBuilder()
   1529         .setExtension(UnittestLite.optionalInt32ExtensionLite, 123)
   1530         .addExtension(UnittestLite.repeatedStringExtensionLite, "spam")
   1531         .addExtension(UnittestLite.repeatedStringExtensionLite, "eggs")
   1532         .setExtension(UnittestLite.optionalNestedEnumExtensionLite,
   1533             TestAllTypesLite.NestedEnum.BAZ)
   1534         .setExtension(UnittestLite.optionalNestedMessageExtensionLite,
   1535             TestAllTypesLite.NestedMessage.newBuilder().setBb(7).build())
   1536         .build();
   1537     TestAllExtensionsLite messageWithUnknownFields = TestAllExtensionsLite.parseFrom(
   1538         messageWithExtensions.toByteArray());
   1539     assertToStringEquals(
   1540         "1: 123\n18: \"\\b\\a\"\n21: 3\n44: \"spam\"\n44: \"eggs\"",
   1541         messageWithUnknownFields);
   1542   }
   1543 
   1544   public void testToStringLazyMessage() throws Exception {
   1545     TestAllTypesLite message = TestAllTypesLite.newBuilder()
   1546         .setOptionalLazyMessage(NestedMessage.newBuilder().setBb(1).build())
   1547         .build();
   1548     assertToStringEquals("optional_lazy_message {\n  bb: 1\n}", message);
   1549   }
   1550 
   1551   public void testToStringGroup() throws Exception {
   1552     TestAllTypesLite message = TestAllTypesLite.newBuilder()
   1553         .setOptionalGroup(OptionalGroup.newBuilder().setA(1).build())
   1554         .build();
   1555     assertToStringEquals("optional_group {\n  a: 1\n}", message);
   1556   }
   1557 
   1558   public void testToStringOneof() throws Exception {
   1559     TestAllTypesLite message = TestAllTypesLite.newBuilder()
   1560         .setOneofString("hello")
   1561         .build();
   1562     assertToStringEquals("oneof_string: \"hello\"", message);
   1563   }
   1564 
   1565   // Asserts that the toString() representation of the message matches the expected. This verifies
   1566   // the first line starts with a comment; but, does not factor in said comment as part of the
   1567   // comparison as it contains unstable addresses.
   1568   private static void assertToStringEquals(String expected, MessageLite message) {
   1569     String toString = message.toString();
   1570     assertEquals('#', toString.charAt(0));
   1571     if (toString.indexOf("\n") >= 0) {
   1572       toString = toString.substring(toString.indexOf("\n") + 1);
   1573     } else {
   1574       toString = "";
   1575     }
   1576     assertEquals(expected, toString);
   1577   }
   1578 
   1579   public void testParseLazy() throws Exception {
   1580     ByteString bb = TestAllTypesLite.newBuilder()
   1581         .setOptionalLazyMessage(NestedMessage.newBuilder()
   1582             .setBb(11)
   1583             .build())
   1584         .build().toByteString();
   1585     ByteString cc = TestAllTypesLite.newBuilder()
   1586         .setOptionalLazyMessage(NestedMessage.newBuilder()
   1587             .setCc(22)
   1588             .build())
   1589         .build().toByteString();
   1590 
   1591     ByteString concat = bb.concat(cc);
   1592     TestAllTypesLite message = TestAllTypesLite.parseFrom(concat);
   1593 
   1594     assertEquals(11, message.getOptionalLazyMessage().getBb());
   1595     assertEquals(22L, message.getOptionalLazyMessage().getCc());
   1596   }
   1597 
   1598   public void testParseLazy_oneOf() throws Exception {
   1599     ByteString bb = TestAllTypesLite.newBuilder()
   1600         .setOneofLazyNestedMessage(NestedMessage.newBuilder()
   1601             .setBb(11)
   1602             .build())
   1603         .build().toByteString();
   1604     ByteString cc = TestAllTypesLite.newBuilder()
   1605         .setOneofLazyNestedMessage(NestedMessage.newBuilder()
   1606             .setCc(22)
   1607             .build())
   1608         .build().toByteString();
   1609 
   1610     ByteString concat = bb.concat(cc);
   1611     TestAllTypesLite message = TestAllTypesLite.parseFrom(concat);
   1612 
   1613     assertEquals(11, message.getOneofLazyNestedMessage().getBb());
   1614     assertEquals(22L, message.getOneofLazyNestedMessage().getCc());
   1615   }
   1616 
   1617   public void testMergeFromStream_repeatedField() throws Exception {
   1618     TestAllTypesLite.Builder builder = TestAllTypesLite.newBuilder()
   1619         .addRepeatedString("hello");
   1620     builder.mergeFrom(CodedInputStream.newInstance(builder.build().toByteArray()));
   1621 
   1622     assertEquals(2, builder.getRepeatedStringCount());
   1623   }
   1624 
   1625   public void testMergeFromStream_invalidBytes() throws Exception {
   1626     TestAllTypesLite.Builder builder = TestAllTypesLite.newBuilder()
   1627         .setDefaultBool(true);
   1628     try {
   1629       builder.mergeFrom(CodedInputStream.newInstance("Invalid bytes".getBytes(Internal.UTF_8)));
   1630       fail();
   1631     } catch (InvalidProtocolBufferException expected) {}
   1632   }
   1633 
   1634   public void testMergeFrom_sanity() throws Exception {
   1635     TestAllTypesLite one = TestUtilLite.getAllLiteSetBuilder().build();
   1636     byte[] bytes = one.toByteArray();
   1637     TestAllTypesLite two = TestAllTypesLite.parseFrom(bytes);
   1638 
   1639     one = one.toBuilder().mergeFrom(one).build();
   1640     two = two.toBuilder().mergeFrom(bytes).build();
   1641     assertEquals(one, two);
   1642     assertEquals(two, one);
   1643     assertEquals(one.hashCode(), two.hashCode());
   1644   }
   1645 
   1646   public void testEquals_notEqual() throws Exception {
   1647     TestAllTypesLite one = TestUtilLite.getAllLiteSetBuilder().build();
   1648     byte[] bytes = one.toByteArray();
   1649     TestAllTypesLite two = one.toBuilder().mergeFrom(one).mergeFrom(bytes).build();
   1650 
   1651     assertFalse(one.equals(two));
   1652     assertFalse(two.equals(one));
   1653 
   1654     assertFalse(one.equals(TestAllTypesLite.getDefaultInstance()));
   1655     assertFalse(TestAllTypesLite.getDefaultInstance().equals(one));
   1656 
   1657     TestAllTypesLite oneFieldSet = TestAllTypesLite.newBuilder()
   1658         .setDefaultBool(true)
   1659         .build();
   1660     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1661     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1662 
   1663     oneFieldSet = TestAllTypesLite.newBuilder()
   1664         .setDefaultBytes(ByteString.EMPTY)
   1665         .build();
   1666     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1667     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1668 
   1669     oneFieldSet = TestAllTypesLite.newBuilder()
   1670         .setDefaultCord("")
   1671         .build();
   1672     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1673     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1674 
   1675     oneFieldSet = TestAllTypesLite.newBuilder()
   1676         .setDefaultCordBytes(ByteString.EMPTY)
   1677         .build();
   1678     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1679     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1680 
   1681     oneFieldSet = TestAllTypesLite.newBuilder()
   1682         .setDefaultDouble(0)
   1683         .build();
   1684     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1685     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1686 
   1687     oneFieldSet = TestAllTypesLite.newBuilder()
   1688         .setDefaultFixed32(0)
   1689         .build();
   1690     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1691     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1692 
   1693     oneFieldSet = TestAllTypesLite.newBuilder()
   1694         .setDefaultFixed64(0)
   1695         .build();
   1696     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1697     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1698 
   1699     oneFieldSet = TestAllTypesLite.newBuilder()
   1700         .setDefaultFloat(0)
   1701         .build();
   1702     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1703     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1704 
   1705     oneFieldSet = TestAllTypesLite.newBuilder()
   1706         .setDefaultForeignEnum(ForeignEnumLite.FOREIGN_LITE_BAR)
   1707         .build();
   1708     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1709     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1710 
   1711     oneFieldSet = TestAllTypesLite.newBuilder()
   1712         .setDefaultImportEnum(ImportEnumLite.IMPORT_LITE_BAR)
   1713         .build();
   1714     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1715     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1716 
   1717     oneFieldSet = TestAllTypesLite.newBuilder()
   1718         .setDefaultInt32(0)
   1719         .build();
   1720     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1721     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1722 
   1723     oneFieldSet = TestAllTypesLite.newBuilder()
   1724         .setDefaultInt64(0)
   1725         .build();
   1726     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1727     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1728 
   1729     oneFieldSet = TestAllTypesLite.newBuilder()
   1730         .setDefaultNestedEnum(NestedEnum.BAR)
   1731         .build();
   1732     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1733     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1734 
   1735     oneFieldSet = TestAllTypesLite.newBuilder()
   1736         .setDefaultSfixed32(0)
   1737         .build();
   1738     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1739     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1740 
   1741     oneFieldSet = TestAllTypesLite.newBuilder()
   1742         .setDefaultSfixed64(0)
   1743         .build();
   1744     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1745     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1746 
   1747     oneFieldSet = TestAllTypesLite.newBuilder()
   1748         .setDefaultSint32(0)
   1749         .build();
   1750     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1751     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1752 
   1753     oneFieldSet = TestAllTypesLite.newBuilder()
   1754         .setDefaultSint64(0)
   1755         .build();
   1756     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1757     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1758 
   1759     oneFieldSet = TestAllTypesLite.newBuilder()
   1760         .setDefaultString("")
   1761         .build();
   1762     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1763     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1764 
   1765     oneFieldSet = TestAllTypesLite.newBuilder()
   1766         .setDefaultStringBytes(ByteString.EMPTY)
   1767         .build();
   1768     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1769     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1770 
   1771     oneFieldSet = TestAllTypesLite.newBuilder()
   1772         .setDefaultStringPiece("")
   1773         .build();
   1774     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1775     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1776 
   1777     oneFieldSet = TestAllTypesLite.newBuilder()
   1778         .setDefaultStringPieceBytes(ByteString.EMPTY)
   1779         .build();
   1780     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1781     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1782 
   1783     oneFieldSet = TestAllTypesLite.newBuilder()
   1784         .setDefaultUint32(0)
   1785         .build();
   1786     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1787     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1788 
   1789     oneFieldSet = TestAllTypesLite.newBuilder()
   1790         .setDefaultUint64(0)
   1791         .build();
   1792     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1793     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1794 
   1795     oneFieldSet = TestAllTypesLite.newBuilder()
   1796         .addRepeatedBool(true)
   1797         .build();
   1798     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1799     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1800 
   1801     oneFieldSet = TestAllTypesLite.newBuilder()
   1802         .addRepeatedBytes(ByteString.EMPTY)
   1803         .build();
   1804     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1805     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1806 
   1807     oneFieldSet = TestAllTypesLite.newBuilder()
   1808         .addRepeatedCord("")
   1809         .build();
   1810     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1811     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1812 
   1813     oneFieldSet = TestAllTypesLite.newBuilder()
   1814         .addRepeatedCordBytes(ByteString.EMPTY)
   1815         .build();
   1816     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1817     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1818 
   1819     oneFieldSet = TestAllTypesLite.newBuilder()
   1820         .addRepeatedDouble(0)
   1821         .build();
   1822     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1823     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1824 
   1825     oneFieldSet = TestAllTypesLite.newBuilder()
   1826         .addRepeatedFixed32(0)
   1827         .build();
   1828     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1829     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1830 
   1831     oneFieldSet = TestAllTypesLite.newBuilder()
   1832         .addRepeatedFixed64(0)
   1833         .build();
   1834     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1835     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1836 
   1837     oneFieldSet = TestAllTypesLite.newBuilder()
   1838         .addRepeatedFloat(0)
   1839         .build();
   1840     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1841     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1842 
   1843     oneFieldSet = TestAllTypesLite.newBuilder()
   1844         .addRepeatedForeignEnum(ForeignEnumLite.FOREIGN_LITE_BAR)
   1845         .build();
   1846     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1847     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1848 
   1849     oneFieldSet = TestAllTypesLite.newBuilder()
   1850         .addRepeatedImportEnum(ImportEnumLite.IMPORT_LITE_BAR)
   1851         .build();
   1852     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1853     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1854 
   1855     oneFieldSet = TestAllTypesLite.newBuilder()
   1856         .addRepeatedInt32(0)
   1857         .build();
   1858     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1859     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1860 
   1861     oneFieldSet = TestAllTypesLite.newBuilder()
   1862         .addRepeatedInt64(0)
   1863         .build();
   1864     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1865     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1866 
   1867     oneFieldSet = TestAllTypesLite.newBuilder()
   1868         .addRepeatedNestedEnum(NestedEnum.BAR)
   1869         .build();
   1870     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1871     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1872 
   1873     oneFieldSet = TestAllTypesLite.newBuilder()
   1874         .addRepeatedSfixed32(0)
   1875         .build();
   1876     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1877     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1878 
   1879     oneFieldSet = TestAllTypesLite.newBuilder()
   1880         .addRepeatedSfixed64(0)
   1881         .build();
   1882     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1883     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1884 
   1885     oneFieldSet = TestAllTypesLite.newBuilder()
   1886         .addRepeatedSint32(0)
   1887         .build();
   1888     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1889     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1890 
   1891     oneFieldSet = TestAllTypesLite.newBuilder()
   1892         .addRepeatedSint64(0)
   1893         .build();
   1894     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1895     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1896 
   1897     oneFieldSet = TestAllTypesLite.newBuilder()
   1898         .addRepeatedString("")
   1899         .build();
   1900     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1901     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1902 
   1903     oneFieldSet = TestAllTypesLite.newBuilder()
   1904         .addRepeatedStringBytes(ByteString.EMPTY)
   1905         .build();
   1906     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1907     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1908 
   1909     oneFieldSet = TestAllTypesLite.newBuilder()
   1910         .addRepeatedStringPiece("")
   1911         .build();
   1912     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1913     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1914 
   1915     oneFieldSet = TestAllTypesLite.newBuilder()
   1916         .addRepeatedStringPieceBytes(ByteString.EMPTY)
   1917         .build();
   1918     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1919     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1920 
   1921     oneFieldSet = TestAllTypesLite.newBuilder()
   1922         .addRepeatedUint32(0)
   1923         .build();
   1924     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1925     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1926 
   1927     oneFieldSet = TestAllTypesLite.newBuilder()
   1928         .addRepeatedUint64(0)
   1929         .build();
   1930     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1931     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1932 
   1933     oneFieldSet = TestAllTypesLite.newBuilder()
   1934         .setOptionalBool(true)
   1935         .build();
   1936     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1937     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1938 
   1939     oneFieldSet = TestAllTypesLite.newBuilder()
   1940         .setOptionalBytes(ByteString.EMPTY)
   1941         .build();
   1942     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1943     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1944 
   1945     oneFieldSet = TestAllTypesLite.newBuilder()
   1946         .setOptionalCord("")
   1947         .build();
   1948     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1949     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1950 
   1951     oneFieldSet = TestAllTypesLite.newBuilder()
   1952         .setOptionalCordBytes(ByteString.EMPTY)
   1953         .build();
   1954     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1955     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1956 
   1957     oneFieldSet = TestAllTypesLite.newBuilder()
   1958         .setOptionalDouble(0)
   1959         .build();
   1960     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1961     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1962 
   1963     oneFieldSet = TestAllTypesLite.newBuilder()
   1964         .setOptionalFixed32(0)
   1965         .build();
   1966     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1967     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1968 
   1969     oneFieldSet = TestAllTypesLite.newBuilder()
   1970         .setOptionalFixed64(0)
   1971         .build();
   1972     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1973     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1974 
   1975     oneFieldSet = TestAllTypesLite.newBuilder()
   1976         .setOptionalFloat(0)
   1977         .build();
   1978     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1979     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1980 
   1981     oneFieldSet = TestAllTypesLite.newBuilder()
   1982         .setOptionalForeignEnum(ForeignEnumLite.FOREIGN_LITE_BAR)
   1983         .build();
   1984     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1985     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1986 
   1987     oneFieldSet = TestAllTypesLite.newBuilder()
   1988         .setOptionalImportEnum(ImportEnumLite.IMPORT_LITE_BAR)
   1989         .build();
   1990     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1991     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1992 
   1993     oneFieldSet = TestAllTypesLite.newBuilder()
   1994         .setOptionalInt32(0)
   1995         .build();
   1996     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   1997     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   1998 
   1999     oneFieldSet = TestAllTypesLite.newBuilder()
   2000         .setOptionalInt64(0)
   2001         .build();
   2002     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2003     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2004 
   2005     oneFieldSet = TestAllTypesLite.newBuilder()
   2006         .setOptionalNestedEnum(NestedEnum.BAR)
   2007         .build();
   2008     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2009     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2010 
   2011     oneFieldSet = TestAllTypesLite.newBuilder()
   2012         .setOptionalSfixed32(0)
   2013         .build();
   2014     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2015     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2016 
   2017     oneFieldSet = TestAllTypesLite.newBuilder()
   2018         .setOptionalSfixed64(0)
   2019         .build();
   2020     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2021     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2022 
   2023     oneFieldSet = TestAllTypesLite.newBuilder()
   2024         .setOptionalSint32(0)
   2025         .build();
   2026     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2027     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2028 
   2029     oneFieldSet = TestAllTypesLite.newBuilder()
   2030         .setOptionalSint64(0)
   2031         .build();
   2032     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2033     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2034 
   2035     oneFieldSet = TestAllTypesLite.newBuilder()
   2036         .setOptionalString("")
   2037         .build();
   2038     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2039     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2040 
   2041     oneFieldSet = TestAllTypesLite.newBuilder()
   2042         .setOptionalStringBytes(ByteString.EMPTY)
   2043         .build();
   2044     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2045     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2046 
   2047     oneFieldSet = TestAllTypesLite.newBuilder()
   2048         .setOptionalStringPiece("")
   2049         .build();
   2050     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2051     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2052 
   2053     oneFieldSet = TestAllTypesLite.newBuilder()
   2054         .setOptionalStringPieceBytes(ByteString.EMPTY)
   2055         .build();
   2056     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2057     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2058 
   2059     oneFieldSet = TestAllTypesLite.newBuilder()
   2060         .setOptionalUint32(0)
   2061         .build();
   2062     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2063     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2064 
   2065     oneFieldSet = TestAllTypesLite.newBuilder()
   2066         .setOptionalUint64(0)
   2067         .build();
   2068     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2069     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2070 
   2071     oneFieldSet = TestAllTypesLite.newBuilder()
   2072         .setOneofBytes(ByteString.EMPTY)
   2073         .build();
   2074     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2075     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2076 
   2077     oneFieldSet = TestAllTypesLite.newBuilder()
   2078         .setOneofLazyNestedMessage(NestedMessage.getDefaultInstance())
   2079         .build();
   2080     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2081     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2082 
   2083     oneFieldSet = TestAllTypesLite.newBuilder()
   2084         .setOneofNestedMessage(NestedMessage.getDefaultInstance())
   2085         .build();
   2086     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2087     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2088 
   2089     oneFieldSet = TestAllTypesLite.newBuilder()
   2090         .setOneofString("")
   2091         .build();
   2092     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2093     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2094 
   2095     oneFieldSet = TestAllTypesLite.newBuilder()
   2096         .setOneofStringBytes(ByteString.EMPTY)
   2097         .build();
   2098     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2099     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2100 
   2101     oneFieldSet = TestAllTypesLite.newBuilder()
   2102         .setOneofUint32(0)
   2103         .build();
   2104     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2105     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2106 
   2107     oneFieldSet = TestAllTypesLite.newBuilder()
   2108         .setOptionalForeignMessage(ForeignMessageLite.getDefaultInstance())
   2109         .build();
   2110     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2111     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2112 
   2113     oneFieldSet = TestAllTypesLite.newBuilder()
   2114         .setOptionalGroup(OptionalGroup.getDefaultInstance())
   2115         .build();
   2116     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2117     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2118 
   2119     oneFieldSet = TestAllTypesLite.newBuilder()
   2120         .setOptionalPublicImportMessage(PublicImportMessageLite.getDefaultInstance())
   2121         .build();
   2122     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2123     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2124 
   2125     oneFieldSet = TestAllTypesLite.newBuilder()
   2126         .setOptionalLazyMessage(NestedMessage.getDefaultInstance())
   2127         .build();
   2128     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2129 
   2130     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2131     oneFieldSet = TestAllTypesLite.newBuilder()
   2132         .addRepeatedLazyMessage(NestedMessage.getDefaultInstance())
   2133         .build();
   2134     assertFalse(oneFieldSet.equals(TestAllTypesLite.getDefaultInstance()));
   2135     assertFalse(TestAllTypesLite.getDefaultInstance().equals(oneFieldSet));
   2136   }
   2137 
   2138   public void testEquals() throws Exception {
   2139     // Check that two identical objs are equal.
   2140     Foo foo1a = Foo.newBuilder()
   2141         .setValue(1)
   2142         .addBar(Bar.newBuilder().setName("foo1"))
   2143         .build();
   2144     Foo foo1b = Foo.newBuilder()
   2145         .setValue(1)
   2146         .addBar(Bar.newBuilder().setName("foo1"))
   2147         .build();
   2148     Foo foo2 = Foo.newBuilder()
   2149         .setValue(1)
   2150         .addBar(Bar.newBuilder().setName("foo2"))
   2151         .build();
   2152 
   2153     // Check that equals is doing value rather than object equality.
   2154     assertEquals(foo1a, foo1b);
   2155     assertEquals(foo1a.hashCode(), foo1b.hashCode());
   2156 
   2157     // Check that a diffeent object is not equal.
   2158     assertFalse(foo1a.equals(foo2));
   2159 
   2160     // Check that two objects which have different types but the same field values are not
   2161     // considered to be equal.
   2162     Bar bar = Bar.newBuilder().setName("bar").build();
   2163     BarPrime barPrime = BarPrime.newBuilder().setName("bar").build();
   2164     assertFalse(bar.equals(barPrime));
   2165   }
   2166 
   2167   public void testOneofEquals() throws Exception {
   2168     TestOneofEquals.Builder builder = TestOneofEquals.newBuilder();
   2169     TestOneofEquals message1 = builder.build();
   2170     // Set message2's name field to default value. The two messages should be different when we
   2171     // check with the oneof case.
   2172     builder.setName("");
   2173     TestOneofEquals message2 = builder.build();
   2174     assertFalse(message1.equals(message2));
   2175   }
   2176 
   2177   public void testEquals_sanity() throws Exception {
   2178     TestAllTypesLite one = TestUtilLite.getAllLiteSetBuilder().build();
   2179     TestAllTypesLite two = TestAllTypesLite.parseFrom(one.toByteArray());
   2180     assertEquals(one, two);
   2181     assertEquals(one.hashCode(), two.hashCode());
   2182 
   2183     assertEquals(
   2184         one.toBuilder().mergeFrom(two).build(),
   2185         two.toBuilder().mergeFrom(two.toByteArray()).build());
   2186   }
   2187 
   2188   public void testEqualsAndHashCodeWithUnknownFields() throws InvalidProtocolBufferException {
   2189     Foo fooWithOnlyValue = Foo.newBuilder()
   2190         .setValue(1)
   2191         .build();
   2192 
   2193     Foo fooWithValueAndExtension = fooWithOnlyValue.toBuilder()
   2194         .setValue(1)
   2195         .setExtension(Bar.fooExt, Bar.newBuilder()
   2196             .setName("name")
   2197             .build())
   2198         .build();
   2199 
   2200     Foo fooWithValueAndUnknownFields = Foo.parseFrom(fooWithValueAndExtension.toByteArray());
   2201 
   2202     assertEqualsAndHashCodeAreFalse(fooWithOnlyValue, fooWithValueAndUnknownFields);
   2203     assertEqualsAndHashCodeAreFalse(fooWithValueAndExtension, fooWithValueAndUnknownFields);
   2204   }
   2205 
   2206   // Test to ensure we avoid a class cast exception with oneofs.
   2207   public void testEquals_oneOfMessages() {
   2208     TestAllTypesLite mine = TestAllTypesLite.newBuilder()
   2209         .setOneofString("Hello")
   2210         .build();
   2211 
   2212     TestAllTypesLite other = TestAllTypesLite.newBuilder()
   2213         .setOneofNestedMessage(NestedMessage.getDefaultInstance())
   2214         .build();
   2215 
   2216     assertFalse(mine.equals(other));
   2217     assertFalse(other.equals(mine));
   2218   }
   2219 
   2220   private void assertEqualsAndHashCodeAreFalse(Object o1, Object o2) {
   2221     assertFalse(o1.equals(o2));
   2222     assertFalse(o1.hashCode() == o2.hashCode());
   2223   }
   2224 
   2225   public void testRecursiveHashcode() {
   2226     // This tests that we don't infinite loop.
   2227     TestRecursiveOneof.getDefaultInstance().hashCode();
   2228   }
   2229 }
   2230