ruby_memprofiler_pprof 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. checksums.yaml +7 -0
  2. data/ext/ruby_memprofiler_pprof/backtrace.c +429 -0
  3. data/ext/ruby_memprofiler_pprof/collector.c +1055 -0
  4. data/ext/ruby_memprofiler_pprof/compat.c +182 -0
  5. data/ext/ruby_memprofiler_pprof/extconf.rb +72 -0
  6. data/ext/ruby_memprofiler_pprof/pprof.upb.c +170 -0
  7. data/ext/ruby_memprofiler_pprof/pprof.upb.h +848 -0
  8. data/ext/ruby_memprofiler_pprof/pprof_out.c +285 -0
  9. data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.c +11 -0
  10. data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.h +301 -0
  11. data/ext/ruby_memprofiler_pprof/strtab.c +391 -0
  12. data/ext/ruby_memprofiler_pprof/vendor/upb/BUILD +719 -0
  13. data/ext/ruby_memprofiler_pprof/vendor/upb/CONTRIBUTING.md +37 -0
  14. data/ext/ruby_memprofiler_pprof/vendor/upb/DESIGN.md +201 -0
  15. data/ext/ruby_memprofiler_pprof/vendor/upb/LICENSE +26 -0
  16. data/ext/ruby_memprofiler_pprof/vendor/upb/README.md +78 -0
  17. data/ext/ruby_memprofiler_pprof/vendor/upb/WORKSPACE +58 -0
  18. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/BUILD +53 -0
  19. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/amalgamate.py +129 -0
  20. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/build_defs.bzl +160 -0
  21. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/lua.BUILD +127 -0
  22. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/protobuf.patch +54 -0
  23. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/py_proto_library.bzl +137 -0
  24. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/python_downloads.bzl +84 -0
  25. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/system_python.bzl +101 -0
  26. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/upb_proto_library.bzl +388 -0
  27. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/workspace_deps.bzl +89 -0
  28. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD +252 -0
  29. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD.googleapis +54 -0
  30. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/benchmark.cc +333 -0
  31. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/build_defs.bzl +88 -0
  32. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/compare.py +118 -0
  33. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor.proto +888 -0
  34. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor_sv.proto +890 -0
  35. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/empty.proto +6 -0
  36. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_protobuf_binary_cc.py +64 -0
  37. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_synthetic_protos.py +118 -0
  38. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_upb_binary_c.py +65 -0
  39. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/BUILD.bazel +102 -0
  40. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/README.md +23 -0
  41. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/build_defs.bzl +73 -0
  42. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/make_cmakelists.py +340 -0
  43. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test.py +57 -0
  44. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test_lib.py +186 -0
  45. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/render.py +43 -0
  46. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/style-guide.md +65 -0
  47. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/vs-cpp-protos.md +255 -0
  48. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/wrapping-upb.md +444 -0
  49. data/ext/ruby_memprofiler_pprof/vendor/upb/python/BUILD +216 -0
  50. data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.c +394 -0
  51. data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.h +63 -0
  52. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.c +1694 -0
  53. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.h +80 -0
  54. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.c +704 -0
  55. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.h +114 -0
  56. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.c +650 -0
  57. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.h +48 -0
  58. data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/BUILD.bazel +193 -0
  59. data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/dist.bzl +190 -0
  60. data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.c +247 -0
  61. data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.h +39 -0
  62. data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.c +522 -0
  63. data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.h +66 -0
  64. data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.c +1909 -0
  65. data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.h +101 -0
  66. data/ext/ruby_memprofiler_pprof/vendor/upb/python/minimal_test.py +183 -0
  67. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/BUILD +70 -0
  68. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/README.md +11 -0
  69. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_database_test_wrapper.py +30 -0
  70. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_pool_test_wrapper.py +45 -0
  71. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_test_wrapper.py +46 -0
  72. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/generator_test_wrapper.py +30 -0
  73. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/json_format_test_wrapper.py +30 -0
  74. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/keywords_test_wrapper.py +30 -0
  75. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_factory_test_wrapper.py +37 -0
  76. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_test_wrapper.py +52 -0
  77. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/proto_builder_test_wrapper.py +32 -0
  78. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/pyproto_test_wrapper.bzl +36 -0
  79. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/reflection_test_wrapper.py +45 -0
  80. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/service_reflection_test_wrapper.py +30 -0
  81. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/symbol_database_test_wrapper.py +30 -0
  82. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_encoding_test_wrapper.py +30 -0
  83. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_format_test_wrapper.py +30 -0
  84. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/unknown_fields_test_wrapper.py +30 -0
  85. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/well_known_types_test_wrapper.py +36 -0
  86. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/wire_format_test_wrapper.py +30 -0
  87. data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.c +350 -0
  88. data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.h +230 -0
  89. data/ext/ruby_memprofiler_pprof/vendor/upb/python/py_extension.bzl +55 -0
  90. data/ext/ruby_memprofiler_pprof/vendor/upb/python/python_api.h +61 -0
  91. data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.c +828 -0
  92. data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.h +69 -0
  93. data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.c +404 -0
  94. data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.h +39 -0
  95. data/ext/ruby_memprofiler_pprof/vendor/upb/python/version_script.lds +6 -0
  96. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/LICENSE +32 -0
  97. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/README.google +9 -0
  98. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/console.lua +156 -0
  99. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/lunit.lua +725 -0
  100. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/BUILD +19 -0
  101. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/LICENSE +21 -0
  102. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/naive.c +92 -0
  103. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-neon.c +157 -0
  104. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-sse.c +170 -0
  105. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/utf8_range.h +9 -0
  106. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/BUILD.bazel +129 -0
  107. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/README.md +8 -0
  108. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/def.c +939 -0
  109. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/lua_proto_library.bzl +138 -0
  110. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/main.c +83 -0
  111. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/msg.c +1118 -0
  112. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test.proto +69 -0
  113. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test_upb.lua +846 -0
  114. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.c +258 -0
  115. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.h +132 -0
  116. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.lua +58 -0
  117. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upbc.cc +134 -0
  118. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.c +192 -0
  119. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.h +174 -0
  120. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb.c +346 -0
  121. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb_failures.txt +1 -0
  122. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.c +1221 -0
  123. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.h +94 -0
  124. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.c +1055 -0
  125. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.h +153 -0
  126. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_internal.h +211 -0
  127. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.c +3262 -0
  128. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.h +414 -0
  129. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.hpp +438 -0
  130. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/empty.proto +1 -0
  131. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.c +604 -0
  132. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.h +71 -0
  133. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/BUILD +13 -0
  134. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/file_descriptor_parsenew_fuzzer.cc +43 -0
  135. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.c +1509 -0
  136. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.h +47 -0
  137. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.c +776 -0
  138. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.h +62 -0
  139. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.c +1147 -0
  140. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.h +189 -0
  141. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.hpp +112 -0
  142. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.c +363 -0
  143. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.h +263 -0
  144. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_internal.h +59 -0
  145. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_test.cc +425 -0
  146. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_test.cc +230 -0
  147. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.c +428 -0
  148. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.h +114 -0
  149. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_internal.h +836 -0
  150. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.cc +491 -0
  151. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.proto +195 -0
  152. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_def.inc +261 -0
  153. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_undef.inc +62 -0
  154. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.c +323 -0
  155. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.h +109 -0
  156. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.hpp +37 -0
  157. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table.c +926 -0
  158. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table_internal.h +385 -0
  159. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test.proto +74 -0
  160. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.cc +186 -0
  161. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.proto +12 -0
  162. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_generated_code.cc +977 -0
  163. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_table.cc +580 -0
  164. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.c +472 -0
  165. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.h +64 -0
  166. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.c +362 -0
  167. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.h +378 -0
  168. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.hpp +115 -0
  169. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb_internal.h +68 -0
  170. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/BUILD +121 -0
  171. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/README.md +7 -0
  172. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.c +300 -0
  173. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.h +66 -0
  174. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare_test.cc +236 -0
  175. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.c +572 -0
  176. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.h +62 -0
  177. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_public_import_test.proto +32 -0
  178. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_regular_import_test.proto +36 -0
  179. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.cc +143 -0
  180. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.proto +119 -0
  181. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_weak_import_test.proto +28 -0
  182. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_wweak_import_test.proto +28 -0
  183. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.c +311 -0
  184. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.h +94 -0
  185. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.cc +202 -0
  186. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.proto +48 -0
  187. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/BUILD +78 -0
  188. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.cc +77 -0
  189. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.h +112 -0
  190. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upb.cc +1997 -0
  191. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upbdefs.cc +193 -0
  192. data/lib/ruby_memprofiler_pprof/atfork.rb +77 -0
  193. data/lib/ruby_memprofiler_pprof/block_flusher.rb +61 -0
  194. data/lib/ruby_memprofiler_pprof/file_flusher.rb +45 -0
  195. data/lib/ruby_memprofiler_pprof/profile_app.rb +30 -0
  196. data/lib/ruby_memprofiler_pprof/profile_data.rb +18 -0
  197. data/lib/ruby_memprofiler_pprof/version.rb +5 -0
  198. data/lib/ruby_memprofiler_pprof.rb +8 -0
  199. data/libexec/ruby_memprofiler_pprof_profile +16 -0
  200. metadata +257 -0
@@ -0,0 +1,977 @@
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 "google/protobuf/test_messages_proto2.upb.h"
35
+ #include "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
+
48
+ const upb_StringView test_str_view = {test_str, sizeof(test_str) - 1};
49
+ const upb_StringView test_str_view2 = {test_str2, sizeof(test_str2) - 1};
50
+ const upb_StringView test_str_view3 = {test_str3, sizeof(test_str3) - 1};
51
+ const upb_StringView test_str_view4 = {test_str4, sizeof(test_str4) - 1};
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) {
59
+ upb_Arena* arena = upb_Arena_New();
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(
77
+ msg, test_str_view);
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);
105
+ EXPECT_TRUE(upb_StringView_IsEqual(val, test_str_view));
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);
136
+ upb_Arena_Free(arena);
137
+ }
138
+
139
+ TEST(GeneratedCode, ScalarsProto2) {
140
+ upb_Arena* arena = upb_Arena_New();
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
+
358
+ upb_Arena_Free(arena);
359
+ }
360
+
361
+ TEST(GeneratedCode, Bytes) {
362
+ upb_Arena* arena = upb_Arena_New();
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";
368
+ upb_StringView bytes = upb_StringView_FromString(data);
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);
412
+ EXPECT_TRUE(upb_StringView_IsEqual(val, test_str_view));
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));
422
+ upb_Arena_Free(arena);
423
+ }
424
+
425
+ TEST(GeneratedCode, Extension) {
426
+ upb_Arena* arena = upb_Arena_New();
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));
481
+ upb_Arena_Free(arena);
482
+ }
483
+
484
+ TEST(GeneratedCode, RepeatedClear) {
485
+ upb_Arena* arena = upb_Arena_New();
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);
502
+ upb_Arena_Free(arena);
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);
509
+ upb_Arena* arena = upb_Arena_New();
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
+
525
+ upb_Arena_Free(arena);
526
+ }
527
+
528
+ static void check_string_map_empty(
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
+
541
+ static void check_string_map_one_entry(
542
+ protobuf_test_messages_proto3_TestAllTypesProto3* msg) {
543
+ const protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry*
544
+ const_ent;
545
+ size_t iter;
546
+ upb_StringView str;
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));
555
+ EXPECT_TRUE(upb_StringView_IsEqual(str, test_str_view2));
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. */
562
+ iter = kUpb_Map_Begin;
563
+ const_ent =
564
+ protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
565
+ msg, &iter);
566
+ ASSERT_NE(nullptr, const_ent);
567
+ EXPECT_TRUE(upb_StringView_IsEqual(
568
+ test_str_view,
569
+ protobuf_test_messages_proto3_TestAllTypesProto3_MapStringStringEntry_key(
570
+ const_ent)));
571
+ EXPECT_TRUE(upb_StringView_IsEqual(
572
+ test_str_view2,
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) {
583
+ upb_Arena* arena = upb_Arena_New();
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
+
604
+ upb_Arena_Free(arena);
605
+ }
606
+
607
+ TEST(GeneratedCode, StringMap) {
608
+ upb_Arena* arena = upb_Arena_New();
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
+
615
+ check_string_map_empty(msg);
616
+
617
+ /* Set map[test_str_view] = test_str_view2 */
618
+ protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_set(
619
+ msg, test_str_view, test_str_view2, arena);
620
+ check_string_map_one_entry(msg);
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));
626
+ check_string_map_one_entry(msg);
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));
632
+ check_string_map_empty(msg);
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(
639
+ msg, test_str_view, test_str_view2, arena);
640
+ protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_set(
641
+ msg, test_str_view3, test_str_view4, arena);
642
+
643
+ /* Test iteration */
644
+ iter = kUpb_Map_Begin;
645
+ count = 0;
646
+
647
+ while (
648
+ (const_ent =
649
+ protobuf_test_messages_proto3_TestAllTypesProto3_map_string_string_next(
650
+ msg, &iter)) != NULL) {
651
+ upb_StringView key =
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++;
659
+ if (upb_StringView_IsEqual(key, test_str_view)) {
660
+ EXPECT_TRUE(upb_StringView_IsEqual(val, test_str_view2));
661
+ } else {
662
+ EXPECT_TRUE(upb_StringView_IsEqual(key, test_str_view3));
663
+ EXPECT_TRUE(upb_StringView_IsEqual(val, test_str_view4));
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);
671
+ check_string_map_empty(msg);
672
+
673
+ upb_Arena_Free(arena);
674
+ }
675
+
676
+ static void check_int32_map_empty(
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
+
688
+ static void check_int32_map_one_entry(
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. */
708
+ iter = kUpb_Map_Begin;
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) {
729
+ upb_Arena* arena = upb_Arena_New();
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
+
736
+ check_int32_map_empty(msg);
737
+
738
+ /* Set map[test_int32] = test_int32_2 */
739
+ protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
740
+ msg, test_int32, test_int32_2, arena);
741
+ check_int32_map_one_entry(msg);
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));
747
+ check_int32_map_one_entry(msg);
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));
753
+ check_int32_map_empty(msg);
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(
760
+ msg, test_int32, test_int32_2, arena);
761
+ protobuf_test_messages_proto3_TestAllTypesProto3_map_int32_int32_set(
762
+ msg, test_int32_3, test_int32_4, arena);
763
+
764
+ /* Test iteration */
765
+ iter = kUpb_Map_Begin;
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 {
783
+ EXPECT_EQ(key, test_int32_3);
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);
792
+ check_int32_map_empty(msg);
793
+
794
+ upb_Arena_Free(arena);
795
+ }
796
+
797
+ TEST(GeneratedCode, TestRepeated) {
798
+ upb_Arena* arena = upb_Arena_New();
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
+
813
+ upb_Arena_Free(arena);
814
+ }
815
+
816
+ TEST(GeneratedCode, Issue9440) {
817
+ upb::Arena arena;
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) {
827
+ upb_Arena* arena = upb_Arena_New();
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);
835
+ upb_Arena_Free(arena);
836
+ }
837
+
838
+ TEST(GeneratedCode, StatusTruncation) {
839
+ int i, j;
840
+ upb_Status status;
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
+
852
+ upb_Status_SetErrorMessage(&status, msg);
853
+ upb_Status_SetErrorFormat(&status2, "%s", msg);
854
+ end = MIN(i, _kUpb_Status_MaxMessage - 1);
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
+
881
+ upb_Arena_AddCleanup(arena1, &i1, decrement_int);
882
+ upb_Arena_AddCleanup(arena2, &i2, decrement_int);
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
+ }
906
+ upb_alloc test_alloc = {&test_allocfunc};
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),
912
+ upb_Arena_Init(buf2, 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)};
934
+ upb_Arena* tmp = upb_Arena_New();
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
+
946
+ upb_Arena* arena = upb_Arena_New();
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;
954
+ upb_Arena_AddCleanup(arena, &i1, decrement_int);
955
+ EXPECT_EQ(5, i1);
956
+ upb_Arena_Free(arena);
957
+ EXPECT_EQ(4, i1);
958
+
959
+ upb_Arena_Free(tmp);
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);
966
+ upb_Arena* arena = upb_Arena_Init(
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);
970
+ upb_Arena_Free(arena);
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);
976
+ upb_Arena_Free(arena);
977
+ }