| 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 protobuf_unittest.UnittestProto; | 34 import protobuf_unittest.UnittestProto; |
| 34 import protobuf_unittest.UnittestProto.ForeignEnum; | |
| 35 import protobuf_unittest.UnittestProto.TestAllExtensions; | 35 import protobuf_unittest.UnittestProto.TestAllExtensions; |
| 36 import protobuf_unittest.UnittestProto.TestAllTypes; | 36 import protobuf_unittest.UnittestProto.TestAllTypes; |
| 37 import protobuf_unittest.UnittestProto.TestEmptyMessage; | 37 import protobuf_unittest.UnittestProto.TestEmptyMessage; |
| 38 import protobuf_unittest.UnittestProto.TestEmptyMessageWithExtensions; | 38 import protobuf_unittest.UnittestProto.TestEmptyMessageWithExtensions; |
| 39 import protobuf_unittest.UnittestProto.TestPackedExtensions; | |
| 40 import protobuf_unittest.UnittestProto.TestPackedTypes; | |
| 41 | 39 |
| 42 import junit.framework.TestCase; | 40 import junit.framework.TestCase; |
| 43 | 41 |
| 44 import java.util.Arrays; | 42 import java.util.Arrays; |
| 45 import java.util.Map; | 43 import java.util.Map; |
| 46 | 44 |
| 47 /** | 45 /** |
| 48 * Tests related to unknown field handling. | 46 * Tests related to unknown field handling. |
| 49 * | 47 * |
| 50 * @author kenton@google.com (Kenton Varda) | 48 * @author kenton@google.com (Kenton Varda) |
| 51 */ | 49 */ |
| 52 public class UnknownFieldSetTest extends TestCase { | 50 public class UnknownFieldSetTest extends TestCase { |
| 53 @Override | |
| 54 public void setUp() throws Exception { | 51 public void setUp() throws Exception { |
| 55 descriptor = TestAllTypes.getDescriptor(); | 52 descriptor = TestAllTypes.getDescriptor(); |
| 56 allFields = TestUtil.getAllSet(); | 53 allFields = TestUtil.getAllSet(); |
| 57 allFieldsData = allFields.toByteString(); | 54 allFieldsData = allFields.toByteString(); |
| 58 emptyMessage = TestEmptyMessage.parseFrom(allFieldsData); | 55 emptyMessage = TestEmptyMessage.parseFrom(allFieldsData); |
| 59 unknownFields = emptyMessage.getUnknownFields(); | 56 unknownFields = emptyMessage.getUnknownFields(); |
| 60 } | 57 } |
| 61 | 58 |
| 62 UnknownFieldSet.Field getField(String name) { | 59 UnknownFieldSet.Field getField(String name) { |
| 63 Descriptors.FieldDescriptor field = descriptor.findFieldByName(name); | 60 Descriptors.FieldDescriptor field = descriptor.findFieldByName(name); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 UnknownFieldSet fields = | 198 UnknownFieldSet fields = |
| 202 UnknownFieldSet.newBuilder().mergeFrom(unknownFields).clear().build(); | 199 UnknownFieldSet.newBuilder().mergeFrom(unknownFields).clear().build(); |
| 203 assertTrue(fields.asMap().isEmpty()); | 200 assertTrue(fields.asMap().isEmpty()); |
| 204 } | 201 } |
| 205 | 202 |
| 206 public void testClearMessage() throws Exception { | 203 public void testClearMessage() throws Exception { |
| 207 TestEmptyMessage message = | 204 TestEmptyMessage message = |
| 208 TestEmptyMessage.newBuilder().mergeFrom(emptyMessage).clear().build(); | 205 TestEmptyMessage.newBuilder().mergeFrom(emptyMessage).clear().build(); |
| 209 assertEquals(0, message.getSerializedSize()); | 206 assertEquals(0, message.getSerializedSize()); |
| 210 } | 207 } |
| 211 | |
| 212 public void testClearField() throws Exception { | |
| 213 int fieldNumber = unknownFields.asMap().keySet().iterator().next(); | |
| 214 UnknownFieldSet fields = | |
| 215 UnknownFieldSet.newBuilder().mergeFrom(unknownFields).clearField(fieldNu
mber).build(); | |
| 216 assertFalse(fields.hasField(fieldNumber)); | |
| 217 } | |
| 218 | 208 |
| 219 public void testParseKnownAndUnknown() throws Exception { | 209 public void testParseKnownAndUnknown() throws Exception { |
| 220 // Test mixing known and unknown fields when parsing. | 210 // Test mixing known and unknown fields when parsing. |
| 221 | 211 |
| 222 UnknownFieldSet fields = | 212 UnknownFieldSet fields = |
| 223 UnknownFieldSet.newBuilder(unknownFields) | 213 UnknownFieldSet.newBuilder(unknownFields) |
| 224 .addField(123456, | 214 .addField(123456, |
| 225 UnknownFieldSet.Field.newBuilder().addVarint(654321).build()) | 215 UnknownFieldSet.Field.newBuilder().addVarint(654321).build()) |
| 226 .build(); | 216 .build(); |
| 227 | 217 |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 private void checkEqualsIsConsistent(UnknownFieldSet set) { | 428 private void checkEqualsIsConsistent(UnknownFieldSet set) { |
| 439 // Object should be equal to itself. | 429 // Object should be equal to itself. |
| 440 assertEquals(set, set); | 430 assertEquals(set, set); |
| 441 | 431 |
| 442 // Object should be equal to a copy of itself. | 432 // Object should be equal to a copy of itself. |
| 443 UnknownFieldSet copy = UnknownFieldSet.newBuilder(set).build(); | 433 UnknownFieldSet copy = UnknownFieldSet.newBuilder(set).build(); |
| 444 assertEquals(set, copy); | 434 assertEquals(set, copy); |
| 445 assertEquals(copy, set); | 435 assertEquals(copy, set); |
| 446 assertEquals(set.hashCode(), copy.hashCode()); | 436 assertEquals(set.hashCode(), copy.hashCode()); |
| 447 } | 437 } |
| 448 | |
| 449 // ================================================================= | |
| 450 | |
| 451 public void testSerializeLite() throws Exception { | |
| 452 UnittestLite.TestEmptyMessageLite emptyMessageLite = | |
| 453 UnittestLite.TestEmptyMessageLite.parseFrom(allFieldsData); | |
| 454 assertEquals(allFieldsData.size(), emptyMessageLite.getSerializedSize()); | |
| 455 ByteString data = emptyMessageLite.toByteString(); | |
| 456 TestAllTypes message = TestAllTypes.parseFrom(data); | |
| 457 TestUtil.assertAllFieldsSet(message); | |
| 458 assertEquals(allFieldsData, data); | |
| 459 } | |
| 460 | |
| 461 public void testAllExtensionsLite() throws Exception { | |
| 462 TestAllExtensions allExtensions = TestUtil.getAllExtensionsSet(); | |
| 463 ByteString allExtensionsData = allExtensions.toByteString(); | |
| 464 UnittestLite.TestEmptyMessageLite emptyMessageLite = | |
| 465 UnittestLite.TestEmptyMessageLite.parser().parseFrom(allExtensionsData); | |
| 466 ByteString data = emptyMessageLite.toByteString(); | |
| 467 TestAllExtensions message = | |
| 468 TestAllExtensions.parseFrom(data, TestUtil.getExtensionRegistry()); | |
| 469 TestUtil.assertAllExtensionsSet(message); | |
| 470 assertEquals(allExtensionsData, data); | |
| 471 } | |
| 472 | |
| 473 public void testAllPackedFieldsLite() throws Exception { | |
| 474 TestPackedTypes allPackedFields = TestUtil.getPackedSet(); | |
| 475 ByteString allPackedData = allPackedFields.toByteString(); | |
| 476 UnittestLite.TestEmptyMessageLite emptyMessageLite = | |
| 477 UnittestLite.TestEmptyMessageLite.parseFrom(allPackedData); | |
| 478 ByteString data = emptyMessageLite.toByteString(); | |
| 479 TestPackedTypes message = | |
| 480 TestPackedTypes.parseFrom(data, TestUtil.getExtensionRegistry()); | |
| 481 TestUtil.assertPackedFieldsSet(message); | |
| 482 assertEquals(allPackedData, data); | |
| 483 } | |
| 484 | |
| 485 public void testAllPackedExtensionsLite() throws Exception { | |
| 486 TestPackedExtensions allPackedExtensions = TestUtil.getPackedExtensionsSet()
; | |
| 487 ByteString allPackedExtensionsData = allPackedExtensions.toByteString(); | |
| 488 UnittestLite.TestEmptyMessageLite emptyMessageLite = | |
| 489 UnittestLite.TestEmptyMessageLite.parseFrom(allPackedExtensionsData); | |
| 490 ByteString data = emptyMessageLite.toByteString(); | |
| 491 TestPackedExtensions message = | |
| 492 TestPackedExtensions.parseFrom(data, TestUtil.getExtensionRegistry()); | |
| 493 TestUtil.assertPackedExtensionsSet(message); | |
| 494 assertEquals(allPackedExtensionsData, data); | |
| 495 } | |
| 496 | |
| 497 public void testCopyFromLite() throws Exception { | |
| 498 UnittestLite.TestEmptyMessageLite emptyMessageLite = | |
| 499 UnittestLite.TestEmptyMessageLite.parseFrom(allFieldsData); | |
| 500 UnittestLite.TestEmptyMessageLite emptyMessageLite2 = | |
| 501 UnittestLite.TestEmptyMessageLite.newBuilder() | |
| 502 .mergeFrom(emptyMessageLite).build(); | |
| 503 assertEquals(emptyMessageLite.toByteString(), emptyMessageLite2.toByteString
()); | |
| 504 } | |
| 505 | |
| 506 public void testMergeFromLite() throws Exception { | |
| 507 TestAllTypes message1 = TestAllTypes.newBuilder() | |
| 508 .setOptionalInt32(1) | |
| 509 .setOptionalString("foo") | |
| 510 .addRepeatedString("bar") | |
| 511 .setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ) | |
| 512 .build(); | |
| 513 | |
| 514 TestAllTypes message2 = TestAllTypes.newBuilder() | |
| 515 .setOptionalInt64(2) | |
| 516 .setOptionalString("baz") | |
| 517 .addRepeatedString("qux") | |
| 518 .setOptionalForeignEnum(ForeignEnum.FOREIGN_BAZ) | |
| 519 .build(); | |
| 520 | |
| 521 ByteString data1 = message1.toByteString(); | |
| 522 UnittestLite.TestEmptyMessageLite emptyMessageLite1 = | |
| 523 UnittestLite.TestEmptyMessageLite.parseFrom(data1); | |
| 524 ByteString data2 = message2.toByteString(); | |
| 525 UnittestLite.TestEmptyMessageLite emptyMessageLite2 = | |
| 526 UnittestLite.TestEmptyMessageLite.parseFrom(data2); | |
| 527 | |
| 528 message1 = TestAllTypes.newBuilder(message1).mergeFrom(message2).build(); | |
| 529 emptyMessageLite1 = UnittestLite.TestEmptyMessageLite.newBuilder(emptyMessag
eLite1) | |
| 530 .mergeFrom(emptyMessageLite2).build(); | |
| 531 | |
| 532 data1 = emptyMessageLite1.toByteString(); | |
| 533 message2 = TestAllTypes.parseFrom(data1); | |
| 534 | |
| 535 assertEquals(message1, message2); | |
| 536 } | |
| 537 | |
| 538 public void testWrongTypeTreatedAsUnknownLite() throws Exception { | |
| 539 // Test that fields of the wrong wire type are treated like unknown fields | |
| 540 // when parsing. | |
| 541 | |
| 542 ByteString bizarroData = getBizarroData(); | |
| 543 TestAllTypes allTypesMessage = TestAllTypes.parseFrom(bizarroData); | |
| 544 UnittestLite.TestEmptyMessageLite emptyMessageLite = | |
| 545 UnittestLite.TestEmptyMessageLite.parseFrom(bizarroData); | |
| 546 ByteString data = emptyMessageLite.toByteString(); | |
| 547 TestAllTypes allTypesMessage2 = TestAllTypes.parseFrom(data); | |
| 548 | |
| 549 assertEquals(allTypesMessage.toString(), allTypesMessage2.toString()); | |
| 550 } | |
| 551 | |
| 552 public void testUnknownExtensionsLite() throws Exception { | |
| 553 // Make sure fields are properly parsed to the UnknownFieldSet even when | |
| 554 // they are declared as extension numbers. | |
| 555 | |
| 556 UnittestLite.TestEmptyMessageWithExtensionsLite message = | |
| 557 UnittestLite.TestEmptyMessageWithExtensionsLite.parseFrom(allFieldsData); | |
| 558 | |
| 559 assertEquals(allFieldsData, message.toByteString()); | |
| 560 } | |
| 561 | |
| 562 public void testWrongExtensionTypeTreatedAsUnknownLite() throws Exception { | |
| 563 // Test that fields of the wrong wire type are treated like unknown fields | |
| 564 // when parsing extensions. | |
| 565 | |
| 566 ByteString bizarroData = getBizarroData(); | |
| 567 TestAllExtensions allExtensionsMessage = | |
| 568 TestAllExtensions.parseFrom(bizarroData); | |
| 569 UnittestLite.TestEmptyMessageLite emptyMessageLite = | |
| 570 UnittestLite.TestEmptyMessageLite.parseFrom(bizarroData); | |
| 571 | |
| 572 // All fields should have been interpreted as unknown, so the byte strings | |
| 573 // should be the same. | |
| 574 assertEquals(emptyMessageLite.toByteString(), | |
| 575 allExtensionsMessage.toByteString()); | |
| 576 } | |
| 577 | |
| 578 public void testParseUnknownEnumValueLite() throws Exception { | |
| 579 Descriptors.FieldDescriptor singularField = | |
| 580 TestAllTypes.getDescriptor().findFieldByName("optional_nested_enum"); | |
| 581 Descriptors.FieldDescriptor repeatedField = | |
| 582 TestAllTypes.getDescriptor().findFieldByName("repeated_nested_enum"); | |
| 583 assertNotNull(singularField); | |
| 584 assertNotNull(repeatedField); | |
| 585 | |
| 586 ByteString data = | |
| 587 UnknownFieldSet.newBuilder() | |
| 588 .addField(singularField.getNumber(), | |
| 589 UnknownFieldSet.Field.newBuilder() | |
| 590 .addVarint(TestAllTypes.NestedEnum.BAR.getNumber()) | |
| 591 .addVarint(5) // not valid | |
| 592 .build()) | |
| 593 .addField(repeatedField.getNumber(), | |
| 594 UnknownFieldSet.Field.newBuilder() | |
| 595 .addVarint(TestAllTypes.NestedEnum.FOO.getNumber()) | |
| 596 .addVarint(4) // not valid | |
| 597 .addVarint(TestAllTypes.NestedEnum.BAZ.getNumber()) | |
| 598 .addVarint(6) // not valid | |
| 599 .build()) | |
| 600 .build() | |
| 601 .toByteString(); | |
| 602 | |
| 603 UnittestLite.TestEmptyMessageLite emptyMessageLite = | |
| 604 UnittestLite.TestEmptyMessageLite.parseFrom(data); | |
| 605 data = emptyMessageLite.toByteString(); | |
| 606 | |
| 607 { | |
| 608 TestAllTypes message = TestAllTypes.parseFrom(data); | |
| 609 assertEquals(TestAllTypes.NestedEnum.BAR, | |
| 610 message.getOptionalNestedEnum()); | |
| 611 assertEquals( | |
| 612 Arrays.asList(TestAllTypes.NestedEnum.FOO, TestAllTypes.NestedEnum.BAZ), | |
| 613 message.getRepeatedNestedEnumList()); | |
| 614 assertEquals(Arrays.asList(5L), | |
| 615 message.getUnknownFields() | |
| 616 .getField(singularField.getNumber()) | |
| 617 .getVarintList()); | |
| 618 assertEquals(Arrays.asList(4L, 6L), | |
| 619 message.getUnknownFields() | |
| 620 .getField(repeatedField.getNumber()) | |
| 621 .getVarintList()); | |
| 622 } | |
| 623 | |
| 624 { | |
| 625 TestAllExtensions message = | |
| 626 TestAllExtensions.parseFrom(data, TestUtil.getExtensionRegistry()); | |
| 627 assertEquals(TestAllTypes.NestedEnum.BAR, | |
| 628 message.getExtension(UnittestProto.optionalNestedEnumExtension)); | |
| 629 assertEquals( | |
| 630 Arrays.asList(TestAllTypes.NestedEnum.FOO, TestAllTypes.NestedEnum.BAZ), | |
| 631 message.getExtension(UnittestProto.repeatedNestedEnumExtension)); | |
| 632 assertEquals(Arrays.asList(5L), | |
| 633 message.getUnknownFields() | |
| 634 .getField(singularField.getNumber()) | |
| 635 .getVarintList()); | |
| 636 assertEquals(Arrays.asList(4L, 6L), | |
| 637 message.getUnknownFields() | |
| 638 .getField(repeatedField.getNumber()) | |
| 639 .getVarintList()); | |
| 640 } | |
| 641 } | |
| 642 | |
| 643 public void testClearLite() throws Exception { | |
| 644 UnittestLite.TestEmptyMessageLite emptyMessageLite1 = | |
| 645 UnittestLite.TestEmptyMessageLite.parseFrom(allFieldsData); | |
| 646 UnittestLite.TestEmptyMessageLite emptyMessageLite2 = | |
| 647 UnittestLite.TestEmptyMessageLite.newBuilder() | |
| 648 .mergeFrom(emptyMessageLite1).clear().build(); | |
| 649 assertEquals(0, emptyMessageLite2.getSerializedSize()); | |
| 650 ByteString data = emptyMessageLite2.toByteString(); | |
| 651 assertEquals(0, data.size()); | |
| 652 } | |
| 653 | |
| 654 } | 438 } |
| OLD | NEW |