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.EnumDescriptor; | |
34 import com.google.protobuf.Descriptors.FieldDescriptor; | |
35 import com.google.protobuf.Descriptors.OneofDescriptor; | |
36 import protobuf_unittest.UnittestProto.TestAllExtensions; | 34 import protobuf_unittest.UnittestProto.TestAllExtensions; |
37 import protobuf_unittest.UnittestProto.TestAllTypes; | 35 import protobuf_unittest.UnittestProto.TestAllTypes; |
38 import protobuf_unittest.UnittestProto.TestEmptyMessage; | 36 import protobuf_unittest.UnittestProto.TestEmptyMessage; |
39 import protobuf_unittest.UnittestProto.TestPackedTypes; | 37 import protobuf_unittest.UnittestProto.TestPackedTypes; |
40 | 38 |
41 import junit.framework.TestCase; | 39 import junit.framework.TestCase; |
42 | |
43 import java.util.Arrays; | 40 import java.util.Arrays; |
44 | 41 |
45 /** | 42 /** |
46 * Unit test for {@link DynamicMessage}. See also {@link MessageTest}, which | 43 * Unit test for {@link DynamicMessage}. See also {@link MessageTest}, which |
47 * tests some {@link DynamicMessage} functionality. | 44 * tests some {@link DynamicMessage} functionality. |
48 * | 45 * |
49 * @author kenton@google.com Kenton Varda | 46 * @author kenton@google.com Kenton Varda |
50 */ | 47 */ |
51 public class DynamicMessageTest extends TestCase { | 48 public class DynamicMessageTest extends TestCase { |
52 TestUtil.ReflectionTester reflectionTester = | 49 TestUtil.ReflectionTester reflectionTester = |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 packedReflectionTester.assertPackedFieldsSetViaReflection(message3); | 235 packedReflectionTester.assertPackedFieldsSetViaReflection(message3); |
239 } | 236 } |
240 | 237 |
241 public void testDynamicMessageCopy() throws Exception { | 238 public void testDynamicMessageCopy() throws Exception { |
242 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 239 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
243 TestUtil.setAllFields(builder); | 240 TestUtil.setAllFields(builder); |
244 TestAllTypes message = builder.build(); | 241 TestAllTypes message = builder.build(); |
245 | 242 |
246 DynamicMessage copy = DynamicMessage.newBuilder(message).build(); | 243 DynamicMessage copy = DynamicMessage.newBuilder(message).build(); |
247 reflectionTester.assertAllFieldsSetViaReflection(copy); | 244 reflectionTester.assertAllFieldsSetViaReflection(copy); |
248 | |
249 // Test oneof behavior | |
250 FieldDescriptor bytesField = | |
251 TestAllTypes.getDescriptor().findFieldByName("oneof_bytes"); | |
252 FieldDescriptor uint32Field = | |
253 TestAllTypes.getDescriptor().findFieldByName("oneof_uint32"); | |
254 assertTrue(copy.hasField(bytesField)); | |
255 assertFalse(copy.hasField(uint32Field)); | |
256 DynamicMessage copy2 = | |
257 DynamicMessage.newBuilder(message).setField(uint32Field, 123).build(); | |
258 assertFalse(copy2.hasField(bytesField)); | |
259 assertTrue(copy2.hasField(uint32Field)); | |
260 assertEquals(123, copy2.getField(uint32Field)); | |
261 } | 245 } |
262 | 246 |
263 public void testToBuilder() throws Exception { | 247 public void testToBuilder() throws Exception { |
264 DynamicMessage.Builder builder = | 248 DynamicMessage.Builder builder = |
265 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | 249 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); |
266 reflectionTester.setAllFieldsViaReflection(builder); | 250 reflectionTester.setAllFieldsViaReflection(builder); |
267 int unknownFieldNum = 9; | 251 int unknownFieldNum = 9; |
268 long unknownFieldVal = 90; | 252 long unknownFieldVal = 90; |
269 builder.setUnknownFields(UnknownFieldSet.newBuilder() | 253 builder.setUnknownFields(UnknownFieldSet.newBuilder() |
270 .addField(unknownFieldNum, | 254 .addField(unknownFieldNum, |
271 UnknownFieldSet.Field.newBuilder() | 255 UnknownFieldSet.Field.newBuilder() |
272 .addVarint(unknownFieldVal).build()) | 256 .addVarint(unknownFieldVal).build()) |
273 .build()); | 257 .build()); |
274 DynamicMessage message = builder.build(); | 258 DynamicMessage message = builder.build(); |
275 | 259 |
276 DynamicMessage derived = message.toBuilder().build(); | 260 DynamicMessage derived = message.toBuilder().build(); |
277 reflectionTester.assertAllFieldsSetViaReflection(derived); | 261 reflectionTester.assertAllFieldsSetViaReflection(derived); |
278 assertEquals(Arrays.asList(unknownFieldVal), | 262 assertEquals(Arrays.asList(unknownFieldVal), |
279 derived.getUnknownFields().getField(unknownFieldNum).getVarintList()); | 263 derived.getUnknownFields().getField(unknownFieldNum).getVarintList()); |
280 } | 264 } |
281 | |
282 public void testDynamicOneofMessage() throws Exception { | |
283 DynamicMessage.Builder builder = | |
284 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
285 OneofDescriptor oneof = TestAllTypes.getDescriptor().getOneofs().get(0); | |
286 assertFalse(builder.hasOneof(oneof)); | |
287 assertSame(null, builder.getOneofFieldDescriptor(oneof)); | |
288 | |
289 reflectionTester.setAllFieldsViaReflection(builder); | |
290 assertTrue(builder.hasOneof(oneof)); | |
291 FieldDescriptor field = oneof.getField(3); | |
292 assertSame(field, builder.getOneofFieldDescriptor(oneof)); | |
293 | |
294 DynamicMessage message = builder.buildPartial(); | |
295 assertTrue(message.hasOneof(oneof)); | |
296 | |
297 DynamicMessage.Builder mergedBuilder = | |
298 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
299 FieldDescriptor mergedField = oneof.getField(0); | |
300 mergedBuilder.setField(mergedField, 123); | |
301 assertTrue(mergedBuilder.hasField(mergedField)); | |
302 mergedBuilder.mergeFrom(message); | |
303 assertTrue(mergedBuilder.hasField(field)); | |
304 assertFalse(mergedBuilder.hasField(mergedField)); | |
305 | |
306 builder.clearOneof(oneof); | |
307 assertSame(null, builder.getOneofFieldDescriptor(oneof)); | |
308 message = builder.build(); | |
309 assertSame(null, message.getOneofFieldDescriptor(oneof)); | |
310 } | |
311 | |
312 // Regression test for a bug that makes setField() not work for repeated | |
313 // enum fields. | |
314 public void testSettersForRepeatedEnumField() throws Exception { | |
315 DynamicMessage.Builder builder = | |
316 DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); | |
317 FieldDescriptor repeatedEnumField = | |
318 TestAllTypes.getDescriptor().findFieldByName( | |
319 "repeated_nested_enum"); | |
320 EnumDescriptor enumDescriptor = TestAllTypes.NestedEnum.getDescriptor(); | |
321 builder.setField(repeatedEnumField, enumDescriptor.getValues()); | |
322 DynamicMessage message = builder.build(); | |
323 assertEquals( | |
324 enumDescriptor.getValues(), message.getField(repeatedEnumField)); | |
325 } | |
326 } | 265 } |
OLD | NEW |