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.Descriptors.Descriptor; 34 import com.google.protobuf.Descriptors.FieldDescriptor; 35 import com.google.protobuf.test.UnittestImport; 36 import protobuf_unittest.EnumWithNoOuter; 37 import protobuf_unittest.MessageWithNoOuter; 38 import protobuf_unittest.MultipleFilesTestProto; 39 import protobuf_unittest.NestedExtension.MyNestedExtension; 40 import protobuf_unittest.NonNestedExtension; 41 import protobuf_unittest.NonNestedExtension.MessageToBeExtended; 42 import protobuf_unittest.NonNestedExtension.MyNonNestedExtension; 43 import protobuf_unittest.OuterClassNameTest2OuterClass; 44 import protobuf_unittest.OuterClassNameTest3OuterClass; 45 import protobuf_unittest.OuterClassNameTestOuterClass; 46 import protobuf_unittest.ServiceWithNoOuter; 47 import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize; 48 import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize; 49 import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize; 50 import protobuf_unittest.UnittestProto; 51 import protobuf_unittest.UnittestProto.ForeignEnum; 52 import protobuf_unittest.UnittestProto.ForeignMessage; 53 import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder; 54 import protobuf_unittest.UnittestProto.NestedTestAllTypes; 55 import protobuf_unittest.UnittestProto.TestAllExtensions; 56 import protobuf_unittest.UnittestProto.TestAllTypes; 57 import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage; 58 import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; 59 import protobuf_unittest.UnittestProto.TestExtremeDefaultValues; 60 import protobuf_unittest.UnittestProto.TestOneof2; 61 import protobuf_unittest.UnittestProto.TestPackedTypes; 62 import protobuf_unittest.UnittestProto.TestUnpackedTypes; 63 import java.io.ByteArrayInputStream; 64 import java.io.ByteArrayOutputStream; 65 import java.io.ObjectInputStream; 66 import java.io.ObjectOutputStream; 67 import java.util.Arrays; 68 import java.util.Collections; 69 import java.util.Iterator; 70 import java.util.List; 71 import junit.framework.TestCase; 72 73 /** 74 * Unit test for generated messages and generated code. See also {@link MessageTest}, which tests 75 * some generated message functionality. 76 * 77 * @author kenton@google.com Kenton Varda 78 */ 79 public class GeneratedMessageTest extends TestCase { 80 TestUtil.ReflectionTester reflectionTester = 81 new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null); 82 testDefaultInstance()83 public void testDefaultInstance() throws Exception { 84 assertSame( 85 TestAllTypes.getDefaultInstance(), 86 TestAllTypes.getDefaultInstance().getDefaultInstanceForType()); 87 assertSame( 88 TestAllTypes.getDefaultInstance(), TestAllTypes.newBuilder().getDefaultInstanceForType()); 89 } 90 testMessageOrBuilder()91 public void testMessageOrBuilder() throws Exception { 92 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 93 TestUtil.setAllFields(builder); 94 TestAllTypes message = builder.build(); 95 TestUtil.assertAllFieldsSet(message); 96 } 97 testUsingBuilderMultipleTimes()98 public void testUsingBuilderMultipleTimes() throws Exception { 99 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 100 // primitive field scalar and repeated 101 builder.setOptionalSfixed64(100); 102 builder.addRepeatedInt32(100); 103 // enum field scalar and repeated 104 builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); 105 builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); 106 // proto field scalar and repeated 107 builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(1)); 108 builder.addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(1)); 109 110 TestAllTypes value1 = builder.build(); 111 112 assertEquals(100, value1.getOptionalSfixed64()); 113 assertEquals(100, value1.getRepeatedInt32(0)); 114 assertEquals(UnittestImport.ImportEnum.IMPORT_BAR, value1.getOptionalImportEnum()); 115 assertEquals(UnittestImport.ImportEnum.IMPORT_BAR, value1.getRepeatedImportEnum(0)); 116 assertEquals(1, value1.getOptionalForeignMessage().getC()); 117 assertEquals(1, value1.getRepeatedForeignMessage(0).getC()); 118 119 // Make sure that builder didn't update previously created values 120 builder.setOptionalSfixed64(200); 121 builder.setRepeatedInt32(0, 200); 122 builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_FOO); 123 builder.setRepeatedImportEnum(0, UnittestImport.ImportEnum.IMPORT_FOO); 124 builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(2)); 125 builder.setRepeatedForeignMessage(0, ForeignMessage.newBuilder().setC(2)); 126 127 TestAllTypes value2 = builder.build(); 128 129 // Make sure value1 didn't change. 130 assertEquals(100, value1.getOptionalSfixed64()); 131 assertEquals(100, value1.getRepeatedInt32(0)); 132 assertEquals(UnittestImport.ImportEnum.IMPORT_BAR, value1.getOptionalImportEnum()); 133 assertEquals(UnittestImport.ImportEnum.IMPORT_BAR, value1.getRepeatedImportEnum(0)); 134 assertEquals(1, value1.getOptionalForeignMessage().getC()); 135 assertEquals(1, value1.getRepeatedForeignMessage(0).getC()); 136 137 // Make sure value2 is correct 138 assertEquals(200, value2.getOptionalSfixed64()); 139 assertEquals(200, value2.getRepeatedInt32(0)); 140 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, value2.getOptionalImportEnum()); 141 assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, value2.getRepeatedImportEnum(0)); 142 assertEquals(2, value2.getOptionalForeignMessage().getC()); 143 assertEquals(2, value2.getRepeatedForeignMessage(0).getC()); 144 } 145 testProtosShareRepeatedArraysIfDidntChange()146 public void testProtosShareRepeatedArraysIfDidntChange() throws Exception { 147 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 148 builder.addRepeatedInt32(100); 149 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); 150 151 TestAllTypes value1 = builder.build(); 152 TestAllTypes value2 = value1.toBuilder().build(); 153 154 assertSame(value1.getRepeatedInt32List(), value2.getRepeatedInt32List()); 155 assertSame(value1.getRepeatedForeignMessageList(), value2.getRepeatedForeignMessageList()); 156 } 157 testRepeatedArraysAreImmutable()158 public void testRepeatedArraysAreImmutable() throws Exception { 159 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 160 builder.addRepeatedInt32(100); 161 builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); 162 builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); 163 assertIsUnmodifiable(builder.getRepeatedInt32List()); 164 assertIsUnmodifiable(builder.getRepeatedImportEnumList()); 165 assertIsUnmodifiable(builder.getRepeatedForeignMessageList()); 166 assertIsUnmodifiable(builder.getRepeatedFloatList()); 167 168 TestAllTypes value = builder.build(); 169 assertIsUnmodifiable(value.getRepeatedInt32List()); 170 assertIsUnmodifiable(value.getRepeatedImportEnumList()); 171 assertIsUnmodifiable(value.getRepeatedForeignMessageList()); 172 assertIsUnmodifiable(value.getRepeatedFloatList()); 173 } 174 testParsedMessagesAreImmutable()175 public void testParsedMessagesAreImmutable() throws Exception { 176 TestAllTypes value = TestAllTypes.parser().parseFrom(TestUtil.getAllSet().toByteString()); 177 assertIsUnmodifiable(value.getRepeatedInt32List()); 178 assertIsUnmodifiable(value.getRepeatedInt64List()); 179 assertIsUnmodifiable(value.getRepeatedUint32List()); 180 assertIsUnmodifiable(value.getRepeatedUint64List()); 181 assertIsUnmodifiable(value.getRepeatedSint32List()); 182 assertIsUnmodifiable(value.getRepeatedSint64List()); 183 assertIsUnmodifiable(value.getRepeatedFixed32List()); 184 assertIsUnmodifiable(value.getRepeatedFixed64List()); 185 assertIsUnmodifiable(value.getRepeatedSfixed32List()); 186 assertIsUnmodifiable(value.getRepeatedSfixed64List()); 187 assertIsUnmodifiable(value.getRepeatedFloatList()); 188 assertIsUnmodifiable(value.getRepeatedDoubleList()); 189 assertIsUnmodifiable(value.getRepeatedBoolList()); 190 assertIsUnmodifiable(value.getRepeatedStringList()); 191 assertIsUnmodifiable(value.getRepeatedBytesList()); 192 assertIsUnmodifiable(value.getRepeatedGroupList()); 193 assertIsUnmodifiable(value.getRepeatedNestedMessageList()); 194 assertIsUnmodifiable(value.getRepeatedForeignMessageList()); 195 assertIsUnmodifiable(value.getRepeatedImportMessageList()); 196 assertIsUnmodifiable(value.getRepeatedNestedEnumList()); 197 assertIsUnmodifiable(value.getRepeatedForeignEnumList()); 198 assertIsUnmodifiable(value.getRepeatedImportEnumList()); 199 } 200 assertIsUnmodifiable(List<?> list)201 private void assertIsUnmodifiable(List<?> list) { 202 if (list == Collections.emptyList()) { 203 // OKAY -- Need to check this b/c EmptyList allows you to call clear. 204 } else { 205 try { 206 list.clear(); 207 fail("List wasn't immutable"); 208 } catch (UnsupportedOperationException e) { 209 // good 210 } 211 } 212 } 213 testSettersRejectNull()214 public void testSettersRejectNull() throws Exception { 215 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 216 try { 217 builder.setOptionalString(null); 218 fail("Exception was not thrown"); 219 } catch (NullPointerException e) { 220 // We expect this exception. 221 } 222 try { 223 builder.setOptionalBytes(null); 224 fail("Exception was not thrown"); 225 } catch (NullPointerException e) { 226 // We expect this exception. 227 } 228 try { 229 builder.setOptionalNestedMessage((TestAllTypes.NestedMessage) null); 230 fail("Exception was not thrown"); 231 } catch (NullPointerException e) { 232 // We expect this exception. 233 } 234 try { 235 builder.setOptionalNestedMessage((TestAllTypes.NestedMessage.Builder) null); 236 fail("Exception was not thrown"); 237 } catch (NullPointerException e) { 238 // We expect this exception. 239 } 240 try { 241 builder.setOptionalNestedEnum(null); 242 fail("Exception was not thrown"); 243 } catch (NullPointerException e) { 244 // We expect this exception. 245 } 246 try { 247 builder.addRepeatedString(null); 248 fail("Exception was not thrown"); 249 } catch (NullPointerException e) { 250 // We expect this exception. 251 } 252 try { 253 builder.addRepeatedBytes(null); 254 fail("Exception was not thrown"); 255 } catch (NullPointerException e) { 256 // We expect this exception. 257 } 258 try { 259 builder.addRepeatedNestedMessage((TestAllTypes.NestedMessage) null); 260 fail("Exception was not thrown"); 261 } catch (NullPointerException e) { 262 // We expect this exception. 263 } 264 try { 265 builder.addRepeatedNestedMessage((TestAllTypes.NestedMessage.Builder) null); 266 fail("Exception was not thrown"); 267 } catch (NullPointerException e) { 268 // We expect this exception. 269 } 270 try { 271 builder.addRepeatedNestedEnum(null); 272 fail("Exception was not thrown"); 273 } catch (NullPointerException e) { 274 // We expect this exception. 275 } 276 } 277 testRepeatedSetters()278 public void testRepeatedSetters() throws Exception { 279 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 280 TestUtil.setAllFields(builder); 281 TestUtil.modifyRepeatedFields(builder); 282 TestAllTypes message = builder.build(); 283 TestUtil.assertRepeatedFieldsModified(message); 284 } 285 testRepeatedSettersRejectNull()286 public void testRepeatedSettersRejectNull() throws Exception { 287 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 288 289 builder.addRepeatedString("one"); 290 builder.addRepeatedString("two"); 291 try { 292 builder.setRepeatedString(1, null); 293 fail("Exception was not thrown"); 294 } catch (NullPointerException e) { 295 // We expect this exception. 296 } 297 298 builder.addRepeatedBytes(TestUtil.toBytes("one")); 299 builder.addRepeatedBytes(TestUtil.toBytes("two")); 300 try { 301 builder.setRepeatedBytes(1, null); 302 fail("Exception was not thrown"); 303 } catch (NullPointerException e) { 304 // We expect this exception. 305 } 306 307 builder.addRepeatedNestedMessage(TestAllTypes.NestedMessage.newBuilder().setBb(218).build()); 308 builder.addRepeatedNestedMessage(TestAllTypes.NestedMessage.newBuilder().setBb(456).build()); 309 try { 310 builder.setRepeatedNestedMessage(1, (TestAllTypes.NestedMessage) null); 311 fail("Exception was not thrown"); 312 } catch (NullPointerException e) { 313 // We expect this exception. 314 } 315 try { 316 builder.setRepeatedNestedMessage(1, (TestAllTypes.NestedMessage.Builder) null); 317 fail("Exception was not thrown"); 318 } catch (NullPointerException e) { 319 // We expect this exception. 320 } 321 322 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.FOO); 323 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR); 324 try { 325 builder.setRepeatedNestedEnum(1, null); 326 fail("Exception was not thrown"); 327 } catch (NullPointerException e) { 328 // We expect this exception. 329 } 330 } 331 testRepeatedAppend()332 public void testRepeatedAppend() throws Exception { 333 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 334 335 builder.addAllRepeatedInt32(Arrays.asList(1, 2, 3, 4)); 336 builder.addAllRepeatedForeignEnum(Arrays.asList(ForeignEnum.FOREIGN_BAZ)); 337 338 ForeignMessage foreignMessage = ForeignMessage.newBuilder().setC(12).build(); 339 builder.addAllRepeatedForeignMessage(Arrays.asList(foreignMessage)); 340 341 TestAllTypes message = builder.build(); 342 assertEquals(message.getRepeatedInt32List(), Arrays.asList(1, 2, 3, 4)); 343 assertEquals(message.getRepeatedForeignEnumList(), Arrays.asList(ForeignEnum.FOREIGN_BAZ)); 344 assertEquals(1, message.getRepeatedForeignMessageCount()); 345 assertEquals(12, message.getRepeatedForeignMessage(0).getC()); 346 } 347 testRepeatedAppendRejectsNull()348 public void testRepeatedAppendRejectsNull() throws Exception { 349 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 350 351 ForeignMessage foreignMessage = ForeignMessage.newBuilder().setC(12).build(); 352 try { 353 builder.addAllRepeatedForeignMessage(Arrays.asList(foreignMessage, (ForeignMessage) null)); 354 fail("Exception was not thrown"); 355 } catch (NullPointerException e) { 356 // We expect this exception. 357 } 358 359 try { 360 builder.addAllRepeatedForeignEnum(Arrays.asList(ForeignEnum.FOREIGN_BAZ, null)); 361 fail("Exception was not thrown"); 362 } catch (NullPointerException e) { 363 // We expect this exception. 364 } 365 366 try { 367 builder.addAllRepeatedString(Arrays.asList("one", null)); 368 fail("Exception was not thrown"); 369 } catch (NullPointerException e) { 370 // We expect this exception. 371 } 372 373 try { 374 builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null)); 375 fail("Exception was not thrown"); 376 } catch (NullPointerException e) { 377 // We expect this exception. 378 } 379 } 380 testRepeatedAppendIterateOnlyOnce()381 public void testRepeatedAppendIterateOnlyOnce() throws Exception { 382 // Create a Iterable that can only be iterated once. 383 Iterable<String> stringIterable = 384 new Iterable<String>() { 385 private boolean called = false; 386 387 @Override 388 public Iterator<String> iterator() { 389 if (called) { 390 throw new IllegalStateException(); 391 } 392 called = true; 393 return Arrays.asList("one", "two", "three").iterator(); 394 } 395 }; 396 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 397 builder.addAllRepeatedString(stringIterable); 398 assertEquals(3, builder.getRepeatedStringCount()); 399 assertEquals("one", builder.getRepeatedString(0)); 400 assertEquals("two", builder.getRepeatedString(1)); 401 assertEquals("three", builder.getRepeatedString(2)); 402 403 try { 404 builder.addAllRepeatedString(stringIterable); 405 fail("Exception was not thrown"); 406 } catch (IllegalStateException e) { 407 // We expect this exception. 408 } 409 } 410 testMergeFromOtherRejectsNull()411 public void testMergeFromOtherRejectsNull() throws Exception { 412 try { 413 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 414 builder.mergeFrom((TestAllTypes) null); 415 fail("Exception was not thrown"); 416 } catch (NullPointerException e) { 417 // We expect this exception. 418 } 419 } 420 testSettingForeignMessageUsingBuilder()421 public void testSettingForeignMessageUsingBuilder() throws Exception { 422 TestAllTypes message = 423 TestAllTypes.newBuilder() 424 // Pass builder for foreign message instance. 425 .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123)) 426 .build(); 427 TestAllTypes expectedMessage = 428 TestAllTypes.newBuilder() 429 // Create expected version passing foreign message instance explicitly. 430 .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123).build()) 431 .build(); 432 // TODO(ngd): Upgrade to using real #equals method once implemented 433 assertEquals(expectedMessage.toString(), message.toString()); 434 } 435 testSettingRepeatedForeignMessageUsingBuilder()436 public void testSettingRepeatedForeignMessageUsingBuilder() throws Exception { 437 TestAllTypes message = 438 TestAllTypes.newBuilder() 439 // Pass builder for foreign message instance. 440 .addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(456)) 441 .build(); 442 TestAllTypes expectedMessage = 443 TestAllTypes.newBuilder() 444 // Create expected version passing foreign message instance explicitly. 445 .addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(456).build()) 446 .build(); 447 assertEquals(expectedMessage.toString(), message.toString()); 448 } 449 testDefaults()450 public void testDefaults() throws Exception { 451 TestUtil.assertClear(TestAllTypes.getDefaultInstance()); 452 TestUtil.assertClear(TestAllTypes.newBuilder().build()); 453 454 TestExtremeDefaultValues message = TestExtremeDefaultValues.getDefaultInstance(); 455 assertEquals("\u1234", message.getUtf8String()); 456 assertEquals(Double.POSITIVE_INFINITY, message.getInfDouble(), 0.0); 457 assertEquals(Double.NEGATIVE_INFINITY, message.getNegInfDouble(), 0.0); 458 assertTrue(Double.isNaN(message.getNanDouble())); 459 assertEquals(Float.POSITIVE_INFINITY, message.getInfFloat(), 0.0f); 460 assertEquals(Float.NEGATIVE_INFINITY, message.getNegInfFloat(), 0.0f); 461 assertTrue(Float.isNaN(message.getNanFloat())); 462 assertEquals("? ? ?? ?? ??? ??/ ??-", message.getCppTrigraph()); 463 } 464 testClear()465 public void testClear() throws Exception { 466 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 467 TestUtil.assertClear(builder); 468 TestUtil.setAllFields(builder); 469 builder.clear(); 470 TestUtil.assertClear(builder); 471 } 472 testReflectionGetters()473 public void testReflectionGetters() throws Exception { 474 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 475 TestUtil.setAllFields(builder); 476 reflectionTester.assertAllFieldsSetViaReflection(builder); 477 478 TestAllTypes message = builder.build(); 479 reflectionTester.assertAllFieldsSetViaReflection(message); 480 } 481 testReflectionSetters()482 public void testReflectionSetters() throws Exception { 483 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 484 reflectionTester.setAllFieldsViaReflection(builder); 485 TestUtil.assertAllFieldsSet(builder); 486 487 TestAllTypes message = builder.build(); 488 TestUtil.assertAllFieldsSet(message); 489 } 490 testReflectionSettersRejectNull()491 public void testReflectionSettersRejectNull() throws Exception { 492 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 493 reflectionTester.assertReflectionSettersRejectNull(builder); 494 } 495 testReflectionRepeatedSetters()496 public void testReflectionRepeatedSetters() throws Exception { 497 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 498 reflectionTester.setAllFieldsViaReflection(builder); 499 reflectionTester.modifyRepeatedFieldsViaReflection(builder); 500 TestUtil.assertRepeatedFieldsModified(builder); 501 502 TestAllTypes message = builder.build(); 503 TestUtil.assertRepeatedFieldsModified(message); 504 } 505 testReflectionRepeatedSettersRejectNull()506 public void testReflectionRepeatedSettersRejectNull() throws Exception { 507 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 508 reflectionTester.assertReflectionRepeatedSettersRejectNull(builder); 509 } 510 testReflectionDefaults()511 public void testReflectionDefaults() throws Exception { 512 reflectionTester.assertClearViaReflection(TestAllTypes.getDefaultInstance()); 513 reflectionTester.assertClearViaReflection(TestAllTypes.newBuilder().build()); 514 } 515 testReflectionGetOneof()516 public void testReflectionGetOneof() throws Exception { 517 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 518 reflectionTester.setAllFieldsViaReflection(builder); 519 Descriptors.OneofDescriptor oneof = TestAllTypes.getDescriptor().getOneofs().get(0); 520 Descriptors.FieldDescriptor field = TestAllTypes.getDescriptor().findFieldByName("oneof_bytes"); 521 assertSame(field, builder.getOneofFieldDescriptor(oneof)); 522 523 TestAllTypes message = builder.build(); 524 assertSame(field, message.getOneofFieldDescriptor(oneof)); 525 } 526 testReflectionClearOneof()527 public void testReflectionClearOneof() throws Exception { 528 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 529 reflectionTester.setAllFieldsViaReflection(builder); 530 Descriptors.OneofDescriptor oneof = TestAllTypes.getDescriptor().getOneofs().get(0); 531 Descriptors.FieldDescriptor field = TestAllTypes.getDescriptor().findFieldByName("oneof_bytes"); 532 533 assertTrue(builder.hasOneof(oneof)); 534 assertTrue(builder.hasField(field)); 535 builder.clearOneof(oneof); 536 assertFalse(builder.hasOneof(oneof)); 537 assertFalse(builder.hasField(field)); 538 } 539 testEnumInterface()540 public void testEnumInterface() throws Exception { 541 assertTrue( 542 TestAllTypes.getDefaultInstance().getDefaultNestedEnum() instanceof ProtocolMessageEnum); 543 } 544 testEnumMap()545 public void testEnumMap() throws Exception { 546 Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap(); 547 548 for (ForeignEnum value : ForeignEnum.values()) { 549 assertEquals(value, map.findValueByNumber(value.getNumber())); 550 } 551 552 assertTrue(map.findValueByNumber(12345) == null); 553 } 554 testParsePackedToUnpacked()555 public void testParsePackedToUnpacked() throws Exception { 556 TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder(); 557 TestUnpackedTypes message = builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build(); 558 TestUtil.assertUnpackedFieldsSet(message); 559 } 560 testParseUnpackedToPacked()561 public void testParseUnpackedToPacked() throws Exception { 562 TestPackedTypes.Builder builder = TestPackedTypes.newBuilder(); 563 TestPackedTypes message = builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build(); 564 TestUtil.assertPackedFieldsSet(message); 565 } 566 567 // ================================================================= 568 // Extensions. 569 570 TestUtil.ReflectionTester extensionsReflectionTester = 571 new TestUtil.ReflectionTester( 572 TestAllExtensions.getDescriptor(), TestUtil.getFullExtensionRegistry()); 573 testExtensionMessageOrBuilder()574 public void testExtensionMessageOrBuilder() throws Exception { 575 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 576 TestUtil.setAllExtensions(builder); 577 TestAllExtensions message = builder.build(); 578 TestUtil.assertAllExtensionsSet(message); 579 } 580 testGetBuilderForExtensionField()581 public void testGetBuilderForExtensionField() { 582 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 583 Message.Builder fieldBuilder = 584 builder.newBuilderForField(UnittestProto.optionalNestedMessageExtension.getDescriptor()); 585 final int expected = 7432; 586 FieldDescriptor field = 587 NestedMessage.getDescriptor().findFieldByNumber(NestedMessage.BB_FIELD_NUMBER); 588 fieldBuilder.setField(field, expected); 589 assertEquals(expected, fieldBuilder.build().getField(field)); 590 } 591 592 testGetBuilderForNonMessageExtensionField()593 public void testGetBuilderForNonMessageExtensionField() { 594 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 595 try { 596 // This should throw an exception because the extension field is not a message. 597 builder.newBuilderForField(UnittestProto.optionalInt32Extension.getDescriptor()); 598 fail("Exception was not thrown"); 599 } catch (UnsupportedOperationException e) { 600 // This exception is expected. 601 } 602 } 603 testExtensionRepeatedSetters()604 public void testExtensionRepeatedSetters() throws Exception { 605 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 606 TestUtil.setAllExtensions(builder); 607 TestUtil.modifyRepeatedExtensions(builder); 608 TestAllExtensions message = builder.build(); 609 TestUtil.assertRepeatedExtensionsModified(message); 610 } 611 testExtensionDefaults()612 public void testExtensionDefaults() throws Exception { 613 TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance()); 614 TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build()); 615 } 616 testUnsetRepeatedExtensionGetField()617 public void testUnsetRepeatedExtensionGetField() { 618 TestAllExtensions message = TestAllExtensions.getDefaultInstance(); 619 Object value; 620 621 value = message.getField(UnittestProto.repeatedStringExtension.getDescriptor()); 622 assertTrue(value instanceof List); 623 assertTrue(((List<?>) value).isEmpty()); 624 assertIsUnmodifiable((List<?>) value); 625 626 value = message.getField(UnittestProto.repeatedNestedMessageExtension.getDescriptor()); 627 assertTrue(value instanceof List); 628 assertTrue(((List<?>) value).isEmpty()); 629 assertIsUnmodifiable((List<?>) value); 630 } 631 testExtensionReflectionGetters()632 public void testExtensionReflectionGetters() throws Exception { 633 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 634 TestUtil.setAllExtensions(builder); 635 extensionsReflectionTester.assertAllFieldsSetViaReflection(builder); 636 637 TestAllExtensions message = builder.build(); 638 extensionsReflectionTester.assertAllFieldsSetViaReflection(message); 639 } 640 testExtensionReflectionSetters()641 public void testExtensionReflectionSetters() throws Exception { 642 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 643 extensionsReflectionTester.setAllFieldsViaReflection(builder); 644 TestUtil.assertAllExtensionsSet(builder); 645 646 TestAllExtensions message = builder.build(); 647 TestUtil.assertAllExtensionsSet(message); 648 } 649 testExtensionReflectionSettersRejectNull()650 public void testExtensionReflectionSettersRejectNull() throws Exception { 651 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 652 extensionsReflectionTester.assertReflectionSettersRejectNull(builder); 653 } 654 testExtensionReflectionRepeatedSetters()655 public void testExtensionReflectionRepeatedSetters() throws Exception { 656 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 657 extensionsReflectionTester.setAllFieldsViaReflection(builder); 658 extensionsReflectionTester.modifyRepeatedFieldsViaReflection(builder); 659 TestUtil.assertRepeatedExtensionsModified(builder); 660 661 TestAllExtensions message = builder.build(); 662 TestUtil.assertRepeatedExtensionsModified(message); 663 } 664 testExtensionReflectionRepeatedSettersRejectNull()665 public void testExtensionReflectionRepeatedSettersRejectNull() throws Exception { 666 TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); 667 extensionsReflectionTester.assertReflectionRepeatedSettersRejectNull(builder); 668 } 669 testExtensionReflectionDefaults()670 public void testExtensionReflectionDefaults() throws Exception { 671 extensionsReflectionTester.assertClearViaReflection(TestAllExtensions.getDefaultInstance()); 672 extensionsReflectionTester.assertClearViaReflection(TestAllExtensions.newBuilder().build()); 673 } 674 testClearExtension()675 public void testClearExtension() throws Exception { 676 // clearExtension() is not actually used in TestUtil, so try it manually. 677 assertFalse( 678 TestAllExtensions.newBuilder() 679 .setExtension(UnittestProto.optionalInt32Extension, 1) 680 .clearExtension(UnittestProto.optionalInt32Extension) 681 .hasExtension(UnittestProto.optionalInt32Extension)); 682 assertEquals( 683 0, 684 TestAllExtensions.newBuilder() 685 .addExtension(UnittestProto.repeatedInt32Extension, 1) 686 .clearExtension(UnittestProto.repeatedInt32Extension) 687 .getExtensionCount(UnittestProto.repeatedInt32Extension)); 688 } 689 testExtensionCopy()690 public void testExtensionCopy() throws Exception { 691 TestAllExtensions original = TestUtil.getAllExtensionsSet(); 692 TestAllExtensions copy = TestAllExtensions.newBuilder(original).build(); 693 TestUtil.assertAllExtensionsSet(copy); 694 } 695 testExtensionMergeFrom()696 public void testExtensionMergeFrom() throws Exception { 697 TestAllExtensions original = 698 TestAllExtensions.newBuilder() 699 .setExtension(UnittestProto.optionalInt32Extension, 1) 700 .build(); 701 TestAllExtensions merged = TestAllExtensions.newBuilder().mergeFrom(original).build(); 702 assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension)); 703 assertEquals(1, (int) merged.getExtension(UnittestProto.optionalInt32Extension)); 704 } 705 706 // ================================================================= 707 // multiple_files_test 708 709 // Test that custom options of an file level enum are properly initialized. 710 // This test needs to be put before any other access to MultipleFilesTestProto 711 // or messages defined in multiple_files_test.proto because the class loading 712 // order affects initialization process of custom options. testEnumValueOptionsInMultipleFilesMode()713 public void testEnumValueOptionsInMultipleFilesMode() throws Exception { 714 assertEquals( 715 12345, 716 EnumWithNoOuter.FOO 717 .getValueDescriptor() 718 .getOptions() 719 .getExtension(MultipleFilesTestProto.enumValueOption) 720 .intValue()); 721 } 722 testMultipleFilesOption()723 public void testMultipleFilesOption() throws Exception { 724 // We mostly just want to check that things compile. 725 MessageWithNoOuter message = 726 MessageWithNoOuter.newBuilder() 727 .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1)) 728 .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1)) 729 .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ) 730 .setForeignEnum(EnumWithNoOuter.BAR) 731 .build(); 732 assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString())); 733 734 assertEquals( 735 MultipleFilesTestProto.getDescriptor(), MessageWithNoOuter.getDescriptor().getFile()); 736 737 Descriptors.FieldDescriptor field = 738 MessageWithNoOuter.getDescriptor().findFieldByName("foreign_enum"); 739 assertEquals(EnumWithNoOuter.BAR.getValueDescriptor(), message.getField(field)); 740 741 assertEquals( 742 MultipleFilesTestProto.getDescriptor(), ServiceWithNoOuter.getDescriptor().getFile()); 743 744 assertFalse( 745 TestAllExtensions.getDefaultInstance() 746 .hasExtension(MultipleFilesTestProto.extensionWithOuter)); 747 } 748 testOptionalFieldWithRequiredSubfieldsOptimizedForSize()749 public void testOptionalFieldWithRequiredSubfieldsOptimizedForSize() throws Exception { 750 TestOptionalOptimizedForSize message = TestOptionalOptimizedForSize.getDefaultInstance(); 751 assertTrue(message.isInitialized()); 752 753 message = 754 TestOptionalOptimizedForSize.newBuilder() 755 .setO(TestRequiredOptimizedForSize.newBuilder().buildPartial()) 756 .buildPartial(); 757 assertFalse(message.isInitialized()); 758 759 message = 760 TestOptionalOptimizedForSize.newBuilder() 761 .setO(TestRequiredOptimizedForSize.newBuilder().setX(5).buildPartial()) 762 .buildPartial(); 763 assertTrue(message.isInitialized()); 764 } 765 testUninitializedExtensionInOptimizedForSize()766 public void testUninitializedExtensionInOptimizedForSize() throws Exception { 767 TestOptimizedForSize.Builder builder = TestOptimizedForSize.newBuilder(); 768 builder.setExtension( 769 TestOptimizedForSize.testExtension2, 770 TestRequiredOptimizedForSize.newBuilder().buildPartial()); 771 assertFalse(builder.isInitialized()); 772 assertFalse(builder.buildPartial().isInitialized()); 773 774 builder = TestOptimizedForSize.newBuilder(); 775 builder.setExtension( 776 TestOptimizedForSize.testExtension2, 777 TestRequiredOptimizedForSize.newBuilder().setX(10).buildPartial()); 778 assertTrue(builder.isInitialized()); 779 assertTrue(builder.buildPartial().isInitialized()); 780 } 781 testToBuilder()782 public void testToBuilder() throws Exception { 783 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 784 TestUtil.setAllFields(builder); 785 TestAllTypes message = builder.build(); 786 TestUtil.assertAllFieldsSet(message); 787 TestUtil.assertAllFieldsSet(message.toBuilder().build()); 788 } 789 testFieldConstantValues()790 public void testFieldConstantValues() throws Exception { 791 assertEquals(TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1); 792 assertEquals(TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1); 793 assertEquals(TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16); 794 assertEquals(TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18); 795 assertEquals(TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21); 796 assertEquals(TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31); 797 assertEquals(TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46); 798 assertEquals(TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48); 799 assertEquals(TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51); 800 } 801 testExtensionConstantValues()802 public void testExtensionConstantValues() throws Exception { 803 assertEquals(UnittestProto.TestRequired.SINGLE_FIELD_NUMBER, 1000); 804 assertEquals(UnittestProto.TestRequired.MULTI_FIELD_NUMBER, 1001); 805 assertEquals(UnittestProto.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1); 806 assertEquals(UnittestProto.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16); 807 assertEquals(UnittestProto.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18); 808 assertEquals(UnittestProto.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 21); 809 assertEquals(UnittestProto.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31); 810 assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46); 811 assertEquals(UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48); 812 assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51); 813 } 814 testRecursiveMessageDefaultInstance()815 public void testRecursiveMessageDefaultInstance() throws Exception { 816 UnittestProto.TestRecursiveMessage message = 817 UnittestProto.TestRecursiveMessage.getDefaultInstance(); 818 assertTrue(message != null); 819 assertNotNull(message.getA()); 820 assertTrue(message.getA().equals(message)); 821 } 822 testSerialize()823 public void testSerialize() throws Exception { 824 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 825 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 826 TestUtil.setAllFields(builder); 827 TestAllTypes expected = builder.build(); 828 ObjectOutputStream out = new ObjectOutputStream(baos); 829 try { 830 out.writeObject(expected); 831 } finally { 832 out.close(); 833 } 834 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 835 ObjectInputStream in = new ObjectInputStream(bais); 836 TestAllTypes actual = (TestAllTypes) in.readObject(); 837 assertEquals(expected, actual); 838 } 839 testSerializePartial()840 public void testSerializePartial() throws Exception { 841 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 842 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 843 TestAllTypes expected = builder.buildPartial(); 844 ObjectOutputStream out = new ObjectOutputStream(baos); 845 try { 846 out.writeObject(expected); 847 } finally { 848 out.close(); 849 } 850 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 851 ObjectInputStream in = new ObjectInputStream(bais); 852 TestAllTypes actual = (TestAllTypes) in.readObject(); 853 assertEquals(expected, actual); 854 } 855 testDeserializeWithoutClassField()856 public void testDeserializeWithoutClassField() throws Exception { 857 // serialized form for version <=3.6.0 858 // just includes messageClassName and asBytes 859 860 // Int32Value.newBuilder().setValue(123).build() 861 byte[] int32ValueBytes = 862 new byte[] { 863 -84, -19, 0, 5, 115, 114, 0, 55, 99, 111, 109, 46, 103, 111, 111, 103, 108, 101, 46, 112, 864 114, 111, 116, 111, 98, 117, 102, 46, 71, 101, 110, 101, 114, 97, 116, 101, 100, 77, 101, 865 115, 115, 97, 103, 101, 76, 105, 116, 101, 36, 83, 101, 114, 105, 97, 108, 105, 122, 101, 866 100, 70, 111, 114, 109, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 91, 0, 7, 97, 115, 66, 121, 116, 867 101, 115, 116, 0, 2, 91, 66, 76, 0, 16, 109, 101, 115, 115, 97, 103, 101, 67, 108, 97, 868 115, 115, 78, 97, 109, 101, 116, 0, 18, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 869 83, 116, 114, 105, 110, 103, 59, 120, 112, 117, 114, 0, 2, 91, 66, -84, -13, 23, -8, 6, 8, 870 84, -32, 2, 0, 0, 120, 112, 0, 0, 0, 2, 8, 123, 116, 0, 30, 99, 111, 109, 46, 103, 111, 871 111, 103, 108, 101, 46, 112, 114, 111, 116, 111, 98, 117, 102, 46, 73, 110, 116, 51, 50, 872 86, 97, 108, 117, 101 873 }; 874 875 ByteArrayInputStream bais = new ByteArrayInputStream(int32ValueBytes); 876 ObjectInputStream in = new ObjectInputStream(bais); 877 Int32Value int32Value = (Int32Value) in.readObject(); 878 assertEquals(123, int32Value.getValue()); 879 } 880 testDeserializeWithClassField()881 public void testDeserializeWithClassField() throws Exception { 882 // serialized form for version > 3.6.0 883 // includes messageClass, messageClassName (for compatibility), and asBytes 884 885 // Int32Value.newBuilder().setValue(123).build() 886 byte[] int32ValueBytes = 887 new byte[] { 888 -84, -19, 0, 5, 115, 114, 0, 55, 99, 111, 109, 46, 103, 111, 111, 103, 108, 101, 46, 112, 889 114, 111, 116, 111, 98, 117, 102, 46, 71, 101, 110, 101, 114, 97, 116, 101, 100, 77, 101, 890 115, 115, 97, 103, 101, 76, 105, 116, 101, 36, 83, 101, 114, 105, 97, 108, 105, 122, 101, 891 100, 70, 111, 114, 109, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 91, 0, 7, 97, 115, 66, 121, 116, 892 101, 115, 116, 0, 2, 91, 66, 76, 0, 12, 109, 101, 115, 115, 97, 103, 101, 67, 108, 97, 893 115, 115, 116, 0, 17, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 67, 108, 97, 115, 894 115, 59, 76, 0, 16, 109, 101, 115, 115, 97, 103, 101, 67, 108, 97, 115, 115, 78, 97, 109, 895 101, 116, 0, 18, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 896 103, 59, 120, 112, 117, 114, 0, 2, 91, 66, -84, -13, 23, -8, 6, 8, 84, -32, 2, 0, 0, 120, 897 112, 0, 0, 0, 2, 8, 123, 118, 114, 0, 30, 99, 111, 109, 46, 103, 111, 111, 103, 108, 101, 898 46, 112, 114, 111, 116, 111, 98, 117, 102, 46, 73, 110, 116, 51, 50, 86, 97, 108, 117, 899 101, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 66, 0, 21, 109, 101, 109, 111, 105, 122, 101, 100, 900 73, 115, 73, 110, 105, 116, 105, 97, 108, 105, 122, 101, 100, 73, 0, 6, 118, 97, 108, 117, 901 101, 95, 120, 114, 0, 38, 99, 111, 109, 46, 103, 111, 111, 103, 108, 101, 46, 112, 114, 902 111, 116, 111, 98, 117, 102, 46, 71, 101, 110, 101, 114, 97, 116, 101, 100, 77, 101, 115, 903 115, 97, 103, 101, 86, 51, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 76, 0, 13, 117, 110, 107, 110, 904 111, 119, 110, 70, 105, 101, 108, 100, 115, 116, 0, 37, 76, 99, 111, 109, 47, 103, 111, 905 111, 103, 108, 101, 47, 112, 114, 111, 116, 111, 98, 117, 102, 47, 85, 110, 107, 110, 111, 906 119, 110, 70, 105, 101, 108, 100, 83, 101, 116, 59, 120, 112, 116, 0, 30, 99, 111, 109, 907 46, 103, 111, 111, 103, 108, 101, 46, 112, 114, 111, 116, 111, 98, 117, 102, 46, 73, 110, 908 116, 51, 50, 86, 97, 108, 117, 101 909 }; 910 911 ByteArrayInputStream bais = new ByteArrayInputStream(int32ValueBytes); 912 ObjectInputStream in = new ObjectInputStream(bais); 913 Int32Value int32Value = (Int32Value) in.readObject(); 914 assertEquals(123, int32Value.getValue()); 915 } 916 testEnumValues()917 public void testEnumValues() { 918 assertEquals(TestAllTypes.NestedEnum.BAR_VALUE, TestAllTypes.NestedEnum.BAR.getNumber()); 919 assertEquals(TestAllTypes.NestedEnum.BAZ_VALUE, TestAllTypes.NestedEnum.BAZ.getNumber()); 920 assertEquals(TestAllTypes.NestedEnum.FOO_VALUE, TestAllTypes.NestedEnum.FOO.getNumber()); 921 } 922 testNonNestedExtensionInitialization()923 public void testNonNestedExtensionInitialization() { 924 assertTrue( 925 NonNestedExtension.nonNestedExtension.getMessageDefaultInstance() 926 instanceof MyNonNestedExtension); 927 assertEquals( 928 "nonNestedExtension", NonNestedExtension.nonNestedExtension.getDescriptor().getName()); 929 } 930 testNestedExtensionInitialization()931 public void testNestedExtensionInitialization() { 932 assertTrue( 933 MyNestedExtension.recursiveExtension.getMessageDefaultInstance() 934 instanceof MessageToBeExtended); 935 assertEquals( 936 "recursiveExtension", MyNestedExtension.recursiveExtension.getDescriptor().getName()); 937 } 938 testInvalidations()939 public void testInvalidations() throws Exception { 940 GeneratedMessage.enableAlwaysUseFieldBuildersForTesting(); 941 TestAllTypes.NestedMessage nestedMessage1 = TestAllTypes.NestedMessage.newBuilder().build(); 942 TestAllTypes.NestedMessage nestedMessage2 = TestAllTypes.NestedMessage.newBuilder().build(); 943 944 // Set all three flavors (enum, primitive, message and singular/repeated) 945 // and verify no invalidations fired 946 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); 947 948 TestAllTypes.Builder builder = 949 (TestAllTypes.Builder) 950 ((AbstractMessage) TestAllTypes.getDefaultInstance()).newBuilderForType(mockParent); 951 builder.setOptionalInt32(1); 952 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR); 953 builder.setOptionalNestedMessage(nestedMessage1); 954 builder.addRepeatedInt32(1); 955 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR); 956 builder.addRepeatedNestedMessage(nestedMessage1); 957 assertEquals(0, mockParent.getInvalidationCount()); 958 959 // Now tell it we want changes and make sure it's only fired once 960 // And do this for each flavor 961 962 // primitive single 963 builder.buildPartial(); 964 builder.setOptionalInt32(2); 965 builder.setOptionalInt32(3); 966 assertEquals(1, mockParent.getInvalidationCount()); 967 968 // enum single 969 builder.buildPartial(); 970 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ); 971 builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR); 972 assertEquals(2, mockParent.getInvalidationCount()); 973 974 // message single 975 builder.buildPartial(); 976 builder.setOptionalNestedMessage(nestedMessage2); 977 builder.setOptionalNestedMessage(nestedMessage1); 978 assertEquals(3, mockParent.getInvalidationCount()); 979 980 // primitive repeated 981 builder.buildPartial(); 982 builder.addRepeatedInt32(2); 983 builder.addRepeatedInt32(3); 984 assertEquals(4, mockParent.getInvalidationCount()); 985 986 // enum repeated 987 builder.buildPartial(); 988 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ); 989 builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ); 990 assertEquals(5, mockParent.getInvalidationCount()); 991 992 // message repeated 993 builder.buildPartial(); 994 builder.addRepeatedNestedMessage(nestedMessage2); 995 builder.addRepeatedNestedMessage(nestedMessage1); 996 assertEquals(6, mockParent.getInvalidationCount()); 997 } 998 testInvalidations_Extensions()999 public void testInvalidations_Extensions() throws Exception { 1000 TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); 1001 1002 TestAllExtensions.Builder builder = 1003 (TestAllExtensions.Builder) 1004 ((AbstractMessage) TestAllExtensions.getDefaultInstance()) 1005 .newBuilderForType(mockParent); 1006 1007 builder.addExtension(UnittestProto.repeatedInt32Extension, 1); 1008 builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 2); 1009 builder.clearExtension(UnittestProto.repeatedInt32Extension); 1010 assertEquals(0, mockParent.getInvalidationCount()); 1011 1012 // Now tell it we want changes and make sure it's only fired once 1013 builder.buildPartial(); 1014 builder.addExtension(UnittestProto.repeatedInt32Extension, 2); 1015 builder.addExtension(UnittestProto.repeatedInt32Extension, 3); 1016 assertEquals(1, mockParent.getInvalidationCount()); 1017 1018 builder.buildPartial(); 1019 builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 4); 1020 builder.setExtension(UnittestProto.repeatedInt32Extension, 1, 5); 1021 assertEquals(2, mockParent.getInvalidationCount()); 1022 1023 builder.buildPartial(); 1024 builder.clearExtension(UnittestProto.repeatedInt32Extension); 1025 builder.clearExtension(UnittestProto.repeatedInt32Extension); 1026 assertEquals(3, mockParent.getInvalidationCount()); 1027 } 1028 testBaseMessageOrBuilder()1029 public void testBaseMessageOrBuilder() { 1030 // Mostly just makes sure the base interface exists and has some methods. 1031 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 1032 TestAllTypes message = builder.buildPartial(); 1033 TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message; 1034 1035 assertEquals(messageAsInterface.getDefaultBool(), messageAsInterface.getDefaultBool()); 1036 assertEquals( 1037 messageAsInterface.getOptionalDouble(), messageAsInterface.getOptionalDouble(), 0.0); 1038 } 1039 testMessageOrBuilderGetters()1040 public void testMessageOrBuilderGetters() { 1041 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 1042 1043 // single fields 1044 assertSame(ForeignMessage.getDefaultInstance(), builder.getOptionalForeignMessageOrBuilder()); 1045 ForeignMessage.Builder subBuilder = builder.getOptionalForeignMessageBuilder(); 1046 assertSame(subBuilder, builder.getOptionalForeignMessageOrBuilder()); 1047 1048 // repeated fields 1049 ForeignMessage m0 = ForeignMessage.newBuilder().buildPartial(); 1050 ForeignMessage m1 = ForeignMessage.newBuilder().buildPartial(); 1051 ForeignMessage m2 = ForeignMessage.newBuilder().buildPartial(); 1052 builder.addRepeatedForeignMessage(m0); 1053 builder.addRepeatedForeignMessage(m1); 1054 builder.addRepeatedForeignMessage(m2); 1055 assertSame(m0, builder.getRepeatedForeignMessageOrBuilder(0)); 1056 assertSame(m1, builder.getRepeatedForeignMessageOrBuilder(1)); 1057 assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2)); 1058 ForeignMessage.Builder b0 = builder.getRepeatedForeignMessageBuilder(0); 1059 ForeignMessage.Builder b1 = builder.getRepeatedForeignMessageBuilder(1); 1060 assertSame(b0, builder.getRepeatedForeignMessageOrBuilder(0)); 1061 assertSame(b1, builder.getRepeatedForeignMessageOrBuilder(1)); 1062 assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2)); 1063 1064 List<? extends ForeignMessageOrBuilder> messageOrBuilderList = 1065 builder.getRepeatedForeignMessageOrBuilderList(); 1066 assertSame(b0, messageOrBuilderList.get(0)); 1067 assertSame(b1, messageOrBuilderList.get(1)); 1068 assertSame(m2, messageOrBuilderList.get(2)); 1069 } 1070 testGetFieldBuilder()1071 public void testGetFieldBuilder() { 1072 Descriptor descriptor = TestAllTypes.getDescriptor(); 1073 1074 FieldDescriptor fieldDescriptor = descriptor.findFieldByName("optional_nested_message"); 1075 FieldDescriptor foreignFieldDescriptor = descriptor.findFieldByName("optional_foreign_message"); 1076 FieldDescriptor importFieldDescriptor = descriptor.findFieldByName("optional_import_message"); 1077 1078 // Mutate the message with new field builder 1079 // Mutate nested message 1080 TestAllTypes.Builder builder1 = TestAllTypes.newBuilder(); 1081 Message.Builder fieldBuilder1 = 1082 builder1 1083 .newBuilderForField(fieldDescriptor) 1084 .mergeFrom((Message) builder1.getField(fieldDescriptor)); 1085 FieldDescriptor subFieldDescriptor1 = 1086 fieldBuilder1.getDescriptorForType().findFieldByName("bb"); 1087 fieldBuilder1.setField(subFieldDescriptor1, 1); 1088 builder1.setField(fieldDescriptor, fieldBuilder1.build()); 1089 1090 // Mutate foreign message 1091 Message.Builder foreignFieldBuilder1 = 1092 builder1 1093 .newBuilderForField(foreignFieldDescriptor) 1094 .mergeFrom((Message) builder1.getField(foreignFieldDescriptor)); 1095 FieldDescriptor subForeignFieldDescriptor1 = 1096 foreignFieldBuilder1.getDescriptorForType().findFieldByName("c"); 1097 foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2); 1098 builder1.setField(foreignFieldDescriptor, foreignFieldBuilder1.build()); 1099 1100 // Mutate import message 1101 Message.Builder importFieldBuilder1 = 1102 builder1 1103 .newBuilderForField(importFieldDescriptor) 1104 .mergeFrom((Message) builder1.getField(importFieldDescriptor)); 1105 FieldDescriptor subImportFieldDescriptor1 = 1106 importFieldBuilder1.getDescriptorForType().findFieldByName("d"); 1107 importFieldBuilder1.setField(subImportFieldDescriptor1, 3); 1108 builder1.setField(importFieldDescriptor, importFieldBuilder1.build()); 1109 1110 Message newMessage1 = builder1.build(); 1111 1112 // Mutate the message with existing field builder 1113 // Mutate nested message 1114 TestAllTypes.Builder builder2 = TestAllTypes.newBuilder(); 1115 Message.Builder fieldBuilder2 = builder2.getFieldBuilder(fieldDescriptor); 1116 FieldDescriptor subFieldDescriptor2 = 1117 fieldBuilder2.getDescriptorForType().findFieldByName("bb"); 1118 fieldBuilder2.setField(subFieldDescriptor2, 1); 1119 builder2.setField(fieldDescriptor, fieldBuilder2.build()); 1120 1121 // Mutate foreign message 1122 Message.Builder foreignFieldBuilder2 = 1123 builder2 1124 .newBuilderForField(foreignFieldDescriptor) 1125 .mergeFrom((Message) builder2.getField(foreignFieldDescriptor)); 1126 FieldDescriptor subForeignFieldDescriptor2 = 1127 foreignFieldBuilder2.getDescriptorForType().findFieldByName("c"); 1128 foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2); 1129 builder2.setField(foreignFieldDescriptor, foreignFieldBuilder2.build()); 1130 1131 // Mutate import message 1132 Message.Builder importFieldBuilder2 = 1133 builder2 1134 .newBuilderForField(importFieldDescriptor) 1135 .mergeFrom((Message) builder2.getField(importFieldDescriptor)); 1136 FieldDescriptor subImportFieldDescriptor2 = 1137 importFieldBuilder2.getDescriptorForType().findFieldByName("d"); 1138 importFieldBuilder2.setField(subImportFieldDescriptor2, 3); 1139 builder2.setField(importFieldDescriptor, importFieldBuilder2.build()); 1140 1141 Message newMessage2 = builder2.build(); 1142 1143 // These two messages should be equal. 1144 assertEquals(newMessage1, newMessage2); 1145 } 1146 testGetFieldBuilderWithInitializedValue()1147 public void testGetFieldBuilderWithInitializedValue() { 1148 Descriptor descriptor = TestAllTypes.getDescriptor(); 1149 FieldDescriptor fieldDescriptor = descriptor.findFieldByName("optional_nested_message"); 1150 1151 // Before setting field, builder is initialized by default value. 1152 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 1153 NestedMessage.Builder fieldBuilder = 1154 (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor); 1155 assertEquals(0, fieldBuilder.getBb()); 1156 1157 // Setting field value with new field builder instance. 1158 builder = TestAllTypes.newBuilder(); 1159 NestedMessage.Builder newFieldBuilder = builder.getOptionalNestedMessageBuilder(); 1160 newFieldBuilder.setBb(2); 1161 // Then get the field builder instance by getFieldBuilder(). 1162 fieldBuilder = (NestedMessage.Builder) builder.getFieldBuilder(fieldDescriptor); 1163 // It should contain new value. 1164 assertEquals(2, fieldBuilder.getBb()); 1165 // These two builder should be equal. 1166 assertSame(fieldBuilder, newFieldBuilder); 1167 } 1168 testGetFieldBuilderNotSupportedException()1169 public void testGetFieldBuilderNotSupportedException() { 1170 Descriptor descriptor = TestAllTypes.getDescriptor(); 1171 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 1172 try { 1173 builder.getFieldBuilder(descriptor.findFieldByName("optional_int32")); 1174 fail("Exception was not thrown"); 1175 } catch (UnsupportedOperationException e) { 1176 // We expect this exception. 1177 } 1178 try { 1179 builder.getFieldBuilder(descriptor.findFieldByName("optional_nested_enum")); 1180 fail("Exception was not thrown"); 1181 } catch (UnsupportedOperationException e) { 1182 // We expect this exception. 1183 } 1184 try { 1185 builder.getFieldBuilder(descriptor.findFieldByName("repeated_int32")); 1186 fail("Exception was not thrown"); 1187 } catch (UnsupportedOperationException e) { 1188 // We expect this exception. 1189 } 1190 try { 1191 builder.getFieldBuilder(descriptor.findFieldByName("repeated_nested_enum")); 1192 fail("Exception was not thrown"); 1193 } catch (UnsupportedOperationException e) { 1194 // We expect this exception. 1195 } 1196 try { 1197 builder.getFieldBuilder(descriptor.findFieldByName("repeated_nested_message")); 1198 fail("Exception was not thrown"); 1199 } catch (UnsupportedOperationException e) { 1200 // We expect this exception. 1201 } 1202 } 1203 1204 // Test that when the default outer class name conflicts with another type 1205 // defined in the proto the compiler will append a suffix to avoid the 1206 // conflict. testConflictingOuterClassName()1207 public void testConflictingOuterClassName() { 1208 // We just need to make sure we can refer to the outer class with the 1209 // expected name. There is nothing else to test. 1210 OuterClassNameTestOuterClass.OuterClassNameTest message = 1211 OuterClassNameTestOuterClass.OuterClassNameTest.newBuilder().build(); 1212 assertTrue( 1213 message.getDescriptorForType() 1214 == OuterClassNameTestOuterClass.OuterClassNameTest.getDescriptor()); 1215 1216 OuterClassNameTest2OuterClass.TestMessage2.NestedMessage.OuterClassNameTest2 message2 = 1217 OuterClassNameTest2OuterClass.TestMessage2.NestedMessage.OuterClassNameTest2.newBuilder() 1218 .build(); 1219 assertEquals(0, message2.getSerializedSize()); 1220 1221 OuterClassNameTest3OuterClass.TestMessage3.NestedMessage.OuterClassNameTest3 enumValue = 1222 OuterClassNameTest3OuterClass.TestMessage3.NestedMessage.OuterClassNameTest3.DUMMY_VALUE; 1223 assertEquals(1, enumValue.getNumber()); 1224 } 1225 1226 // ================================================================= 1227 // oneof generated code test testOneofEnumCase()1228 public void testOneofEnumCase() throws Exception { 1229 TestOneof2 message = 1230 TestOneof2.newBuilder().setFooInt(123).setFooString("foo").setFooCord("bar").build(); 1231 TestUtil.assertAtMostOneFieldSetOneof(message); 1232 } 1233 testClearOneof()1234 public void testClearOneof() throws Exception { 1235 TestOneof2.Builder builder = TestOneof2.newBuilder().setFooInt(123); 1236 assertEquals(TestOneof2.FooCase.FOO_INT, builder.getFooCase()); 1237 builder.clearFoo(); 1238 assertEquals(TestOneof2.FooCase.FOO_NOT_SET, builder.getFooCase()); 1239 } 1240 testSetOneofClearsOthers()1241 public void testSetOneofClearsOthers() throws Exception { 1242 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1243 TestOneof2 message = builder.setFooInt(123).setFooString("foo").buildPartial(); 1244 assertTrue(message.hasFooString()); 1245 TestUtil.assertAtMostOneFieldSetOneof(message); 1246 1247 message = builder.setFooCord("bar").buildPartial(); 1248 assertTrue(message.hasFooCord()); 1249 TestUtil.assertAtMostOneFieldSetOneof(message); 1250 1251 message = builder.setFooStringPiece("baz").buildPartial(); 1252 assertTrue(message.hasFooStringPiece()); 1253 TestUtil.assertAtMostOneFieldSetOneof(message); 1254 1255 message = builder.setFooBytes(TestUtil.toBytes("qux")).buildPartial(); 1256 assertTrue(message.hasFooBytes()); 1257 TestUtil.assertAtMostOneFieldSetOneof(message); 1258 1259 message = builder.setFooEnum(TestOneof2.NestedEnum.FOO).buildPartial(); 1260 assertTrue(message.hasFooEnum()); 1261 TestUtil.assertAtMostOneFieldSetOneof(message); 1262 1263 message = 1264 builder 1265 .setFooMessage(TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()) 1266 .buildPartial(); 1267 assertTrue(message.hasFooMessage()); 1268 TestUtil.assertAtMostOneFieldSetOneof(message); 1269 1270 message = builder.setFooInt(123).buildPartial(); 1271 assertTrue(message.hasFooInt()); 1272 TestUtil.assertAtMostOneFieldSetOneof(message); 1273 } 1274 testOneofTypes()1275 public void testOneofTypes() throws Exception { 1276 // Primitive 1277 { 1278 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1279 assertEquals(builder.getFooInt(), 0); 1280 assertFalse(builder.hasFooInt()); 1281 assertTrue(builder.setFooInt(123).hasFooInt()); 1282 assertEquals(builder.getFooInt(), 123); 1283 TestOneof2 message = builder.buildPartial(); 1284 assertTrue(message.hasFooInt()); 1285 assertEquals(message.getFooInt(), 123); 1286 1287 assertFalse(builder.clearFooInt().hasFooInt()); 1288 TestOneof2 message2 = builder.build(); 1289 assertFalse(message2.hasFooInt()); 1290 assertEquals(0, message2.getFooInt()); 1291 } 1292 1293 // Enum 1294 { 1295 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1296 assertEquals(TestOneof2.NestedEnum.FOO, builder.getFooEnum()); 1297 assertTrue(builder.setFooEnum(TestOneof2.NestedEnum.BAR).hasFooEnum()); 1298 assertEquals(TestOneof2.NestedEnum.BAR, builder.getFooEnum()); 1299 TestOneof2 message = builder.buildPartial(); 1300 assertTrue(message.hasFooEnum()); 1301 assertEquals(TestOneof2.NestedEnum.BAR, message.getFooEnum()); 1302 1303 assertFalse(builder.clearFooEnum().hasFooEnum()); 1304 TestOneof2 message2 = builder.build(); 1305 assertFalse(message2.hasFooEnum()); 1306 assertEquals(TestOneof2.NestedEnum.FOO, message2.getFooEnum()); 1307 } 1308 1309 // String 1310 { 1311 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1312 assertEquals("", builder.getFooString()); 1313 builder.setFooString("foo"); 1314 assertTrue(builder.hasFooString()); 1315 assertEquals("foo", builder.getFooString()); 1316 TestOneof2 message = builder.buildPartial(); 1317 assertTrue(message.hasFooString()); 1318 assertEquals("foo", message.getFooString()); 1319 assertEquals(message.getFooStringBytes(), TestUtil.toBytes("foo")); 1320 1321 assertFalse(builder.clearFooString().hasFooString()); 1322 TestOneof2 message2 = builder.buildPartial(); 1323 assertFalse(message2.hasFooString()); 1324 assertEquals("", message2.getFooString()); 1325 assertEquals(message2.getFooStringBytes(), TestUtil.toBytes("")); 1326 1327 // Get method should not change the oneof value. 1328 builder.setFooInt(123); 1329 assertEquals("", builder.getFooString()); 1330 assertEquals(builder.getFooStringBytes(), TestUtil.toBytes("")); 1331 assertEquals(123, builder.getFooInt()); 1332 1333 message = builder.build(); 1334 assertEquals("", message.getFooString()); 1335 assertEquals(message.getFooStringBytes(), TestUtil.toBytes("")); 1336 assertEquals(123, message.getFooInt()); 1337 } 1338 1339 // Cord 1340 { 1341 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1342 assertEquals("", builder.getFooCord()); 1343 builder.setFooCord("foo"); 1344 assertTrue(builder.hasFooCord()); 1345 assertEquals("foo", builder.getFooCord()); 1346 TestOneof2 message = builder.buildPartial(); 1347 assertTrue(message.hasFooCord()); 1348 assertEquals("foo", message.getFooCord()); 1349 assertEquals(message.getFooCordBytes(), TestUtil.toBytes("foo")); 1350 1351 assertFalse(builder.clearFooCord().hasFooCord()); 1352 TestOneof2 message2 = builder.build(); 1353 assertFalse(message2.hasFooCord()); 1354 assertEquals("", message2.getFooCord()); 1355 assertEquals(message2.getFooCordBytes(), TestUtil.toBytes("")); 1356 } 1357 1358 // StringPiece 1359 { 1360 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1361 assertEquals("", builder.getFooStringPiece()); 1362 builder.setFooStringPiece("foo"); 1363 assertTrue(builder.hasFooStringPiece()); 1364 assertEquals("foo", builder.getFooStringPiece()); 1365 TestOneof2 message = builder.buildPartial(); 1366 assertTrue(message.hasFooStringPiece()); 1367 assertEquals("foo", message.getFooStringPiece()); 1368 assertEquals(message.getFooStringPieceBytes(), TestUtil.toBytes("foo")); 1369 1370 assertFalse(builder.clearFooStringPiece().hasFooStringPiece()); 1371 TestOneof2 message2 = builder.build(); 1372 assertFalse(message2.hasFooStringPiece()); 1373 assertEquals("", message2.getFooStringPiece()); 1374 assertEquals(message2.getFooStringPieceBytes(), TestUtil.toBytes("")); 1375 } 1376 1377 // Message 1378 { 1379 // set 1380 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1381 assertEquals(0, builder.getFooMessage().getQuxInt()); 1382 builder.setFooMessage(TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()); 1383 assertTrue(builder.hasFooMessage()); 1384 assertEquals(234, builder.getFooMessage().getQuxInt()); 1385 TestOneof2 message = builder.buildPartial(); 1386 assertTrue(message.hasFooMessage()); 1387 assertEquals(234, message.getFooMessage().getQuxInt()); 1388 1389 // clear 1390 assertFalse(builder.clearFooMessage().hasFooString()); 1391 message = builder.build(); 1392 assertFalse(message.hasFooMessage()); 1393 assertEquals(0, message.getFooMessage().getQuxInt()); 1394 1395 // nested builder 1396 builder = TestOneof2.newBuilder(); 1397 assertSame(builder.getFooMessageOrBuilder(), TestOneof2.NestedMessage.getDefaultInstance()); 1398 assertFalse(builder.hasFooMessage()); 1399 builder.getFooMessageBuilder().setQuxInt(123); 1400 assertTrue(builder.hasFooMessage()); 1401 assertEquals(123, builder.getFooMessage().getQuxInt()); 1402 message = builder.build(); 1403 assertTrue(message.hasFooMessage()); 1404 assertEquals(123, message.getFooMessage().getQuxInt()); 1405 } 1406 1407 // LazyMessage is tested in LazyMessageLiteTest.java 1408 } 1409 testOneofMerge()1410 public void testOneofMerge() throws Exception { 1411 // Primitive Type 1412 { 1413 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1414 TestOneof2 message = builder.setFooInt(123).build(); 1415 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); 1416 assertTrue(message2.hasFooInt()); 1417 assertEquals(123, message2.getFooInt()); 1418 } 1419 1420 // String 1421 { 1422 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1423 TestOneof2 message = builder.setFooString("foo").build(); 1424 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); 1425 assertTrue(message2.hasFooString()); 1426 assertEquals("foo", message2.getFooString()); 1427 } 1428 1429 // Enum 1430 { 1431 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1432 TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build(); 1433 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); 1434 assertTrue(message2.hasFooEnum()); 1435 assertEquals(TestOneof2.NestedEnum.BAR, message2.getFooEnum()); 1436 } 1437 1438 // Message 1439 { 1440 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1441 TestOneof2 message = 1442 builder 1443 .setFooMessage(TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()) 1444 .build(); 1445 TestOneof2 message2 = TestOneof2.newBuilder().mergeFrom(message).build(); 1446 assertTrue(message2.hasFooMessage()); 1447 assertEquals(234, message2.getFooMessage().getQuxInt()); 1448 } 1449 } 1450 testOneofSerialization()1451 public void testOneofSerialization() throws Exception { 1452 // Primitive Type 1453 { 1454 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1455 TestOneof2 message = builder.setFooInt(123).build(); 1456 ByteString serialized = message.toByteString(); 1457 TestOneof2 message2 = TestOneof2.parseFrom(serialized); 1458 assertTrue(message2.hasFooInt()); 1459 assertEquals(123, message2.getFooInt()); 1460 } 1461 1462 // String 1463 { 1464 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1465 TestOneof2 message = builder.setFooString("foo").build(); 1466 ByteString serialized = message.toByteString(); 1467 TestOneof2 message2 = TestOneof2.parseFrom(serialized); 1468 assertTrue(message2.hasFooString()); 1469 assertEquals("foo", message2.getFooString()); 1470 } 1471 1472 // Enum 1473 { 1474 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1475 TestOneof2 message = builder.setFooEnum(TestOneof2.NestedEnum.BAR).build(); 1476 ByteString serialized = message.toByteString(); 1477 TestOneof2 message2 = TestOneof2.parseFrom(serialized); 1478 assertTrue(message2.hasFooEnum()); 1479 assertEquals(TestOneof2.NestedEnum.BAR, message2.getFooEnum()); 1480 } 1481 1482 // Message 1483 { 1484 TestOneof2.Builder builder = TestOneof2.newBuilder(); 1485 TestOneof2 message = 1486 builder 1487 .setFooMessage(TestOneof2.NestedMessage.newBuilder().setQuxInt(234).build()) 1488 .build(); 1489 ByteString serialized = message.toByteString(); 1490 TestOneof2 message2 = TestOneof2.parseFrom(serialized); 1491 assertTrue(message2.hasFooMessage()); 1492 assertEquals(234, message2.getFooMessage().getQuxInt()); 1493 } 1494 } 1495 testOneofNestedBuilderOnChangePropagation()1496 public void testOneofNestedBuilderOnChangePropagation() { 1497 NestedTestAllTypes.Builder parentBuilder = NestedTestAllTypes.newBuilder(); 1498 TestAllTypes.Builder builder = parentBuilder.getPayloadBuilder(); 1499 builder.getOneofNestedMessageBuilder(); 1500 assertTrue(builder.hasOneofNestedMessage()); 1501 assertTrue(parentBuilder.hasPayload()); 1502 NestedTestAllTypes message = parentBuilder.build(); 1503 assertTrue(message.hasPayload()); 1504 assertTrue(message.getPayload().hasOneofNestedMessage()); 1505 } 1506 testGetRepeatedFieldBuilder()1507 public void testGetRepeatedFieldBuilder() { 1508 Descriptor descriptor = TestAllTypes.getDescriptor(); 1509 1510 FieldDescriptor fieldDescriptor = descriptor.findFieldByName("repeated_nested_message"); 1511 FieldDescriptor foreignFieldDescriptor = descriptor.findFieldByName("repeated_foreign_message"); 1512 FieldDescriptor importFieldDescriptor = descriptor.findFieldByName("repeated_import_message"); 1513 1514 // Mutate the message with new field builder 1515 // Mutate nested message 1516 TestAllTypes.Builder builder1 = TestAllTypes.newBuilder(); 1517 Message.Builder fieldBuilder1 = builder1.newBuilderForField(fieldDescriptor); 1518 FieldDescriptor subFieldDescriptor1 = 1519 fieldBuilder1.getDescriptorForType().findFieldByName("bb"); 1520 fieldBuilder1.setField(subFieldDescriptor1, 1); 1521 builder1.addRepeatedField(fieldDescriptor, fieldBuilder1.build()); 1522 1523 // Mutate foreign message 1524 Message.Builder foreignFieldBuilder1 = builder1.newBuilderForField(foreignFieldDescriptor); 1525 FieldDescriptor subForeignFieldDescriptor1 = 1526 foreignFieldBuilder1.getDescriptorForType().findFieldByName("c"); 1527 foreignFieldBuilder1.setField(subForeignFieldDescriptor1, 2); 1528 builder1.addRepeatedField(foreignFieldDescriptor, foreignFieldBuilder1.build()); 1529 1530 // Mutate import message 1531 Message.Builder importFieldBuilder1 = builder1.newBuilderForField(importFieldDescriptor); 1532 FieldDescriptor subImportFieldDescriptor1 = 1533 importFieldBuilder1.getDescriptorForType().findFieldByName("d"); 1534 importFieldBuilder1.setField(subImportFieldDescriptor1, 3); 1535 builder1.addRepeatedField(importFieldDescriptor, importFieldBuilder1.build()); 1536 1537 Message newMessage1 = builder1.build(); 1538 1539 // Mutate the message with existing field builder 1540 // Mutate nested message 1541 TestAllTypes.Builder builder2 = TestAllTypes.newBuilder(); 1542 builder2.addRepeatedNestedMessageBuilder(); 1543 Message.Builder fieldBuilder2 = builder2.getRepeatedFieldBuilder(fieldDescriptor, 0); 1544 FieldDescriptor subFieldDescriptor2 = 1545 fieldBuilder2.getDescriptorForType().findFieldByName("bb"); 1546 fieldBuilder2.setField(subFieldDescriptor2, 1); 1547 1548 // Mutate foreign message 1549 Message.Builder foreignFieldBuilder2 = builder2.newBuilderForField(foreignFieldDescriptor); 1550 FieldDescriptor subForeignFieldDescriptor2 = 1551 foreignFieldBuilder2.getDescriptorForType().findFieldByName("c"); 1552 foreignFieldBuilder2.setField(subForeignFieldDescriptor2, 2); 1553 builder2.addRepeatedField(foreignFieldDescriptor, foreignFieldBuilder2.build()); 1554 1555 // Mutate import message 1556 Message.Builder importFieldBuilder2 = builder2.newBuilderForField(importFieldDescriptor); 1557 FieldDescriptor subImportFieldDescriptor2 = 1558 importFieldBuilder2.getDescriptorForType().findFieldByName("d"); 1559 importFieldBuilder2.setField(subImportFieldDescriptor2, 3); 1560 builder2.addRepeatedField(importFieldDescriptor, importFieldBuilder2.build()); 1561 1562 Message newMessage2 = builder2.build(); 1563 1564 // These two messages should be equal. 1565 assertEquals(newMessage1, newMessage2); 1566 } 1567 testGetRepeatedFieldBuilderWithInitializedValue()1568 public void testGetRepeatedFieldBuilderWithInitializedValue() { 1569 Descriptor descriptor = TestAllTypes.getDescriptor(); 1570 FieldDescriptor fieldDescriptor = descriptor.findFieldByName("repeated_nested_message"); 1571 1572 // Before setting field, builder is initialized by default value. 1573 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 1574 builder.addRepeatedNestedMessageBuilder(); 1575 NestedMessage.Builder fieldBuilder = 1576 (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor, 0); 1577 assertEquals(0, fieldBuilder.getBb()); 1578 1579 // Setting field value with new field builder instance. 1580 builder = TestAllTypes.newBuilder(); 1581 NestedMessage.Builder newFieldBuilder = builder.addRepeatedNestedMessageBuilder(); 1582 newFieldBuilder.setBb(2); 1583 // Then get the field builder instance by getRepeatedFieldBuilder(). 1584 fieldBuilder = (NestedMessage.Builder) builder.getRepeatedFieldBuilder(fieldDescriptor, 0); 1585 // It should contain new value. 1586 assertEquals(2, fieldBuilder.getBb()); 1587 // These two builder should be equal. 1588 assertSame(fieldBuilder, newFieldBuilder); 1589 } 1590 testGetRepeatedFieldBuilderNotSupportedException()1591 public void testGetRepeatedFieldBuilderNotSupportedException() { 1592 Descriptor descriptor = TestAllTypes.getDescriptor(); 1593 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); 1594 try { 1595 builder.getRepeatedFieldBuilder(descriptor.findFieldByName("repeated_int32"), 0); 1596 fail("Exception was not thrown"); 1597 } catch (UnsupportedOperationException e) { 1598 // We expect this exception. 1599 } 1600 try { 1601 builder.getRepeatedFieldBuilder(descriptor.findFieldByName("repeated_nested_enum"), 0); 1602 fail("Exception was not thrown"); 1603 } catch (UnsupportedOperationException e) { 1604 // We expect this exception. 1605 } 1606 try { 1607 builder.getRepeatedFieldBuilder(descriptor.findFieldByName("optional_int32"), 0); 1608 fail("Exception was not thrown"); 1609 } catch (UnsupportedOperationException e) { 1610 // We expect this exception. 1611 } 1612 try { 1613 builder.getRepeatedFieldBuilder(descriptor.findFieldByName("optional_nested_enum"), 0); 1614 fail("Exception was not thrown"); 1615 } catch (UnsupportedOperationException e) { 1616 // We expect this exception. 1617 } 1618 try { 1619 builder.getRepeatedFieldBuilder(descriptor.findFieldByName("optional_nested_message"), 0); 1620 fail("Exception was not thrown"); 1621 } catch (UnsupportedOperationException e) { 1622 // We expect this exception. 1623 } 1624 } 1625 } 1626