1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 4 // 5 // Redistribution and use in source and binary forms, with or without 6 // modification, are permitted provided that the following conditions are 7 // met: 8 // 9 // * Redistributions of source code must retain the above copyright 10 // notice, this list of conditions and the following disclaimer. 11 // * Redistributions in binary form must reproduce the above 12 // copyright notice, this list of conditions and the following disclaimer 13 // in the documentation and/or other materials provided with the 14 // distribution. 15 // * Neither the name of Google Inc. nor the names of its 16 // contributors may be used to endorse or promote products derived from 17 // this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 package com.google.protobuf; 32 33 import com.google.protobuf.UnittestLite.TestAllTypesLite; 34 import com.google.protobuf.UnittestLite.TestPackedExtensionsLite; 35 import com.google.protobuf.UnittestLite.TestParsingMergeLite; 36 import java.io.ByteArrayInputStream; 37 import java.io.ByteArrayOutputStream; 38 import java.io.InputStream; 39 import junit.framework.TestCase; 40 41 public class ParserLiteTest extends TestCase { assertRoundTripEquals(MessageLite message, ExtensionRegistryLite registry)42 private void assertRoundTripEquals(MessageLite message, ExtensionRegistryLite registry) 43 throws Exception { 44 final byte[] data = message.toByteArray(); 45 final int offset = 20; 46 final int length = data.length; 47 final int padding = 30; 48 Parser<? extends MessageLite> parser = message.getParserForType(); 49 assertEquals(message, parser.parseFrom(data, registry)); 50 assertEquals( 51 message, 52 parser.parseFrom(generatePaddingArray(data, offset, padding), offset, length, registry)); 53 assertEquals(message, parser.parseFrom(message.toByteString(), registry)); 54 assertEquals(message, parser.parseFrom(new ByteArrayInputStream(data), registry)); 55 assertEquals(message, parser.parseFrom(CodedInputStream.newInstance(data), registry)); 56 assertEquals( 57 message, parser.parseFrom(message.toByteString().asReadOnlyByteBuffer(), registry)); 58 } 59 60 @SuppressWarnings("unchecked") assertRoundTripEquals(MessageLite message)61 private void assertRoundTripEquals(MessageLite message) throws Exception { 62 final byte[] data = message.toByteArray(); 63 final int offset = 20; 64 final int length = data.length; 65 final int padding = 30; 66 67 Parser<MessageLite> parser = (Parser<MessageLite>) message.getParserForType(); 68 assertEquals(message, parser.parseFrom(data)); 69 assertEquals( 70 message, parser.parseFrom(generatePaddingArray(data, offset, padding), offset, length)); 71 assertEquals(message, parser.parseFrom(message.toByteString())); 72 assertEquals(message, parser.parseFrom(new ByteArrayInputStream(data))); 73 assertEquals(message, parser.parseFrom(CodedInputStream.newInstance(data))); 74 assertEquals(message, parser.parseFrom(message.toByteString().asReadOnlyByteBuffer())); 75 } 76 generatePaddingArray(byte[] data, int offset, int padding)77 private byte[] generatePaddingArray(byte[] data, int offset, int padding) { 78 byte[] result = new byte[offset + data.length + padding]; 79 System.arraycopy(data, 0, result, offset, data.length); 80 return result; 81 } 82 testParseExtensionsLite()83 public void testParseExtensionsLite() throws Exception { 84 assertRoundTripEquals( 85 TestUtilLite.getAllLiteExtensionsSet(), TestUtilLite.getExtensionRegistryLite()); 86 } 87 testParsePacked()88 public void testParsePacked() throws Exception { 89 assertRoundTripEquals(TestUtil.getPackedSet()); 90 assertRoundTripEquals(TestUtil.getPackedExtensionsSet(), TestUtil.getExtensionRegistry()); 91 } 92 testParsePackedLite()93 public void testParsePackedLite() throws Exception { 94 assertRoundTripEquals( 95 TestUtilLite.getLitePackedExtensionsSet(), TestUtilLite.getExtensionRegistryLite()); 96 } 97 testParseDelimitedToLite()98 public void testParseDelimitedToLite() throws Exception { 99 // Write MessageLite with packed extension fields. 100 TestPackedExtensionsLite packedMessage = TestUtilLite.getLitePackedExtensionsSet(); 101 ByteArrayOutputStream output = new ByteArrayOutputStream(); 102 packedMessage.writeDelimitedTo(output); 103 packedMessage.writeDelimitedTo(output); 104 105 InputStream input = new ByteArrayInputStream(output.toByteArray()); 106 assertEquals( 107 packedMessage, 108 packedMessage 109 .getParserForType() 110 .parseDelimitedFrom(input, TestUtilLite.getExtensionRegistryLite())); 111 assertEquals( 112 packedMessage, 113 packedMessage 114 .getParserForType() 115 .parseDelimitedFrom(input, TestUtilLite.getExtensionRegistryLite())); 116 } 117 118 /** Helper method for {@link #testParsingMergeLite()}. */ assertMessageMerged(TestAllTypesLite allTypes)119 private void assertMessageMerged(TestAllTypesLite allTypes) throws Exception { 120 assertEquals(3, allTypes.getOptionalInt32()); 121 assertEquals(2, allTypes.getOptionalInt64()); 122 assertEquals("hello", allTypes.getOptionalString()); 123 } 124 testParsingMergeLite()125 public void testParsingMergeLite() throws Exception { 126 // Build messages. 127 TestAllTypesLite.Builder builder = TestAllTypesLite.newBuilder(); 128 TestAllTypesLite msg1 = builder.setOptionalInt32(1).build(); 129 builder.clear(); 130 TestAllTypesLite msg2 = builder.setOptionalInt64(2).build(); 131 builder.clear(); 132 TestAllTypesLite msg3 = builder.setOptionalInt32(3).setOptionalString("hello").build(); 133 134 // Build groups. 135 TestParsingMergeLite.RepeatedFieldsGenerator.Group1 optionalG1 = 136 TestParsingMergeLite.RepeatedFieldsGenerator.Group1.newBuilder().setField1(msg1).build(); 137 TestParsingMergeLite.RepeatedFieldsGenerator.Group1 optionalG2 = 138 TestParsingMergeLite.RepeatedFieldsGenerator.Group1.newBuilder().setField1(msg2).build(); 139 TestParsingMergeLite.RepeatedFieldsGenerator.Group1 optionalG3 = 140 TestParsingMergeLite.RepeatedFieldsGenerator.Group1.newBuilder().setField1(msg3).build(); 141 TestParsingMergeLite.RepeatedFieldsGenerator.Group2 repeatedG1 = 142 TestParsingMergeLite.RepeatedFieldsGenerator.Group2.newBuilder().setField1(msg1).build(); 143 TestParsingMergeLite.RepeatedFieldsGenerator.Group2 repeatedG2 = 144 TestParsingMergeLite.RepeatedFieldsGenerator.Group2.newBuilder().setField1(msg2).build(); 145 TestParsingMergeLite.RepeatedFieldsGenerator.Group2 repeatedG3 = 146 TestParsingMergeLite.RepeatedFieldsGenerator.Group2.newBuilder().setField1(msg3).build(); 147 148 // Assign and serialize RepeatedFieldsGenerator. 149 ByteString data = 150 TestParsingMergeLite.RepeatedFieldsGenerator.newBuilder() 151 .addField1(msg1) 152 .addField1(msg2) 153 .addField1(msg3) 154 .addField2(msg1) 155 .addField2(msg2) 156 .addField2(msg3) 157 .addField3(msg1) 158 .addField3(msg2) 159 .addField3(msg3) 160 .addGroup1(optionalG1) 161 .addGroup1(optionalG2) 162 .addGroup1(optionalG3) 163 .addGroup2(repeatedG1) 164 .addGroup2(repeatedG2) 165 .addGroup2(repeatedG3) 166 .addExt1(msg1) 167 .addExt1(msg2) 168 .addExt1(msg3) 169 .addExt2(msg1) 170 .addExt2(msg2) 171 .addExt2(msg3) 172 .build() 173 .toByteString(); 174 175 // Parse TestParsingMergeLite. 176 ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance(); 177 UnittestLite.registerAllExtensions(registry); 178 TestParsingMergeLite parsingMerge = TestParsingMergeLite.parser().parseFrom(data, registry); 179 180 // Required and optional fields should be merged. 181 assertMessageMerged(parsingMerge.getRequiredAllTypes()); 182 assertMessageMerged(parsingMerge.getOptionalAllTypes()); 183 assertMessageMerged(parsingMerge.getOptionalGroup().getOptionalGroupAllTypes()); 184 assertMessageMerged(parsingMerge.getExtension(TestParsingMergeLite.optionalExt)); 185 186 // Repeated fields should not be merged. 187 assertEquals(3, parsingMerge.getRepeatedAllTypesCount()); 188 assertEquals(3, parsingMerge.getRepeatedGroupCount()); 189 assertEquals(3, parsingMerge.getExtensionCount(TestParsingMergeLite.repeatedExt)); 190 } 191 } 192