• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 //     * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 //     * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 package com.google.protobuf;
32 
33 import com.google.protobuf.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