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"
40 #define MIN(x, y) ((x) < (y) ? (x) : (y))
46 const char test_str4[] =
"just another test string";
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;
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,
73 protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_double(
msg,
75 protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_bool(
msg, 1);
76 protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_string(
79 serialized.
data = protobuf_test_messages_proto3_TestAllTypesProto3_serialize(
82 msg2 = protobuf_test_messages_proto3_TestAllTypesProto3_parse(
85 EXPECT_EQ(10, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int32(
87 EXPECT_EQ(20, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int64(
91 protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint32(msg2));
94 protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint64(msg2));
97 protobuf_test_messages_proto3_TestAllTypesProto3_optional_float(msg2));
100 protobuf_test_messages_proto3_TestAllTypesProto3_optional_double(msg2));
103 protobuf_test_messages_proto3_TestAllTypesProto3_optional_bool(msg2));
104 val = protobuf_test_messages_proto3_TestAllTypesProto3_optional_string(msg2);
108 protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_int32(
msg);
110 0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int32(
msg));
111 protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_int64(
msg);
113 0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int64(
msg));
114 protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_uint32(
msg);
116 0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint32(
msg));
117 protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_uint64(
msg);
119 0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint64(
msg));
120 protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_float(
msg);
123 protobuf_test_messages_proto3_TestAllTypesProto3_optional_float(
msg));
124 protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_double(
msg);
127 protobuf_test_messages_proto3_TestAllTypesProto3_optional_double(
msg));
128 protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_bool(
msg);
131 protobuf_test_messages_proto3_TestAllTypesProto3_optional_bool(
msg));
132 protobuf_test_messages_proto3_TestAllTypesProto3_clear_optional_string(
msg);
134 0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_string(
msg)
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;
149 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int32(
msg));
150 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_int32(
msg, 10);
153 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int32(
msg));
156 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int64(
msg));
157 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_int64(
msg, 20);
160 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int64(
msg));
163 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint32(
165 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_uint32(
msg, 30);
168 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint32(
172 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint64(
174 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_uint64(
msg, 40);
177 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint64(
181 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sint32(
183 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_sint32(
msg, 50);
186 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sint32(
190 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sint64(
192 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_sint64(
msg, 60);
195 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sint64(
199 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_fixed32(
201 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_fixed32(
msg,
205 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_fixed32(
209 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_fixed64(
211 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_fixed64(
msg,
215 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_fixed64(
219 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sfixed32(
221 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_sfixed32(
msg,
225 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sfixed32(
229 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sfixed64(
231 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_sfixed64(
msg,
235 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_sfixed64(
239 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_float(
msg));
240 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_float(
msg,
244 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_float(
msg));
247 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_double(
249 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_double(
msg,
253 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_double(
257 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bool(
msg));
258 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_bool(
msg, 1);
261 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bool(
msg));
263 serialized.
data = protobuf_test_messages_proto2_TestAllTypesProto2_serialize(
266 msg2 = protobuf_test_messages_proto2_TestAllTypesProto2_parse(
269 EXPECT_EQ(10, protobuf_test_messages_proto2_TestAllTypesProto2_optional_int32(
271 EXPECT_EQ(20, protobuf_test_messages_proto2_TestAllTypesProto2_optional_int64(
275 protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint32(msg2));
278 protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint64(msg2));
281 protobuf_test_messages_proto2_TestAllTypesProto2_optional_sint32(msg2));
284 protobuf_test_messages_proto2_TestAllTypesProto2_optional_sint64(msg2));
287 protobuf_test_messages_proto2_TestAllTypesProto2_optional_fixed32(msg2));
290 protobuf_test_messages_proto2_TestAllTypesProto2_optional_fixed64(msg2));
293 protobuf_test_messages_proto2_TestAllTypesProto2_optional_sfixed32(msg2));
296 protobuf_test_messages_proto2_TestAllTypesProto2_optional_sfixed64(msg2));
299 protobuf_test_messages_proto2_TestAllTypesProto2_optional_float(msg2));
302 protobuf_test_messages_proto2_TestAllTypesProto2_optional_double(msg2));
305 protobuf_test_messages_proto2_TestAllTypesProto2_optional_bool(msg2));
308 protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_int32(
msg);
310 0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_int32(
msg));
313 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int32(
msg));
315 protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_int64(
msg);
317 0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_int64(
msg));
320 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_int64(
msg));
321 protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_uint32(
msg);
323 0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint32(
msg));
326 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint32(
328 protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_uint64(
msg);
330 0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint64(
msg));
333 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_uint64(
335 protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_float(
msg);
338 protobuf_test_messages_proto2_TestAllTypesProto2_optional_float(
msg));
341 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_float(
msg));
342 protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_double(
msg);
345 protobuf_test_messages_proto2_TestAllTypesProto2_optional_double(
msg));
348 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_double(
350 protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_bool(
msg);
353 protobuf_test_messages_proto2_TestAllTypesProto2_optional_bool(
msg));
356 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bool(
msg));
363 protobuf_test_messages_proto2_TestAllTypesProto2*
msg =
364 protobuf_test_messages_proto2_TestAllTypesProto2_new(
arena);
365 protobuf_test_messages_proto2_TestAllTypesProto2* msg2;
367 const char data[] =
"ABCDEF";
373 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bytes(
msg));
374 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_bytes(
msg,
378 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bytes(
msg));
382 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_string(
384 protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_string(
388 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_string(
391 serialized.
data = protobuf_test_messages_proto2_TestAllTypesProto2_serialize(
394 msg2 = protobuf_test_messages_proto2_TestAllTypesProto2_parse(
398 protobuf_test_messages_proto2_TestAllTypesProto2_optional_bytes(
msg)
401 0, memcmp(
bytes.data,
402 protobuf_test_messages_proto2_TestAllTypesProto2_optional_bytes(
406 protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_bytes(
msg);
409 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_bytes(
msg));
411 val = protobuf_test_messages_proto2_TestAllTypesProto2_optional_string(msg2);
414 protobuf_test_messages_proto2_TestAllTypesProto2_clear_optional_string(
msg);
416 0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_string(
msg)
420 protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_string(
425 TEST(GeneratedCode, Extension) {
427 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect*
msg =
428 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect_new(
430 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect* msg2;
435 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_has_message_set_extension(
438 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2*
ext =
439 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_new(
443 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_i(
445 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_set_i(
449 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_i(
452 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_set_message_set_extension(
456 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_has_message_set_extension(
460 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect_serialize(
463 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrect_parse(
465 const protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2*
467 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_message_set_extension(
471 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_i(
475 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_clear_message_set_extension(
479 protobuf_test_messages_proto2_TestAllTypesProto2_MessageSetCorrectExtension2_has_message_set_extension(
484 TEST(GeneratedCode, RepeatedClear) {
486 protobuf_test_messages_proto2_TestAllTypesProto2*
msg =
487 protobuf_test_messages_proto2_TestAllTypesProto2_new(
arena);
489 protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(
msg, &
len);
491 protobuf_test_messages_proto2_TestAllTypesProto2_add_repeated_int32(
msg, 2,
493 protobuf_test_messages_proto2_TestAllTypesProto2_add_repeated_int32(
msg, 3,
495 protobuf_test_messages_proto2_TestAllTypesProto2_add_repeated_int32(
msg, 4,
497 protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(
msg, &
len);
499 protobuf_test_messages_proto2_TestAllTypesProto2_clear_repeated_int32(
msg);
500 protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(
msg, &
len);
506 const char invalid_utf8[] =
"\xff";
511 protobuf_test_messages_proto3_TestAllTypesProto3*
msg =
512 protobuf_test_messages_proto3_TestAllTypesProto3_new(
arena);
513 protobuf_test_messages_proto3_TestAllTypesProto3* msg2;
515 protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_string(
516 msg, invalid_utf8_view);
518 serialized.
data = protobuf_test_messages_proto3_TestAllTypesProto3_serialize(
521 msg2 = protobuf_test_messages_proto3_TestAllTypesProto3_parse(
529 protobuf_test_messages_proto3_TestAllTypesProto3*
msg) {
534 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_size(
537 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
542 protobuf_test_messages_proto3_TestAllTypesProto3*
msg) {
543 const protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry*
550 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_size(
553 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_get(
558 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_get(
564 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
569 protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry_key(
573 protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry_value(
577 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
582 TEST(GeneratedCode, StringDoubleMap) {
585 upb_test_MapTest*
msg = upb_test_MapTest_new(
arena);
586 upb_test_MapTest* msg2;
598 msg2 = upb_test_MapTest_parse(serialized.
data, serialized.
size,
arena);
601 upb_test_MapTest_map_string_double_get(msg2,
test_str_view, &val));
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*
618 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_set(
624 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_delete(
630 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_delete(
638 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_set(
640 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_set(
649 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
652 protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry_key(
655 protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry_value(
670 protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_clear(
msg);
677 protobuf_test_messages_proto3_TestAllTypesProto3*
msg) {
681 0, protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_size(
684 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_next(
689 protobuf_test_messages_proto3_TestAllTypesProto3*
msg) {
690 const protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry*
696 1, protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_size(
699 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_get(
704 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_get(
710 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_next(
715 protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry_key(
719 protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry_value(
723 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_next(
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*
739 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
745 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_delete(
751 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_delete(
759 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
761 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
770 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_next(
773 protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry_key(
776 protobuf_test_messages_proto3_TestAllTypesProto3_MapInt32Int32Entry_value(
791 protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_clear(
msg);
797 TEST(GeneratedCode, TestRepeated) {
799 protobuf_test_messages_proto3_TestAllTypesProto3*
msg =
800 protobuf_test_messages_proto3_TestAllTypesProto3_new(
arena);
804 protobuf_test_messages_proto3_TestAllTypesProto3_add_repeated_int32(
msg, 5,
807 elems = protobuf_test_messages_proto3_TestAllTypesProto3_repeated_int32(
816 TEST(GeneratedCode, Issue9440) {
818 upb_test_HelloRequest*
msg = upb_test_HelloRequest_new(
arena.ptr());
819 upb_test_HelloRequest_set_id(
msg, 8);
826 TEST(GeneratedCode, NullDecodeBuffer) {
828 protobuf_test_messages_proto3_TestAllTypesProto3*
msg =
829 protobuf_test_messages_proto3_TestAllTypesProto3_parse(NULL, 0,
arena);
833 protobuf_test_messages_proto3_TestAllTypesProto3_serialize(
msg,
arena, &
size);
838 TEST(GeneratedCode, StatusTruncation) {
843 char*
msg =
static_cast<char*
>(malloc(
i + 1));
845 char ch = (
i % 96) + 33;
847 for (j = 0; j <
i; j++) {
858 for (j = 0; j <
end; j++) {
868 int* iptr =
static_cast<int*
>(
ptr);
872 TEST(GeneratedCode, ArenaFuse) {
908 TEST(GeneratedCode, FuseWithInitialBlock) {
915 int size =
sizeof(arenas) /
sizeof(arenas[0]);
916 for (
int i = 0;
i <
size; ++
i) {
917 for (
int j = 0; j <
size; ++j) {
929 TEST(GeneratedCode, ArenaDecode) {
932 char large_string[1024] = {0};
933 upb_StringView large_string_view = {large_string,
sizeof(large_string)};
936 protobuf_test_messages_proto3_TestAllTypesProto3*
msg =
937 protobuf_test_messages_proto3_TestAllTypesProto3_new(
tmp);
939 protobuf_test_messages_proto3_TestAllTypesProto3_set_optional_bytes(
940 msg, large_string_view);
943 serialized.
data = protobuf_test_messages_proto3_TestAllTypesProto3_serialize(
950 protobuf_test_messages_proto3_TestAllTypesProto3_parse(
962 TEST(GeneratedCode, ArenaUnaligned) {
965 char* unaligned_buf_ptr = (
char*)((
uintptr_t)buf1 | 7);
967 unaligned_buf_ptr, &buf1[
sizeof(buf1)] - unaligned_buf_ptr, NULL);