test_generated_code.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009-2021, Google LLC
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of Google LLC nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 /* Test of generated code, with a special focus on features that are not used in
29  * descriptor.proto or conformance.proto (since these get some testing from
30  * upb/def.c and tests/conformance_upb.c, respectively).
31  */
32 
33 #include "gtest/gtest.h"
34 #include "src/google/protobuf/test_messages_proto2.upb.h"
35 #include "src/google/protobuf/test_messages_proto3.upb.h"
36 #include "upb/test.upb.h"
37 #include "upb/upb.hpp"
38 
39 #if !defined(MIN)
40 #define MIN(x, y) ((x) < (y) ? (x) : (y))
41 #endif
42 
43 const char test_str[] = "abcdefg";
44 const char test_str2[] = "12345678910";
45 const char test_str3[] = "rstlnezxcvbnm";
46 const char test_str4[] = "just another test string";
47 
52 
53 const int32_t test_int32 = 10;
54 const int32_t test_int32_2 = -20;
55 const int32_t test_int32_3 = 30;
56 const int32_t test_int32_4 = -40;
57 
58 TEST(GeneratedCode, ScalarsProto3) {
60  protobuf_test_messages_proto3_TestAllTypesProto3* msg =
61  protobuf_test_messages_proto3_TestAllTypesProto3_new(arena);
62  protobuf_test_messages_proto3_TestAllTypesProto3* msg2;
63  upb_StringView serialized;
64  upb_StringView val;
65 
66  // Test serialization.
67  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_int32(msg, 10);
68  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_int64(msg, 20);
69  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_uint32(msg, 30);
70  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_uint64(msg, 40);
71  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_float(msg,
72  50.5);
73  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_double(msg,
74  60.6);
75  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_bool(msg, 1);
76  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_string(
78 
79  serialized.data = protobuf_test_messages_proto3_TestAllTypesProto3_serialize(
80  msg, arena, &serialized.size);
81 
82  msg2 = protobuf_test_messages_proto3_TestAllTypesProto3_parse(
83  serialized.data, serialized.size, arena);
84 
85  EXPECT_EQ(10, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int32(
86  msg2));
87  EXPECT_EQ(20, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int64(
88  msg2));
89  EXPECT_EQ(
90  30,
91  protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint32(msg2));
92  EXPECT_EQ(
93  40,
94  protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint64(msg2));
95  EXPECT_EQ(
96  50.5,
97  protobuf_test_messages_proto3_TestAllTypesProto3_optional_float(msg2));
98  EXPECT_EQ(
99  60.6,
100  protobuf_test_messages_proto3_TestAllTypesProto3_optional_double(msg2));
101  EXPECT_EQ(
102  true,
103  protobuf_test_messages_proto3_TestAllTypesProto3_optional_bool(msg2));
104  val = protobuf_test_messages_proto3_TestAllTypesProto3_optional_string(msg2);
106 
107  // Test clear.
108  protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_int32(msg);
109  EXPECT_EQ(
110  0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int32(msg));
111  protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_int64(msg);
112  EXPECT_EQ(
113  0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int64(msg));
114  protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_uint32(msg);
115  EXPECT_EQ(
116  0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint32(msg));
117  protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_uint64(msg);
118  EXPECT_EQ(
119  0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint64(msg));
120  protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_float(msg);
121  EXPECT_EQ(
122  0.0f,
123  protobuf_test_messages_proto3_TestAllTypesProto3_optional_float(msg));
124  protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_double(msg);
125  EXPECT_EQ(
126  0.0,
127  protobuf_test_messages_proto3_TestAllTypesProto3_optional_double(msg));
128  protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_bool(msg);
129  EXPECT_EQ(
130  false,
131  protobuf_test_messages_proto3_TestAllTypesProto3_optional_bool(msg));
132  protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_string(msg);
133  EXPECT_EQ(
134  0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_string(msg)
135  .size);
137 }
138 
139 TEST(GeneratedCode, ScalarsProto2) {
141  protobuf_test_messages_proto2_TestAllTypesProto2* msg =
142  protobuf_test_messages_proto2_TestAllTypesProto2_new(arena);
143  protobuf_test_messages_proto2_TestAllTypesProto2* msg2;
144  upb_StringView serialized;
145 
146  // Test hazzer and serialization.
147  EXPECT_EQ(
148  false,
149  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int32(msg));
150  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_int32(msg, 10);
151  EXPECT_EQ(
152  true,
153  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int32(msg));
154  EXPECT_EQ(
155  false,
156  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int64(msg));
157  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_int64(msg, 20);
158  EXPECT_EQ(
159  true,
160  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int64(msg));
161  EXPECT_EQ(
162  false,
163  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint32(
164  msg));
165  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_uint32(msg, 30);
166  EXPECT_EQ(
167  true,
168  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint32(
169  msg));
170  EXPECT_EQ(
171  false,
172  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint64(
173  msg));
174  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_uint64(msg, 40);
175  EXPECT_EQ(
176  true,
177  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint64(
178  msg));
179  EXPECT_EQ(
180  false,
181  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sint32(
182  msg));
183  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_sint32(msg, 50);
184  EXPECT_EQ(
185  true,
186  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sint32(
187  msg));
188  EXPECT_EQ(
189  false,
190  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sint64(
191  msg));
192  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_sint64(msg, 60);
193  EXPECT_EQ(
194  true,
195  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sint64(
196  msg));
197  EXPECT_EQ(
198  false,
199  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_fixed32(
200  msg));
201  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_fixed32(msg,
202  70);
203  EXPECT_EQ(
204  true,
205  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_fixed32(
206  msg));
207  EXPECT_EQ(
208  false,
209  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_fixed64(
210  msg));
211  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_fixed64(msg,
212  80);
213  EXPECT_EQ(
214  true,
215  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_fixed64(
216  msg));
217  EXPECT_EQ(
218  false,
219  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sfixed32(
220  msg));
221  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_sfixed32(msg,
222  90);
223  EXPECT_EQ(
224  true,
225  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sfixed32(
226  msg));
227  EXPECT_EQ(
228  false,
229  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sfixed64(
230  msg));
231  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_sfixed64(msg,
232  100);
233  EXPECT_EQ(
234  true,
235  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sfixed64(
236  msg));
237  EXPECT_EQ(
238  false,
239  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_float(msg));
240  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_float(msg,
241  50.5);
242  EXPECT_EQ(
243  true,
244  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_float(msg));
245  EXPECT_EQ(
246  false,
247  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_double(
248  msg));
249  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_double(msg,
250  60.6);
251  EXPECT_EQ(
252  true,
253  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_double(
254  msg));
255  EXPECT_EQ(
256  false,
257  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bool(msg));
258  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_bool(msg, 1);
259  EXPECT_EQ(
260  true,
261  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bool(msg));
262 
263  serialized.data = protobuf_test_messages_proto2_TestAllTypesProto2_serialize(
264  msg, arena, &serialized.size);
265 
266  msg2 = protobuf_test_messages_proto2_TestAllTypesProto2_parse(
267  serialized.data, serialized.size, arena);
268 
269  EXPECT_EQ(10, protobuf_test_messages_proto2_TestAllTypesProto2_optional_int32(
270  msg2));
271  EXPECT_EQ(20, protobuf_test_messages_proto2_TestAllTypesProto2_optional_int64(
272  msg2));
273  EXPECT_EQ(
274  30,
275  protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint32(msg2));
276  EXPECT_EQ(
277  40,
278  protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint64(msg2));
279  EXPECT_EQ(
280  50,
281  protobuf_test_messages_proto2_TestAllTypesProto2_optional_sint32(msg2));
282  EXPECT_EQ(
283  60,
284  protobuf_test_messages_proto2_TestAllTypesProto2_optional_sint64(msg2));
285  EXPECT_EQ(
286  70,
287  protobuf_test_messages_proto2_TestAllTypesProto2_optional_fixed32(msg2));
288  EXPECT_EQ(
289  80,
290  protobuf_test_messages_proto2_TestAllTypesProto2_optional_fixed64(msg2));
291  EXPECT_EQ(
292  90,
293  protobuf_test_messages_proto2_TestAllTypesProto2_optional_sfixed32(msg2));
294  EXPECT_EQ(
295  100,
296  protobuf_test_messages_proto2_TestAllTypesProto2_optional_sfixed64(msg2));
297  EXPECT_EQ(
298  50.5,
299  protobuf_test_messages_proto2_TestAllTypesProto2_optional_float(msg2));
300  EXPECT_EQ(
301  60.6,
302  protobuf_test_messages_proto2_TestAllTypesProto2_optional_double(msg2));
303  EXPECT_EQ(
304  true,
305  protobuf_test_messages_proto2_TestAllTypesProto2_optional_bool(msg2));
306 
307  // Test clear.
308  protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_int32(msg);
309  EXPECT_EQ(
310  0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_int32(msg));
311  EXPECT_EQ(
312  false,
313  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int32(msg));
314 
315  protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_int64(msg);
316  EXPECT_EQ(
317  0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_int64(msg));
318  EXPECT_EQ(
319  false,
320  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int64(msg));
321  protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_uint32(msg);
322  EXPECT_EQ(
323  0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint32(msg));
324  EXPECT_EQ(
325  false,
326  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint32(
327  msg));
328  protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_uint64(msg);
329  EXPECT_EQ(
330  0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint64(msg));
331  EXPECT_EQ(
332  false,
333  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint64(
334  msg));
335  protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_float(msg);
336  EXPECT_EQ(
337  0.0f,
338  protobuf_test_messages_proto2_TestAllTypesProto2_optional_float(msg));
339  EXPECT_EQ(
340  false,
341  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_float(msg));
342  protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_double(msg);
343  EXPECT_EQ(
344  0.0,
345  protobuf_test_messages_proto2_TestAllTypesProto2_optional_double(msg));
346  EXPECT_EQ(
347  false,
348  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_double(
349  msg));
350  protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_bool(msg);
351  EXPECT_EQ(
352  false,
353  protobuf_test_messages_proto2_TestAllTypesProto2_optional_bool(msg));
354  EXPECT_EQ(
355  false,
356  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bool(msg));
357 
359 }
360 
361 TEST(GeneratedCode, Bytes) {
363  protobuf_test_messages_proto2_TestAllTypesProto2* msg =
364  protobuf_test_messages_proto2_TestAllTypesProto2_new(arena);
365  protobuf_test_messages_proto2_TestAllTypesProto2* msg2;
366  upb_StringView serialized;
367  const char data[] = "ABCDEF";
369  upb_StringView val;
370 
371  EXPECT_EQ(
372  false,
373  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bytes(msg));
374  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_bytes(msg,
375  bytes);
376  EXPECT_EQ(
377  true,
378  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bytes(msg));
379 
380  EXPECT_EQ(
381  false,
382  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_string(
383  msg));
384  protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_string(
385  msg, test_str_view);
386  EXPECT_EQ(
387  true,
388  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_string(
389  msg));
390 
391  serialized.data = protobuf_test_messages_proto2_TestAllTypesProto2_serialize(
392  msg, arena, &serialized.size);
393 
394  msg2 = protobuf_test_messages_proto2_TestAllTypesProto2_parse(
395  serialized.data, serialized.size, arena);
396 
397  EXPECT_EQ(bytes.size,
398  protobuf_test_messages_proto2_TestAllTypesProto2_optional_bytes(msg)
399  .size);
400  EXPECT_EQ(
401  0, memcmp(bytes.data,
402  protobuf_test_messages_proto2_TestAllTypesProto2_optional_bytes(
403  msg)
404  .data,
405  bytes.size));
406  protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_bytes(msg);
407  EXPECT_EQ(
408  false,
409  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bytes(msg));
410 
411  val = protobuf_test_messages_proto2_TestAllTypesProto2_optional_string(msg2);
413 
414  protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_string(msg);
415  EXPECT_EQ(
416  0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_string(msg)
417  .size);
418  EXPECT_EQ(
419  false,
420  protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_string(
421  msg));
423 }
424 
425 TEST(GeneratedCode, Extension) {
427  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect* msg =
428  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect_new(
429  arena);
430  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect* msg2;
431  upb_StringView serialized;
432 
433  EXPECT_EQ(
434  false,
435  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_has_message_set_extension(
436  msg));
437 
438  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2* ext =
439  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_new(
440  arena);
441  EXPECT_EQ(
442  0,
443  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_i(
444  ext));
445  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_set_i(
446  ext, 5);
447  EXPECT_EQ(
448  5,
449  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_i(
450  ext));
451  // Test setter/hazzer.
452  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_set_message_set_extension(
453  msg, ext, arena);
454  EXPECT_EQ(
455  true,
456  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_has_message_set_extension(
457  msg));
458  // Test serialize.
459  serialized.data =
460  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect_serialize(
461  msg, arena, &serialized.size);
462  msg2 =
463  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect_parse(
464  serialized.data, serialized.size, arena);
465  const protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2*
466  ext2 =
467  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_message_set_extension(
468  msg);
469  EXPECT_EQ(
470  5,
471  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_i(
472  ext2));
473 
474  // Test Clear.
475  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_clear_message_set_extension(
476  msg);
477  EXPECT_EQ(
478  false,
479  protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_has_message_set_extension(
480  msg));
482 }
483 
484 TEST(GeneratedCode, RepeatedClear) {
486  protobuf_test_messages_proto2_TestAllTypesProto2* msg =
487  protobuf_test_messages_proto2_TestAllTypesProto2_new(arena);
488  size_t len = 0;
489  protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(msg, &len);
490  EXPECT_EQ(0, len);
491  protobuf_test_messages_proto2_TestAllTypesProto2_add_repeated_int32(msg, 2,
492  arena);
493  protobuf_test_messages_proto2_TestAllTypesProto2_add_repeated_int32(msg, 3,
494  arena);
495  protobuf_test_messages_proto2_TestAllTypesProto2_add_repeated_int32(msg, 4,
496  arena);
497  protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(msg, &len);
498  EXPECT_EQ(3, len);
499  protobuf_test_messages_proto2_TestAllTypesProto2_clear_repeated_int32(msg);
500  protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(msg, &len);
501  EXPECT_EQ(0, len);
503 }
504 
505 TEST(GeneratedCode, UTF8) {
506  const char invalid_utf8[] = "\xff";
507  const upb_StringView invalid_utf8_view =
508  upb_StringView_FromDataAndSize(invalid_utf8, 1);
510  upb_StringView serialized;
511  protobuf_test_messages_proto3_TestAllTypesProto3* msg =
512  protobuf_test_messages_proto3_TestAllTypesProto3_new(arena);
513  protobuf_test_messages_proto3_TestAllTypesProto3* msg2;
514 
515  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_string(
516  msg, invalid_utf8_view);
517 
518  serialized.data = protobuf_test_messages_proto3_TestAllTypesProto3_serialize(
519  msg, arena, &serialized.size);
520 
521  msg2 = protobuf_test_messages_proto3_TestAllTypesProto3_parse(
522  serialized.data, serialized.size, arena);
523  EXPECT_EQ(nullptr, msg2);
524 
526 }
527 
529  protobuf_test_messages_proto3_TestAllTypesProto3* msg) {
530  size_t iter = kUpb_Map_Begin;
531 
532  EXPECT_EQ(
533  0,
534  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_size(
535  msg));
536  EXPECT_FALSE(
537  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
538  msg, &iter));
539 }
540 
542  protobuf_test_messages_proto3_TestAllTypesProto3* msg) {
543  const protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry*
544  const_ent;
545  size_t iter;
547 
548  EXPECT_EQ(
549  1,
550  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_size(
551  msg));
552  EXPECT_TRUE(
553  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_get(
554  msg, test_str_view, &str));
556 
557  EXPECT_FALSE(
558  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_get(
559  msg, test_str_view3, &str));
560 
561  /* Test that iteration reveals a single k/v pair in the map. */
563  const_ent =
564  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
565  msg, &iter);
566  ASSERT_NE(nullptr, const_ent);
569  protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry_key(
570  const_ent)));
573  protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry_value(
574  const_ent)));
575 
576  const_ent =
577  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
578  msg, &iter);
579  EXPECT_EQ(nullptr, const_ent);
580 }
581 
582 TEST(GeneratedCode, StringDoubleMap) {
584  upb_StringView serialized;
585  upb_test_MapTest* msg = upb_test_MapTest_new(arena);
586  upb_test_MapTest* msg2;
587  double val;
588 
589  upb_test_MapTest_map_string_double_set(msg, test_str_view, 1.5, arena);
590  ASSERT_NE(nullptr, msg);
591  EXPECT_TRUE(upb_test_MapTest_map_string_double_get(msg, test_str_view, &val));
592  EXPECT_EQ(1.5, val);
593  val = 0;
594 
595  serialized.data = upb_test_MapTest_serialize(msg, arena, &serialized.size);
596  EXPECT_NE(nullptr, serialized.data);
597 
598  msg2 = upb_test_MapTest_parse(serialized.data, serialized.size, arena);
599  ASSERT_NE(nullptr, msg2);
600  EXPECT_TRUE(
601  upb_test_MapTest_map_string_double_get(msg2, test_str_view, &val));
602  EXPECT_EQ(1.5, val);
603 
605 }
606 
607 TEST(GeneratedCode, StringMap) {
609  protobuf_test_messages_proto3_TestAllTypesProto3* msg =
610  protobuf_test_messages_proto3_TestAllTypesProto3_new(arena);
611  const protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry*
612  const_ent;
613  size_t iter, count;
614 
616 
617  /* Set map[test_str_view] = test_str_view2 */
618  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_set(
621 
622  /* Deleting a non-existent key does nothing. */
623  EXPECT_FALSE(
624  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_delete(
625  msg, test_str_view3));
627 
628  /* Deleting the key sets the map back to empty. */
629  EXPECT_TRUE(
630  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_delete(
631  msg, test_str_view));
633 
634  /* Set two keys this time:
635  * map[test_str_view] = test_str_view2
636  * map[test_str_view3] = test_str_view4
637  */
638  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_set(
640  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_set(
642 
643  /* Test iteration */
645  count = 0;
646 
647  while (
648  (const_ent =
649  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
650  msg, &iter)) != NULL) {
652  protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry_key(
653  const_ent);
654  upb_StringView val =
655  protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry_value(
656  const_ent);
657 
658  count++;
661  } else {
664  }
665  }
666 
667  EXPECT_EQ(2, count);
668 
669  /* Clearing the map goes back to empty. */
670  protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_clear(msg);
672 
674 }
675 
677  protobuf_test_messages_proto3_TestAllTypesProto3* msg) {
678  size_t iter = kUpb_Map_Begin;
679 
680  EXPECT_EQ(
681  0, protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_size(
682  msg));
683  EXPECT_FALSE(
684  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_next(
685  msg, &iter));
686 }
687 
689  protobuf_test_messages_proto3_TestAllTypesProto3* msg) {
690  const protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry*
691  const_ent;
692  size_t iter;
693  int32_t val;
694 
695  EXPECT_EQ(
696  1, protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_size(
697  msg));
698  EXPECT_TRUE(
699  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_get(
700  msg, test_int32, &val));
701  EXPECT_EQ(val, test_int32_2);
702 
703  EXPECT_FALSE(
704  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_get(
705  msg, test_int32_3, &val));
706 
707  /* Test that iteration reveals a single k/v pair in the map. */
709  const_ent =
710  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_next(
711  msg, &iter);
712  ASSERT_NE(nullptr, const_ent);
713  EXPECT_EQ(
714  test_int32,
715  protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry_key(
716  const_ent));
717  EXPECT_EQ(
718  test_int32_2,
719  protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry_value(
720  const_ent));
721 
722  const_ent =
723  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_next(
724  msg, &iter);
725  EXPECT_EQ(nullptr, const_ent);
726 }
727 
728 TEST(GeneratedCode, Int32Map) {
730  protobuf_test_messages_proto3_TestAllTypesProto3* msg =
731  protobuf_test_messages_proto3_TestAllTypesProto3_new(arena);
732  const protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry*
733  const_ent;
734  size_t iter, count;
735 
737 
738  /* Set map[test_int32] = test_int32_2 */
739  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
742 
743  /* Deleting a non-existent key does nothing. */
744  EXPECT_FALSE(
745  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_delete(
746  msg, test_int32_3));
748 
749  /* Deleting the key sets the map back to empty. */
750  EXPECT_TRUE(
751  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_delete(
752  msg, test_int32));
754 
755  /* Set two keys this time:
756  * map[test_int32] = test_int32_2
757  * map[test_int32_3] = test_int32_4
758  */
759  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
761  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
763 
764  /* Test iteration */
766  count = 0;
767 
768  while (
769  (const_ent =
770  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_next(
771  msg, &iter)) != NULL) {
772  int32_t key =
773  protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry_key(
774  const_ent);
775  int32_t val =
776  protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry_value(
777  const_ent);
778 
779  count++;
780  if (key == test_int32) {
781  EXPECT_EQ(val, test_int32_2);
782  } else {
784  EXPECT_EQ(val, test_int32_4);
785  }
786  }
787 
788  EXPECT_EQ(2, count);
789 
790  /* Clearing the map goes back to empty. */
791  protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_clear(msg);
793 
795 }
796 
797 TEST(GeneratedCode, TestRepeated) {
799  protobuf_test_messages_proto3_TestAllTypesProto3* msg =
800  protobuf_test_messages_proto3_TestAllTypesProto3_new(arena);
801  size_t size;
802  const int* elems;
803 
804  protobuf_test_messages_proto3_TestAllTypesProto3_add_repeated_int32(msg, 5,
805  arena);
806 
807  elems = protobuf_test_messages_proto3_TestAllTypesProto3_repeated_int32(
808  msg, &size);
809 
810  EXPECT_EQ(1, size);
811  EXPECT_EQ(5, elems[0]);
812 
814 }
815 
816 TEST(GeneratedCode, Issue9440) {
818  upb_test_HelloRequest* msg = upb_test_HelloRequest_new(arena.ptr());
819  upb_test_HelloRequest_set_id(msg, 8);
820  EXPECT_EQ(8, upb_test_HelloRequest_id(msg));
821  char str[] = "1";
822  upb_test_HelloRequest_set_version(msg, upb_StringView{str, strlen(str)});
823  EXPECT_EQ(8, upb_test_HelloRequest_id(msg));
824 }
825 
826 TEST(GeneratedCode, NullDecodeBuffer) {
828  protobuf_test_messages_proto3_TestAllTypesProto3* msg =
829  protobuf_test_messages_proto3_TestAllTypesProto3_parse(NULL, 0, arena);
830  size_t size;
831 
832  ASSERT_NE(nullptr, msg);
833  protobuf_test_messages_proto3_TestAllTypesProto3_serialize(msg, arena, &size);
834  EXPECT_EQ(0, size);
836 }
837 
838 TEST(GeneratedCode, StatusTruncation) {
839  int i, j;
841  upb_Status status2;
842  for (i = 0; i < _kUpb_Status_MaxMessage + 20; i++) {
843  char* msg = static_cast<char*>(malloc(i + 1));
844  int end;
845  char ch = (i % 96) + 33; /* Cycle through printable chars. */
846 
847  for (j = 0; j < i; j++) {
848  msg[j] = ch;
849  }
850  msg[i] = '\0';
851 
853  upb_Status_SetErrorFormat(&status2, "%s", msg);
855  EXPECT_EQ(end, strlen(status.msg));
856  EXPECT_EQ(end, strlen(status2.msg));
857 
858  for (j = 0; j < end; j++) {
859  EXPECT_EQ(ch, status.msg[j]);
860  EXPECT_EQ(ch, status2.msg[j]);
861  }
862 
863  free(msg);
864  }
865 }
866 
867 static void decrement_int(void* ptr) {
868  int* iptr = static_cast<int*>(ptr);
869  (*iptr)--;
870 }
871 
872 TEST(GeneratedCode, ArenaFuse) {
873  int i1 = 5;
874  int i2 = 5;
875  int i3 = 5;
876  int i4 = 5;
877 
878  upb_Arena* arena1 = upb_Arena_New();
879  upb_Arena* arena2 = upb_Arena_New();
880 
883 
884  EXPECT_TRUE(upb_Arena_Fuse(arena1, arena2));
885 
886  upb_Arena_AddCleanup(arena1, &i3, decrement_int);
887  upb_Arena_AddCleanup(arena2, &i4, decrement_int);
888 
889  upb_Arena_Free(arena1);
890  EXPECT_EQ(5, i1);
891  EXPECT_EQ(5, i2);
892  EXPECT_EQ(5, i3);
893  EXPECT_EQ(5, i4);
894  upb_Arena_Free(arena2);
895  EXPECT_EQ(4, i1);
896  EXPECT_EQ(4, i2);
897  EXPECT_EQ(4, i3);
898  EXPECT_EQ(4, i4);
899 }
900 
901 /* Do nothing allocator for testing */
902 static void* test_allocfunc(upb_alloc* alloc, void* ptr, size_t oldsize,
903  size_t size) {
904  return upb_alloc_global.func(alloc, ptr, oldsize, size);
905 }
907 
908 TEST(GeneratedCode, FuseWithInitialBlock) {
909  char buf1[1024];
910  char buf2[1024];
911  upb_Arena* arenas[] = {upb_Arena_Init(buf1, 1024, &upb_alloc_global),
913  upb_Arena_Init(NULL, 0, &test_alloc),
914  upb_Arena_Init(NULL, 0, &upb_alloc_global)};
915  int size = sizeof(arenas) / sizeof(arenas[0]);
916  for (int i = 0; i < size; ++i) {
917  for (int j = 0; j < size; ++j) {
918  if (i == j) {
919  EXPECT_TRUE(upb_Arena_Fuse(arenas[i], arenas[j]));
920  } else {
921  EXPECT_FALSE(upb_Arena_Fuse(arenas[i], arenas[j]));
922  }
923  }
924  }
925 
926  for (int i = 0; i < size; ++i) upb_Arena_Free(arenas[i]);
927 }
928 
929 TEST(GeneratedCode, ArenaDecode) {
930  // Tests against a bug that previously existed when passing an arena to
931  // upb_decode().
932  char large_string[1024] = {0};
933  upb_StringView large_string_view = {large_string, sizeof(large_string)};
935 
936  protobuf_test_messages_proto3_TestAllTypesProto3* msg =
937  protobuf_test_messages_proto3_TestAllTypesProto3_new(tmp);
938 
939  protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_bytes(
940  msg, large_string_view);
941 
942  upb_StringView serialized;
943  serialized.data = protobuf_test_messages_proto3_TestAllTypesProto3_serialize(
944  msg, tmp, &serialized.size);
945 
947  // Parse the large payload, forcing an arena block to be allocated. This used
948  // to corrupt the cleanup list, preventing subsequent upb_Arena_AddCleanup()
949  // calls from working properly.
950  protobuf_test_messages_proto3_TestAllTypesProto3_parse(
951  serialized.data, serialized.size, arena);
952 
953  int i1 = 5;
955  EXPECT_EQ(5, i1);
957  EXPECT_EQ(4, i1);
958 
960 }
961 
962 TEST(GeneratedCode, ArenaUnaligned) {
963  char buf1[1024];
964  // Force the pointer to be unaligned.
965  char* unaligned_buf_ptr = (char*)((uintptr_t)buf1 | 7);
967  unaligned_buf_ptr, &buf1[sizeof(buf1)] - unaligned_buf_ptr, NULL);
968  char* mem = static_cast<char*>(upb_Arena_Malloc(arena, 5));
969  EXPECT_EQ(0, reinterpret_cast<uintptr_t>(mem) & 15);
971 
972  // Try the same, but with a size so small that aligning up will overflow.
973  arena = upb_Arena_Init(unaligned_buf_ptr, 5, &upb_alloc_global);
974  mem = static_cast<char*>(upb_Arena_Malloc(arena, 5));
975  EXPECT_EQ(0, reinterpret_cast<uintptr_t>(mem) & 15);
977 }
xds_interop_client.str
str
Definition: xds_interop_client.py:487
EXPECT_FALSE
#define EXPECT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1970
ptr
char * ptr
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
ASSERT_NE
#define ASSERT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2060
test_allocfunc
static void * test_allocfunc(upb_alloc *alloc, void *ptr, size_t oldsize, size_t size)
Definition: test_generated_code.cc:902
Bytes
Definition: boringssl-with-bazel/src/crypto/test/test_util.h:38
kUpb_Map_Begin
#define kUpb_Map_Begin
Definition: upb/upb/upb.h:329
upb_StringView::data
const char * data
Definition: upb/upb/upb.h:73
ext
void * ext
Definition: x509v3.h:87
upb_Arena_Init
upb_Arena * upb_Arena_Init(void *mem, size_t n, upb_alloc *alloc)
Definition: upb/upb/upb.c:216
TEST
TEST(GeneratedCode, ScalarsProto3)
Definition: test_generated_code.cc:58
status
absl::Status status
Definition: rls.cc:251
upb_Arena_New
UPB_INLINE upb_Arena * upb_Arena_New(void)
Definition: upb/upb/upb.h:267
arena
grpc_core::ScopedArenaPtr arena
Definition: binder_transport_test.cc:237
upb_alloc_global
upb_alloc upb_alloc_global
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:2241
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
check_string_map_empty
static void check_string_map_empty(protobuf_test_messages_proto3_TestAllTypesProto3 *msg)
Definition: test_generated_code.cc:528
upb_Status_SetErrorMessage
void upb_Status_SetErrorMessage(upb_Status *status, const char *msg)
Definition: upb/upb/upb.c:56
autogen_x86imm.f
f
Definition: autogen_x86imm.py:9
upb_Status::msg
char msg[_kUpb_Status_MaxMessage]
Definition: upb/upb/upb.h:54
test_alloc
upb_alloc test_alloc
Definition: test_generated_code.cc:906
i1
int i1
Definition: abseil-cpp/absl/container/btree_test.cc:2772
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
_kUpb_Status_MaxMessage
#define _kUpb_Status_MaxMessage
Definition: upb/upb/upb.h:50
upb_StringView::size
size_t size
Definition: upb/upb/upb.h:74
EXPECT_NE
#define EXPECT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2028
MIN
#define MIN(x, y)
Definition: test_generated_code.cc:40
upb_Arena_Malloc
UPB_INLINE void * upb_Arena_Malloc(upb_Arena *a, size_t size)
Definition: upb/upb/upb.h:222
UTF8
#define UTF8(card, tagbytes)
Definition: php-upb.h:2049
upb_Status_SetErrorFormat
void upb_Status_SetErrorFormat(upb_Status *status, const char *fmt,...)
Definition: upb/upb/upb.c:63
test_str_view4
const upb_StringView test_str_view4
Definition: test_generated_code.cc:51
upb_Arena_AddCleanup
bool upb_Arena_AddCleanup(upb_Arena *a, void *ud, upb_CleanupFunc *func)
Definition: upb/upb/upb.c:278
decrement_int
static void decrement_int(void *ptr)
Definition: test_generated_code.cc:867
test_int32
const int32_t test_int32
Definition: test_generated_code.cc:53
test_str_view3
const upb_StringView test_str_view3
Definition: test_generated_code.cc:50
upb_Status
Definition: upb/upb/upb.h:52
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
test_str2
const char test_str2[]
Definition: test_generated_code.cc:44
uintptr_t
_W64 unsigned int uintptr_t
Definition: stdint-msvc2008.h:119
upb_StringView_IsEqual
UPB_INLINE bool upb_StringView_IsEqual(upb_StringView a, upb_StringView b)
Definition: upb/upb/upb.h:89
test_int32_4
const int32_t test_int32_4
Definition: test_generated_code.cc:56
test_int32_2
const int32_t test_int32_2
Definition: test_generated_code.cc:54
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
check_int32_map_empty
static void check_int32_map_empty(protobuf_test_messages_proto3_TestAllTypesProto3 *msg)
Definition: test_generated_code.cc:676
mem
void * mem
Definition: libc.cpp:91
test_int32_3
const int32_t test_int32_3
Definition: test_generated_code.cc:55
upb::Arena
Definition: upb.hpp:68
key
const char * key
Definition: hpack_parser_table.cc:164
upb_StringView
Definition: upb/upb/upb.h:72
bytes
uint8 bytes[10]
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc:153
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
upb.hpp
test_str4
const char test_str4[]
Definition: test_generated_code.cc:46
upb_StringView_FromDataAndSize
UPB_INLINE upb_StringView upb_StringView_FromDataAndSize(const char *data, size_t size)
Definition: upb/upb/upb.h:77
test_str_view2
const upb_StringView test_str_view2
Definition: test_generated_code.cc:49
buf2
static char buf2[32]
Definition: test-fs.c:127
upb_StringView_FromString
UPB_INLINE upb_StringView upb_StringView_FromString(const char *data)
Definition: upb/upb/upb.h:85
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
upb_alloc::func
upb_alloc_func * func
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.h:300
test_str_view
const upb_StringView test_str_view
Definition: test_generated_code.cc:48
check_string_map_one_entry
static void check_string_map_one_entry(protobuf_test_messages_proto3_TestAllTypesProto3 *msg)
Definition: test_generated_code.cc:541
iter
Definition: test_winkernel.cpp:47
check_int32_map_one_entry
static void check_int32_map_one_entry(protobuf_test_messages_proto3_TestAllTypesProto3 *msg)
Definition: test_generated_code.cc:688
i2
int i2
Definition: abseil-cpp/absl/container/btree_test.cc:2773
ch
char ch
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3621
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
autogen_x86imm.tmp
tmp
Definition: autogen_x86imm.py:12
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
test_str3
const char test_str3[]
Definition: test_generated_code.cc:45
int32_t
signed int int32_t
Definition: stdint-msvc2008.h:77
upb_alloc
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.h:299
upb_Arena
Definition: upb_internal.h:36
upb_Arena_Fuse
bool upb_Arena_Fuse(upb_Arena *a1, upb_Arena *a2)
Definition: upb/upb/upb.c:299
upb_Arena_Free
void upb_Arena_Free(upb_Arena *a)
Definition: upb/upb/upb.c:273
alloc
std::allocator< int > alloc
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:87
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
test_str
const char test_str[]
Definition: test_generated_code.cc:43


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:31