OLD | NEW |
| (Empty) |
1 // Protocol Buffers - Google's data interchange format | |
2 // Copyright 2008 Google Inc. All rights reserved. | |
3 // http://code.google.com/p/protobuf/ | |
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 protobuf_unittest.UnittestProto.TestAllExtensions; | |
34 import protobuf_unittest.UnittestProto.TestAllTypes; | |
35 import protobuf_unittest.UnittestProto.TestEmptyMessage; | |
36 import protobuf_unittest.UnittestProto.TestPackedTypes; | |
37 | |
38 import junit.framework.TestCase; | |
39 import java.util.Arrays; | |
40 | |
41 /** | |
42 * Unit test for {@link DynamicMessage}. See also {@link MessageTest}, which | |
43 * tests some {@link DynamicMessage} functionality. | |
44 * | |
45 * @author kenton@google.com Kenton Varda | |
46 */ | |
47 public class DynamicMessageTest extends TestCase { | |
48 TestUtil.ReflectionTester reflectionTester = | |
49 new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null); | |
50 | |
51 TestUtil.ReflectionTester extensionsReflectionTester = | |
52 new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(), | |
53 TestUtil.getExtensionRegistry()); | |
54 TestUtil.ReflectionTester packedReflectionTester = | |
55 new TestUtil.ReflectionTester(TestPackedTypes.getDescriptor(), null); | |
56 | |
57 public void testDynamicMessageAccessors() throws Exception { | |
58 Message.Builder builder = | |
59 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
60 reflectionTester.setAllFieldsViaReflection(builder); | |
61 Message message = builder.build(); | |
62 reflectionTester.assertAllFieldsSetViaReflection(message); | |
63 } | |
64 | |
65 public void testSettersAfterBuild() throws Exception { | |
66 Message.Builder builder = | |
67 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
68 Message firstMessage = builder.build(); | |
69 // double build() | |
70 builder.build(); | |
71 // clear() after build() | |
72 builder.clear(); | |
73 // setters after build() | |
74 reflectionTester.setAllFieldsViaReflection(builder); | |
75 Message message = builder.build(); | |
76 reflectionTester.assertAllFieldsSetViaReflection(message); | |
77 // repeated setters after build() | |
78 reflectionTester.modifyRepeatedFieldsViaReflection(builder); | |
79 message = builder.build(); | |
80 reflectionTester.assertRepeatedFieldsModifiedViaReflection(message); | |
81 // firstMessage shouldn't have been modified. | |
82 reflectionTester.assertClearViaReflection(firstMessage); | |
83 } | |
84 | |
85 public void testUnknownFields() throws Exception { | |
86 Message.Builder builder = | |
87 DynamicMessage.newBuilder(TestEmptyMessage.getDescriptor()); | |
88 builder.setUnknownFields(UnknownFieldSet.newBuilder() | |
89 .addField(1, UnknownFieldSet.Field.newBuilder().addVarint(1).build()) | |
90 .addField(2, UnknownFieldSet.Field.newBuilder().addFixed32(1).build()) | |
91 .build()); | |
92 Message message = builder.build(); | |
93 assertEquals(2, message.getUnknownFields().asMap().size()); | |
94 // clone() with unknown fields | |
95 Message.Builder newBuilder = builder.clone(); | |
96 assertEquals(2, newBuilder.getUnknownFields().asMap().size()); | |
97 // clear() with unknown fields | |
98 newBuilder.clear(); | |
99 assertTrue(newBuilder.getUnknownFields().asMap().isEmpty()); | |
100 // serialize/parse with unknown fields | |
101 newBuilder.mergeFrom(message.toByteString()); | |
102 assertEquals(2, newBuilder.getUnknownFields().asMap().size()); | |
103 } | |
104 | |
105 public void testDynamicMessageSettersRejectNull() throws Exception { | |
106 Message.Builder builder = | |
107 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
108 reflectionTester.assertReflectionSettersRejectNull(builder); | |
109 } | |
110 | |
111 public void testDynamicMessageExtensionAccessors() throws Exception { | |
112 // We don't need to extensively test DynamicMessage's handling of | |
113 // extensions because, frankly, it doesn't do anything special with them. | |
114 // It treats them just like any other fields. | |
115 Message.Builder builder = | |
116 DynamicMessage.newBuilder(TestAllExtensions.getDescriptor()); | |
117 extensionsReflectionTester.setAllFieldsViaReflection(builder); | |
118 Message message = builder.build(); | |
119 extensionsReflectionTester.assertAllFieldsSetViaReflection(message); | |
120 } | |
121 | |
122 public void testDynamicMessageExtensionSettersRejectNull() throws Exception { | |
123 Message.Builder builder = | |
124 DynamicMessage.newBuilder(TestAllExtensions.getDescriptor()); | |
125 extensionsReflectionTester.assertReflectionSettersRejectNull(builder); | |
126 } | |
127 | |
128 public void testDynamicMessageRepeatedSetters() throws Exception { | |
129 Message.Builder builder = | |
130 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
131 reflectionTester.setAllFieldsViaReflection(builder); | |
132 reflectionTester.modifyRepeatedFieldsViaReflection(builder); | |
133 Message message = builder.build(); | |
134 reflectionTester.assertRepeatedFieldsModifiedViaReflection(message); | |
135 } | |
136 | |
137 public void testDynamicMessageRepeatedSettersRejectNull() throws Exception { | |
138 Message.Builder builder = | |
139 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
140 reflectionTester.assertReflectionRepeatedSettersRejectNull(builder); | |
141 } | |
142 | |
143 public void testDynamicMessageDefaults() throws Exception { | |
144 reflectionTester.assertClearViaReflection( | |
145 DynamicMessage.getDefaultInstance(TestAllTypes.getDescriptor())); | |
146 reflectionTester.assertClearViaReflection( | |
147 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()).build()); | |
148 } | |
149 | |
150 public void testDynamicMessageSerializedSize() throws Exception { | |
151 TestAllTypes message = TestUtil.getAllSet(); | |
152 | |
153 Message.Builder dynamicBuilder = | |
154 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
155 reflectionTester.setAllFieldsViaReflection(dynamicBuilder); | |
156 Message dynamicMessage = dynamicBuilder.build(); | |
157 | |
158 assertEquals(message.getSerializedSize(), | |
159 dynamicMessage.getSerializedSize()); | |
160 } | |
161 | |
162 public void testDynamicMessageSerialization() throws Exception { | |
163 Message.Builder builder = | |
164 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
165 reflectionTester.setAllFieldsViaReflection(builder); | |
166 Message message = builder.build(); | |
167 | |
168 ByteString rawBytes = message.toByteString(); | |
169 TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes); | |
170 | |
171 TestUtil.assertAllFieldsSet(message2); | |
172 | |
173 // In fact, the serialized forms should be exactly the same, byte-for-byte. | |
174 assertEquals(TestUtil.getAllSet().toByteString(), rawBytes); | |
175 } | |
176 | |
177 public void testDynamicMessageParsing() throws Exception { | |
178 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
179 TestUtil.setAllFields(builder); | |
180 TestAllTypes message = builder.build(); | |
181 | |
182 ByteString rawBytes = message.toByteString(); | |
183 | |
184 Message message2 = | |
185 DynamicMessage.parseFrom(TestAllTypes.getDescriptor(), rawBytes); | |
186 reflectionTester.assertAllFieldsSetViaReflection(message2); | |
187 | |
188 // Test Parser interface. | |
189 Message message3 = message2.getParserForType().parseFrom(rawBytes); | |
190 reflectionTester.assertAllFieldsSetViaReflection(message3); | |
191 } | |
192 | |
193 public void testDynamicMessageExtensionParsing() throws Exception { | |
194 ByteString rawBytes = TestUtil.getAllExtensionsSet().toByteString(); | |
195 Message message = DynamicMessage.parseFrom( | |
196 TestAllExtensions.getDescriptor(), rawBytes, | |
197 TestUtil.getExtensionRegistry()); | |
198 extensionsReflectionTester.assertAllFieldsSetViaReflection(message); | |
199 | |
200 // Test Parser interface. | |
201 Message message2 = message.getParserForType().parseFrom( | |
202 rawBytes, TestUtil.getExtensionRegistry()); | |
203 extensionsReflectionTester.assertAllFieldsSetViaReflection(message2); | |
204 } | |
205 | |
206 public void testDynamicMessagePackedSerialization() throws Exception { | |
207 Message.Builder builder = | |
208 DynamicMessage.newBuilder(TestPackedTypes.getDescriptor()); | |
209 packedReflectionTester.setPackedFieldsViaReflection(builder); | |
210 Message message = builder.build(); | |
211 | |
212 ByteString rawBytes = message.toByteString(); | |
213 TestPackedTypes message2 = TestPackedTypes.parseFrom(rawBytes); | |
214 | |
215 TestUtil.assertPackedFieldsSet(message2); | |
216 | |
217 // In fact, the serialized forms should be exactly the same, byte-for-byte. | |
218 assertEquals(TestUtil.getPackedSet().toByteString(), rawBytes); | |
219 } | |
220 | |
221 public void testDynamicMessagePackedParsing() throws Exception { | |
222 TestPackedTypes.Builder builder = TestPackedTypes.newBuilder(); | |
223 TestUtil.setPackedFields(builder); | |
224 TestPackedTypes message = builder.build(); | |
225 | |
226 ByteString rawBytes = message.toByteString(); | |
227 | |
228 Message message2 = | |
229 DynamicMessage.parseFrom(TestPackedTypes.getDescriptor(), rawBytes); | |
230 packedReflectionTester.assertPackedFieldsSetViaReflection(message2); | |
231 | |
232 // Test Parser interface. | |
233 Message message3 = message2.getParserForType().parseFrom(rawBytes); | |
234 packedReflectionTester.assertPackedFieldsSetViaReflection(message3); | |
235 } | |
236 | |
237 public void testDynamicMessageCopy() throws Exception { | |
238 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
239 TestUtil.setAllFields(builder); | |
240 TestAllTypes message = builder.build(); | |
241 | |
242 DynamicMessage copy = DynamicMessage.newBuilder(message).build(); | |
243 reflectionTester.assertAllFieldsSetViaReflection(copy); | |
244 } | |
245 | |
246 public void testToBuilder() throws Exception { | |
247 DynamicMessage.Builder builder = | |
248 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
249 reflectionTester.setAllFieldsViaReflection(builder); | |
250 int unknownFieldNum = 9; | |
251 long unknownFieldVal = 90; | |
252 builder.setUnknownFields(UnknownFieldSet.newBuilder() | |
253 .addField(unknownFieldNum, | |
254 UnknownFieldSet.Field.newBuilder() | |
255 .addVarint(unknownFieldVal).build()) | |
256 .build()); | |
257 DynamicMessage message = builder.build(); | |
258 | |
259 DynamicMessage derived = message.toBuilder().build(); | |
260 reflectionTester.assertAllFieldsSetViaReflection(derived); | |
261 assertEquals(Arrays.asList(unknownFieldVal), | |
262 derived.getUnknownFields().getField(unknownFieldNum).getVarintList()); | |
263 } | |
264 } | |
OLD | NEW |