blob: f59d2178645379ac50bad3ba54127b09e93d4bf6 [file] [log] [blame]
Brian Silverman9c614bc2016-02-15 20:20:02 -05001// 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