| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // https://developers.google.com/protocol-buffers/ | 3 // http://code.google.com/p/protobuf/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| 11 // * Redistributions in binary form must reproduce the above | 11 // * Redistributions in binary form must reproduce the above |
| 12 // copyright notice, this list of conditions and the following disclaimer | 12 // copyright notice, this list of conditions and the following disclaimer |
| 13 // in the documentation and/or other materials provided with the | 13 // in the documentation and/or other materials provided with the |
| 14 // distribution. | 14 // distribution. |
| 15 // * Neither the name of Google Inc. nor the names of its | 15 // * Neither the name of Google Inc. nor the names of its |
| 16 // contributors may be used to endorse or promote products derived from | 16 // contributors may be used to endorse or promote products derived from |
| 17 // this software without specific prior written permission. | 17 // this software without specific prior written permission. |
| 18 // | 18 // |
| 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 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. | 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 30 | 30 |
| 31 package com.google.protobuf; | 31 package com.google.protobuf.test; |
| 32 import com.google.protobuf.*; |
| 32 | 33 |
| 33 import com.google.protobuf.Descriptors.Descriptor; | 34 import com.google.protobuf.Descriptors.Descriptor; |
| 34 import com.google.protobuf.Descriptors.FieldDescriptor; | 35 import com.google.protobuf.Descriptors.FieldDescriptor; |
| 35 import com.google.protobuf.UnittestLite.TestAllExtensionsLite; | |
| 36 import com.google.protobuf.test.UnittestImport; | 36 import com.google.protobuf.test.UnittestImport; |
| 37 import protobuf_unittest.EnumWithNoOuter; | 37 import protobuf_unittest.EnumWithNoOuter; |
| 38 import protobuf_unittest.MessageWithNoOuter; | 38 import protobuf_unittest.MessageWithNoOuter; |
| 39 import protobuf_unittest.MultipleFilesTestProto; | 39 import protobuf_unittest.MultipleFilesTestProto; |
| 40 import protobuf_unittest.NestedExtension.MyNestedExtension; | 40 import protobuf_unittest.NestedExtension.MyNestedExtension; |
| 41 import protobuf_unittest.NestedExtensionLite.MyNestedExtensionLite; | |
| 42 import protobuf_unittest.NonNestedExtension; | 41 import protobuf_unittest.NonNestedExtension; |
| 43 import protobuf_unittest.NonNestedExtension.MessageToBeExtended; | 42 import protobuf_unittest.NonNestedExtension.MessageToBeExtended; |
| 44 import protobuf_unittest.NonNestedExtension.MyNonNestedExtension; | 43 import protobuf_unittest.NonNestedExtension.MyNonNestedExtension; |
| 45 import protobuf_unittest.NonNestedExtensionLite; | |
| 46 import protobuf_unittest.NonNestedExtensionLite.MessageLiteToBeExtended; | |
| 47 import protobuf_unittest.NonNestedExtensionLite.MyNonNestedExtensionLite; | |
| 48 import protobuf_unittest.OuterClassNameTest2OuterClass; | |
| 49 import protobuf_unittest.OuterClassNameTest3OuterClass; | |
| 50 import protobuf_unittest.OuterClassNameTestOuterClass; | |
| 51 import protobuf_unittest.ServiceWithNoOuter; | 44 import protobuf_unittest.ServiceWithNoOuter; |
| 52 import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize; | 45 import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize; |
| 53 import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize; | 46 import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize; |
| 54 import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize; | 47 import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize; |
| 55 import protobuf_unittest.UnittestProto; | 48 import protobuf_unittest.UnittestProto; |
| 56 import protobuf_unittest.UnittestProto.ForeignEnum; | 49 import protobuf_unittest.UnittestProto.ForeignEnum; |
| 57 import protobuf_unittest.UnittestProto.ForeignMessage; | 50 import protobuf_unittest.UnittestProto.ForeignMessage; |
| 58 import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder; | 51 import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder; |
| 59 import protobuf_unittest.UnittestProto.NestedTestAllTypes; | |
| 60 import protobuf_unittest.UnittestProto.TestAllExtensions; | 52 import protobuf_unittest.UnittestProto.TestAllExtensions; |
| 61 import protobuf_unittest.UnittestProto.TestAllTypes; | 53 import protobuf_unittest.UnittestProto.TestAllTypes; |
| 62 import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage; | 54 import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage; |
| 63 import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; | 55 import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; |
| 64 import protobuf_unittest.UnittestProto.TestExtremeDefaultValues; | 56 import protobuf_unittest.UnittestProto.TestExtremeDefaultValues; |
| 65 import protobuf_unittest.UnittestProto.TestOneof2; | |
| 66 import protobuf_unittest.UnittestProto.TestPackedTypes; | 57 import protobuf_unittest.UnittestProto.TestPackedTypes; |
| 67 import protobuf_unittest.UnittestProto.TestUnpackedTypes; | 58 import protobuf_unittest.UnittestProto.TestUnpackedTypes; |
| 68 | 59 |
| 69 import junit.framework.TestCase; | 60 import junit.framework.TestCase; |
| 70 | 61 |
| 71 import java.io.ByteArrayInputStream; | 62 import java.io.ByteArrayInputStream; |
| 72 import java.io.ByteArrayOutputStream; | 63 import java.io.ByteArrayOutputStream; |
| 73 import java.io.ObjectInputStream; | 64 import java.io.ObjectInputStream; |
| 74 import java.io.ObjectOutputStream; | 65 import java.io.ObjectOutputStream; |
| 75 import java.util.Arrays; | 66 import java.util.Arrays; |
| 76 import java.util.Collections; | 67 import java.util.Collections; |
| 77 import java.util.Iterator; | |
| 78 import java.util.List; | 68 import java.util.List; |
| 79 | 69 |
| 80 /** | 70 /** |
| 81 * Unit test for generated messages and generated code. See also | 71 * Unit test for generated messages and generated code. See also |
| 82 * {@link MessageTest}, which tests some generated message functionality. | 72 * {@link MessageTest}, which tests some generated message functionality. |
| 83 * | 73 * |
| 84 * @author kenton@google.com Kenton Varda | 74 * @author kenton@google.com Kenton Varda |
| 85 */ | 75 */ |
| 86 public class GeneratedMessageTest extends TestCase { | 76 public class GeneratedMessageTest extends TestCase { |
| 87 TestUtil.ReflectionTester reflectionTester = | 77 TestUtil.ReflectionTester reflectionTester = |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 assertEquals(200, value2.getOptionalSfixed64()); | 138 assertEquals(200, value2.getOptionalSfixed64()); |
| 149 assertEquals(200, value2.getRepeatedInt32(0)); | 139 assertEquals(200, value2.getRepeatedInt32(0)); |
| 150 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, | 140 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, |
| 151 value2.getOptionalImportEnum()); | 141 value2.getOptionalImportEnum()); |
| 152 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, | 142 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, |
| 153 value2.getRepeatedImportEnum(0)); | 143 value2.getRepeatedImportEnum(0)); |
| 154 assertEquals(2, value2.getOptionalForeignMessage().getC()); | 144 assertEquals(2, value2.getOptionalForeignMessage().getC()); |
| 155 assertEquals(2, value2.getRepeatedForeignMessage(0).getC()); | 145 assertEquals(2, value2.getRepeatedForeignMessage(0).getC()); |
| 156 } | 146 } |
| 157 | 147 |
| 158 public void testProtosShareRepeatedArraysIfDidntChange() throws Exception { | |
| 159 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 160 builder.addRepeatedInt32(100); | |
| 161 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); | |
| 162 | |
| 163 TestAllTypes value1 = builder.build(); | |
| 164 TestAllTypes value2 = value1.toBuilder().build(); | |
| 165 | |
| 166 assertSame(value1.getRepeatedInt32List(), value2.getRepeatedInt32List()); | |
| 167 assertSame(value1.getRepeatedForeignMessageList(), | |
| 168 value2.getRepeatedForeignMessageList()); | |
| 169 } | |
| 170 | |
| 171 public void testRepeatedArraysAreImmutable() throws Exception { | 148 public void testRepeatedArraysAreImmutable() throws Exception { |
| 172 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 149 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 173 builder.addRepeatedInt32(100); | 150 builder.addRepeatedInt32(100); |
| 174 builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); | 151 builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); |
| 175 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); | 152 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); |
| 176 assertIsUnmodifiable(builder.getRepeatedInt32List()); | 153 assertIsUnmodifiable(builder.getRepeatedInt32List()); |
| 177 assertIsUnmodifiable(builder.getRepeatedImportEnumList()); | 154 assertIsUnmodifiable(builder.getRepeatedImportEnumList()); |
| 178 assertIsUnmodifiable(builder.getRepeatedForeignMessageList()); | 155 assertIsUnmodifiable(builder.getRepeatedForeignMessageList()); |
| 179 assertIsUnmodifiable(builder.getRepeatedFloatList()); | 156 assertIsUnmodifiable(builder.getRepeatedFloatList()); |
| 180 | 157 |
| 181 | 158 |
| 182 TestAllTypes value = builder.build(); | 159 TestAllTypes value = builder.build(); |
| 183 assertIsUnmodifiable(value.getRepeatedInt32List()); | 160 assertIsUnmodifiable(value.getRepeatedInt32List()); |
| 184 assertIsUnmodifiable(value.getRepeatedImportEnumList()); | 161 assertIsUnmodifiable(value.getRepeatedImportEnumList()); |
| 185 assertIsUnmodifiable(value.getRepeatedForeignMessageList()); | 162 assertIsUnmodifiable(value.getRepeatedForeignMessageList()); |
| 186 assertIsUnmodifiable(value.getRepeatedFloatList()); | 163 assertIsUnmodifiable(value.getRepeatedFloatList()); |
| 187 } | 164 } |
| 188 | 165 |
| 189 public void testParsedMessagesAreImmutable() throws Exception { | 166 public void testParsedMessagesAreImmutable() throws Exception { |
| 190 TestAllTypes value = TestAllTypes.parser().parseFrom(TestUtil.getAllSet().to
ByteString()); | 167 TestAllTypes value = TestAllTypes.PARSER.parseFrom( |
| 168 TestUtil.getAllSet().toByteString()); |
| 191 assertIsUnmodifiable(value.getRepeatedInt32List()); | 169 assertIsUnmodifiable(value.getRepeatedInt32List()); |
| 192 assertIsUnmodifiable(value.getRepeatedInt64List()); | 170 assertIsUnmodifiable(value.getRepeatedInt64List()); |
| 193 assertIsUnmodifiable(value.getRepeatedUint32List()); | 171 assertIsUnmodifiable(value.getRepeatedUint32List()); |
| 194 assertIsUnmodifiable(value.getRepeatedUint64List()); | 172 assertIsUnmodifiable(value.getRepeatedUint64List()); |
| 195 assertIsUnmodifiable(value.getRepeatedSint32List()); | 173 assertIsUnmodifiable(value.getRepeatedSint32List()); |
| 196 assertIsUnmodifiable(value.getRepeatedSint64List()); | 174 assertIsUnmodifiable(value.getRepeatedSint64List()); |
| 197 assertIsUnmodifiable(value.getRepeatedFixed32List()); | 175 assertIsUnmodifiable(value.getRepeatedFixed32List()); |
| 198 assertIsUnmodifiable(value.getRepeatedFixed64List()); | 176 assertIsUnmodifiable(value.getRepeatedFixed64List()); |
| 199 assertIsUnmodifiable(value.getRepeatedSfixed32List()); | 177 assertIsUnmodifiable(value.getRepeatedSfixed32List()); |
| 200 assertIsUnmodifiable(value.getRepeatedSfixed64List()); | 178 assertIsUnmodifiable(value.getRepeatedSfixed64List()); |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 // We expect this exception. | 372 // We expect this exception. |
| 395 } | 373 } |
| 396 | 374 |
| 397 try { | 375 try { |
| 398 builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null)); | 376 builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null)); |
| 399 fail("Exception was not thrown"); | 377 fail("Exception was not thrown"); |
| 400 } catch (NullPointerException e) { | 378 } catch (NullPointerException e) { |
| 401 // We expect this exception. | 379 // We expect this exception. |
| 402 } | 380 } |
| 403 } | 381 } |
| 404 | |
| 405 public void testRepeatedAppendIterateOnlyOnce() throws Exception { | |
| 406 // Create a Iterable that can only be iterated once. | |
| 407 Iterable<String> stringIterable = new Iterable<String>() { | |
| 408 private boolean called = false; | |
| 409 @Override | |
| 410 public Iterator<String> iterator() { | |
| 411 if (called) { | |
| 412 throw new IllegalStateException(); | |
| 413 } | |
| 414 called = true; | |
| 415 return Arrays.asList("one", "two", "three").iterator(); | |
| 416 } | |
| 417 }; | |
| 418 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 419 builder.addAllRepeatedString(stringIterable); | |
| 420 assertEquals(3, builder.getRepeatedStringCount()); | |
| 421 assertEquals("one", builder.getRepeatedString(0)); | |
| 422 assertEquals("two", builder.getRepeatedString(1)); | |
| 423 assertEquals("three", builder.getRepeatedString(2)); | |
| 424 | |
| 425 try { | |
| 426 builder.addAllRepeatedString(stringIterable); | |
| 427 fail("Exception was not thrown"); | |
| 428 } catch (IllegalStateException e) { | |
| 429 // We expect this exception. | |
| 430 } | |
| 431 } | |
| 432 | |
| 433 public void testMergeFromOtherRejectsNull() throws Exception { | |
| 434 try { | |
| 435 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 436 builder.mergeFrom((TestAllTypes) null); | |
| 437 fail("Exception was not thrown"); | |
| 438 } catch (NullPointerException e) { | |
| 439 // We expect this exception. | |
| 440 } | |
| 441 } | |
| 442 | 382 |
| 443 public void testSettingForeignMessageUsingBuilder() throws Exception { | 383 public void testSettingForeignMessageUsingBuilder() throws Exception { |
| 444 TestAllTypes message = TestAllTypes.newBuilder() | 384 TestAllTypes message = TestAllTypes.newBuilder() |
| 445 // Pass builder for foreign message instance. | 385 // Pass builder for foreign message instance. |
| 446 .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123)) | 386 .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123)) |
| 447 .build(); | 387 .build(); |
| 448 TestAllTypes expectedMessage = TestAllTypes.newBuilder() | 388 TestAllTypes expectedMessage = TestAllTypes.newBuilder() |
| 449 // Create expected version passing foreign message instance explicitly. | 389 // Create expected version passing foreign message instance explicitly. |
| 450 .setOptionalForeignMessage( | 390 .setOptionalForeignMessage( |
| 451 ForeignMessage.newBuilder().setC(123).build()) | 391 ForeignMessage.newBuilder().setC(123).build()) |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 reflectionTester.assertReflectionRepeatedSettersRejectNull(builder); | 469 reflectionTester.assertReflectionRepeatedSettersRejectNull(builder); |
| 530 } | 470 } |
| 531 | 471 |
| 532 public void testReflectionDefaults() throws Exception { | 472 public void testReflectionDefaults() throws Exception { |
| 533 reflectionTester.assertClearViaReflection( | 473 reflectionTester.assertClearViaReflection( |
| 534 TestAllTypes.getDefaultInstance()); | 474 TestAllTypes.getDefaultInstance()); |
| 535 reflectionTester.assertClearViaReflection( | 475 reflectionTester.assertClearViaReflection( |
| 536 TestAllTypes.newBuilder().build()); | 476 TestAllTypes.newBuilder().build()); |
| 537 } | 477 } |
| 538 | 478 |
| 539 public void testReflectionGetOneof() throws Exception { | |
| 540 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 541 reflectionTester.setAllFieldsViaReflection(builder); | |
| 542 Descriptors.OneofDescriptor oneof = | |
| 543 TestAllTypes.getDescriptor().getOneofs().get(0); | |
| 544 Descriptors.FieldDescriptor field = | |
| 545 TestAllTypes.getDescriptor().findFieldByName("oneof_bytes"); | |
| 546 assertSame(field, builder.getOneofFieldDescriptor(oneof)); | |
| 547 | |
| 548 TestAllTypes message = builder.build(); | |
| 549 assertSame(field, message.getOneofFieldDescriptor(oneof)); | |
| 550 } | |
| 551 | |
| 552 public void testReflectionClearOneof() throws Exception { | |
| 553 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 554 reflectionTester.setAllFieldsViaReflection(builder); | |
| 555 Descriptors.OneofDescriptor oneof = | |
| 556 TestAllTypes.getDescriptor().getOneofs().get(0); | |
| 557 Descriptors.FieldDescriptor field = | |
| 558 TestAllTypes.getDescriptor().findFieldByName("oneof_bytes"); | |
| 559 | |
| 560 assertTrue(builder.hasOneof(oneof)); | |
| 561 assertTrue(builder.hasField(field)); | |
| 562 builder.clearOneof(oneof); | |
| 563 assertFalse(builder.hasOneof(oneof)); | |
| 564 assertFalse(builder.hasField(field)); | |
| 565 } | |
| 566 | |
| 567 public void testEnumInterface() throws Exception { | 479 public void testEnumInterface() throws Exception { |
| 568 assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum() | 480 assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum() |
| 569 instanceof ProtocolMessageEnum); | 481 instanceof ProtocolMessageEnum); |
| 570 } | 482 } |
| 571 | 483 |
| 572 public void testEnumMap() throws Exception { | 484 public void testEnumMap() throws Exception { |
| 573 Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap(); | 485 Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap(); |
| 574 | 486 |
| 575 for (ForeignEnum value : ForeignEnum.values()) { | 487 for (ForeignEnum value : ForeignEnum.values()) { |
| 576 assertEquals(value, map.findValueByNumber(value.getNumber())); | 488 assertEquals(value, map.findValueByNumber(value.getNumber())); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 TestUtil.modifyRepeatedExtensions(builder); | 525 TestUtil.modifyRepeatedExtensions(builder); |
| 614 TestAllExtensions message = builder.build(); | 526 TestAllExtensions message = builder.build(); |
| 615 TestUtil.assertRepeatedExtensionsModified(message); | 527 TestUtil.assertRepeatedExtensionsModified(message); |
| 616 } | 528 } |
| 617 | 529 |
| 618 public void testExtensionDefaults() throws Exception { | 530 public void testExtensionDefaults() throws Exception { |
| 619 TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance()); | 531 TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance()); |
| 620 TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build()); | 532 TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build()); |
| 621 } | 533 } |
| 622 | 534 |
| 623 public void testUnsetRepeatedExtensionGetField() { | |
| 624 TestAllExtensions message = TestAllExtensions.getDefaultInstance(); | |
| 625 Object value; | |
| 626 | |
| 627 value = message.getField(UnittestProto.repeatedStringExtension.getDescriptor
()); | |
| 628 assertTrue(value instanceof List); | |
| 629 assertTrue(((List<?>) value).isEmpty()); | |
| 630 assertIsUnmodifiable((List<?>) value); | |
| 631 | |
| 632 value = message.getField(UnittestProto.repeatedNestedMessageExtension.getDes
criptor()); | |
| 633 assertTrue(value instanceof List); | |
| 634 assertTrue(((List<?>) value).isEmpty()); | |
| 635 assertIsUnmodifiable((List<?>) value); | |
| 636 } | |
| 637 | |
| 638 public void testExtensionReflectionGetters() throws Exception { | 535 public void testExtensionReflectionGetters() throws Exception { |
| 639 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); | 536 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); |
| 640 TestUtil.setAllExtensions(builder); | 537 TestUtil.setAllExtensions(builder); |
| 641 extensionsReflectionTester.assertAllFieldsSetViaReflection(builder); | 538 extensionsReflectionTester.assertAllFieldsSetViaReflection(builder); |
| 642 | 539 |
| 643 TestAllExtensions message = builder.build(); | 540 TestAllExtensions message = builder.build(); |
| 644 extensionsReflectionTester.assertAllFieldsSetViaReflection(message); | 541 extensionsReflectionTester.assertAllFieldsSetViaReflection(message); |
| 645 } | 542 } |
| 646 | 543 |
| 647 public void testExtensionReflectionSetters() throws Exception { | 544 public void testExtensionReflectionSetters() throws Exception { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 707 TestAllExtensions.newBuilder() | 604 TestAllExtensions.newBuilder() |
| 708 .setExtension(UnittestProto.optionalInt32Extension, 1).build(); | 605 .setExtension(UnittestProto.optionalInt32Extension, 1).build(); |
| 709 TestAllExtensions merged = | 606 TestAllExtensions merged = |
| 710 TestAllExtensions.newBuilder().mergeFrom(original).build(); | 607 TestAllExtensions.newBuilder().mergeFrom(original).build(); |
| 711 assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension)); | 608 assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension)); |
| 712 assertEquals( | 609 assertEquals( |
| 713 1, (int) merged.getExtension(UnittestProto.optionalInt32Extension)); | 610 1, (int) merged.getExtension(UnittestProto.optionalInt32Extension)); |
| 714 } | 611 } |
| 715 | 612 |
| 716 // ================================================================= | 613 // ================================================================= |
| 717 // Lite Extensions. | |
| 718 | |
| 719 // We test lite extensions directly because they have a separate | |
| 720 // implementation from full extensions. In contrast, we do not test | |
| 721 // lite fields directly since they are implemented exactly the same as | |
| 722 // regular fields. | |
| 723 | |
| 724 public void testLiteExtensionMessageOrBuilder() throws Exception { | |
| 725 TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder(); | |
| 726 TestUtilLite.setAllExtensions(builder); | |
| 727 TestUtil.assertAllExtensionsSet(builder); | |
| 728 | |
| 729 TestAllExtensionsLite message = builder.build(); | |
| 730 TestUtil.assertAllExtensionsSet(message); | |
| 731 } | |
| 732 | |
| 733 public void testLiteExtensionRepeatedSetters() throws Exception { | |
| 734 TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder(); | |
| 735 TestUtilLite.setAllExtensions(builder); | |
| 736 TestUtilLite.modifyRepeatedExtensions(builder); | |
| 737 TestUtil.assertRepeatedExtensionsModified(builder); | |
| 738 | |
| 739 TestAllExtensionsLite message = builder.build(); | |
| 740 TestUtil.assertRepeatedExtensionsModified(message); | |
| 741 } | |
| 742 | |
| 743 public void testLiteExtensionDefaults() throws Exception { | |
| 744 TestUtil.assertExtensionsClear(TestAllExtensionsLite.getDefaultInstance()); | |
| 745 TestUtil.assertExtensionsClear(TestAllExtensionsLite.newBuilder().build()); | |
| 746 } | |
| 747 | |
| 748 public void testClearLiteExtension() throws Exception { | |
| 749 // clearExtension() is not actually used in TestUtil, so try it manually. | |
| 750 assertFalse( | |
| 751 TestAllExtensionsLite.newBuilder() | |
| 752 .setExtension(UnittestLite.optionalInt32ExtensionLite, 1) | |
| 753 .clearExtension(UnittestLite.optionalInt32ExtensionLite) | |
| 754 .hasExtension(UnittestLite.optionalInt32ExtensionLite)); | |
| 755 assertEquals(0, | |
| 756 TestAllExtensionsLite.newBuilder() | |
| 757 .addExtension(UnittestLite.repeatedInt32ExtensionLite, 1) | |
| 758 .clearExtension(UnittestLite.repeatedInt32ExtensionLite) | |
| 759 .getExtensionCount(UnittestLite.repeatedInt32ExtensionLite)); | |
| 760 } | |
| 761 | |
| 762 public void testLiteExtensionCopy() throws Exception { | |
| 763 TestAllExtensionsLite original = TestUtilLite.getAllLiteExtensionsSet(); | |
| 764 TestAllExtensionsLite copy = | |
| 765 TestAllExtensionsLite.newBuilder(original).build(); | |
| 766 TestUtil.assertAllExtensionsSet(copy); | |
| 767 } | |
| 768 | |
| 769 public void testLiteExtensionMergeFrom() throws Exception { | |
| 770 TestAllExtensionsLite original = | |
| 771 TestAllExtensionsLite.newBuilder() | |
| 772 .setExtension(UnittestLite.optionalInt32ExtensionLite, 1).build(); | |
| 773 TestAllExtensionsLite merged = | |
| 774 TestAllExtensionsLite.newBuilder().mergeFrom(original).build(); | |
| 775 assertTrue(merged.hasExtension(UnittestLite.optionalInt32ExtensionLite)); | |
| 776 assertEquals( | |
| 777 1, (int) merged.getExtension(UnittestLite.optionalInt32ExtensionLite)); | |
| 778 } | |
| 779 | |
| 780 // ================================================================= | |
| 781 // multiple_files_test | 614 // multiple_files_test |
| 782 | 615 |
| 783 // Test that custom options of an file level enum are properly initialized. | |
| 784 // This test needs to be put before any other access to MultipleFilesTestProto | |
| 785 // or messages defined in multiple_files_test.proto because the class loading | |
| 786 // order affects initialization process of custom options. | |
| 787 public void testEnumValueOptionsInMultipleFilesMode() throws Exception { | |
| 788 assertEquals(12345, EnumWithNoOuter.FOO.getValueDescriptor().getOptions() | |
| 789 .getExtension(MultipleFilesTestProto.enumValueOption).intValue()); | |
| 790 } | |
| 791 | |
| 792 public void testMultipleFilesOption() throws Exception { | 616 public void testMultipleFilesOption() throws Exception { |
| 793 // We mostly just want to check that things compile. | 617 // We mostly just want to check that things compile. |
| 794 MessageWithNoOuter message = | 618 MessageWithNoOuter message = |
| 795 MessageWithNoOuter.newBuilder() | 619 MessageWithNoOuter.newBuilder() |
| 796 .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1)) | 620 .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1)) |
| 797 .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1)) | 621 .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1)) |
| 798 .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ) | 622 .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ) |
| 799 .setForeignEnum(EnumWithNoOuter.BAR) | 623 .setForeignEnum(EnumWithNoOuter.BAR) |
| 800 .build(); | 624 .build(); |
| 801 assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString())); | 625 assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString())); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 880 assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46); | 704 assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46); |
| 881 assertEquals( | 705 assertEquals( |
| 882 UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48); | 706 UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48); |
| 883 assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51); | 707 assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51); |
| 884 } | 708 } |
| 885 | 709 |
| 886 public void testRecursiveMessageDefaultInstance() throws Exception { | 710 public void testRecursiveMessageDefaultInstance() throws Exception { |
| 887 UnittestProto.TestRecursiveMessage message = | 711 UnittestProto.TestRecursiveMessage message = |
| 888 UnittestProto.TestRecursiveMessage.getDefaultInstance(); | 712 UnittestProto.TestRecursiveMessage.getDefaultInstance(); |
| 889 assertTrue(message != null); | 713 assertTrue(message != null); |
| 890 assertNotNull(message.getA()); | 714 assertTrue(message.getA() != null); |
| 891 assertTrue(message.getA() == message); | 715 assertTrue(message.getA() == message); |
| 892 } | 716 } |
| 893 | 717 |
| 894 public void testSerialize() throws Exception { | 718 public void testSerialize() throws Exception { |
| 895 ByteArrayOutputStream baos = new ByteArrayOutputStream(); | 719 ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| 896 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 720 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 897 TestUtil.setAllFields(builder); | 721 TestUtil.setAllFields(builder); |
| 898 TestAllTypes expected = builder.build(); | 722 TestAllTypes expected = builder.build(); |
| 899 ObjectOutputStream out = new ObjectOutputStream(baos); | 723 ObjectOutputStream out = new ObjectOutputStream(baos); |
| 900 try { | 724 try { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 943 NonNestedExtension.nonNestedExtension.getDescriptor().getName()
); | 767 NonNestedExtension.nonNestedExtension.getDescriptor().getName()
); |
| 944 } | 768 } |
| 945 | 769 |
| 946 public void testNestedExtensionInitialization() { | 770 public void testNestedExtensionInitialization() { |
| 947 assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance() | 771 assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance() |
| 948 instanceof MessageToBeExtended); | 772 instanceof MessageToBeExtended); |
| 949 assertEquals("recursiveExtension", | 773 assertEquals("recursiveExtension", |
| 950 MyNestedExtension.recursiveExtension.getDescriptor().getName())
; | 774 MyNestedExtension.recursiveExtension.getDescriptor().getName())
; |
| 951 } | 775 } |
| 952 | 776 |
| 953 public void testNonNestedExtensionLiteInitialization() { | |
| 954 assertTrue(NonNestedExtensionLite.nonNestedExtensionLite | |
| 955 .getMessageDefaultInstance() instanceof MyNonNestedExtensionLite)
; | |
| 956 } | |
| 957 | |
| 958 public void testNestedExtensionLiteInitialization() { | |
| 959 assertTrue(MyNestedExtensionLite.recursiveExtensionLite | |
| 960 .getMessageDefaultInstance() instanceof MessageLiteToBeExtended); | |
| 961 } | |
| 962 | |
| 963 public void testInvalidations() throws Exception { | |
| 964 GeneratedMessage.enableAlwaysUseFieldBuildersForTesting(); | |
| 965 TestAllTypes.NestedMessage nestedMessage1 = | |
| 966 TestAllTypes.NestedMessage.newBuilder().build(); | |
| 967 TestAllTypes.NestedMessage nestedMessage2 = | |
| 968 TestAllTypes.NestedMessage.newBuilder().build(); | |
| 969 | |
| 970 // Set all three flavors (enum, primitive, message and singular/repeated) | |
| 971 // and verify no invalidations fired | |
| 972 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); | |
| 973 | |
| 974 TestAllTypes.Builder builder = (TestAllTypes.Builder) | |
| 975 ((GeneratedMessage) TestAllTypes.getDefaultInstance()). | |
| 976 newBuilderForType(mockParent); | |
| 977 builder.setOptionalInt32(1); | |
| 978 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR); | |
| 979 builder.setOptionalNestedMessage(nestedMessage1); | |
| 980 builder.addRepeatedInt32(1); | |
| 981 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR); | |
| 982 builder.addRepeatedNestedMessage(nestedMessage1); | |
| 983 assertEquals(0, mockParent.getInvalidationCount()); | |
| 984 | |
| 985 // Now tell it we want changes and make sure it's only fired once | |
| 986 // And do this for each flavor | |
| 987 | |
| 988 // primitive single | |
| 989 builder.buildPartial(); | |
| 990 builder.setOptionalInt32(2); | |
| 991 builder.setOptionalInt32(3); | |
| 992 assertEquals(1, mockParent.getInvalidationCount()); | |
| 993 | |
| 994 // enum single | |
| 995 builder.buildPartial(); | |
| 996 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ); | |
| 997 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR); | |
| 998 assertEquals(2, mockParent.getInvalidationCount()); | |
| 999 | |
| 1000 // message single | |
| 1001 builder.buildPartial(); | |
| 1002 builder.setOptionalNestedMessage(nestedMessage2); | |
| 1003 builder.setOptionalNestedMessage(nestedMessage1); | |
| 1004 assertEquals(3, mockParent.getInvalidationCount()); | |
| 1005 | |
| 1006 // primitive repeated | |
| 1007 builder.buildPartial(); | |
| 1008 builder.addRepeatedInt32(2); | |
| 1009 builder.addRepeatedInt32(3); | |
| 1010 assertEquals(4, mockParent.getInvalidationCount()); | |
| 1011 | |
| 1012 // enum repeated | |
| 1013 builder.buildPartial(); | |
| 1014 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ); | |
| 1015 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ); | |
| 1016 assertEquals(5, mockParent.getInvalidationCount()); | |
| 1017 | |
| 1018 // message repeated | |
| 1019 builder.buildPartial(); | |
| 1020 builder.addRepeatedNestedMessage(nestedMessage2); | |
| 1021 builder.addRepeatedNestedMessage(nestedMessage1); | |
| 1022 assertEquals(6, mockParent.getInvalidationCount()); | |
| 1023 | |
| 1024 } | |
| 1025 | |
| 1026 public void testInvalidations_Extensions() throws Exception { | |
| 1027 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); | |
| 1028 | |
| 1029 TestAllExtensions.Builder builder = (TestAllExtensions.Builder) | |
| 1030 ((GeneratedMessage) TestAllExtensions.getDefaultInstance()). | |
| 1031 newBuilderForType(mockParent); | |
| 1032 | |
| 1033 builder.addExtension(UnittestProto.repeatedInt32Extension, 1); | |
| 1034 builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 2); | |
| 1035 builder.clearExtension(UnittestProto.repeatedInt32Extension); | |
| 1036 assertEquals(0, mockParent.getInvalidationCount()); | |
| 1037 | |
| 1038 // Now tell it we want changes and make sure it's only fired once | |
| 1039 builder.buildPartial(); | |
| 1040 builder.addExtension(UnittestProto.repeatedInt32Extension, 2); | |
| 1041 builder.addExtension(UnittestProto.repeatedInt32Extension, 3); | |
| 1042 assertEquals(1, mockParent.getInvalidationCount()); | |
| 1043 | |
| 1044 builder.buildPartial(); | |
| 1045 builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 4); | |
| 1046 builder.setExtension(UnittestProto.repeatedInt32Extension, 1, 5); | |
| 1047 assertEquals(2, mockParent.getInvalidationCount()); | |
| 1048 | |
| 1049 builder.buildPartial(); | |
| 1050 builder.clearExtension(UnittestProto.repeatedInt32Extension); | |
| 1051 builder.clearExtension(UnittestProto.repeatedInt32Extension); | |
| 1052 assertEquals(3, mockParent.getInvalidationCount()); | |
| 1053 } | |
| 1054 | 777 |
| 1055 public void testBaseMessageOrBuilder() { | 778 public void testBaseMessageOrBuilder() { |
| 1056 // Mostly just makes sure the base interface exists and has some methods. | 779 // Mostly just makes sure the base interface exists and has some methods. |
| 1057 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 780 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 1058 TestAllTypes message = builder.buildPartial(); | 781 TestAllTypes message = builder.buildPartial(); |
| 1059 TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder; | 782 TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder; |
| 1060 TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message; | 783 TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message; |
| 1061 | 784 |
| 1062 assertEquals( | 785 assertEquals( |
| 1063 messageAsInterface.getDefaultBool(), | 786 messageAsInterface.getDefaultBool(), |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1228 // We expect this exception. | 951 // We expect this exception. |
| 1229 } | 952 } |
| 1230 try { | 953 try { |
| 1231 builder.getFieldBuilder( | 954 builder.getFieldBuilder( |
| 1232 descriptor.findFieldByName("repeated_nested_message")); | 955 descriptor.findFieldByName("repeated_nested_message")); |
| 1233 fail("Exception was not thrown"); | 956 fail("Exception was not thrown"); |
| 1234 } catch (UnsupportedOperationException e) { | 957 } catch (UnsupportedOperationException e) { |
| 1235 // We expect this exception. | 958 // We expect this exception. |
| 1236 } | 959 } |
| 1237 } | 960 } |
| 1238 | |
| 1239 // Test that when the default outer class name conflicts with another type | |
| 1240 // defined in the proto the compiler will append a suffix to avoid the | |
| 1241 // conflict. | |
| 1242 public void testConflictingOuterClassName() { | |
| 1243 // We just need to make sure we can refer to the outer class with the | |
| 1244 // expected name. There is nothing else to test. | |
| 1245 OuterClassNameTestOuterClass.OuterClassNameTest message = | |
| 1246 OuterClassNameTestOuterClass.OuterClassNameTest.newBuilder().build(); | |
| 1247 assertTrue(message.getDescriptorForType() == | |
| 1248 OuterClassNameTestOuterClass.OuterClassNameTest.getDescriptor()); | |
| 1249 | |
| 1250 OuterClassNameTest2OuterClass.TestMessage2.NestedMessage.OuterClassNameTest2 | |
| 1251 message2 = OuterClassNameTest2OuterClass.TestMessage2.NestedMessage | |
| 1252 .OuterClassNameTest2.newBuilder().build(); | |
| 1253 assertEquals(0, message2.getSerializedSize()); | |
| 1254 | |
| 1255 OuterClassNameTest3OuterClass.TestMessage3.NestedMessage.OuterClassNameTest3 | |
| 1256 enumValue = OuterClassNameTest3OuterClass.TestMessage3.NestedMessage | |
| 1257 .OuterClassNameTest3.DUMMY_VALUE; | |
| 1258 assertEquals(1, enumValue.getNumber()); | |
| 1259 } | |
| 1260 | |
| 1261 // ================================================================= | |
| 1262 // oneof generated code test | |
| 1263 public void testOneofEnumCase() throws Exception { | |
| 1264 TestOneof2 message = TestOneof2.newBuilder() | |
| 1265 .setFooInt(123).setFooString("foo").setFooCord("bar").build(); | |
| 1266 TestUtil.assertAtMostOneFieldSetOneof(message); | |
| 1267 } | |
| 1268 | |
| 1269 public void testClearOneof() throws Exception { | |
| 1270 TestOneof2.Builder builder = TestOneof2.newBuilder().setFooInt(123); | |
| 1271 assertEquals(TestOneof2.FooCase.FOO_INT, builder.getFooCase()); | |
| 1272 builder.clearFoo(); | |
| 1273 assertEquals(TestOneof2.FooCase.FOO_NOT_SET, builder.getFooCase()); | |
| 1274 } | |
| 1275 | |
| 1276 public void testSetOneofClearsOthers() throws Exception { | |
| 1277 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1278 TestOneof2 message = | |
| 1279 builder.setFooInt(123).setFooString("foo").buildPartial(); | |
| 1280 assertTrue(message.hasFooString()); | |
| 1281 TestUtil.assertAtMostOneFieldSetOneof(message); | |
| 1282 | |
| 1283 message = builder.setFooCord("bar").buildPartial(); | |
| 1284 assertTrue(message.hasFooCord()); | |
| 1285 TestUtil.assertAtMostOneFieldSetOneof(message); | |
| 1286 | |
| 1287 message = builder.setFooStringPiece("baz").buildPartial(); | |
| 1288 assertTrue(message.hasFooStringPiece()); | |
| 1289 TestUtil.assertAtMostOneFieldSetOneof(message); | |
| 1290 | |
| 1291 message = builder.setFooBytes(TestUtil.toBytes("qux")).buildPartial(); | |
| 1292 assertTrue(message.hasFooBytes()); | |
| 1293 TestUtil.assertAtMostOneFieldSetOneof(message); | |
| 1294 | |
| 1295 message = builder.setFooEnum(TestOneof2.NestedEnum.FOO).buildPartial(); | |
| 1296 assertTrue(message.hasFooEnum()); | |
| 1297 TestUtil.assertAtMostOneFieldSetOneof(message); | |
| 1298 | |
| 1299 message = builder.setFooMessage( | |
| 1300 TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).buildParti
al(); | |
| 1301 assertTrue(message.hasFooMessage()); | |
| 1302 TestUtil.assertAtMostOneFieldSetOneof(message); | |
| 1303 | |
| 1304 message = builder.setFooInt(123).buildPartial(); | |
| 1305 assertTrue(message.hasFooInt()); | |
| 1306 TestUtil.assertAtMostOneFieldSetOneof(message); | |
| 1307 } | |
| 1308 | |
| 1309 public void testOneofTypes() throws Exception { | |
| 1310 // Primitive | |
| 1311 { | |
| 1312 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1313 assertEquals(builder.getFooInt(), 0); | |
| 1314 assertFalse(builder.hasFooInt()); | |
| 1315 assertTrue(builder.setFooInt(123).hasFooInt()); | |
| 1316 assertEquals(builder.getFooInt(), 123); | |
| 1317 TestOneof2 message = builder.buildPartial(); | |
| 1318 assertTrue(message.hasFooInt()); | |
| 1319 assertEquals(message.getFooInt(), 123); | |
| 1320 | |
| 1321 assertFalse(builder.clearFooInt().hasFooInt()); | |
| 1322 TestOneof2 message2 = builder.build(); | |
| 1323 assertFalse(message2.hasFooInt()); | |
| 1324 assertEquals(message2.getFooInt(), 0); | |
| 1325 } | |
| 1326 | |
| 1327 // Enum | |
| 1328 { | |
| 1329 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1330 assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.FOO); | |
| 1331 assertTrue(builder.setFooEnum(TestOneof2.NestedEnum.BAR).hasFooEnum()); | |
| 1332 assertEquals(builder.getFooEnum(), TestOneof2.NestedEnum.BAR); | |
| 1333 TestOneof2 message = builder.buildPartial(); | |
| 1334 assertTrue(message.hasFooEnum()); | |
| 1335 assertEquals(message.getFooEnum(), TestOneof2.NestedEnum.BAR); | |
| 1336 | |
| 1337 assertFalse(builder.clearFooEnum().hasFooEnum()); | |
| 1338 TestOneof2 message2 = builder.build(); | |
| 1339 assertFalse(message2.hasFooEnum()); | |
| 1340 assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.FOO); | |
| 1341 } | |
| 1342 | |
| 1343 // String | |
| 1344 { | |
| 1345 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1346 assertEquals(builder.getFooString(), ""); | |
| 1347 builder.setFooString("foo"); | |
| 1348 assertTrue(builder.hasFooString()); | |
| 1349 assertEquals(builder.getFooString(), "foo"); | |
| 1350 TestOneof2 message = builder.buildPartial(); | |
| 1351 assertTrue(message.hasFooString()); | |
| 1352 assertEquals(message.getFooString(), "foo"); | |
| 1353 assertEquals(message.getFooStringBytes(), TestUtil.toBytes("foo")); | |
| 1354 | |
| 1355 assertFalse(builder.clearFooString().hasFooString()); | |
| 1356 TestOneof2 message2 = builder.buildPartial(); | |
| 1357 assertFalse(message2.hasFooString()); | |
| 1358 assertEquals(message2.getFooString(), ""); | |
| 1359 assertEquals(message2.getFooStringBytes(), TestUtil.toBytes("")); | |
| 1360 | |
| 1361 // Get method should not change the oneof value. | |
| 1362 builder.setFooInt(123); | |
| 1363 assertEquals(builder.getFooString(), ""); | |
| 1364 assertEquals(builder.getFooStringBytes(), TestUtil.toBytes("")); | |
| 1365 assertEquals(123, builder.getFooInt()); | |
| 1366 | |
| 1367 message = builder.build(); | |
| 1368 assertEquals(message.getFooString(), ""); | |
| 1369 assertEquals(message.getFooStringBytes(), TestUtil.toBytes("")); | |
| 1370 assertEquals(123, message.getFooInt()); | |
| 1371 } | |
| 1372 | |
| 1373 // Cord | |
| 1374 { | |
| 1375 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1376 assertEquals(builder.getFooCord(), ""); | |
| 1377 builder.setFooCord("foo"); | |
| 1378 assertTrue(builder.hasFooCord()); | |
| 1379 assertEquals(builder.getFooCord(), "foo"); | |
| 1380 TestOneof2 message = builder.buildPartial(); | |
| 1381 assertTrue(message.hasFooCord()); | |
| 1382 assertEquals(message.getFooCord(), "foo"); | |
| 1383 assertEquals(message.getFooCordBytes(), TestUtil.toBytes("foo")); | |
| 1384 | |
| 1385 assertFalse(builder.clearFooCord().hasFooCord()); | |
| 1386 TestOneof2 message2 = builder.build(); | |
| 1387 assertFalse(message2.hasFooCord()); | |
| 1388 assertEquals(message2.getFooCord(), ""); | |
| 1389 assertEquals(message2.getFooCordBytes(), TestUtil.toBytes("")); | |
| 1390 } | |
| 1391 | |
| 1392 // StringPiece | |
| 1393 { | |
| 1394 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1395 assertEquals(builder.getFooStringPiece(), ""); | |
| 1396 builder.setFooStringPiece("foo"); | |
| 1397 assertTrue(builder.hasFooStringPiece()); | |
| 1398 assertEquals(builder.getFooStringPiece(), "foo"); | |
| 1399 TestOneof2 message = builder.buildPartial(); | |
| 1400 assertTrue(message.hasFooStringPiece()); | |
| 1401 assertEquals(message.getFooStringPiece(), "foo"); | |
| 1402 assertEquals(message.getFooStringPieceBytes(), TestUtil.toBytes("foo")); | |
| 1403 | |
| 1404 assertFalse(builder.clearFooStringPiece().hasFooStringPiece()); | |
| 1405 TestOneof2 message2 = builder.build(); | |
| 1406 assertFalse(message2.hasFooStringPiece()); | |
| 1407 assertEquals(message2.getFooStringPiece(), ""); | |
| 1408 assertEquals(message2.getFooStringPieceBytes(), TestUtil.toBytes("")); | |
| 1409 } | |
| 1410 | |
| 1411 // Message | |
| 1412 { | |
| 1413 // set | |
| 1414 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1415 assertEquals(builder.getFooMessage().getQuxInt(), 0); | |
| 1416 builder.setFooMessage( | |
| 1417 TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()); | |
| 1418 assertTrue(builder.hasFooMessage()); | |
| 1419 assertEquals(builder.getFooMessage().getQuxInt(), 234); | |
| 1420 TestOneof2 message = builder.buildPartial(); | |
| 1421 assertTrue(message.hasFooMessage()); | |
| 1422 assertEquals(message.getFooMessage().getQuxInt(), 234); | |
| 1423 | |
| 1424 // clear | |
| 1425 assertFalse(builder.clearFooMessage().hasFooString()); | |
| 1426 message = builder.build(); | |
| 1427 assertFalse(message.hasFooMessage()); | |
| 1428 assertEquals(message.getFooMessage().getQuxInt(), 0); | |
| 1429 | |
| 1430 // nested builder | |
| 1431 builder = TestOneof2.newBuilder(); | |
| 1432 assertSame(builder.getFooMessageOrBuilder(), | |
| 1433 TestOneof2.NestedMessage.getDefaultInstance()); | |
| 1434 assertFalse(builder.hasFooMessage()); | |
| 1435 builder.getFooMessageBuilder().setQuxInt(123); | |
| 1436 assertTrue(builder.hasFooMessage()); | |
| 1437 assertEquals(builder.getFooMessage().getQuxInt(), 123); | |
| 1438 message = builder.build(); | |
| 1439 assertTrue(message.hasFooMessage()); | |
| 1440 assertEquals(message.getFooMessage().getQuxInt(), 123); | |
| 1441 } | |
| 1442 | |
| 1443 // LazyMessage is tested in LazyMessageLiteTest.java | |
| 1444 } | |
| 1445 | |
| 1446 public void testOneofMerge() throws Exception { | |
| 1447 // Primitive Type | |
| 1448 { | |
| 1449 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1450 TestOneof2 message = builder.setFooInt(123).build(); | |
| 1451 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); | |
| 1452 assertTrue(message2.hasFooInt()); | |
| 1453 assertEquals(message2.getFooInt(), 123); | |
| 1454 } | |
| 1455 | |
| 1456 // String | |
| 1457 { | |
| 1458 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1459 TestOneof2 message = builder.setFooString("foo").build(); | |
| 1460 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); | |
| 1461 assertTrue(message2.hasFooString()); | |
| 1462 assertEquals(message2.getFooString(), "foo"); | |
| 1463 } | |
| 1464 | |
| 1465 // Enum | |
| 1466 { | |
| 1467 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1468 TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build()
; | |
| 1469 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); | |
| 1470 assertTrue(message2.hasFooEnum()); | |
| 1471 assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR); | |
| 1472 } | |
| 1473 | |
| 1474 // Message | |
| 1475 { | |
| 1476 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1477 TestOneof2 message = builder.setFooMessage( | |
| 1478 TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).build(); | |
| 1479 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); | |
| 1480 assertTrue(message2.hasFooMessage()); | |
| 1481 assertEquals(message2.getFooMessage().getQuxInt(), 234); | |
| 1482 } | |
| 1483 } | |
| 1484 | |
| 1485 public void testOneofSerialization() throws Exception { | |
| 1486 // Primitive Type | |
| 1487 { | |
| 1488 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1489 TestOneof2 message = builder.setFooInt(123).build(); | |
| 1490 ByteString serialized = message.toByteString(); | |
| 1491 TestOneof2 message2 = TestOneof2.parseFrom(serialized); | |
| 1492 assertTrue(message2.hasFooInt()); | |
| 1493 assertEquals(message2.getFooInt(), 123); | |
| 1494 } | |
| 1495 | |
| 1496 // String | |
| 1497 { | |
| 1498 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1499 TestOneof2 message = builder.setFooString("foo").build(); | |
| 1500 ByteString serialized = message.toByteString(); | |
| 1501 TestOneof2 message2 = TestOneof2.parseFrom(serialized); | |
| 1502 assertTrue(message2.hasFooString()); | |
| 1503 assertEquals(message2.getFooString(), "foo"); | |
| 1504 } | |
| 1505 | |
| 1506 // Enum | |
| 1507 { | |
| 1508 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1509 TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build()
; | |
| 1510 ByteString serialized = message.toByteString(); | |
| 1511 TestOneof2 message2 = TestOneof2.parseFrom(serialized); | |
| 1512 assertTrue(message2.hasFooEnum()); | |
| 1513 assertEquals(message2.getFooEnum(), TestOneof2.NestedEnum.BAR); | |
| 1514 } | |
| 1515 | |
| 1516 // Message | |
| 1517 { | |
| 1518 TestOneof2.Builder builder = TestOneof2.newBuilder(); | |
| 1519 TestOneof2 message = builder.setFooMessage( | |
| 1520 TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()).build(); | |
| 1521 ByteString serialized = message.toByteString(); | |
| 1522 TestOneof2 message2 = TestOneof2.parseFrom(serialized); | |
| 1523 assertTrue(message2.hasFooMessage()); | |
| 1524 assertEquals(message2.getFooMessage().getQuxInt(), 234); | |
| 1525 } | |
| 1526 } | |
| 1527 | |
| 1528 public void testOneofNestedBuilderOnChangePropagation() { | |
| 1529 NestedTestAllTypes.Builder parentBuilder = NestedTestAllTypes.newBuilder(); | |
| 1530 TestAllTypes.Builder builder = parentBuilder.getPayloadBuilder(); | |
| 1531 builder.getOneofNestedMessageBuilder(); | |
| 1532 assertTrue(builder.hasOneofNestedMessage()); | |
| 1533 assertTrue(parentBuilder.hasPayload()); | |
| 1534 NestedTestAllTypes message = parentBuilder.build(); | |
| 1535 assertTrue(message.hasPayload()); | |
| 1536 assertTrue(message.getPayload().hasOneofNestedMessage()); | |
| 1537 } | |
| 1538 | |
| 1539 public void testGetRepeatedFieldBuilder() { | |
| 1540 Descriptor descriptor = TestAllTypes.getDescriptor(); | |
| 1541 | |
| 1542 FieldDescriptor fieldDescriptor = | |
| 1543 descriptor.findFieldByName("repeated_nested_message"); | |
| 1544 FieldDescriptor foreignFieldDescriptor = | |
| 1545 descriptor.findFieldByName("repeated_foreign_message"); | |
| 1546 FieldDescriptor importFieldDescriptor = | |
| 1547 descriptor.findFieldByName("repeated_import_message"); | |
| 1548 | |
| 1549 // Mutate the message with new field builder | |
| 1550 // Mutate nested message | |
| 1551 TestAllTypes.Builder builder1 = TestAllTypes.newBuilder(); | |
| 1552 Message.Builder fieldBuilder1 = builder1.newBuilderForField( | |
| 1553 fieldDescriptor); | |
| 1554 FieldDescriptor subFieldDescriptor1 = | |
| 1555 fieldBuilder1.getDescriptorForType().findFieldByName("bb"); | |
| 1556 fieldBuilder1.setField(subFieldDescriptor1, 1); | |
| 1557 builder1.addRepeatedField(fieldDescriptor, fieldBuilder1.build()); | |
| 1558 | |
| 1559 // Mutate foreign message | |
| 1560 Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField( | |
| 1561 foreignFieldDescriptor); | |
| 1562 FieldDescriptor subForeignFieldDescriptor1 = | |
| 1563 foreignFieldBuilder1.getDescriptorForType().findFieldByName("c"); | |
| 1564 foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2); | |
| 1565 builder1.addRepeatedField(foreignFieldDescriptor, | |
| 1566 foreignFieldBuilder1.build()); | |
| 1567 | |
| 1568 // Mutate import message | |
| 1569 Message.Builder importFieldBuilder1 = builder1.newBuilderForField( | |
| 1570 importFieldDescriptor); | |
| 1571 FieldDescriptor subImportFieldDescriptor1 = | |
| 1572 importFieldBuilder1.getDescriptorForType().findFieldByName("d"); | |
| 1573 importFieldBuilder1.setField(subImportFieldDescriptor1, 3); | |
| 1574 builder1.addRepeatedField(importFieldDescriptor, | |
| 1575 importFieldBuilder1.build()); | |
| 1576 | |
| 1577 Message newMessage1 = builder1.build(); | |
| 1578 | |
| 1579 // Mutate the message with existing field builder | |
| 1580 // Mutate nested message | |
| 1581 TestAllTypes.Builder builder2 = TestAllTypes.newBuilder(); | |
| 1582 builder2.addRepeatedNestedMessageBuilder(); | |
| 1583 Message.Builder fieldBuilder2 = builder2.getRepeatedFieldBuilder( | |
| 1584 fieldDescriptor, 0); | |
| 1585 FieldDescriptor subFieldDescriptor2 = | |
| 1586 fieldBuilder2.getDescriptorForType().findFieldByName("bb"); | |
| 1587 fieldBuilder2.setField(subFieldDescriptor2, 1); | |
| 1588 | |
| 1589 // Mutate foreign message | |
| 1590 Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField( | |
| 1591 foreignFieldDescriptor); | |
| 1592 FieldDescriptor subForeignFieldDescriptor2 = | |
| 1593 foreignFieldBuilder2.getDescriptorForType().findFieldByName("c"); | |
| 1594 foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2); | |
| 1595 builder2.addRepeatedField(foreignFieldDescriptor, | |
| 1596 foreignFieldBuilder2.build()); | |
| 1597 | |
| 1598 // Mutate import message | |
| 1599 Message.Builder importFieldBuilder2 = builder2.newBuilderForField( | |
| 1600 importFieldDescriptor); | |
| 1601 FieldDescriptor subImportFieldDescriptor2 = | |
| 1602 importFieldBuilder2.getDescriptorForType().findFieldByName("d"); | |
| 1603 importFieldBuilder2.setField(subImportFieldDescriptor2, 3); | |
| 1604 builder2.addRepeatedField(importFieldDescriptor, | |
| 1605 importFieldBuilder2.build()); | |
| 1606 | |
| 1607 Message newMessage2 = builder2.build(); | |
| 1608 | |
| 1609 // These two messages should be equal. | |
| 1610 assertEquals(newMessage1, newMessage2); | |
| 1611 } | |
| 1612 | |
| 1613 public void testGetRepeatedFieldBuilderWithInitializedValue() { | |
| 1614 Descriptor descriptor = TestAllTypes.getDescriptor(); | |
| 1615 FieldDescriptor fieldDescriptor = | |
| 1616 descriptor.findFieldByName("repeated_nested_message"); | |
| 1617 | |
| 1618 // Before setting field, builder is initialized by default value. | |
| 1619 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 1620 builder.addRepeatedNestedMessageBuilder(); | |
| 1621 NestedMessage.Builder fieldBuilder = | |
| 1622 (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor,
0); | |
| 1623 assertEquals(0, fieldBuilder.getBb()); | |
| 1624 | |
| 1625 // Setting field value with new field builder instance. | |
| 1626 builder = TestAllTypes.newBuilder(); | |
| 1627 NestedMessage.Builder newFieldBuilder = | |
| 1628 builder.addRepeatedNestedMessageBuilder(); | |
| 1629 newFieldBuilder.setBb(2); | |
| 1630 // Then get the field builder instance by getRepeatedFieldBuilder(). | |
| 1631 fieldBuilder = | |
| 1632 (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor,
0); | |
| 1633 // It should contain new value. | |
| 1634 assertEquals(2, fieldBuilder.getBb()); | |
| 1635 // These two builder should be equal. | |
| 1636 assertSame(fieldBuilder, newFieldBuilder); | |
| 1637 } | |
| 1638 | |
| 1639 public void testGetRepeatedFieldBuilderNotSupportedException() { | |
| 1640 Descriptor descriptor = TestAllTypes.getDescriptor(); | |
| 1641 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 1642 try { | |
| 1643 builder.getRepeatedFieldBuilder(descriptor.findFieldByName("repeated_int32
"), 0); | |
| 1644 fail("Exception was not thrown"); | |
| 1645 } catch (UnsupportedOperationException e) { | |
| 1646 // We expect this exception. | |
| 1647 } | |
| 1648 try { | |
| 1649 builder.getRepeatedFieldBuilder( | |
| 1650 descriptor.findFieldByName("repeated_nested_enum"), 0); | |
| 1651 fail("Exception was not thrown"); | |
| 1652 } catch (UnsupportedOperationException e) { | |
| 1653 // We expect this exception. | |
| 1654 } | |
| 1655 try { | |
| 1656 builder.getRepeatedFieldBuilder(descriptor.findFieldByName("optional_int32
"), 0); | |
| 1657 fail("Exception was not thrown"); | |
| 1658 } catch (UnsupportedOperationException e) { | |
| 1659 // We expect this exception. | |
| 1660 } | |
| 1661 try { | |
| 1662 builder.getRepeatedFieldBuilder( | |
| 1663 descriptor.findFieldByName("optional_nested_enum"), 0); | |
| 1664 fail("Exception was not thrown"); | |
| 1665 } catch (UnsupportedOperationException e) { | |
| 1666 // We expect this exception. | |
| 1667 } | |
| 1668 try { | |
| 1669 builder.getRepeatedFieldBuilder( | |
| 1670 descriptor.findFieldByName("optional_nested_message"), 0); | |
| 1671 fail("Exception was not thrown"); | |
| 1672 } catch (UnsupportedOperationException e) { | |
| 1673 // We expect this exception. | |
| 1674 } | |
| 1675 } | |
| 1676 } | 961 } |
| OLD | NEW |