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,425 @@
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 mini table accessors.
29
+ *
30
+ * Messages are created and mutated using generated code, and then
31
+ * accessed through reflective APIs exposed through mini table accessors.
32
+ */
33
+
34
+ #include "upb/mini_table_accessors.h"
35
+
36
+ #include "gtest/gtest.h"
37
+ #include "google/protobuf/test_messages_proto2.upb.h"
38
+ #include "google/protobuf/test_messages_proto3.upb.h"
39
+ #include "upb/collections.h"
40
+ #include "upb/mini_table.h"
41
+ #include "upb/test.upb.h"
42
+
43
+ namespace {
44
+
45
+ // Proto2 test messages field numbers used for reflective access.
46
+ const uint32_t kFieldOptionalInt32 = 1;
47
+ const uint32_t kFieldOptionalUInt32 = 3;
48
+ const uint32_t kFieldOptionalBool = 13;
49
+ const uint32_t kFieldOptionalString = 14;
50
+ const uint32_t kFieldOptionalNestedMessage = 18;
51
+ const uint32_t kFieldOptionalRepeatedInt32 = 31;
52
+ const uint32_t kFieldOptionalNestedMessageA = 1;
53
+ const uint32_t kFieldOptionalOneOfUInt32 = 111;
54
+ const uint32_t kFieldOptionalOneOfString = 113;
55
+
56
+ const uint32_t kFieldProto3OptionalInt64 = 2;
57
+ const uint32_t kFieldProto3OptionalUInt64 = 4;
58
+
59
+ const char kTestStr1[] = "Hello1";
60
+ const char kTestStr2[] = "Hello2";
61
+ const int32_t kTestInt32 = 567;
62
+ const int32_t kTestUInt32 = 0xF1234567;
63
+ const uint64_t kTestUInt64 = 0xFEDCBAFF87654321;
64
+
65
+ const upb_MiniTable_Field* find_proto3_field(int field_number) {
66
+ return upb_MiniTable_FindFieldByNumber(
67
+ &protobuf_test_messages_proto3_TestAllTypesProto3_msginit, field_number);
68
+ }
69
+
70
+ const upb_MiniTable_Field* find_proto2_field(int field_number) {
71
+ return upb_MiniTable_FindFieldByNumber(
72
+ &protobuf_test_messages_proto2_TestAllTypesProto2_msginit, field_number);
73
+ }
74
+
75
+ TEST(GeneratedCode, HazzersProto2) {
76
+ upb_Arena* arena = upb_Arena_New();
77
+ protobuf_test_messages_proto2_TestAllTypesProto2* msg =
78
+ protobuf_test_messages_proto2_TestAllTypesProto2_new(arena);
79
+
80
+ // Scalar/Boolean.
81
+ const upb_MiniTable_Field* optional_bool_field =
82
+ find_proto2_field(kFieldOptionalBool);
83
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_bool_field));
84
+ protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_bool(msg, true);
85
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_bool_field));
86
+ upb_MiniTable_ClearField(msg, optional_bool_field);
87
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_bool_field));
88
+ EXPECT_EQ(
89
+ false,
90
+ protobuf_test_messages_proto2_TestAllTypesProto2_optional_bool(msg));
91
+
92
+ // String.
93
+ const upb_MiniTable_Field* optional_string_field =
94
+ find_proto2_field(kFieldOptionalString);
95
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_string_field));
96
+ protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_string(
97
+ msg, upb_StringView_FromString(kTestStr1));
98
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_string_field));
99
+ EXPECT_EQ(
100
+ strlen(kTestStr1),
101
+ protobuf_test_messages_proto2_TestAllTypesProto2_optional_string(msg)
102
+ .size);
103
+ upb_MiniTable_ClearField(msg, optional_string_field);
104
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_string_field));
105
+ EXPECT_EQ(
106
+ 0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_string(msg)
107
+ .size);
108
+
109
+ // Message.
110
+ const upb_MiniTable_Field* optional_message_field =
111
+ find_proto2_field(kFieldOptionalNestedMessage);
112
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_message_field));
113
+ protobuf_test_messages_proto2_TestAllTypesProto2_mutable_optional_nested_message(
114
+ msg, arena);
115
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_message_field));
116
+ upb_MiniTable_ClearField(msg, optional_message_field);
117
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_message_field));
118
+ EXPECT_EQ(
119
+ true,
120
+ protobuf_test_messages_proto2_TestAllTypesProto2_optional_nested_message(
121
+ msg) == nullptr);
122
+
123
+ // One of.
124
+ const upb_MiniTable_Field* optional_oneof_uint32_field =
125
+ find_proto2_field(kFieldOptionalOneOfUInt32);
126
+ const upb_MiniTable_Field* optional_oneof_string_field =
127
+ find_proto2_field(kFieldOptionalOneOfString);
128
+
129
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_oneof_uint32_field));
130
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_oneof_string_field));
131
+ protobuf_test_messages_proto2_TestAllTypesProto2_set_oneof_uint32(msg, 123);
132
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_oneof_uint32_field));
133
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_oneof_string_field));
134
+ protobuf_test_messages_proto2_TestAllTypesProto2_set_oneof_string(
135
+ msg, upb_StringView_FromString(kTestStr1));
136
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_oneof_uint32_field));
137
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_oneof_string_field));
138
+ upb_MiniTable_ClearField(msg, optional_oneof_uint32_field);
139
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_oneof_uint32_field));
140
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_oneof_string_field));
141
+ upb_MiniTable_ClearField(msg, optional_oneof_string_field);
142
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_oneof_uint32_field));
143
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_oneof_string_field));
144
+
145
+ upb_Arena_Free(arena);
146
+ }
147
+
148
+ TEST(GeneratedCode, ScalarsProto2) {
149
+ upb_Arena* arena = upb_Arena_New();
150
+ protobuf_test_messages_proto2_TestAllTypesProto2* msg =
151
+ protobuf_test_messages_proto2_TestAllTypesProto2_new(arena);
152
+
153
+ const upb_MiniTable_Field* optional_int32_field =
154
+ find_proto2_field(kFieldOptionalInt32);
155
+
156
+ EXPECT_EQ(
157
+ 0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_int32(msg));
158
+
159
+ EXPECT_EQ(0, upb_MiniTable_GetInt32(msg, optional_int32_field));
160
+ upb_MiniTable_SetInt32(msg, optional_int32_field, kTestInt32);
161
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_int32_field));
162
+ EXPECT_EQ(kTestInt32, upb_MiniTable_GetInt32(msg, optional_int32_field));
163
+ EXPECT_EQ(
164
+ kTestInt32,
165
+ protobuf_test_messages_proto2_TestAllTypesProto2_optional_int32(msg));
166
+
167
+ const upb_MiniTable_Field* optional_uint32_field =
168
+ find_proto2_field(kFieldOptionalUInt32);
169
+
170
+ EXPECT_EQ(
171
+ 0, protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint32(msg));
172
+ EXPECT_EQ(0, upb_MiniTable_GetUInt32(msg, optional_uint32_field));
173
+ upb_MiniTable_SetUInt32(msg, optional_uint32_field, kTestUInt32);
174
+ EXPECT_EQ(kTestUInt32, upb_MiniTable_GetUInt32(msg, optional_uint32_field));
175
+ EXPECT_EQ(
176
+ kTestUInt32,
177
+ protobuf_test_messages_proto2_TestAllTypesProto2_optional_uint32(msg));
178
+
179
+ upb_Arena_Free(arena);
180
+ }
181
+
182
+ TEST(GeneratedCode, ScalarProto3) {
183
+ upb_Arena* arena = upb_Arena_New();
184
+ protobuf_test_messages_proto3_TestAllTypesProto3* msg =
185
+ protobuf_test_messages_proto3_TestAllTypesProto3_new(arena);
186
+
187
+ const upb_MiniTable_Field* optional_int64_field =
188
+ find_proto3_field(kFieldProto3OptionalInt64);
189
+ const upb_MiniTable_Field* optional_uint64_field =
190
+ find_proto3_field(kFieldProto3OptionalUInt64);
191
+
192
+ EXPECT_EQ(
193
+ 0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int64(msg));
194
+ upb_MiniTable_SetInt64(msg, optional_int64_field, -1);
195
+ EXPECT_EQ(
196
+ -1, protobuf_test_messages_proto3_TestAllTypesProto3_optional_int64(msg));
197
+ EXPECT_EQ(-1, upb_MiniTable_GetInt64(msg, optional_int64_field));
198
+
199
+ EXPECT_EQ(
200
+ 0, protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint64(msg));
201
+ upb_MiniTable_SetUInt64(msg, optional_uint64_field, kTestUInt64);
202
+ EXPECT_EQ(
203
+ kTestUInt64,
204
+ protobuf_test_messages_proto3_TestAllTypesProto3_optional_uint64(msg));
205
+ EXPECT_EQ(kTestUInt64, upb_MiniTable_GetUInt64(msg, optional_uint64_field));
206
+
207
+ upb_Arena_Free(arena);
208
+ }
209
+
210
+ TEST(GeneratedCode, Strings) {
211
+ upb_Arena* arena = upb_Arena_New();
212
+ protobuf_test_messages_proto2_TestAllTypesProto2* msg =
213
+ protobuf_test_messages_proto2_TestAllTypesProto2_new(arena);
214
+
215
+ const upb_MiniTable_Field* optional_string_field =
216
+ find_proto2_field(kFieldOptionalString);
217
+
218
+ // Test default.
219
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_string_field));
220
+ // Test read after write using C.
221
+ protobuf_test_messages_proto2_TestAllTypesProto2_set_optional_string(
222
+ msg, upb_StringView_FromString(kTestStr1));
223
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_string_field));
224
+ upb_StringView value = upb_MiniTable_GetString(msg, optional_string_field);
225
+ std::string read_value = std::string(value.data, value.size);
226
+ EXPECT_EQ(kTestStr1, read_value);
227
+ // Clear.
228
+ upb_MiniTable_ClearField(msg, optional_string_field);
229
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_string_field));
230
+ EXPECT_EQ(
231
+ false,
232
+ protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_string(
233
+ msg));
234
+ upb_MiniTable_SetString(msg, optional_string_field,
235
+ upb_StringView_FromString(kTestStr2));
236
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_string_field));
237
+ EXPECT_EQ(
238
+ true,
239
+ protobuf_test_messages_proto2_TestAllTypesProto2_has_optional_string(
240
+ msg));
241
+ value = protobuf_test_messages_proto2_TestAllTypesProto2_optional_string(msg);
242
+ read_value = std::string(value.data, value.size);
243
+ EXPECT_EQ(kTestStr2, read_value);
244
+
245
+ upb_Arena_Free(arena);
246
+ }
247
+
248
+ TEST(GeneratedCode, SubMessage) {
249
+ upb_Arena* arena = upb_Arena_New();
250
+ protobuf_test_messages_proto2_TestAllTypesProto2* msg =
251
+ protobuf_test_messages_proto2_TestAllTypesProto2_new(arena);
252
+
253
+ const upb_MiniTable_Field* optional_message_field =
254
+ find_proto2_field(kFieldOptionalNestedMessage);
255
+
256
+ const upb_Message* test_message =
257
+ upb_MiniTable_GetMessage(msg, optional_message_field);
258
+ EXPECT_EQ(NULL, test_message);
259
+
260
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_message_field));
261
+
262
+ // Get mutable using C API.
263
+ protobuf_test_messages_proto2_TestAllTypesProto2_NestedMessage* nested_message =
264
+ protobuf_test_messages_proto2_TestAllTypesProto2_mutable_optional_nested_message(
265
+ msg, arena);
266
+ EXPECT_EQ(true, nested_message != nullptr);
267
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_message_field));
268
+ protobuf_test_messages_proto2_TestAllTypesProto2_NestedMessage_set_a(
269
+ nested_message, 5);
270
+
271
+ // Read back using mini table API.
272
+ const upb_Message* sub_message =
273
+ upb_MiniTable_GetMessage(msg, optional_message_field);
274
+ EXPECT_EQ(true, sub_message != NULL);
275
+
276
+ const upb_MiniTable_Field* nested_message_a_field =
277
+ upb_MiniTable_FindFieldByNumber(
278
+ &protobuf_test_messages_proto2_TestAllTypesProto2_NestedMessage_msginit,
279
+ kFieldOptionalNestedMessageA);
280
+ EXPECT_EQ(5, upb_MiniTable_GetInt32(sub_message, nested_message_a_field));
281
+
282
+ upb_MiniTable_ClearField(msg, optional_message_field);
283
+ EXPECT_EQ(
284
+ NULL,
285
+ protobuf_test_messages_proto2_TestAllTypesProto2_optional_nested_message(
286
+ msg));
287
+ EXPECT_EQ(false, upb_MiniTable_HasField(msg, optional_message_field));
288
+
289
+ upb_Message* new_nested_message =
290
+ protobuf_test_messages_proto2_TestAllTypesProto2_NestedMessage_new(arena);
291
+ upb_MiniTable_SetInt32(new_nested_message, nested_message_a_field, 123);
292
+ upb_MiniTable_SetMessage(msg, optional_message_field, new_nested_message);
293
+
294
+ upb_Message* mutable_message = upb_MiniTable_GetMutableMessage(
295
+ msg, &protobuf_test_messages_proto2_TestAllTypesProto2_msginit,
296
+ optional_message_field, arena);
297
+ EXPECT_EQ(
298
+ true,
299
+ protobuf_test_messages_proto2_TestAllTypesProto2_optional_nested_message(
300
+ msg) != NULL);
301
+ EXPECT_EQ(true, upb_MiniTable_HasField(msg, optional_message_field));
302
+ EXPECT_EQ(123,
303
+ upb_MiniTable_GetInt32(mutable_message, nested_message_a_field));
304
+
305
+ upb_Arena_Free(arena);
306
+ }
307
+
308
+ TEST(GeneratedCode, RepeatedScalar) {
309
+ upb_Arena* arena = upb_Arena_New();
310
+ protobuf_test_messages_proto2_TestAllTypesProto2* msg =
311
+ protobuf_test_messages_proto2_TestAllTypesProto2_new(arena);
312
+
313
+ const upb_MiniTable_Field* repeated_int32_field =
314
+ find_proto2_field(kFieldOptionalRepeatedInt32);
315
+
316
+ size_t len;
317
+ const int32_t* arr =
318
+ protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(msg,
319
+ &len);
320
+ // Test Get/Set Array values, validate with C API.
321
+ EXPECT_EQ(0, len);
322
+ EXPECT_EQ(NULL, arr);
323
+ EXPECT_EQ(NULL, upb_MiniTable_GetArray(msg, repeated_int32_field));
324
+ protobuf_test_messages_proto2_TestAllTypesProto2_resize_repeated_int32(
325
+ msg, 10, arena);
326
+ int32_t* mutable_values =
327
+ protobuf_test_messages_proto2_TestAllTypesProto2_mutable_repeated_int32(
328
+ msg, &len);
329
+ mutable_values[5] = 123;
330
+ const upb_Array* readonly_arr =
331
+ upb_MiniTable_GetArray(msg, repeated_int32_field);
332
+ EXPECT_EQ(123, upb_Array_Get(readonly_arr, 5).int32_val);
333
+
334
+ upb_MessageValue new_value;
335
+ new_value.int32_val = 567;
336
+ upb_Array* mutable_array =
337
+ upb_MiniTable_GetMutableArray(msg, repeated_int32_field);
338
+ upb_Array_Set(mutable_array, 5, new_value);
339
+ EXPECT_EQ(new_value.int32_val,
340
+ protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(
341
+ msg, &len)[5]);
342
+
343
+ // Test resize.
344
+ bool result = upb_Array_Resize(mutable_array, 20, arena);
345
+ EXPECT_EQ(true, result);
346
+ upb_Array_Set(mutable_array, 19, new_value);
347
+ EXPECT_EQ(new_value.int32_val,
348
+ protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(
349
+ msg, &len)[19]);
350
+ upb_Array_Resize(mutable_array, 0, arena);
351
+ const int32_t* zero_length_array =
352
+ protobuf_test_messages_proto2_TestAllTypesProto2_repeated_int32(msg,
353
+ &len);
354
+ EXPECT_EQ(0, len);
355
+ EXPECT_EQ(true, zero_length_array != NULL);
356
+
357
+ upb_Arena_Free(arena);
358
+ }
359
+
360
+ TEST(GeneratedCode, Extensions) {
361
+ upb_Arena* arena = upb_Arena_New();
362
+ upb_test_ModelWithExtensions* msg = upb_test_ModelWithExtensions_new(arena);
363
+ upb_test_ModelWithExtensions_set_random_int32(msg, 10);
364
+ upb_test_ModelWithExtensions_set_random_name(
365
+ msg, upb_StringView_FromString("Hello"));
366
+
367
+ upb_test_ModelExtension1* extension1 = upb_test_ModelExtension1_new(arena);
368
+ upb_test_ModelExtension1_set_str(extension1,
369
+ upb_StringView_FromString("World"));
370
+
371
+ upb_test_ModelExtension2* extension2 = upb_test_ModelExtension2_new(arena);
372
+ upb_test_ModelExtension2_set_i(extension2, 5);
373
+
374
+ upb_test_ModelExtension1_set_model_ext(msg, extension1, arena);
375
+ upb_test_ModelExtension2_set_model_ext(msg, extension2, arena);
376
+
377
+ size_t serialized_size;
378
+ char* serialized =
379
+ upb_test_ModelWithExtensions_serialize(msg, arena, &serialized_size);
380
+
381
+ // Test known GetExtension
382
+ const upb_Message_Extension* upb_ext2;
383
+ upb_GetExtension_Status promote_status = upb_MiniTable_GetOrPromoteExtension(
384
+ msg, &upb_test_ModelExtension2_model_ext_ext, 0, arena, &upb_ext2);
385
+
386
+ upb_test_ModelExtension2* ext2 =
387
+ (upb_test_ModelExtension2*)upb_ext2->data.ptr;
388
+ EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
389
+ EXPECT_EQ(5, upb_test_ModelExtension2_i(ext2));
390
+
391
+ upb_test_EmptyMessageWithExtensions* base_msg =
392
+ upb_test_EmptyMessageWithExtensions_parse(serialized, serialized_size,
393
+ arena);
394
+
395
+ // Get unknown extension bytes before promotion.
396
+ const char* extension_data;
397
+ size_t len;
398
+ upb_GetExtensionAsBytes_Status status = status =
399
+ upb_MiniTable_GetExtensionAsBytes(base_msg,
400
+ &upb_test_ModelExtension2_model_ext_ext,
401
+ 0, arena, &extension_data, &len);
402
+ EXPECT_EQ(kUpb_GetExtensionAsBytes_Ok, status);
403
+ EXPECT_EQ(0x48, extension_data[0]);
404
+ EXPECT_EQ(5, extension_data[1]);
405
+
406
+ // Test unknown GetExtension.
407
+ promote_status = upb_MiniTable_GetOrPromoteExtension(
408
+ base_msg, &upb_test_ModelExtension2_model_ext_ext, 0, arena, &upb_ext2);
409
+
410
+ ext2 = (upb_test_ModelExtension2*)upb_ext2->data.ptr;
411
+ EXPECT_EQ(kUpb_GetExtension_Ok, promote_status);
412
+ EXPECT_EQ(5, upb_test_ModelExtension2_i(ext2));
413
+
414
+ // Get unknown extension bytes after promotion.
415
+ status = upb_MiniTable_GetExtensionAsBytes(
416
+ base_msg, &upb_test_ModelExtension2_model_ext_ext, 0, arena,
417
+ &extension_data, &len);
418
+ EXPECT_EQ(kUpb_GetExtensionAsBytes_Ok, status);
419
+ EXPECT_EQ(0x48, extension_data[0]);
420
+ EXPECT_EQ(5, extension_data[1]);
421
+
422
+ upb_Arena_Free(arena);
423
+ }
424
+
425
+ } // namespace
@@ -0,0 +1,230 @@
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
+ #include "upb/mini_table.hpp"
29
+
30
+ #include "absl/container/flat_hash_set.h"
31
+ #include "gmock/gmock.h"
32
+ #include "google/protobuf/descriptor.h"
33
+ #include "gtest/gtest.h"
34
+ #include "upb/msg_internal.h"
35
+ #include "upb/upb.hpp"
36
+
37
+ namespace protobuf = ::google::protobuf;
38
+
39
+ class MiniTableTest : public testing::TestWithParam<upb_MiniTablePlatform> {};
40
+
41
+ TEST_P(MiniTableTest, Empty) {
42
+ upb::Arena arena;
43
+ upb::Status status;
44
+ upb_MiniTable* table =
45
+ upb_MiniTable_Build(NULL, 0, GetParam(), arena.ptr(), status.ptr());
46
+ ASSERT_NE(nullptr, table);
47
+ EXPECT_EQ(0, table->field_count);
48
+ EXPECT_EQ(0, table->required_count);
49
+ }
50
+
51
+ TEST_P(MiniTableTest, AllScalarTypes) {
52
+ upb::Arena arena;
53
+ upb::MtDataEncoder e;
54
+ ASSERT_TRUE(e.StartMessage(0));
55
+ int count = 0;
56
+ for (int i = kUpb_FieldType_Double; i < kUpb_FieldType_SInt64; i++) {
57
+ ASSERT_TRUE(e.PutField(static_cast<upb_FieldType>(i), i, 0));
58
+ count++;
59
+ }
60
+ upb::Status status;
61
+ upb_MiniTable* table = upb_MiniTable_Build(
62
+ e.data().data(), e.data().size(), GetParam(), arena.ptr(), status.ptr());
63
+ ASSERT_NE(nullptr, table);
64
+ EXPECT_EQ(count, table->field_count);
65
+ absl::flat_hash_set<size_t> offsets;
66
+ for (int i = 0; i < 16; i++) {
67
+ const upb_MiniTable_Field* f = &table->fields[i];
68
+ EXPECT_EQ(i + 1, f->number);
69
+ EXPECT_EQ(kUpb_FieldMode_Scalar, f->mode & kUpb_FieldMode_Mask);
70
+ EXPECT_TRUE(offsets.insert(f->offset).second);
71
+ EXPECT_TRUE(f->offset < table->size);
72
+ }
73
+ EXPECT_EQ(0, table->required_count);
74
+ }
75
+
76
+ TEST_P(MiniTableTest, AllRepeatedTypes) {
77
+ upb::Arena arena;
78
+ upb::MtDataEncoder e;
79
+ ASSERT_TRUE(e.StartMessage(0));
80
+ int count = 0;
81
+ for (int i = kUpb_FieldType_Double; i < kUpb_FieldType_SInt64; i++) {
82
+ ASSERT_TRUE(e.PutField(static_cast<upb_FieldType>(i), i,
83
+ kUpb_FieldModifier_IsRepeated));
84
+ count++;
85
+ }
86
+ upb::Status status;
87
+ upb_MiniTable* table = upb_MiniTable_Build(
88
+ e.data().data(), e.data().size(), GetParam(), arena.ptr(), status.ptr());
89
+ ASSERT_NE(nullptr, table);
90
+ EXPECT_EQ(count, table->field_count);
91
+ absl::flat_hash_set<size_t> offsets;
92
+ for (int i = 0; i < 16; i++) {
93
+ const upb_MiniTable_Field* f = &table->fields[i];
94
+ EXPECT_EQ(i + 1, f->number);
95
+ EXPECT_EQ(kUpb_FieldMode_Array, f->mode & kUpb_FieldMode_Mask);
96
+ EXPECT_TRUE(offsets.insert(f->offset).second);
97
+ EXPECT_TRUE(f->offset < table->size);
98
+ }
99
+ EXPECT_EQ(0, table->required_count);
100
+ }
101
+
102
+ TEST_P(MiniTableTest, Skips) {
103
+ upb::Arena arena;
104
+ upb::MtDataEncoder e;
105
+ ASSERT_TRUE(e.StartMessage(0));
106
+ int count = 0;
107
+ std::vector<int> field_numbers;
108
+ for (int i = 0; i < 25; i++) {
109
+ int field_number = 1 << i;
110
+ field_numbers.push_back(field_number);
111
+ ASSERT_TRUE(e.PutField(kUpb_FieldType_Float, field_number, 0));
112
+ count++;
113
+ }
114
+ upb::Status status;
115
+ upb_MiniTable* table = upb_MiniTable_Build(
116
+ e.data().data(), e.data().size(), GetParam(), arena.ptr(), status.ptr());
117
+ ASSERT_NE(nullptr, table);
118
+ EXPECT_EQ(count, table->field_count);
119
+ absl::flat_hash_set<size_t> offsets;
120
+ for (size_t i = 0; i < field_numbers.size(); i++) {
121
+ const upb_MiniTable_Field* f = &table->fields[i];
122
+ EXPECT_EQ(field_numbers[i], f->number);
123
+ EXPECT_EQ(kUpb_FieldType_Float, f->descriptortype);
124
+ EXPECT_EQ(kUpb_FieldMode_Scalar, f->mode & kUpb_FieldMode_Mask);
125
+ EXPECT_TRUE(offsets.insert(f->offset).second);
126
+ EXPECT_TRUE(f->offset < table->size);
127
+ }
128
+ EXPECT_EQ(0, table->required_count);
129
+ }
130
+
131
+ TEST_P(MiniTableTest, AllScalarTypesOneof) {
132
+ upb::Arena arena;
133
+ upb::MtDataEncoder e;
134
+ ASSERT_TRUE(e.StartMessage(0));
135
+ int count = 0;
136
+ for (int i = kUpb_FieldType_Double; i < kUpb_FieldType_SInt64; i++) {
137
+ ASSERT_TRUE(e.PutField(static_cast<upb_FieldType>(i), i, 0));
138
+ count++;
139
+ }
140
+ ASSERT_TRUE(e.StartOneof());
141
+ for (int i = kUpb_FieldType_Double; i < kUpb_FieldType_SInt64; i++) {
142
+ ASSERT_TRUE(e.PutOneofField(i));
143
+ }
144
+ upb::Status status;
145
+ upb_MiniTable* table = upb_MiniTable_Build(
146
+ e.data().data(), e.data().size(), GetParam(), arena.ptr(), status.ptr());
147
+ ASSERT_NE(nullptr, table) << status.error_message();
148
+ EXPECT_EQ(count, table->field_count);
149
+ absl::flat_hash_set<size_t> offsets;
150
+ for (int i = 0; i < 16; i++) {
151
+ const upb_MiniTable_Field* f = &table->fields[i];
152
+ EXPECT_EQ(i + 1, f->number);
153
+ EXPECT_EQ(kUpb_FieldMode_Scalar, f->mode & kUpb_FieldMode_Mask);
154
+ // For a oneof all fields have the same offset.
155
+ EXPECT_EQ(table->fields[0].offset, f->offset);
156
+ // All presence fields should point to the same oneof case offset.
157
+ size_t case_ofs = _upb_oneofcase_ofs(f);
158
+ EXPECT_EQ(table->fields[0].presence, f->presence);
159
+ EXPECT_TRUE(f->offset < table->size);
160
+ EXPECT_TRUE(case_ofs < table->size);
161
+ EXPECT_TRUE(case_ofs != f->offset);
162
+ }
163
+ EXPECT_EQ(0, table->required_count);
164
+ }
165
+
166
+ INSTANTIATE_TEST_SUITE_P(Platforms, MiniTableTest,
167
+ testing::Values(kUpb_MiniTablePlatform_32Bit,
168
+ kUpb_MiniTablePlatform_64Bit));
169
+
170
+ TEST(MiniTablePlatformIndependentTest, Base92Roundtrip) {
171
+ for (char i = 0; i < 92; i++) {
172
+ EXPECT_EQ(i, upb_FromBase92(upb_ToBase92(i)));
173
+ }
174
+ }
175
+
176
+ TEST(MiniTablePlatformIndependentTest, IsTypePackable) {
177
+ for (int i = 1; i <= protobuf::FieldDescriptor::MAX_TYPE; i++) {
178
+ EXPECT_EQ(upb_IsTypePackable(static_cast<upb_FieldType>(i)),
179
+ protobuf::FieldDescriptor::IsTypePackable(
180
+ static_cast<protobuf::FieldDescriptor::Type>(i)));
181
+ }
182
+ }
183
+
184
+ TEST(MiniTableEnumTest, Enum) {
185
+ upb::Arena arena;
186
+ upb::MtDataEncoder e;
187
+
188
+ e.StartEnum();
189
+ absl::flat_hash_set<int32_t> values;
190
+ for (int i = 0; i < 256; i++) {
191
+ values.insert(i * 2);
192
+ e.PutEnumValue(i * 2);
193
+ }
194
+ e.EndEnum();
195
+
196
+ upb::Status status;
197
+ upb_MiniTable_Enum* table = upb_MiniTable_BuildEnum(
198
+ e.data().data(), e.data().size(), arena.ptr(), status.ptr());
199
+ ASSERT_NE(nullptr, table) << status.error_message();
200
+
201
+ for (int i = 0; i < UINT16_MAX; i++) {
202
+ EXPECT_EQ(values.contains(i), upb_MiniTable_Enum_CheckValue(table, i)) << i;
203
+ }
204
+ }
205
+
206
+ TEST(MiniTableEnumTest, PositiveAndNegative) {
207
+ upb::Arena arena;
208
+ upb::MtDataEncoder e;
209
+
210
+ e.StartEnum();
211
+ absl::flat_hash_set<int32_t> values;
212
+ for (int i = 0; i < 100; i++) {
213
+ values.insert(i);
214
+ e.PutEnumValue(i);
215
+ }
216
+ for (int i = 100; i > 0; i--) {
217
+ values.insert(-i);
218
+ e.PutEnumValue(-i);
219
+ }
220
+ e.EndEnum();
221
+
222
+ upb::Status status;
223
+ upb_MiniTable_Enum* table = upb_MiniTable_BuildEnum(
224
+ e.data().data(), e.data().size(), arena.ptr(), status.ptr());
225
+ ASSERT_NE(nullptr, table) << status.error_message();
226
+
227
+ for (int i = -UINT16_MAX; i < UINT16_MAX; i++) {
228
+ EXPECT_EQ(values.contains(i), upb_MiniTable_Enum_CheckValue(table, i)) << i;
229
+ }
230
+ }