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 = "proto3";
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;
45option csharp_namespace = "Google.Protobuf.TestProtos";
46
47import "google/protobuf/unittest_import_proto3.proto";
48
49// We don't put this in a package within proto2 because we need to make sure
50// that the generated code doesn't depend on being in the proto2 namespace.
51// In test_util.h we do "using namespace unittest = protobuf_unittest".
52package protobuf_unittest;
53
54// Protos optimized for SPEED use a strict superset of the generated code
55// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
56// tests for speed unless explicitly testing code size optimization.
57option optimize_for = SPEED;
58
59option java_outer_classname = "UnittestProto";
60
61// This proto includes every type of field in both singular and repeated
62// forms.
63message TestAllTypes {
64  message NestedMessage {
65    // The field name "b" fails to compile in proto1 because it conflicts with
66    // a local variable named "b" in one of the generated methods.  Doh.
67    // This file needs to compile in proto1 to test backwards-compatibility.
68    int32 bb = 1;
69  }
70
71  enum NestedEnum {
72    NESTED_ENUM_UNSPECIFIED = 0;
73    FOO = 1;
74    BAR = 2;
75    BAZ = 3;
76    NEG = -1;  // Intentionally negative.
77  }
78
79  // Singular
80  int32 single_int32 = 1;
81  int64 single_int64 = 2;
82  uint32 single_uint32 = 3;
83  uint64 single_uint64 = 4;
84  sint32 single_sint32 = 5;
85  sint64 single_sint64 = 6;
86  fixed32 single_fixed32 = 7;
87  fixed64 single_fixed64 = 8;
88  sfixed32 single_sfixed32 = 9;
89  sfixed64 single_sfixed64 = 10;
90  float single_float = 11;
91  double single_double = 12;
92  bool single_bool = 13;
93  string single_string = 14;
94  bytes single_bytes = 15;
95
96  NestedMessage single_nested_message = 18;
97  ForeignMessage single_foreign_message = 19;
98  protobuf_unittest_import.ImportMessage single_import_message = 20;
99
100  NestedEnum single_nested_enum = 21;
101  ForeignEnum single_foreign_enum = 22;
102  protobuf_unittest_import.ImportEnum single_import_enum = 23;
103
104  // Defined in unittest_import_public.proto
105  protobuf_unittest_import.PublicImportMessage
106      single_public_import_message = 26;
107
108  // Repeated
109  repeated    int32 repeated_int32    = 31;
110  repeated    int64 repeated_int64    = 32;
111  repeated   uint32 repeated_uint32   = 33;
112  repeated   uint64 repeated_uint64   = 34;
113  repeated   sint32 repeated_sint32   = 35;
114  repeated   sint64 repeated_sint64   = 36;
115  repeated  fixed32 repeated_fixed32  = 37;
116  repeated  fixed64 repeated_fixed64  = 38;
117  repeated sfixed32 repeated_sfixed32 = 39;
118  repeated sfixed64 repeated_sfixed64 = 40;
119  repeated    float repeated_float    = 41;
120  repeated   double repeated_double   = 42;
121  repeated     bool repeated_bool     = 43;
122  repeated   string repeated_string   = 44;
123  repeated    bytes repeated_bytes    = 45;
124
125  repeated NestedMessage                        repeated_nested_message  = 48;
126  repeated ForeignMessage                       repeated_foreign_message = 49;
127  repeated protobuf_unittest_import.ImportMessage repeated_import_message  = 50;
128
129  repeated NestedEnum                           repeated_nested_enum     = 51;
130  repeated ForeignEnum                          repeated_foreign_enum    = 52;
131  repeated protobuf_unittest_import.ImportEnum    repeated_import_enum     = 53;
132  // Defined in unittest_import_public.proto
133  repeated protobuf_unittest_import.PublicImportMessage
134      repeated_public_import_message = 54;
135
136  // For oneof test
137  oneof oneof_field {
138    uint32 oneof_uint32 = 111;
139    NestedMessage oneof_nested_message = 112;
140    string oneof_string = 113;
141    bytes oneof_bytes = 114;
142  }
143}
144
145// This proto includes a recusively nested message.
146message NestedTestAllTypes {
147  NestedTestAllTypes child = 1;
148  TestAllTypes payload = 2;
149  repeated NestedTestAllTypes repeated_child = 3;
150}
151
152message TestDeprecatedFields {
153  int32 deprecated_int32 = 1 [deprecated=true];
154}
155
156// Define these after TestAllTypes to make sure the compiler can handle
157// that.
158message ForeignMessage {
159  int32 c = 1;
160}
161
162enum ForeignEnum {
163  FOREIGN_UNSPECIFIED = 0;
164  FOREIGN_FOO = 4;
165  FOREIGN_BAR = 5;
166  FOREIGN_BAZ = 6;
167}
168
169message TestReservedFields {
170  reserved 2, 15, 9 to 11;
171  reserved "bar", "baz";
172}
173
174
175// Test that we can use NestedMessage from outside TestAllTypes.
176message TestForeignNested {
177  TestAllTypes.NestedMessage foreign_nested = 1;
178}
179
180// Test that really large tag numbers don't break anything.
181message TestReallyLargeTagNumber {
182  // The largest possible tag number is 2^28 - 1, since the wire format uses
183  // three bits to communicate wire type.
184  int32 a = 1;
185  int32 bb = 268435455;
186}
187
188message TestRecursiveMessage {
189  TestRecursiveMessage a = 1;
190  int32 i = 2;
191}
192
193// Test that mutual recursion works.
194message TestMutualRecursionA {
195  TestMutualRecursionB bb = 1;
196}
197
198message TestMutualRecursionB {
199  TestMutualRecursionA a = 1;
200  int32 optional_int32 = 2;
201}
202
203
204// Test an enum that has multiple values with the same number.
205enum TestEnumWithDupValue {
206  TEST_ENUM_WITH_DUP_VALUE_UNSPECIFIED = 0;
207  option allow_alias = true;
208
209  FOO1 = 1;
210  BAR1 = 2;
211  BAZ = 3;
212  FOO2 = 1;
213  BAR2 = 2;
214}
215
216// Test an enum with large, unordered values.
217enum TestSparseEnum {
218  TEST_SPARSE_ENUM_UNSPECIFIED = 0;
219  SPARSE_A = 123;
220  SPARSE_B = 62374;
221  SPARSE_C = 12589234;
222  SPARSE_D = -15;
223  SPARSE_E = -53452;
224  // In proto3, value 0 must be the first one specified
225  // SPARSE_F = 0;
226  SPARSE_G = 2;
227}
228
229// Test message with CamelCase field names.  This violates Protocol Buffer
230// standard style.
231message TestCamelCaseFieldNames {
232  int32 PrimitiveField = 1;
233  string StringField = 2;
234  ForeignEnum EnumField = 3;
235  ForeignMessage MessageField = 4;
236
237  repeated int32 RepeatedPrimitiveField = 7;
238  repeated string RepeatedStringField = 8;
239  repeated ForeignEnum RepeatedEnumField = 9;
240  repeated ForeignMessage RepeatedMessageField = 10;
241}
242
243
244// We list fields out of order, to ensure that we're using field number and not
245// field index to determine serialization order.
246message TestFieldOrderings {
247  string my_string = 11;
248  int64 my_int = 1;
249  float my_float = 101;
250  message NestedMessage {
251    int64 oo = 2;
252    // The field name "b" fails to compile in proto1 because it conflicts with
253    // a local variable named "b" in one of the generated methods.  Doh.
254    // This file needs to compile in proto1 to test backwards-compatibility.
255    int32 bb = 1;
256  }
257
258  NestedMessage single_nested_message  = 200;
259}
260
261message SparseEnumMessage {
262  TestSparseEnum sparse_enum = 1;
263}
264
265// Test String and Bytes: string is for valid UTF-8 strings
266message OneString {
267  string data = 1;
268}
269
270message MoreString {
271  repeated string data = 1;
272}
273
274message OneBytes {
275  bytes data = 1;
276}
277
278message MoreBytes {
279  bytes data = 1;
280}
281
282// Test int32, uint32, int64, uint64, and bool are all compatible
283message Int32Message {
284  int32 data = 1;
285}
286
287message Uint32Message {
288  uint32 data = 1;
289}
290
291message Int64Message {
292  int64 data = 1;
293}
294
295message Uint64Message {
296  uint64 data = 1;
297}
298
299message BoolMessage {
300  bool data = 1;
301}
302
303// Test oneofs.
304message TestOneof {
305  oneof foo {
306    int32 foo_int = 1;
307    string foo_string = 2;
308    TestAllTypes foo_message = 3;
309  }
310}
311
312// Test messages for packed fields
313
314message TestPackedTypes {
315  repeated    int32 packed_int32    =  90 [packed = true];
316  repeated    int64 packed_int64    =  91 [packed = true];
317  repeated   uint32 packed_uint32   =  92 [packed = true];
318  repeated   uint64 packed_uint64   =  93 [packed = true];
319  repeated   sint32 packed_sint32   =  94 [packed = true];
320  repeated   sint64 packed_sint64   =  95 [packed = true];
321  repeated  fixed32 packed_fixed32  =  96 [packed = true];
322  repeated  fixed64 packed_fixed64  =  97 [packed = true];
323  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
324  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
325  repeated    float packed_float    = 100 [packed = true];
326  repeated   double packed_double   = 101 [packed = true];
327  repeated     bool packed_bool     = 102 [packed = true];
328  repeated ForeignEnum packed_enum  = 103 [packed = true];
329}
330
331// A message with the same fields as TestPackedTypes, but without packing. Used
332// to test packed <-> unpacked wire compatibility.
333message TestUnpackedTypes {
334  repeated    int32 unpacked_int32    =  90 [packed = false];
335  repeated    int64 unpacked_int64    =  91 [packed = false];
336  repeated   uint32 unpacked_uint32   =  92 [packed = false];
337  repeated   uint64 unpacked_uint64   =  93 [packed = false];
338  repeated   sint32 unpacked_sint32   =  94 [packed = false];
339  repeated   sint64 unpacked_sint64   =  95 [packed = false];
340  repeated  fixed32 unpacked_fixed32  =  96 [packed = false];
341  repeated  fixed64 unpacked_fixed64  =  97 [packed = false];
342  repeated sfixed32 unpacked_sfixed32 =  98 [packed = false];
343  repeated sfixed64 unpacked_sfixed64 =  99 [packed = false];
344  repeated    float unpacked_float    = 100 [packed = false];
345  repeated   double unpacked_double   = 101 [packed = false];
346  repeated     bool unpacked_bool     = 102 [packed = false];
347  repeated ForeignEnum unpacked_enum  = 103 [packed = false];
348}
349
350message TestRepeatedScalarDifferentTagSizes {
351  // Parsing repeated fixed size values used to fail. This message needs to be
352  // used in order to get a tag of the right size; all of the repeated fields
353  // in TestAllTypes didn't trigger the check.
354  repeated fixed32 repeated_fixed32 = 12;
355  // Check for a varint type, just for good measure.
356  repeated int32   repeated_int32   = 13;
357
358  // These have two-byte tags.
359  repeated fixed64 repeated_fixed64 = 2046;
360  repeated int64   repeated_int64   = 2047;
361
362  // Three byte tags.
363  repeated float   repeated_float   = 262142;
364  repeated uint64  repeated_uint64  = 262143;
365}
366
367message TestCommentInjectionMessage {
368  // */ <- This should not close the generated doc comment
369  string a = 1;
370}
371
372
373// Test that RPC services work.
374message FooRequest  {}
375message FooResponse {}
376
377message FooClientMessage {}
378message FooServerMessage{}
379
380service TestService {
381  rpc Foo(FooRequest) returns (FooResponse);
382  rpc Bar(BarRequest) returns (BarResponse);
383}
384
385
386message BarRequest  {}
387message BarResponse {}
388
389