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// Author: kenton@google.com (Kenton Varda) 32// Based on original Protocol Buffers design by 33// Sanjay Ghemawat, Jeff Dean, and others. 34// 35// A proto file we will use for unit testing. 36 37syntax = "proto2"; 38 39// Some generic_services option(s) added automatically. 40// See: http://go/proto2-generic-services-default 41option cc_generic_services = true; // auto-added 42option java_generic_services = true; // auto-added 43option py_generic_services = true; // auto-added 44option cc_enable_arenas = true; 45 46import "google/protobuf/unittest_import.proto"; 47 48// We don't put this in a package within proto2 because we need to make sure 49// that the generated code doesn't depend on being in the proto2 namespace. 50// In test_util.h we do "using namespace unittest = protobuf_unittest". 51package protobuf_unittest; 52 53// Protos optimized for SPEED use a strict superset of the generated code 54// of equivalent ones optimized for CODE_SIZE, so we should optimize all our 55// tests for speed unless explicitly testing code size optimization. 56option optimize_for = SPEED; 57 58option java_outer_classname = "UnittestProto"; 59 60// This proto includes every type of field in both singular and repeated 61// forms. 62message TestAllTypes { 63 message NestedMessage { 64 // The field name "b" fails to compile in proto1 because it conflicts with 65 // a local variable named "b" in one of the generated methods. Doh. 66 // This file needs to compile in proto1 to test backwards-compatibility. 67 optional int32 bb = 1; 68 } 69 70 enum NestedEnum { 71 FOO = 1; 72 BAR = 2; 73 BAZ = 3; 74 NEG = -1; // Intentionally negative. 75 } 76 77 // Singular 78 optional int32 optional_int32 = 1; 79 optional int64 optional_int64 = 2; 80 optional uint32 optional_uint32 = 3; 81 optional uint64 optional_uint64 = 4; 82 optional sint32 optional_sint32 = 5; 83 optional sint64 optional_sint64 = 6; 84 optional fixed32 optional_fixed32 = 7; 85 optional fixed64 optional_fixed64 = 8; 86 optional sfixed32 optional_sfixed32 = 9; 87 optional sfixed64 optional_sfixed64 = 10; 88 optional float optional_float = 11; 89 optional double optional_double = 12; 90 optional bool optional_bool = 13; 91 optional string optional_string = 14; 92 optional bytes optional_bytes = 15; 93 94 optional group OptionalGroup = 16 { 95 optional int32 a = 17; 96 } 97 98 optional NestedMessage optional_nested_message = 18; 99 optional ForeignMessage optional_foreign_message = 19; 100 optional protobuf_unittest_import.ImportMessage optional_import_message = 20; 101 102 optional NestedEnum optional_nested_enum = 21; 103 optional ForeignEnum optional_foreign_enum = 22; 104 optional protobuf_unittest_import.ImportEnum optional_import_enum = 23; 105 106 optional string optional_string_piece = 24 [ctype=STRING_PIECE]; 107 optional string optional_cord = 25 [ctype=CORD]; 108 109 // Defined in unittest_import_public.proto 110 optional protobuf_unittest_import.PublicImportMessage 111 optional_public_import_message = 26; 112 113 optional NestedMessage optional_lazy_message = 27 [lazy=true]; 114 115 // Repeated 116 repeated int32 repeated_int32 = 31; 117 repeated int64 repeated_int64 = 32; 118 repeated uint32 repeated_uint32 = 33; 119 repeated uint64 repeated_uint64 = 34; 120 repeated sint32 repeated_sint32 = 35; 121 repeated sint64 repeated_sint64 = 36; 122 repeated fixed32 repeated_fixed32 = 37; 123 repeated fixed64 repeated_fixed64 = 38; 124 repeated sfixed32 repeated_sfixed32 = 39; 125 repeated sfixed64 repeated_sfixed64 = 40; 126 repeated float repeated_float = 41; 127 repeated double repeated_double = 42; 128 repeated bool repeated_bool = 43; 129 repeated string repeated_string = 44; 130 repeated bytes repeated_bytes = 45; 131 132 repeated group RepeatedGroup = 46 { 133 optional int32 a = 47; 134 } 135 136 repeated NestedMessage repeated_nested_message = 48; 137 repeated ForeignMessage repeated_foreign_message = 49; 138 repeated protobuf_unittest_import.ImportMessage repeated_import_message = 50; 139 140 repeated NestedEnum repeated_nested_enum = 51; 141 repeated ForeignEnum repeated_foreign_enum = 52; 142 repeated protobuf_unittest_import.ImportEnum repeated_import_enum = 53; 143 144 repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; 145 repeated string repeated_cord = 55 [ctype=CORD]; 146 147 repeated NestedMessage repeated_lazy_message = 57 [lazy=true]; 148 149 // Singular with defaults 150 optional int32 default_int32 = 61 [default = 41 ]; 151 optional int64 default_int64 = 62 [default = 42 ]; 152 optional uint32 default_uint32 = 63 [default = 43 ]; 153 optional uint64 default_uint64 = 64 [default = 44 ]; 154 optional sint32 default_sint32 = 65 [default = -45 ]; 155 optional sint64 default_sint64 = 66 [default = 46 ]; 156 optional fixed32 default_fixed32 = 67 [default = 47 ]; 157 optional fixed64 default_fixed64 = 68 [default = 48 ]; 158 optional sfixed32 default_sfixed32 = 69 [default = 49 ]; 159 optional sfixed64 default_sfixed64 = 70 [default = -50 ]; 160 optional float default_float = 71 [default = 51.5 ]; 161 optional double default_double = 72 [default = 52e3 ]; 162 optional bool default_bool = 73 [default = true ]; 163 optional string default_string = 74 [default = "hello"]; 164 optional bytes default_bytes = 75 [default = "world"]; 165 166 optional NestedEnum default_nested_enum = 81 [default = BAR ]; 167 optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR]; 168 optional protobuf_unittest_import.ImportEnum 169 default_import_enum = 83 [default = IMPORT_BAR]; 170 171 optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; 172 optional string default_cord = 85 [ctype=CORD,default="123"]; 173 174 // For oneof test 175 oneof oneof_field { 176 uint32 oneof_uint32 = 111; 177 NestedMessage oneof_nested_message = 112; 178 string oneof_string = 113; 179 bytes oneof_bytes = 114; 180 } 181} 182 183// This proto includes a recusively nested message. 184message NestedTestAllTypes { 185 optional NestedTestAllTypes child = 1; 186 optional TestAllTypes payload = 2; 187 repeated NestedTestAllTypes repeated_child = 3; 188} 189 190message TestDeprecatedFields { 191 optional int32 deprecated_int32 = 1 [deprecated=true]; 192} 193 194// Define these after TestAllTypes to make sure the compiler can handle 195// that. 196message ForeignMessage { 197 optional int32 c = 1; 198} 199 200enum ForeignEnum { 201 FOREIGN_FOO = 4; 202 FOREIGN_BAR = 5; 203 FOREIGN_BAZ = 6; 204} 205 206message TestReservedFields { 207 reserved 2, 15, 9 to 11; 208 reserved "bar", "baz"; 209} 210 211message TestAllExtensions { 212 extensions 1 to max; 213} 214 215extend TestAllExtensions { 216 // Singular 217 optional int32 optional_int32_extension = 1; 218 optional int64 optional_int64_extension = 2; 219 optional uint32 optional_uint32_extension = 3; 220 optional uint64 optional_uint64_extension = 4; 221 optional sint32 optional_sint32_extension = 5; 222 optional sint64 optional_sint64_extension = 6; 223 optional fixed32 optional_fixed32_extension = 7; 224 optional fixed64 optional_fixed64_extension = 8; 225 optional sfixed32 optional_sfixed32_extension = 9; 226 optional sfixed64 optional_sfixed64_extension = 10; 227 optional float optional_float_extension = 11; 228 optional double optional_double_extension = 12; 229 optional bool optional_bool_extension = 13; 230 optional string optional_string_extension = 14; 231 optional bytes optional_bytes_extension = 15; 232 233 optional group OptionalGroup_extension = 16 { 234 optional int32 a = 17; 235 } 236 237 optional TestAllTypes.NestedMessage optional_nested_message_extension = 18; 238 optional ForeignMessage optional_foreign_message_extension = 19; 239 optional protobuf_unittest_import.ImportMessage 240 optional_import_message_extension = 20; 241 242 optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21; 243 optional ForeignEnum optional_foreign_enum_extension = 22; 244 optional protobuf_unittest_import.ImportEnum 245 optional_import_enum_extension = 23; 246 247 optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE]; 248 optional string optional_cord_extension = 25 [ctype=CORD]; 249 250 optional protobuf_unittest_import.PublicImportMessage 251 optional_public_import_message_extension = 26; 252 253 optional TestAllTypes.NestedMessage 254 optional_lazy_message_extension = 27 [lazy=true]; 255 256 // Repeated 257 repeated int32 repeated_int32_extension = 31; 258 repeated int64 repeated_int64_extension = 32; 259 repeated uint32 repeated_uint32_extension = 33; 260 repeated uint64 repeated_uint64_extension = 34; 261 repeated sint32 repeated_sint32_extension = 35; 262 repeated sint64 repeated_sint64_extension = 36; 263 repeated fixed32 repeated_fixed32_extension = 37; 264 repeated fixed64 repeated_fixed64_extension = 38; 265 repeated sfixed32 repeated_sfixed32_extension = 39; 266 repeated sfixed64 repeated_sfixed64_extension = 40; 267 repeated float repeated_float_extension = 41; 268 repeated double repeated_double_extension = 42; 269 repeated bool repeated_bool_extension = 43; 270 repeated string repeated_string_extension = 44; 271 repeated bytes repeated_bytes_extension = 45; 272 273 repeated group RepeatedGroup_extension = 46 { 274 optional int32 a = 47; 275 } 276 277 repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48; 278 repeated ForeignMessage repeated_foreign_message_extension = 49; 279 repeated protobuf_unittest_import.ImportMessage 280 repeated_import_message_extension = 50; 281 282 repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51; 283 repeated ForeignEnum repeated_foreign_enum_extension = 52; 284 repeated protobuf_unittest_import.ImportEnum 285 repeated_import_enum_extension = 53; 286 287 repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE]; 288 repeated string repeated_cord_extension = 55 [ctype=CORD]; 289 290 repeated TestAllTypes.NestedMessage 291 repeated_lazy_message_extension = 57 [lazy=true]; 292 293 // Singular with defaults 294 optional int32 default_int32_extension = 61 [default = 41 ]; 295 optional int64 default_int64_extension = 62 [default = 42 ]; 296 optional uint32 default_uint32_extension = 63 [default = 43 ]; 297 optional uint64 default_uint64_extension = 64 [default = 44 ]; 298 optional sint32 default_sint32_extension = 65 [default = -45 ]; 299 optional sint64 default_sint64_extension = 66 [default = 46 ]; 300 optional fixed32 default_fixed32_extension = 67 [default = 47 ]; 301 optional fixed64 default_fixed64_extension = 68 [default = 48 ]; 302 optional sfixed32 default_sfixed32_extension = 69 [default = 49 ]; 303 optional sfixed64 default_sfixed64_extension = 70 [default = -50 ]; 304 optional float default_float_extension = 71 [default = 51.5 ]; 305 optional double default_double_extension = 72 [default = 52e3 ]; 306 optional bool default_bool_extension = 73 [default = true ]; 307 optional string default_string_extension = 74 [default = "hello"]; 308 optional bytes default_bytes_extension = 75 [default = "world"]; 309 310 optional TestAllTypes.NestedEnum 311 default_nested_enum_extension = 81 [default = BAR]; 312 optional ForeignEnum 313 default_foreign_enum_extension = 82 [default = FOREIGN_BAR]; 314 optional protobuf_unittest_import.ImportEnum 315 default_import_enum_extension = 83 [default = IMPORT_BAR]; 316 317 optional string default_string_piece_extension = 84 [ctype=STRING_PIECE, 318 default="abc"]; 319 optional string default_cord_extension = 85 [ctype=CORD, default="123"]; 320 321 // For oneof test 322 optional uint32 oneof_uint32_extension = 111; 323 optional TestAllTypes.NestedMessage oneof_nested_message_extension = 112; 324 optional string oneof_string_extension = 113; 325 optional bytes oneof_bytes_extension = 114; 326} 327 328message TestNestedExtension { 329 extend TestAllExtensions { 330 // Check for bug where string extensions declared in tested scope did not 331 // compile. 332 optional string test = 1002 [default="test"]; 333 // Used to test if generated extension name is correct when there are 334 // underscores. 335 optional string nested_string_extension = 1003; 336 } 337} 338 339// We have separate messages for testing required fields because it's 340// annoying to have to fill in required fields in TestProto in order to 341// do anything with it. Note that we don't need to test every type of 342// required filed because the code output is basically identical to 343// optional fields for all types. 344message TestRequired { 345 required int32 a = 1; 346 optional int32 dummy2 = 2; 347 required int32 b = 3; 348 349 extend TestAllExtensions { 350 optional TestRequired single = 1000; 351 repeated TestRequired multi = 1001; 352 } 353 354 // Pad the field count to 32 so that we can test that IsInitialized() 355 // properly checks multiple elements of has_bits_. 356 optional int32 dummy4 = 4; 357 optional int32 dummy5 = 5; 358 optional int32 dummy6 = 6; 359 optional int32 dummy7 = 7; 360 optional int32 dummy8 = 8; 361 optional int32 dummy9 = 9; 362 optional int32 dummy10 = 10; 363 optional int32 dummy11 = 11; 364 optional int32 dummy12 = 12; 365 optional int32 dummy13 = 13; 366 optional int32 dummy14 = 14; 367 optional int32 dummy15 = 15; 368 optional int32 dummy16 = 16; 369 optional int32 dummy17 = 17; 370 optional int32 dummy18 = 18; 371 optional int32 dummy19 = 19; 372 optional int32 dummy20 = 20; 373 optional int32 dummy21 = 21; 374 optional int32 dummy22 = 22; 375 optional int32 dummy23 = 23; 376 optional int32 dummy24 = 24; 377 optional int32 dummy25 = 25; 378 optional int32 dummy26 = 26; 379 optional int32 dummy27 = 27; 380 optional int32 dummy28 = 28; 381 optional int32 dummy29 = 29; 382 optional int32 dummy30 = 30; 383 optional int32 dummy31 = 31; 384 optional int32 dummy32 = 32; 385 386 required int32 c = 33; 387} 388 389message TestRequiredForeign { 390 optional TestRequired optional_message = 1; 391 repeated TestRequired repeated_message = 2; 392 optional int32 dummy = 3; 393} 394 395// Test that we can use NestedMessage from outside TestAllTypes. 396message TestForeignNested { 397 optional TestAllTypes.NestedMessage foreign_nested = 1; 398} 399 400// TestEmptyMessage is used to test unknown field support. 401message TestEmptyMessage { 402} 403 404// Like above, but declare all field numbers as potential extensions. No 405// actual extensions should ever be defined for this type. 406message TestEmptyMessageWithExtensions { 407 extensions 1 to max; 408} 409 410message TestMultipleExtensionRanges { 411 extensions 42; 412 extensions 4143 to 4243; 413 extensions 65536 to max; 414} 415 416// Test that really large tag numbers don't break anything. 417message TestReallyLargeTagNumber { 418 // The largest possible tag number is 2^28 - 1, since the wire format uses 419 // three bits to communicate wire type. 420 optional int32 a = 1; 421 optional int32 bb = 268435455; 422} 423 424message TestRecursiveMessage { 425 optional TestRecursiveMessage a = 1; 426 optional int32 i = 2; 427} 428 429// Test that mutual recursion works. 430message TestMutualRecursionA { 431 optional TestMutualRecursionB bb = 1; 432} 433 434message TestMutualRecursionB { 435 optional TestMutualRecursionA a = 1; 436 optional int32 optional_int32 = 2; 437} 438 439// Test that groups have disjoint field numbers from their siblings and 440// parents. This is NOT possible in proto1; only google.protobuf. When attempting 441// to compile with proto1, this will emit an error; so we only include it 442// in protobuf_unittest_proto. 443message TestDupFieldNumber { // NO_PROTO1 444 optional int32 a = 1; // NO_PROTO1 445 optional group Foo = 2 { optional int32 a = 1; } // NO_PROTO1 446 optional group Bar = 3 { optional int32 a = 1; } // NO_PROTO1 447} // NO_PROTO1 448 449// Additional messages for testing lazy fields. 450message TestEagerMessage { 451 optional TestAllTypes sub_message = 1 [lazy=false]; 452} 453message TestLazyMessage { 454 optional TestAllTypes sub_message = 1 [lazy=true]; 455} 456 457// Needed for a Python test. 458message TestNestedMessageHasBits { 459 message NestedMessage { 460 repeated int32 nestedmessage_repeated_int32 = 1; 461 repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2; 462 } 463 optional NestedMessage optional_nested_message = 1; 464} 465 466 467// Test an enum that has multiple values with the same number. 468enum TestEnumWithDupValue { 469 option allow_alias = true; 470 471 FOO1 = 1; 472 BAR1 = 2; 473 BAZ = 3; 474 FOO2 = 1; 475 BAR2 = 2; 476} 477 478// Test an enum with large, unordered values. 479enum TestSparseEnum { 480 SPARSE_A = 123; 481 SPARSE_B = 62374; 482 SPARSE_C = 12589234; 483 SPARSE_D = -15; 484 SPARSE_E = -53452; 485 SPARSE_F = 0; 486 SPARSE_G = 2; 487} 488 489// Test message with CamelCase field names. This violates Protocol Buffer 490// standard style. 491message TestCamelCaseFieldNames { 492 optional int32 PrimitiveField = 1; 493 optional string StringField = 2; 494 optional ForeignEnum EnumField = 3; 495 optional ForeignMessage MessageField = 4; 496 optional string StringPieceField = 5 [ctype=STRING_PIECE]; 497 optional string CordField = 6 [ctype=CORD]; 498 499 repeated int32 RepeatedPrimitiveField = 7; 500 repeated string RepeatedStringField = 8; 501 repeated ForeignEnum RepeatedEnumField = 9; 502 repeated ForeignMessage RepeatedMessageField = 10; 503 repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE]; 504 repeated string RepeatedCordField = 12 [ctype=CORD]; 505} 506 507 508// We list fields out of order, to ensure that we're using field number and not 509// field index to determine serialization order. 510message TestFieldOrderings { 511 optional string my_string = 11; 512 extensions 2 to 10; 513 optional int64 my_int = 1; 514 extensions 12 to 100; 515 optional float my_float = 101; 516 message NestedMessage { 517 optional int64 oo = 2; 518 // The field name "b" fails to compile in proto1 because it conflicts with 519 // a local variable named "b" in one of the generated methods. Doh. 520 // This file needs to compile in proto1 to test backwards-compatibility. 521 optional int32 bb = 1; 522 } 523 524 optional NestedMessage optional_nested_message = 200; 525} 526 527 528extend TestFieldOrderings { 529 optional string my_extension_string = 50; 530 optional int32 my_extension_int = 5; 531} 532 533 534message TestExtremeDefaultValues { 535 optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"]; 536 optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF]; 537 optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF]; 538 optional int32 small_int32 = 4 [default = -0x7FFFFFFF]; 539 optional int64 small_int64 = 5 [default = -0x7FFFFFFFFFFFFFFF]; 540 optional int32 really_small_int32 = 21 [default = -0x80000000]; 541 optional int64 really_small_int64 = 22 [default = -0x8000000000000000]; 542 543 // The default value here is UTF-8 for "\u1234". (We could also just type 544 // the UTF-8 text directly into this text file rather than escape it, but 545 // lots of people use editors that would be confused by this.) 546 optional string utf8_string = 6 [default = "\341\210\264"]; 547 548 // Tests for single-precision floating-point values. 549 optional float zero_float = 7 [default = 0]; 550 optional float one_float = 8 [default = 1]; 551 optional float small_float = 9 [default = 1.5]; 552 optional float negative_one_float = 10 [default = -1]; 553 optional float negative_float = 11 [default = -1.5]; 554 // Using exponents 555 optional float large_float = 12 [default = 2E8]; 556 optional float small_negative_float = 13 [default = -8e-28]; 557 558 // Text for nonfinite floating-point values. 559 optional double inf_double = 14 [default = inf]; 560 optional double neg_inf_double = 15 [default = -inf]; 561 optional double nan_double = 16 [default = nan]; 562 optional float inf_float = 17 [default = inf]; 563 optional float neg_inf_float = 18 [default = -inf]; 564 optional float nan_float = 19 [default = nan]; 565 566 // Tests for C++ trigraphs. 567 // Trigraphs should be escaped in C++ generated files, but they should not be 568 // escaped for other languages. 569 // Note that in .proto file, "\?" is a valid way to escape ? in string 570 // literals. 571 optional string cpp_trigraph = 20 [default = "? \? ?? \?? \??? ??/ ?\?-"]; 572 573 // String defaults containing the character '\000' 574 optional string string_with_zero = 23 [default = "hel\000lo"]; 575 optional bytes bytes_with_zero = 24 [default = "wor\000ld"]; 576 optional string string_piece_with_zero = 25 [ctype=STRING_PIECE, 577 default="ab\000c"]; 578 optional string cord_with_zero = 26 [ctype=CORD, 579 default="12\0003"]; 580 optional string replacement_string = 27 [default="${unknown}"]; 581} 582 583message SparseEnumMessage { 584 optional TestSparseEnum sparse_enum = 1; 585} 586 587// Test String and Bytes: string is for valid UTF-8 strings 588message OneString { 589 optional string data = 1; 590} 591 592message MoreString { 593 repeated string data = 1; 594} 595 596message OneBytes { 597 optional bytes data = 1; 598} 599 600message MoreBytes { 601 repeated bytes data = 1; 602} 603 604// Test int32, uint32, int64, uint64, and bool are all compatible 605message Int32Message { 606 optional int32 data = 1; 607} 608 609message Uint32Message { 610 optional uint32 data = 1; 611} 612 613message Int64Message { 614 optional int64 data = 1; 615} 616 617message Uint64Message { 618 optional uint64 data = 1; 619} 620 621message BoolMessage { 622 optional bool data = 1; 623} 624 625// Test oneofs. 626message TestOneof { 627 oneof foo { 628 int32 foo_int = 1; 629 string foo_string = 2; 630 TestAllTypes foo_message = 3; 631 group FooGroup = 4 { 632 optional int32 a = 5; 633 optional string b = 6; 634 } 635 } 636} 637 638message TestOneofBackwardsCompatible { 639 optional int32 foo_int = 1; 640 optional string foo_string = 2; 641 optional TestAllTypes foo_message = 3; 642 optional group FooGroup = 4 { 643 optional int32 a = 5; 644 optional string b = 6; 645 } 646} 647 648message TestOneof2 { 649 oneof foo { 650 int32 foo_int = 1; 651 string foo_string = 2; 652 string foo_cord = 3 [ctype=CORD]; 653 string foo_string_piece = 4 [ctype=STRING_PIECE]; 654 bytes foo_bytes = 5; 655 NestedEnum foo_enum = 6; 656 NestedMessage foo_message = 7; 657 group FooGroup = 8 { 658 optional int32 a = 9; 659 optional string b = 10; 660 } 661 NestedMessage foo_lazy_message = 11 [lazy=true]; 662 } 663 664 oneof bar { 665 int32 bar_int = 12 [default = 5]; 666 string bar_string = 13 [default = "STRING"]; 667 string bar_cord = 14 [ctype=CORD, default = "CORD"]; 668 string bar_string_piece = 15 [ctype=STRING_PIECE, default = "SPIECE"]; 669 bytes bar_bytes = 16 [default = "BYTES"]; 670 NestedEnum bar_enum = 17 [default = BAR]; 671 } 672 673 optional int32 baz_int = 18; 674 optional string baz_string = 19 [default = "BAZ"]; 675 676 message NestedMessage { 677 optional int64 qux_int = 1; 678 repeated int32 corge_int = 2; 679 } 680 681 enum NestedEnum { 682 FOO = 1; 683 BAR = 2; 684 BAZ = 3; 685 } 686} 687 688message TestRequiredOneof { 689 oneof foo { 690 int32 foo_int = 1; 691 string foo_string = 2; 692 NestedMessage foo_message = 3; 693 } 694 message NestedMessage { 695 required double required_double = 1; 696 } 697} 698 699 700// Test messages for packed fields 701 702message TestPackedTypes { 703 repeated int32 packed_int32 = 90 [packed = true]; 704 repeated int64 packed_int64 = 91 [packed = true]; 705 repeated uint32 packed_uint32 = 92 [packed = true]; 706 repeated uint64 packed_uint64 = 93 [packed = true]; 707 repeated sint32 packed_sint32 = 94 [packed = true]; 708 repeated sint64 packed_sint64 = 95 [packed = true]; 709 repeated fixed32 packed_fixed32 = 96 [packed = true]; 710 repeated fixed64 packed_fixed64 = 97 [packed = true]; 711 repeated sfixed32 packed_sfixed32 = 98 [packed = true]; 712 repeated sfixed64 packed_sfixed64 = 99 [packed = true]; 713 repeated float packed_float = 100 [packed = true]; 714 repeated double packed_double = 101 [packed = true]; 715 repeated bool packed_bool = 102 [packed = true]; 716 repeated ForeignEnum packed_enum = 103 [packed = true]; 717} 718 719// A message with the same fields as TestPackedTypes, but without packing. Used 720// to test packed <-> unpacked wire compatibility. 721message TestUnpackedTypes { 722 repeated int32 unpacked_int32 = 90 [packed = false]; 723 repeated int64 unpacked_int64 = 91 [packed = false]; 724 repeated uint32 unpacked_uint32 = 92 [packed = false]; 725 repeated uint64 unpacked_uint64 = 93 [packed = false]; 726 repeated sint32 unpacked_sint32 = 94 [packed = false]; 727 repeated sint64 unpacked_sint64 = 95 [packed = false]; 728 repeated fixed32 unpacked_fixed32 = 96 [packed = false]; 729 repeated fixed64 unpacked_fixed64 = 97 [packed = false]; 730 repeated sfixed32 unpacked_sfixed32 = 98 [packed = false]; 731 repeated sfixed64 unpacked_sfixed64 = 99 [packed = false]; 732 repeated float unpacked_float = 100 [packed = false]; 733 repeated double unpacked_double = 101 [packed = false]; 734 repeated bool unpacked_bool = 102 [packed = false]; 735 repeated ForeignEnum unpacked_enum = 103 [packed = false]; 736} 737 738message TestPackedExtensions { 739 extensions 1 to max; 740} 741 742extend TestPackedExtensions { 743 repeated int32 packed_int32_extension = 90 [packed = true]; 744 repeated int64 packed_int64_extension = 91 [packed = true]; 745 repeated uint32 packed_uint32_extension = 92 [packed = true]; 746 repeated uint64 packed_uint64_extension = 93 [packed = true]; 747 repeated sint32 packed_sint32_extension = 94 [packed = true]; 748 repeated sint64 packed_sint64_extension = 95 [packed = true]; 749 repeated fixed32 packed_fixed32_extension = 96 [packed = true]; 750 repeated fixed64 packed_fixed64_extension = 97 [packed = true]; 751 repeated sfixed32 packed_sfixed32_extension = 98 [packed = true]; 752 repeated sfixed64 packed_sfixed64_extension = 99 [packed = true]; 753 repeated float packed_float_extension = 100 [packed = true]; 754 repeated double packed_double_extension = 101 [packed = true]; 755 repeated bool packed_bool_extension = 102 [packed = true]; 756 repeated ForeignEnum packed_enum_extension = 103 [packed = true]; 757} 758 759message TestUnpackedExtensions { 760 extensions 1 to max; 761} 762 763extend TestUnpackedExtensions { 764 repeated int32 unpacked_int32_extension = 90 [packed = false]; 765 repeated int64 unpacked_int64_extension = 91 [packed = false]; 766 repeated uint32 unpacked_uint32_extension = 92 [packed = false]; 767 repeated uint64 unpacked_uint64_extension = 93 [packed = false]; 768 repeated sint32 unpacked_sint32_extension = 94 [packed = false]; 769 repeated sint64 unpacked_sint64_extension = 95 [packed = false]; 770 repeated fixed32 unpacked_fixed32_extension = 96 [packed = false]; 771 repeated fixed64 unpacked_fixed64_extension = 97 [packed = false]; 772 repeated sfixed32 unpacked_sfixed32_extension = 98 [packed = false]; 773 repeated sfixed64 unpacked_sfixed64_extension = 99 [packed = false]; 774 repeated float unpacked_float_extension = 100 [packed = false]; 775 repeated double unpacked_double_extension = 101 [packed = false]; 776 repeated bool unpacked_bool_extension = 102 [packed = false]; 777 repeated ForeignEnum unpacked_enum_extension = 103 [packed = false]; 778} 779 780// Used by ExtensionSetTest/DynamicExtensions. The test actually builds 781// a set of extensions to TestAllExtensions dynamically, based on the fields 782// of this message type. 783message TestDynamicExtensions { 784 enum DynamicEnumType { 785 DYNAMIC_FOO = 2200; 786 DYNAMIC_BAR = 2201; 787 DYNAMIC_BAZ = 2202; 788 } 789 message DynamicMessageType { 790 optional int32 dynamic_field = 2100; 791 } 792 793 optional fixed32 scalar_extension = 2000; 794 optional ForeignEnum enum_extension = 2001; 795 optional DynamicEnumType dynamic_enum_extension = 2002; 796 797 optional ForeignMessage message_extension = 2003; 798 optional DynamicMessageType dynamic_message_extension = 2004; 799 800 repeated string repeated_extension = 2005; 801 repeated sint32 packed_extension = 2006 [packed = true]; 802} 803 804message TestRepeatedScalarDifferentTagSizes { 805 // Parsing repeated fixed size values used to fail. This message needs to be 806 // used in order to get a tag of the right size; all of the repeated fields 807 // in TestAllTypes didn't trigger the check. 808 repeated fixed32 repeated_fixed32 = 12; 809 // Check for a varint type, just for good measure. 810 repeated int32 repeated_int32 = 13; 811 812 // These have two-byte tags. 813 repeated fixed64 repeated_fixed64 = 2046; 814 repeated int64 repeated_int64 = 2047; 815 816 // Three byte tags. 817 repeated float repeated_float = 262142; 818 repeated uint64 repeated_uint64 = 262143; 819} 820 821// Test that if an optional or required message/group field appears multiple 822// times in the input, they need to be merged. 823message TestParsingMerge { 824 // RepeatedFieldsGenerator defines matching field types as TestParsingMerge, 825 // except that all fields are repeated. In the tests, we will serialize the 826 // RepeatedFieldsGenerator to bytes, and parse the bytes to TestParsingMerge. 827 // Repeated fields in RepeatedFieldsGenerator are expected to be merged into 828 // the corresponding required/optional fields in TestParsingMerge. 829 message RepeatedFieldsGenerator { 830 repeated TestAllTypes field1 = 1; 831 repeated TestAllTypes field2 = 2; 832 repeated TestAllTypes field3 = 3; 833 repeated group Group1 = 10 { 834 optional TestAllTypes field1 = 11; 835 } 836 repeated group Group2 = 20 { 837 optional TestAllTypes field1 = 21; 838 } 839 repeated TestAllTypes ext1 = 1000; 840 repeated TestAllTypes ext2 = 1001; 841 } 842 required TestAllTypes required_all_types = 1; 843 optional TestAllTypes optional_all_types = 2; 844 repeated TestAllTypes repeated_all_types = 3; 845 optional group OptionalGroup = 10 { 846 optional TestAllTypes optional_group_all_types = 11; 847 } 848 repeated group RepeatedGroup = 20 { 849 optional TestAllTypes repeated_group_all_types = 21; 850 } 851 extensions 1000 to max; 852 extend TestParsingMerge { 853 optional TestAllTypes optional_ext = 1000; 854 repeated TestAllTypes repeated_ext = 1001; 855 } 856} 857 858message TestCommentInjectionMessage { 859 // */ <- This should not close the generated doc comment 860 optional string a = 1 [default="*/ <- Neither should this."]; 861} 862 863 864// Test that RPC services work. 865message FooRequest {} 866message FooResponse {} 867 868message FooClientMessage {} 869message FooServerMessage{} 870 871service TestService { 872 rpc Foo(FooRequest) returns (FooResponse); 873 rpc Bar(BarRequest) returns (BarResponse); 874} 875 876 877message BarRequest {} 878message BarResponse {} 879 880