1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // http://code.google.com/p/protobuf/
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
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
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.
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.
31 package com.google.protobuf;
33 import com.google.protobuf.Descriptors.Descriptor;
34 import com.google.protobuf.Descriptors.FieldDescriptor;
35 import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
36 import com.google.protobuf.test.UnittestImport;
37 import protobuf_unittest.EnumWithNoOuter;
38 import protobuf_unittest.MessageWithNoOuter;
39 import protobuf_unittest.MultipleFilesTestProto;
40 import protobuf_unittest.NestedExtension.MyNestedExtension;
41 import protobuf_unittest.NestedExtensionLite.MyNestedExtensionLite;
42 import protobuf_unittest.NonNestedExtension;
43 import protobuf_unittest.NonNestedExtension.MessageToBeExtended;
44 import protobuf_unittest.NonNestedExtension.MyNonNestedExtension;
45 import protobuf_unittest.NonNestedExtensionLite;
46 import protobuf_unittest.NonNestedExtensionLite.MessageLiteToBeExtended;
47 import protobuf_unittest.NonNestedExtensionLite.MyNonNestedExtensionLite;
48 import protobuf_unittest.ServiceWithNoOuter;
49 import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize;
50 import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize;
51 import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize;
52 import protobuf_unittest.UnittestProto;
53 import protobuf_unittest.UnittestProto.ForeignEnum;
54 import protobuf_unittest.UnittestProto.ForeignMessage;
55 import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder;
56 import protobuf_unittest.UnittestProto.TestAllExtensions;
57 import protobuf_unittest.UnittestProto.TestAllTypes;
58 import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage;
59 import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;
60 import protobuf_unittest.UnittestProto.TestExtremeDefaultValues;
61 import protobuf_unittest.UnittestProto.TestPackedTypes;
62 import protobuf_unittest.UnittestProto.TestUnpackedTypes;
64 import junit.framework.TestCase;
66 import java.io.ByteArrayInputStream;
67 import java.io.ByteArrayOutputStream;
68 import java.io.ObjectInputStream;
69 import java.io.ObjectOutputStream;
70 import java.util.Arrays;
71 import java.util.Collections;
72 import java.util.List;
75 * Unit test for generated messages and generated code. See also
76 * {@link MessageTest}, which tests some generated message functionality.
78 * @author kenton@google.com Kenton Varda
80 public class GeneratedMessageTest extends TestCase {
81 TestUtil.ReflectionTester reflectionTester =
82 new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);
84 public void testDefaultInstance() throws Exception {
85 assertSame(TestAllTypes.getDefaultInstance(),
86 TestAllTypes.getDefaultInstance().getDefaultInstanceForType());
87 assertSame(TestAllTypes.getDefaultInstance(),
88 TestAllTypes.newBuilder().getDefaultInstanceForType());
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);
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));
110 TestAllTypes value1 = builder.build();
112 assertEquals(100, value1.getOptionalSfixed64());
113 assertEquals(100, value1.getRepeatedInt32(0));
114 assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
115 value1.getOptionalImportEnum());
116 assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
117 value1.getRepeatedImportEnum(0));
118 assertEquals(1, value1.getOptionalForeignMessage().getC());
119 assertEquals(1, value1.getRepeatedForeignMessage(0).getC());
121 // Make sure that builder didn't update previously created values
122 builder.setOptionalSfixed64(200);
123 builder.setRepeatedInt32(0, 200);
124 builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_FOO);
125 builder.setRepeatedImportEnum(0, UnittestImport.ImportEnum.IMPORT_FOO);
126 builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(2));
127 builder.setRepeatedForeignMessage(0, ForeignMessage.newBuilder().setC(2));
129 TestAllTypes value2 = builder.build();
131 // Make sure value1 didn't change.
132 assertEquals(100, value1.getOptionalSfixed64());
133 assertEquals(100, value1.getRepeatedInt32(0));
134 assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
135 value1.getOptionalImportEnum());
136 assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,
137 value1.getRepeatedImportEnum(0));
138 assertEquals(1, value1.getOptionalForeignMessage().getC());
139 assertEquals(1, value1.getRepeatedForeignMessage(0).getC());
141 // Make sure value2 is correct
142 assertEquals(200, value2.getOptionalSfixed64());
143 assertEquals(200, value2.getRepeatedInt32(0));
144 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,
145 value2.getOptionalImportEnum());
146 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,
147 value2.getRepeatedImportEnum(0));
148 assertEquals(2, value2.getOptionalForeignMessage().getC());
149 assertEquals(2, value2.getRepeatedForeignMessage(0).getC());
152 public void testProtosShareRepeatedArraysIfDidntChange() throws Exception {
153 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
154 builder.addRepeatedInt32(100);
155 builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
156 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance());
158 TestAllTypes value1 = builder.build();
159 TestAllTypes value2 = value1.toBuilder().build();
161 assertSame(value1.getRepeatedInt32List(), value2.getRepeatedInt32List());
162 assertSame(value1.getRepeatedImportEnumList(),
163 value2.getRepeatedImportEnumList());
164 assertSame(value1.getRepeatedForeignMessageList(),
165 value2.getRepeatedForeignMessageList());
168 public void testRepeatedArraysAreImmutable() throws Exception {
169 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
170 builder.addRepeatedInt32(100);
171 builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);
172 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance());
173 assertIsUnmodifiable(builder.getRepeatedInt32List());
174 assertIsUnmodifiable(builder.getRepeatedImportEnumList());
175 assertIsUnmodifiable(builder.getRepeatedForeignMessageList());
176 assertIsUnmodifiable(builder.getRepeatedFloatList());
179 TestAllTypes value = builder.build();
180 assertIsUnmodifiable(value.getRepeatedInt32List());
181 assertIsUnmodifiable(value.getRepeatedImportEnumList());
182 assertIsUnmodifiable(value.getRepeatedForeignMessageList());
183 assertIsUnmodifiable(value.getRepeatedFloatList());
186 public void testParsedMessagesAreImmutable() throws Exception {
187 TestAllTypes value = TestAllTypes.PARSER.parseFrom(
188 TestUtil.getAllSet().toByteString());
189 assertIsUnmodifiable(value.getRepeatedInt32List());
190 assertIsUnmodifiable(value.getRepeatedInt64List());
191 assertIsUnmodifiable(value.getRepeatedUint32List());
192 assertIsUnmodifiable(value.getRepeatedUint64List());
193 assertIsUnmodifiable(value.getRepeatedSint32List());
194 assertIsUnmodifiable(value.getRepeatedSint64List());
195 assertIsUnmodifiable(value.getRepeatedFixed32List());
196 assertIsUnmodifiable(value.getRepeatedFixed64List());
197 assertIsUnmodifiable(value.getRepeatedSfixed32List());
198 assertIsUnmodifiable(value.getRepeatedSfixed64List());
199 assertIsUnmodifiable(value.getRepeatedFloatList());
200 assertIsUnmodifiable(value.getRepeatedDoubleList());
201 assertIsUnmodifiable(value.getRepeatedBoolList());
202 assertIsUnmodifiable(value.getRepeatedStringList());
203 assertIsUnmodifiable(value.getRepeatedBytesList());
204 assertIsUnmodifiable(value.getRepeatedGroupList());
205 assertIsUnmodifiable(value.getRepeatedNestedMessageList());
206 assertIsUnmodifiable(value.getRepeatedForeignMessageList());
207 assertIsUnmodifiable(value.getRepeatedImportMessageList());
208 assertIsUnmodifiable(value.getRepeatedNestedEnumList());
209 assertIsUnmodifiable(value.getRepeatedForeignEnumList());
210 assertIsUnmodifiable(value.getRepeatedImportEnumList());
213 private void assertIsUnmodifiable(List<?> list) {
214 if (list == Collections.emptyList()) {
215 // OKAY -- Need to check this b/c EmptyList allows you to call clear.
219 fail("List wasn't immutable");
220 } catch (UnsupportedOperationException e) {
226 public void testSettersRejectNull() throws Exception {
227 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
229 builder.setOptionalString(null);
230 fail("Exception was not thrown");
231 } catch (NullPointerException e) {
232 // We expect this exception.
235 builder.setOptionalBytes(null);
236 fail("Exception was not thrown");
237 } catch (NullPointerException e) {
238 // We expect this exception.
241 builder.setOptionalNestedMessage((TestAllTypes.NestedMessage) null);
242 fail("Exception was not thrown");
243 } catch (NullPointerException e) {
244 // We expect this exception.
247 builder.setOptionalNestedMessage(
248 (TestAllTypes.NestedMessage.Builder) null);
249 fail("Exception was not thrown");
250 } catch (NullPointerException e) {
251 // We expect this exception.
254 builder.setOptionalNestedEnum(null);
255 fail("Exception was not thrown");
256 } catch (NullPointerException e) {
257 // We expect this exception.
260 builder.addRepeatedString(null);
261 fail("Exception was not thrown");
262 } catch (NullPointerException e) {
263 // We expect this exception.
266 builder.addRepeatedBytes(null);
267 fail("Exception was not thrown");
268 } catch (NullPointerException e) {
269 // We expect this exception.
272 builder.addRepeatedNestedMessage((TestAllTypes.NestedMessage) null);
273 fail("Exception was not thrown");
274 } catch (NullPointerException e) {
275 // We expect this exception.
278 builder.addRepeatedNestedMessage(
279 (TestAllTypes.NestedMessage.Builder) null);
280 fail("Exception was not thrown");
281 } catch (NullPointerException e) {
282 // We expect this exception.
285 builder.addRepeatedNestedEnum(null);
286 fail("Exception was not thrown");
287 } catch (NullPointerException e) {
288 // We expect this exception.
292 public void testRepeatedSetters() throws Exception {
293 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
294 TestUtil.setAllFields(builder);
295 TestUtil.modifyRepeatedFields(builder);
296 TestAllTypes message = builder.build();
297 TestUtil.assertRepeatedFieldsModified(message);
300 public void testRepeatedSettersRejectNull() throws Exception {
301 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
303 builder.addRepeatedString("one");
304 builder.addRepeatedString("two");
306 builder.setRepeatedString(1, null);
307 fail("Exception was not thrown");
308 } catch (NullPointerException e) {
309 // We expect this exception.
312 builder.addRepeatedBytes(TestUtil.toBytes("one"));
313 builder.addRepeatedBytes(TestUtil.toBytes("two"));
315 builder.setRepeatedBytes(1, null);
316 fail("Exception was not thrown");
317 } catch (NullPointerException e) {
318 // We expect this exception.
321 builder.addRepeatedNestedMessage(
322 TestAllTypes.NestedMessage.newBuilder().setBb(218).build());
323 builder.addRepeatedNestedMessage(
324 TestAllTypes.NestedMessage.newBuilder().setBb(456).build());
326 builder.setRepeatedNestedMessage(1, (TestAllTypes.NestedMessage) null);
327 fail("Exception was not thrown");
328 } catch (NullPointerException e) {
329 // We expect this exception.
332 builder.setRepeatedNestedMessage(
333 1, (TestAllTypes.NestedMessage.Builder) null);
334 fail("Exception was not thrown");
335 } catch (NullPointerException e) {
336 // We expect this exception.
339 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.FOO);
340 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR);
342 builder.setRepeatedNestedEnum(1, null);
343 fail("Exception was not thrown");
344 } catch (NullPointerException e) {
345 // We expect this exception.
349 public void testRepeatedAppend() throws Exception {
350 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
352 builder.addAllRepeatedInt32(Arrays.asList(1, 2, 3, 4));
353 builder.addAllRepeatedForeignEnum(Arrays.asList(ForeignEnum.FOREIGN_BAZ));
355 ForeignMessage foreignMessage =
356 ForeignMessage.newBuilder().setC(12).build();
357 builder.addAllRepeatedForeignMessage(Arrays.asList(foreignMessage));
359 TestAllTypes message = builder.build();
360 assertEquals(message.getRepeatedInt32List(), Arrays.asList(1, 2, 3, 4));
361 assertEquals(message.getRepeatedForeignEnumList(),
362 Arrays.asList(ForeignEnum.FOREIGN_BAZ));
363 assertEquals(1, message.getRepeatedForeignMessageCount());
364 assertEquals(12, message.getRepeatedForeignMessage(0).getC());
367 public void testRepeatedAppendRejectsNull() throws Exception {
368 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
370 ForeignMessage foreignMessage =
371 ForeignMessage.newBuilder().setC(12).build();
373 builder.addAllRepeatedForeignMessage(
374 Arrays.asList(foreignMessage, (ForeignMessage) null));
375 fail("Exception was not thrown");
376 } catch (NullPointerException e) {
377 // We expect this exception.
381 builder.addAllRepeatedForeignEnum(
382 Arrays.asList(ForeignEnum.FOREIGN_BAZ, null));
383 fail("Exception was not thrown");
384 } catch (NullPointerException e) {
385 // We expect this exception.
389 builder.addAllRepeatedString(Arrays.asList("one", null));
390 fail("Exception was not thrown");
391 } catch (NullPointerException e) {
392 // We expect this exception.
396 builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null));
397 fail("Exception was not thrown");
398 } catch (NullPointerException e) {
399 // We expect this exception.
403 public void testSettingForeignMessageUsingBuilder() throws Exception {
404 TestAllTypes message = TestAllTypes.newBuilder()
405 // Pass builder for foreign message instance.
406 .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123))
408 TestAllTypes expectedMessage = TestAllTypes.newBuilder()
409 // Create expected version passing foreign message instance explicitly.
410 .setOptionalForeignMessage(
411 ForeignMessage.newBuilder().setC(123).build())
413 // TODO(ngd): Upgrade to using real #equals method once implemented
414 assertEquals(expectedMessage.toString(), message.toString());
417 public void testSettingRepeatedForeignMessageUsingBuilder() throws Exception {
418 TestAllTypes message = TestAllTypes.newBuilder()
419 // Pass builder for foreign message instance.
420 .addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(456))
422 TestAllTypes expectedMessage = TestAllTypes.newBuilder()
423 // Create expected version passing foreign message instance explicitly.
424 .addRepeatedForeignMessage(
425 ForeignMessage.newBuilder().setC(456).build())
427 assertEquals(expectedMessage.toString(), message.toString());
430 public void testDefaults() throws Exception {
431 TestUtil.assertClear(TestAllTypes.getDefaultInstance());
432 TestUtil.assertClear(TestAllTypes.newBuilder().build());
434 TestExtremeDefaultValues message =
435 TestExtremeDefaultValues.getDefaultInstance();
436 assertEquals("\u1234", message.getUtf8String());
437 assertEquals(Double.POSITIVE_INFINITY, message.getInfDouble());
438 assertEquals(Double.NEGATIVE_INFINITY, message.getNegInfDouble());
439 assertTrue(Double.isNaN(message.getNanDouble()));
440 assertEquals(Float.POSITIVE_INFINITY, message.getInfFloat());
441 assertEquals(Float.NEGATIVE_INFINITY, message.getNegInfFloat());
442 assertTrue(Float.isNaN(message.getNanFloat()));
443 assertEquals("? ? ?? ?? ??? ??/ ??-", message.getCppTrigraph());
446 public void testClear() throws Exception {
447 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
448 TestUtil.assertClear(builder);
449 TestUtil.setAllFields(builder);
451 TestUtil.assertClear(builder);
454 public void testReflectionGetters() throws Exception {
455 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
456 TestUtil.setAllFields(builder);
457 reflectionTester.assertAllFieldsSetViaReflection(builder);
459 TestAllTypes message = builder.build();
460 reflectionTester.assertAllFieldsSetViaReflection(message);
463 public void testReflectionSetters() throws Exception {
464 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
465 reflectionTester.setAllFieldsViaReflection(builder);
466 TestUtil.assertAllFieldsSet(builder);
468 TestAllTypes message = builder.build();
469 TestUtil.assertAllFieldsSet(message);
472 public void testReflectionSettersRejectNull() throws Exception {
473 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
474 reflectionTester.assertReflectionSettersRejectNull(builder);
477 public void testReflectionRepeatedSetters() throws Exception {
478 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
479 reflectionTester.setAllFieldsViaReflection(builder);
480 reflectionTester.modifyRepeatedFieldsViaReflection(builder);
481 TestUtil.assertRepeatedFieldsModified(builder);
483 TestAllTypes message = builder.build();
484 TestUtil.assertRepeatedFieldsModified(message);
487 public void testReflectionRepeatedSettersRejectNull() throws Exception {
488 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
489 reflectionTester.assertReflectionRepeatedSettersRejectNull(builder);
492 public void testReflectionDefaults() throws Exception {
493 reflectionTester.assertClearViaReflection(
494 TestAllTypes.getDefaultInstance());
495 reflectionTester.assertClearViaReflection(
496 TestAllTypes.newBuilder().build());
499 public void testEnumInterface() throws Exception {
500 assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum()
501 instanceof ProtocolMessageEnum);
504 public void testEnumMap() throws Exception {
505 Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap();
507 for (ForeignEnum value : ForeignEnum.values()) {
508 assertEquals(value, map.findValueByNumber(value.getNumber()));
511 assertTrue(map.findValueByNumber(12345) == null);
514 public void testParsePackedToUnpacked() throws Exception {
515 TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder();
516 TestUnpackedTypes message =
517 builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build();
518 TestUtil.assertUnpackedFieldsSet(message);
521 public void testParseUnpackedToPacked() throws Exception {
522 TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();
523 TestPackedTypes message =
524 builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build();
525 TestUtil.assertPackedFieldsSet(message);
528 // =================================================================
531 TestUtil.ReflectionTester extensionsReflectionTester =
532 new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),
533 TestUtil.getExtensionRegistry());
535 public void testExtensionMessageOrBuilder() throws Exception {
536 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
537 TestUtil.setAllExtensions(builder);
538 TestAllExtensions message = builder.build();
539 TestUtil.assertAllExtensionsSet(message);
542 public void testExtensionRepeatedSetters() throws Exception {
543 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
544 TestUtil.setAllExtensions(builder);
545 TestUtil.modifyRepeatedExtensions(builder);
546 TestAllExtensions message = builder.build();
547 TestUtil.assertRepeatedExtensionsModified(message);
550 public void testExtensionDefaults() throws Exception {
551 TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance());
552 TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build());
555 public void testExtensionReflectionGetters() throws Exception {
556 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
557 TestUtil.setAllExtensions(builder);
558 extensionsReflectionTester.assertAllFieldsSetViaReflection(builder);
560 TestAllExtensions message = builder.build();
561 extensionsReflectionTester.assertAllFieldsSetViaReflection(message);
564 public void testExtensionReflectionSetters() throws Exception {
565 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
566 extensionsReflectionTester.setAllFieldsViaReflection(builder);
567 TestUtil.assertAllExtensionsSet(builder);
569 TestAllExtensions message = builder.build();
570 TestUtil.assertAllExtensionsSet(message);
573 public void testExtensionReflectionSettersRejectNull() throws Exception {
574 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
575 extensionsReflectionTester.assertReflectionSettersRejectNull(builder);
578 public void testExtensionReflectionRepeatedSetters() throws Exception {
579 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
580 extensionsReflectionTester.setAllFieldsViaReflection(builder);
581 extensionsReflectionTester.modifyRepeatedFieldsViaReflection(builder);
582 TestUtil.assertRepeatedExtensionsModified(builder);
584 TestAllExtensions message = builder.build();
585 TestUtil.assertRepeatedExtensionsModified(message);
588 public void testExtensionReflectionRepeatedSettersRejectNull()
590 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
591 extensionsReflectionTester.assertReflectionRepeatedSettersRejectNull(
595 public void testExtensionReflectionDefaults() throws Exception {
596 extensionsReflectionTester.assertClearViaReflection(
597 TestAllExtensions.getDefaultInstance());
598 extensionsReflectionTester.assertClearViaReflection(
599 TestAllExtensions.newBuilder().build());
602 public void testClearExtension() throws Exception {
603 // clearExtension() is not actually used in TestUtil, so try it manually.
605 TestAllExtensions.newBuilder()
606 .setExtension(UnittestProto.optionalInt32Extension, 1)
607 .clearExtension(UnittestProto.optionalInt32Extension)
608 .hasExtension(UnittestProto.optionalInt32Extension));
610 TestAllExtensions.newBuilder()
611 .addExtension(UnittestProto.repeatedInt32Extension, 1)
612 .clearExtension(UnittestProto.repeatedInt32Extension)
613 .getExtensionCount(UnittestProto.repeatedInt32Extension));
616 public void testExtensionCopy() throws Exception {
617 TestAllExtensions original = TestUtil.getAllExtensionsSet();
618 TestAllExtensions copy = TestAllExtensions.newBuilder(original).build();
619 TestUtil.assertAllExtensionsSet(copy);
622 public void testExtensionMergeFrom() throws Exception {
623 TestAllExtensions original =
624 TestAllExtensions.newBuilder()
625 .setExtension(UnittestProto.optionalInt32Extension, 1).build();
626 TestAllExtensions merged =
627 TestAllExtensions.newBuilder().mergeFrom(original).build();
628 assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension));
630 1, (int) merged.getExtension(UnittestProto.optionalInt32Extension));
633 // =================================================================
636 // We test lite extensions directly because they have a separate
637 // implementation from full extensions. In contrast, we do not test
638 // lite fields directly since they are implemented exactly the same as
641 public void testLiteExtensionMessageOrBuilder() throws Exception {
642 TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();
643 TestUtil.setAllExtensions(builder);
644 TestUtil.assertAllExtensionsSet(builder);
646 TestAllExtensionsLite message = builder.build();
647 TestUtil.assertAllExtensionsSet(message);
650 public void testLiteExtensionRepeatedSetters() throws Exception {
651 TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();
652 TestUtil.setAllExtensions(builder);
653 TestUtil.modifyRepeatedExtensions(builder);
654 TestUtil.assertRepeatedExtensionsModified(builder);
656 TestAllExtensionsLite message = builder.build();
657 TestUtil.assertRepeatedExtensionsModified(message);
660 public void testLiteExtensionDefaults() throws Exception {
661 TestUtil.assertExtensionsClear(TestAllExtensionsLite.getDefaultInstance());
662 TestUtil.assertExtensionsClear(TestAllExtensionsLite.newBuilder().build());
665 public void testClearLiteExtension() throws Exception {
666 // clearExtension() is not actually used in TestUtil, so try it manually.
668 TestAllExtensionsLite.newBuilder()
669 .setExtension(UnittestLite.optionalInt32ExtensionLite, 1)
670 .clearExtension(UnittestLite.optionalInt32ExtensionLite)
671 .hasExtension(UnittestLite.optionalInt32ExtensionLite));
673 TestAllExtensionsLite.newBuilder()
674 .addExtension(UnittestLite.repeatedInt32ExtensionLite, 1)
675 .clearExtension(UnittestLite.repeatedInt32ExtensionLite)
676 .getExtensionCount(UnittestLite.repeatedInt32ExtensionLite));
679 public void testLiteExtensionCopy() throws Exception {
680 TestAllExtensionsLite original = TestUtil.getAllLiteExtensionsSet();
681 TestAllExtensionsLite copy =
682 TestAllExtensionsLite.newBuilder(original).build();
683 TestUtil.assertAllExtensionsSet(copy);
686 public void testLiteExtensionMergeFrom() throws Exception {
687 TestAllExtensionsLite original =
688 TestAllExtensionsLite.newBuilder()
689 .setExtension(UnittestLite.optionalInt32ExtensionLite, 1).build();
690 TestAllExtensionsLite merged =
691 TestAllExtensionsLite.newBuilder().mergeFrom(original).build();
692 assertTrue(merged.hasExtension(UnittestLite.optionalInt32ExtensionLite));
694 1, (int) merged.getExtension(UnittestLite.optionalInt32ExtensionLite));
697 // =================================================================
698 // multiple_files_test
700 public void testMultipleFilesOption() throws Exception {
701 // We mostly just want to check that things compile.
702 MessageWithNoOuter message =
703 MessageWithNoOuter.newBuilder()
704 .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1))
705 .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1))
706 .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ)
707 .setForeignEnum(EnumWithNoOuter.BAR)
709 assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString()));
711 assertEquals(MultipleFilesTestProto.getDescriptor(),
712 MessageWithNoOuter.getDescriptor().getFile());
714 Descriptors.FieldDescriptor field =
715 MessageWithNoOuter.getDescriptor().findFieldByName("foreign_enum");
716 assertEquals(EnumWithNoOuter.BAR.getValueDescriptor(),
717 message.getField(field));
719 assertEquals(MultipleFilesTestProto.getDescriptor(),
720 ServiceWithNoOuter.getDescriptor().getFile());
723 TestAllExtensions.getDefaultInstance().hasExtension(
724 MultipleFilesTestProto.extensionWithOuter));
727 public void testOptionalFieldWithRequiredSubfieldsOptimizedForSize()
729 TestOptionalOptimizedForSize message =
730 TestOptionalOptimizedForSize.getDefaultInstance();
731 assertTrue(message.isInitialized());
733 message = TestOptionalOptimizedForSize.newBuilder().setO(
734 TestRequiredOptimizedForSize.newBuilder().buildPartial()
736 assertFalse(message.isInitialized());
738 message = TestOptionalOptimizedForSize.newBuilder().setO(
739 TestRequiredOptimizedForSize.newBuilder().setX(5).buildPartial()
741 assertTrue(message.isInitialized());
744 public void testUninitializedExtensionInOptimizedForSize()
746 TestOptimizedForSize.Builder builder = TestOptimizedForSize.newBuilder();
747 builder.setExtension(TestOptimizedForSize.testExtension2,
748 TestRequiredOptimizedForSize.newBuilder().buildPartial());
749 assertFalse(builder.isInitialized());
750 assertFalse(builder.buildPartial().isInitialized());
752 builder = TestOptimizedForSize.newBuilder();
753 builder.setExtension(TestOptimizedForSize.testExtension2,
754 TestRequiredOptimizedForSize.newBuilder().setX(10).buildPartial());
755 assertTrue(builder.isInitialized());
756 assertTrue(builder.buildPartial().isInitialized());
759 public void testToBuilder() throws Exception {
760 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
761 TestUtil.setAllFields(builder);
762 TestAllTypes message = builder.build();
763 TestUtil.assertAllFieldsSet(message);
764 TestUtil.assertAllFieldsSet(message.toBuilder().build());
767 public void testFieldConstantValues() throws Exception {
768 assertEquals(TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1);
769 assertEquals(TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1);
770 assertEquals(TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16);
771 assertEquals(TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18);
772 assertEquals(TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21);
773 assertEquals(TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31);
774 assertEquals(TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46);
775 assertEquals(TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48);
776 assertEquals(TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51);
779 public void testExtensionConstantValues() throws Exception {
780 assertEquals(UnittestProto.TestRequired.SINGLE_FIELD_NUMBER, 1000);
781 assertEquals(UnittestProto.TestRequired.MULTI_FIELD_NUMBER, 1001);
782 assertEquals(UnittestProto.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1);
783 assertEquals(UnittestProto.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16);
785 UnittestProto.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18);
786 assertEquals(UnittestProto.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 21);
787 assertEquals(UnittestProto.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31);
788 assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46);
790 UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48);
791 assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51);
794 public void testRecursiveMessageDefaultInstance() throws Exception {
795 UnittestProto.TestRecursiveMessage message =
796 UnittestProto.TestRecursiveMessage.getDefaultInstance();
797 assertTrue(message != null);
798 assertTrue(message.getA() != null);
799 assertTrue(message.getA() == message);
802 public void testSerialize() throws Exception {
803 ByteArrayOutputStream baos = new ByteArrayOutputStream();
804 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
805 TestUtil.setAllFields(builder);
806 TestAllTypes expected = builder.build();
807 ObjectOutputStream out = new ObjectOutputStream(baos);
809 out.writeObject(expected);
813 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
814 ObjectInputStream in = new ObjectInputStream(bais);
815 TestAllTypes actual = (TestAllTypes) in.readObject();
816 assertEquals(expected, actual);
819 public void testSerializePartial() throws Exception {
820 ByteArrayOutputStream baos = new ByteArrayOutputStream();
821 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
822 TestAllTypes expected = builder.buildPartial();
823 ObjectOutputStream out = new ObjectOutputStream(baos);
825 out.writeObject(expected);
829 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
830 ObjectInputStream in = new ObjectInputStream(bais);
831 TestAllTypes actual = (TestAllTypes) in.readObject();
832 assertEquals(expected, actual);
835 public void testEnumValues() {
837 TestAllTypes.NestedEnum.BAR.getNumber(),
838 TestAllTypes.NestedEnum.BAR_VALUE);
840 TestAllTypes.NestedEnum.BAZ.getNumber(),
841 TestAllTypes.NestedEnum.BAZ_VALUE);
843 TestAllTypes.NestedEnum.FOO.getNumber(),
844 TestAllTypes.NestedEnum.FOO_VALUE);
847 public void testNonNestedExtensionInitialization() {
848 assertTrue(NonNestedExtension.nonNestedExtension
849 .getMessageDefaultInstance() instanceof MyNonNestedExtension);
850 assertEquals("nonNestedExtension",
851 NonNestedExtension.nonNestedExtension.getDescriptor().getName());
854 public void testNestedExtensionInitialization() {
855 assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance()
856 instanceof MessageToBeExtended);
857 assertEquals("recursiveExtension",
858 MyNestedExtension.recursiveExtension.getDescriptor().getName());
861 public void testNonNestedExtensionLiteInitialization() {
862 assertTrue(NonNestedExtensionLite.nonNestedExtensionLite
863 .getMessageDefaultInstance() instanceof MyNonNestedExtensionLite);
866 public void testNestedExtensionLiteInitialization() {
867 assertTrue(MyNestedExtensionLite.recursiveExtensionLite
868 .getMessageDefaultInstance() instanceof MessageLiteToBeExtended);
871 public void testInvalidations() throws Exception {
872 GeneratedMessage.enableAlwaysUseFieldBuildersForTesting();
873 TestAllTypes.NestedMessage nestedMessage1 =
874 TestAllTypes.NestedMessage.newBuilder().build();
875 TestAllTypes.NestedMessage nestedMessage2 =
876 TestAllTypes.NestedMessage.newBuilder().build();
878 // Set all three flavors (enum, primitive, message and singular/repeated)
879 // and verify no invalidations fired
880 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
882 TestAllTypes.Builder builder = (TestAllTypes.Builder)
883 ((GeneratedMessage) TestAllTypes.getDefaultInstance()).
884 newBuilderForType(mockParent);
885 builder.setOptionalInt32(1);
886 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR);
887 builder.setOptionalNestedMessage(nestedMessage1);
888 builder.addRepeatedInt32(1);
889 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR);
890 builder.addRepeatedNestedMessage(nestedMessage1);
891 assertEquals(0, mockParent.getInvalidationCount());
893 // Now tell it we want changes and make sure it's only fired once
894 // And do this for each flavor
897 builder.buildPartial();
898 builder.setOptionalInt32(2);
899 builder.setOptionalInt32(3);
900 assertEquals(1, mockParent.getInvalidationCount());
903 builder.buildPartial();
904 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ);
905 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR);
906 assertEquals(2, mockParent.getInvalidationCount());
909 builder.buildPartial();
910 builder.setOptionalNestedMessage(nestedMessage2);
911 builder.setOptionalNestedMessage(nestedMessage1);
912 assertEquals(3, mockParent.getInvalidationCount());
914 // primitive repeated
915 builder.buildPartial();
916 builder.addRepeatedInt32(2);
917 builder.addRepeatedInt32(3);
918 assertEquals(4, mockParent.getInvalidationCount());
921 builder.buildPartial();
922 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ);
923 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ);
924 assertEquals(5, mockParent.getInvalidationCount());
927 builder.buildPartial();
928 builder.addRepeatedNestedMessage(nestedMessage2);
929 builder.addRepeatedNestedMessage(nestedMessage1);
930 assertEquals(6, mockParent.getInvalidationCount());
934 public void testInvalidations_Extensions() throws Exception {
935 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();
937 TestAllExtensions.Builder builder = (TestAllExtensions.Builder)
938 ((GeneratedMessage) TestAllExtensions.getDefaultInstance()).
939 newBuilderForType(mockParent);
941 builder.addExtension(UnittestProto.repeatedInt32Extension, 1);
942 builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 2);
943 builder.clearExtension(UnittestProto.repeatedInt32Extension);
944 assertEquals(0, mockParent.getInvalidationCount());
946 // Now tell it we want changes and make sure it's only fired once
947 builder.buildPartial();
948 builder.addExtension(UnittestProto.repeatedInt32Extension, 2);
949 builder.addExtension(UnittestProto.repeatedInt32Extension, 3);
950 assertEquals(1, mockParent.getInvalidationCount());
952 builder.buildPartial();
953 builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 4);
954 builder.setExtension(UnittestProto.repeatedInt32Extension, 1, 5);
955 assertEquals(2, mockParent.getInvalidationCount());
957 builder.buildPartial();
958 builder.clearExtension(UnittestProto.repeatedInt32Extension);
959 builder.clearExtension(UnittestProto.repeatedInt32Extension);
960 assertEquals(3, mockParent.getInvalidationCount());
963 public void testBaseMessageOrBuilder() {
964 // Mostly just makes sure the base interface exists and has some methods.
965 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
966 TestAllTypes message = builder.buildPartial();
967 TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder;
968 TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message;
971 messageAsInterface.getDefaultBool(),
972 messageAsInterface.getDefaultBool());
974 messageAsInterface.getOptionalDouble(),
975 messageAsInterface.getOptionalDouble());
978 public void testMessageOrBuilderGetters() {
979 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
982 assertSame(ForeignMessage.getDefaultInstance(),
983 builder.getOptionalForeignMessageOrBuilder());
984 ForeignMessage.Builder subBuilder =
985 builder.getOptionalForeignMessageBuilder();
986 assertSame(subBuilder, builder.getOptionalForeignMessageOrBuilder());
989 ForeignMessage m0 = ForeignMessage.newBuilder().buildPartial();
990 ForeignMessage m1 = ForeignMessage.newBuilder().buildPartial();
991 ForeignMessage m2 = ForeignMessage.newBuilder().buildPartial();
992 builder.addRepeatedForeignMessage(m0);
993 builder.addRepeatedForeignMessage(m1);
994 builder.addRepeatedForeignMessage(m2);
995 assertSame(m0, builder.getRepeatedForeignMessageOrBuilder(0));
996 assertSame(m1, builder.getRepeatedForeignMessageOrBuilder(1));
997 assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));
998 ForeignMessage.Builder b0 = builder.getRepeatedForeignMessageBuilder(0);
999 ForeignMessage.Builder b1 = builder.getRepeatedForeignMessageBuilder(1);
1000 assertSame(b0, builder.getRepeatedForeignMessageOrBuilder(0));
1001 assertSame(b1, builder.getRepeatedForeignMessageOrBuilder(1));
1002 assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));
1004 List<? extends ForeignMessageOrBuilder> messageOrBuilderList =
1005 builder.getRepeatedForeignMessageOrBuilderList();
1006 assertSame(b0, messageOrBuilderList.get(0));
1007 assertSame(b1, messageOrBuilderList.get(1));
1008 assertSame(m2, messageOrBuilderList.get(2));
1011 public void testGetFieldBuilder() {
1012 Descriptor descriptor = TestAllTypes.getDescriptor();
1014 FieldDescriptor fieldDescriptor =
1015 descriptor.findFieldByName("optional_nested_message");
1016 FieldDescriptor foreignFieldDescriptor =
1017 descriptor.findFieldByName("optional_foreign_message");
1018 FieldDescriptor importFieldDescriptor =
1019 descriptor.findFieldByName("optional_import_message");
1021 // Mutate the message with new field builder
1022 // Mutate nested message
1023 TestAllTypes.Builder builder1 = TestAllTypes.newBuilder();
1024 Message.Builder fieldBuilder1 = builder1.newBuilderForField(fieldDescriptor)
1025 .mergeFrom((Message) builder1.getField(fieldDescriptor));
1026 FieldDescriptor subFieldDescriptor1 =
1027 fieldBuilder1.getDescriptorForType().findFieldByName("bb");
1028 fieldBuilder1.setField(subFieldDescriptor1, 1);
1029 builder1.setField(fieldDescriptor, fieldBuilder1.build());
1031 // Mutate foreign message
1032 Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField(
1033 foreignFieldDescriptor)
1034 .mergeFrom((Message) builder1.getField(foreignFieldDescriptor));
1035 FieldDescriptor subForeignFieldDescriptor1 =
1036 foreignFieldBuilder1.getDescriptorForType().findFieldByName("c");
1037 foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2);
1038 builder1.setField(foreignFieldDescriptor, foreignFieldBuilder1.build());
1040 // Mutate import message
1041 Message.Builder importFieldBuilder1 = builder1.newBuilderForField(
1042 importFieldDescriptor)
1043 .mergeFrom((Message) builder1.getField(importFieldDescriptor));
1044 FieldDescriptor subImportFieldDescriptor1 =
1045 importFieldBuilder1.getDescriptorForType().findFieldByName("d");
1046 importFieldBuilder1.setField(subImportFieldDescriptor1, 3);
1047 builder1.setField(importFieldDescriptor, importFieldBuilder1.build());
1049 Message newMessage1 = builder1.build();
1051 // Mutate the message with existing field builder
1052 // Mutate nested message
1053 TestAllTypes.Builder builder2 = TestAllTypes.newBuilder();
1054 Message.Builder fieldBuilder2 = builder2.getFieldBuilder(fieldDescriptor);
1055 FieldDescriptor subFieldDescriptor2 =
1056 fieldBuilder2.getDescriptorForType().findFieldByName("bb");
1057 fieldBuilder2.setField(subFieldDescriptor2, 1);
1058 builder2.setField(fieldDescriptor, fieldBuilder2.build());
1060 // Mutate foreign message
1061 Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField(
1062 foreignFieldDescriptor)
1063 .mergeFrom((Message) builder2.getField(foreignFieldDescriptor));
1064 FieldDescriptor subForeignFieldDescriptor2 =
1065 foreignFieldBuilder2.getDescriptorForType().findFieldByName("c");
1066 foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2);
1067 builder2.setField(foreignFieldDescriptor, foreignFieldBuilder2.build());
1069 // Mutate import message
1070 Message.Builder importFieldBuilder2 = builder2.newBuilderForField(
1071 importFieldDescriptor)
1072 .mergeFrom((Message) builder2.getField(importFieldDescriptor));
1073 FieldDescriptor subImportFieldDescriptor2 =
1074 importFieldBuilder2.getDescriptorForType().findFieldByName("d");
1075 importFieldBuilder2.setField(subImportFieldDescriptor2, 3);
1076 builder2.setField(importFieldDescriptor, importFieldBuilder2.build());
1078 Message newMessage2 = builder2.build();
1080 // These two messages should be equal.
1081 assertEquals(newMessage1, newMessage2);
1084 public void testGetFieldBuilderWithInitializedValue() {
1085 Descriptor descriptor = TestAllTypes.getDescriptor();
1086 FieldDescriptor fieldDescriptor =
1087 descriptor.findFieldByName("optional_nested_message");
1089 // Before setting field, builder is initialized by default value.
1090 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
1091 NestedMessage.Builder fieldBuilder =
1092 (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor);
1093 assertEquals(0, fieldBuilder.getBb());
1095 // Setting field value with new field builder instance.
1096 builder = TestAllTypes.newBuilder();
1097 NestedMessage.Builder newFieldBuilder =
1098 builder.getOptionalNestedMessageBuilder();
1099 newFieldBuilder.setBb(2);
1100 // Then get the field builder instance by getFieldBuilder().
1102 (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor);
1103 // It should contain new value.
1104 assertEquals(2, fieldBuilder.getBb());
1105 // These two builder should be equal.
1106 assertSame(fieldBuilder, newFieldBuilder);
1109 public void testGetFieldBuilderNotSupportedException() {
1110 Descriptor descriptor = TestAllTypes.getDescriptor();
1111 TestAllTypes.Builder builder = TestAllTypes.newBuilder();
1113 builder.getFieldBuilder(descriptor.findFieldByName("optional_int32"));
1114 fail("Exception was not thrown");
1115 } catch (UnsupportedOperationException e) {
1116 // We expect this exception.
1119 builder.getFieldBuilder(
1120 descriptor.findFieldByName("optional_nested_enum"));
1121 fail("Exception was not thrown");
1122 } catch (UnsupportedOperationException e) {
1123 // We expect this exception.
1126 builder.getFieldBuilder(descriptor.findFieldByName("repeated_int32"));
1127 fail("Exception was not thrown");
1128 } catch (UnsupportedOperationException e) {
1129 // We expect this exception.
1132 builder.getFieldBuilder(
1133 descriptor.findFieldByName("repeated_nested_enum"));
1134 fail("Exception was not thrown");
1135 } catch (UnsupportedOperationException e) {
1136 // We expect this exception.
1139 builder.getFieldBuilder(
1140 descriptor.findFieldByName("repeated_nested_message"));
1141 fail("Exception was not thrown");
1142 } catch (UnsupportedOperationException e) {
1143 // We expect this exception.