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