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,300 @@
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/util/compare.h"
29
+
30
+ #include <setjmp.h>
31
+ #include <stdbool.h>
32
+
33
+ #include "upb/port_def.inc"
34
+
35
+ struct upb_UnknownFields;
36
+ typedef struct upb_UnknownFields upb_UnknownFields;
37
+
38
+ typedef struct {
39
+ uint32_t tag;
40
+ union {
41
+ uint64_t varint;
42
+ uint64_t uint64;
43
+ uint32_t uint32;
44
+ upb_StringView delimited;
45
+ upb_UnknownFields* group;
46
+ } data;
47
+ } upb_UnknownField;
48
+
49
+ struct upb_UnknownFields {
50
+ size_t size;
51
+ size_t capacity;
52
+ upb_UnknownField* fields;
53
+ };
54
+
55
+ typedef struct {
56
+ const char* end;
57
+ upb_Arena* arena;
58
+ upb_UnknownField* tmp;
59
+ size_t tmp_size;
60
+ int depth;
61
+ jmp_buf err;
62
+ } upb_UnknownField_Context;
63
+
64
+ static void upb_UnknownFields_Grow(upb_UnknownField_Context* ctx,
65
+ upb_UnknownField** base,
66
+ upb_UnknownField** ptr,
67
+ upb_UnknownField** end) {
68
+ size_t old = (*ptr - *base);
69
+ size_t new = UPB_MAX(4, old * 2);
70
+
71
+ *base = upb_Arena_Realloc(ctx->arena, *base, old * sizeof(**base),
72
+ new * sizeof(**base));
73
+ if (!*base) UPB_LONGJMP(ctx->err, kUpb_UnknownCompareResult_OutOfMemory);
74
+
75
+ *ptr = *base + old;
76
+ *end = *base + new;
77
+ }
78
+
79
+ static const char* upb_UnknownFields_ParseVarint(const char* ptr,
80
+ const char* limit,
81
+ uint64_t* val) {
82
+ uint8_t byte;
83
+ int bitpos = 0;
84
+ *val = 0;
85
+
86
+ do {
87
+ // Unknown field data must be valid.
88
+ UPB_ASSERT(bitpos < 70 && ptr < limit);
89
+ byte = *ptr;
90
+ *val |= (uint64_t)(byte & 0x7F) << bitpos;
91
+ ptr++;
92
+ bitpos += 7;
93
+ } while (byte & 0x80);
94
+
95
+ return ptr;
96
+ }
97
+
98
+ // We have to implement our own sort here, since qsort() is not an in-order
99
+ // sort. Here we use merge sort, the simplest in-order sort.
100
+ static void upb_UnknownFields_Merge(upb_UnknownField* arr, size_t start,
101
+ size_t mid, size_t end,
102
+ upb_UnknownField* tmp) {
103
+ memcpy(tmp, &arr[start], (end - start) * sizeof(*tmp));
104
+
105
+ upb_UnknownField* ptr1 = tmp;
106
+ upb_UnknownField* end1 = &tmp[mid - start];
107
+ upb_UnknownField* ptr2 = &tmp[mid - start];
108
+ upb_UnknownField* end2 = &tmp[end - start];
109
+ upb_UnknownField* out = &arr[start];
110
+
111
+ while (ptr1 < end1 && ptr2 < end2) {
112
+ if (ptr1->tag <= ptr2->tag) {
113
+ *out++ = *ptr1++;
114
+ } else {
115
+ *out++ = *ptr2++;
116
+ }
117
+ }
118
+
119
+ if (ptr1 < end1) {
120
+ memcpy(out, ptr1, (end1 - ptr1) * sizeof(*out));
121
+ } else if (ptr2 < end2) {
122
+ memcpy(out, ptr1, (end2 - ptr2) * sizeof(*out));
123
+ }
124
+ }
125
+
126
+ static void upb_UnknownFields_SortRecursive(upb_UnknownField* arr, size_t start,
127
+ size_t end, upb_UnknownField* tmp) {
128
+ if (end - start > 1) {
129
+ size_t mid = start + ((end - start) / 2);
130
+ upb_UnknownFields_SortRecursive(arr, start, mid, tmp);
131
+ upb_UnknownFields_SortRecursive(arr, mid, end, tmp);
132
+ upb_UnknownFields_Merge(arr, start, mid, end, tmp);
133
+ }
134
+ }
135
+
136
+ static void upb_UnknownFields_Sort(upb_UnknownField_Context* ctx,
137
+ upb_UnknownFields* fields) {
138
+ if (ctx->tmp_size < fields->size) {
139
+ ctx->tmp_size = UPB_MAX(8, ctx->tmp_size);
140
+ while (ctx->tmp_size < fields->size) ctx->tmp_size *= 2;
141
+ ctx->tmp = realloc(ctx->tmp, ctx->tmp_size * sizeof(*ctx->tmp));
142
+ }
143
+ upb_UnknownFields_SortRecursive(fields->fields, 0, fields->size, ctx->tmp);
144
+ }
145
+
146
+ static upb_UnknownFields* upb_UnknownFields_DoBuild(
147
+ upb_UnknownField_Context* ctx, const char** buf) {
148
+ upb_UnknownField* arr_base = NULL;
149
+ upb_UnknownField* arr_ptr = NULL;
150
+ upb_UnknownField* arr_end = NULL;
151
+ const char* ptr = *buf;
152
+ uint32_t last_tag = 0;
153
+ bool sorted = true;
154
+ while (ptr < ctx->end) {
155
+ uint64_t tag;
156
+ ptr = upb_UnknownFields_ParseVarint(ptr, ctx->end, &tag);
157
+ UPB_ASSERT(tag <= UINT32_MAX);
158
+ int wire_type = tag & 7;
159
+ if (wire_type == kUpb_WireType_EndGroup) break;
160
+ if (tag < last_tag) sorted = false;
161
+ last_tag = tag;
162
+
163
+ if (arr_ptr == arr_end) {
164
+ upb_UnknownFields_Grow(ctx, &arr_base, &arr_ptr, &arr_end);
165
+ }
166
+ upb_UnknownField* field = arr_ptr;
167
+ field->tag = tag;
168
+ arr_ptr++;
169
+
170
+ switch (wire_type) {
171
+ case kUpb_WireType_Varint:
172
+ ptr = upb_UnknownFields_ParseVarint(ptr, ctx->end, &field->data.varint);
173
+ break;
174
+ case kUpb_WireType_64Bit:
175
+ UPB_ASSERT(ctx->end - ptr >= 8);
176
+ memcpy(&field->data.uint64, ptr, 8);
177
+ ptr += 8;
178
+ break;
179
+ case kUpb_WireType_32Bit:
180
+ UPB_ASSERT(ctx->end - ptr >= 4);
181
+ memcpy(&field->data.uint32, ptr, 4);
182
+ ptr += 4;
183
+ break;
184
+ case kUpb_WireType_Delimited: {
185
+ uint64_t size;
186
+ ptr = upb_UnknownFields_ParseVarint(ptr, ctx->end, &size);
187
+ UPB_ASSERT(ctx->end - ptr >= size);
188
+ field->data.delimited.data = ptr;
189
+ field->data.delimited.size = size;
190
+ ptr += size;
191
+ break;
192
+ }
193
+ case kUpb_WireType_StartGroup:
194
+ if (--ctx->depth == 0) {
195
+ UPB_LONGJMP(ctx->err, kUpb_UnknownCompareResult_MaxDepthExceeded);
196
+ }
197
+ field->data.group = upb_UnknownFields_DoBuild(ctx, &ptr);
198
+ ctx->depth++;
199
+ break;
200
+ default:
201
+ UPB_UNREACHABLE();
202
+ }
203
+ }
204
+
205
+ *buf = ptr;
206
+ upb_UnknownFields* ret = upb_Arena_Malloc(ctx->arena, sizeof(*ret));
207
+ if (!ret) UPB_LONGJMP(ctx->err, kUpb_UnknownCompareResult_OutOfMemory);
208
+ ret->fields = arr_base;
209
+ ret->size = arr_ptr - arr_base;
210
+ ret->capacity = arr_end - arr_base;
211
+ if (!sorted) {
212
+ upb_UnknownFields_Sort(ctx, ret);
213
+ }
214
+ return ret;
215
+ }
216
+
217
+ // Builds a upb_UnknownFields data structure from the binary data in buf.
218
+ static upb_UnknownFields* upb_UnknownFields_Build(upb_UnknownField_Context* ctx,
219
+ const char* buf,
220
+ size_t size) {
221
+ ctx->end = buf + size;
222
+ upb_UnknownFields* fields = upb_UnknownFields_DoBuild(ctx, &buf);
223
+ UPB_ASSERT(buf == ctx->end);
224
+ return fields;
225
+ }
226
+
227
+ // Compares two sorted upb_UnknwonFields structures for equality.
228
+ static bool upb_UnknownFields_IsEqual(const upb_UnknownFields* uf1,
229
+ const upb_UnknownFields* uf2) {
230
+ if (uf1->size != uf2->size) return false;
231
+ for (size_t i = 0, n = uf1->size; i < n; i++) {
232
+ upb_UnknownField* f1 = &uf1->fields[i];
233
+ upb_UnknownField* f2 = &uf2->fields[i];
234
+ if (f1->tag != f2->tag) return false;
235
+ int wire_type = f1->tag & 7;
236
+ switch (wire_type) {
237
+ case kUpb_WireType_Varint:
238
+ if (f1->data.varint != f2->data.varint) return false;
239
+ break;
240
+ case kUpb_WireType_64Bit:
241
+ if (f1->data.uint64 != f2->data.uint64) return false;
242
+ break;
243
+ case kUpb_WireType_32Bit:
244
+ if (f1->data.uint32 != f2->data.uint32) return false;
245
+ break;
246
+ case kUpb_WireType_Delimited:
247
+ if (!upb_StringView_IsEqual(f1->data.delimited, f2->data.delimited)) {
248
+ return false;
249
+ }
250
+ break;
251
+ case kUpb_WireType_StartGroup:
252
+ if (!upb_UnknownFields_IsEqual(f1->data.group, f2->data.group)) {
253
+ return false;
254
+ }
255
+ break;
256
+ default:
257
+ UPB_UNREACHABLE();
258
+ }
259
+ }
260
+ return true;
261
+ }
262
+
263
+ upb_UnknownCompareResult upb_Message_UnknownFieldsAreEqual(const char* buf1,
264
+ size_t size1,
265
+ const char* buf2,
266
+ size_t size2,
267
+ int max_depth) {
268
+ if (size1 == 0 && size2 == 0) return kUpb_UnknownCompareResult_Equal;
269
+ if (size1 == 0 || size2 == 0) return kUpb_UnknownCompareResult_NotEqual;
270
+ if (memcmp(buf1, buf2, size1) == 0) return kUpb_UnknownCompareResult_Equal;
271
+
272
+ upb_UnknownField_Context ctx = {
273
+ .arena = upb_Arena_New(),
274
+ .depth = max_depth,
275
+ .tmp = NULL,
276
+ .tmp_size = 0,
277
+ };
278
+
279
+ if (!ctx.arena) return kUpb_UnknownCompareResult_OutOfMemory;
280
+
281
+ int ret = UPB_SETJMP(ctx.err);
282
+
283
+ if (UPB_LIKELY(ret == 0)) {
284
+ // First build both unknown fields into a sorted data structure (similar
285
+ // to the UnknownFieldSet in C++).
286
+ upb_UnknownFields* uf1 = upb_UnknownFields_Build(&ctx, buf1, size1);
287
+ upb_UnknownFields* uf2 = upb_UnknownFields_Build(&ctx, buf2, size2);
288
+
289
+ // Now perform the equality check on the sorted structures.
290
+ if (upb_UnknownFields_IsEqual(uf1, uf2)) {
291
+ ret = kUpb_UnknownCompareResult_Equal;
292
+ } else {
293
+ ret = kUpb_UnknownCompareResult_NotEqual;
294
+ }
295
+ }
296
+
297
+ upb_Arena_Free(ctx.arena);
298
+ free(ctx.tmp);
299
+ return ret;
300
+ }
@@ -0,0 +1,66 @@
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
+ #ifndef UPB_UTIL_COMPARE_H_
29
+ #define UPB_UTIL_COMPARE_H_
30
+
31
+ #include "upb/def.h"
32
+
33
+ #ifdef __cplusplus
34
+ extern "C" {
35
+ #endif
36
+
37
+ // Returns true if unknown fields from the two messages are equal when sorted
38
+ // and varints are made canonical.
39
+ //
40
+ // This function is discouraged, as the comparison is inherently lossy without
41
+ // schema data:
42
+ //
43
+ // 1. We don't know whether delimited fields are sub-messages. Unknown
44
+ // sub-messages will therefore not have their fields sorted and varints
45
+ // canonicalized.
46
+ // 2. We don't know about oneof/non-repeated fields, which should semantically
47
+ // discard every value except the last.
48
+
49
+ typedef enum {
50
+ kUpb_UnknownCompareResult_Equal = 0,
51
+ kUpb_UnknownCompareResult_NotEqual = 1,
52
+ kUpb_UnknownCompareResult_OutOfMemory = 2,
53
+ kUpb_UnknownCompareResult_MaxDepthExceeded = 3,
54
+ } upb_UnknownCompareResult;
55
+
56
+ upb_UnknownCompareResult upb_Message_UnknownFieldsAreEqual(const char* buf1,
57
+ size_t size1,
58
+ const char* buf2,
59
+ size_t size2,
60
+ int max_depth);
61
+
62
+ #ifdef __cplusplus
63
+ } /* extern "C" */
64
+ #endif
65
+
66
+ #endif /* UPB_UTIL_COMPARE_H_ */
@@ -0,0 +1,236 @@
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/util/compare.h"
29
+
30
+ #include <stdint.h>
31
+
32
+ #include <string_view>
33
+ #include <vector>
34
+
35
+ #include "absl/strings/string_view.h"
36
+ #include "gmock/gmock.h"
37
+ #include "gtest/gtest.h"
38
+
39
+ struct UnknownField;
40
+
41
+ using UnknownFields = std::vector<UnknownField>;
42
+
43
+ enum class UnknownFieldType {
44
+ kVarint,
45
+ kLongVarint, // Over-encoded to have distinct wire format.
46
+ kDelimited,
47
+ kFixed64,
48
+ kFixed32,
49
+ kGroup,
50
+ };
51
+
52
+ union UnknownFieldValue {
53
+ uint64_t varint;
54
+ uint64_t fixed64;
55
+ uint32_t fixed32;
56
+ // NULL-terminated (strings must not have embedded NULL).
57
+ const char* delimited;
58
+ UnknownFields* group;
59
+ };
60
+
61
+ struct TypeAndValue {
62
+ UnknownFieldType type;
63
+ UnknownFieldValue value;
64
+ };
65
+
66
+ struct UnknownField {
67
+ uint32_t field_number;
68
+ TypeAndValue value;
69
+ };
70
+
71
+ TypeAndValue Varint(uint64_t val) {
72
+ TypeAndValue ret{UnknownFieldType::kVarint};
73
+ ret.value.varint = val;
74
+ return ret;
75
+ }
76
+
77
+ TypeAndValue LongVarint(uint64_t val) {
78
+ TypeAndValue ret{UnknownFieldType::kLongVarint};
79
+ ret.value.varint = val;
80
+ return ret;
81
+ }
82
+
83
+ TypeAndValue Fixed64(uint64_t val) {
84
+ TypeAndValue ret{UnknownFieldType::kFixed64};
85
+ ret.value.fixed64 = val;
86
+ return ret;
87
+ }
88
+
89
+ TypeAndValue Fixed32(uint32_t val) {
90
+ TypeAndValue ret{UnknownFieldType::kFixed32};
91
+ ret.value.fixed32 = val;
92
+ return ret;
93
+ }
94
+
95
+ TypeAndValue Delimited(const char* val) {
96
+ TypeAndValue ret{UnknownFieldType::kDelimited};
97
+ ret.value.delimited = val;
98
+ return ret;
99
+ }
100
+
101
+ TypeAndValue Group(UnknownFields nested) {
102
+ TypeAndValue ret{UnknownFieldType::kGroup};
103
+ ret.value.group = &nested;
104
+ return ret;
105
+ }
106
+
107
+ void EncodeVarint(uint64_t val, std::string* str) {
108
+ do {
109
+ char byte = val & 0x7fU;
110
+ val >>= 7;
111
+ if (val) byte |= 0x80U;
112
+ str->push_back(byte);
113
+ } while (val);
114
+ }
115
+
116
+ std::string ToBinaryPayload(const UnknownFields& fields) {
117
+ static const upb_WireType wire_types[] = {
118
+ kUpb_WireType_Varint, kUpb_WireType_Varint, kUpb_WireType_Delimited,
119
+ kUpb_WireType_64Bit, kUpb_WireType_32Bit, kUpb_WireType_StartGroup,
120
+ };
121
+ std::string ret;
122
+
123
+ for (const auto& field : fields) {
124
+ uint32_t tag = field.field_number << 3 |
125
+ (wire_types[static_cast<int>(field.value.type)]);
126
+ EncodeVarint(tag, &ret);
127
+ switch (field.value.type) {
128
+ case UnknownFieldType::kVarint:
129
+ EncodeVarint(field.value.value.varint, &ret);
130
+ break;
131
+ case UnknownFieldType::kLongVarint:
132
+ EncodeVarint(field.value.value.varint, &ret);
133
+ ret.back() |= 0x80;
134
+ ret.push_back(0);
135
+ break;
136
+ case UnknownFieldType::kDelimited:
137
+ EncodeVarint(strlen(field.value.value.delimited), &ret);
138
+ ret.append(field.value.value.delimited);
139
+ break;
140
+ case UnknownFieldType::kFixed64: {
141
+ uint64_t val = _upb_BigEndian_Swap64(field.value.value.fixed64);
142
+ ret.append(reinterpret_cast<const char*>(&val), sizeof(val));
143
+ break;
144
+ }
145
+ case UnknownFieldType::kFixed32: {
146
+ uint32_t val = _upb_BigEndian_Swap32(field.value.value.fixed32);
147
+ ret.append(reinterpret_cast<const char*>(&val), sizeof(val));
148
+ break;
149
+ }
150
+ case UnknownFieldType::kGroup: {
151
+ uint32_t end_tag = field.field_number << 3 | kUpb_WireType_EndGroup;
152
+ ret.append(ToBinaryPayload(*field.value.value.group));
153
+ EncodeVarint(end_tag, &ret);
154
+ break;
155
+ }
156
+ }
157
+ }
158
+
159
+ return ret;
160
+ }
161
+
162
+ upb_UnknownCompareResult CompareUnknownWithMaxDepth(UnknownFields uf1,
163
+ UnknownFields uf2,
164
+ int max_depth) {
165
+ std::string buf1 = ToBinaryPayload(uf1);
166
+ std::string buf2 = ToBinaryPayload(uf2);
167
+ return upb_Message_UnknownFieldsAreEqual(buf1.data(), buf1.size(),
168
+ buf2.data(), buf2.size(), max_depth);
169
+ }
170
+
171
+ upb_UnknownCompareResult CompareUnknown(UnknownFields uf1, UnknownFields uf2) {
172
+ return CompareUnknownWithMaxDepth(uf1, uf2, 64);
173
+ }
174
+
175
+ TEST(CompareTest, UnknownFieldsReflexive) {
176
+ EXPECT_EQ(kUpb_UnknownCompareResult_Equal, CompareUnknown({}, {}));
177
+ EXPECT_EQ(kUpb_UnknownCompareResult_Equal,
178
+ CompareUnknown({{1, Varint(123)}, {2, Fixed32(456)}},
179
+ {{1, Varint(123)}, {2, Fixed32(456)}}));
180
+ EXPECT_EQ(
181
+ kUpb_UnknownCompareResult_Equal,
182
+ CompareUnknown(
183
+ {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}},
184
+ {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}}));
185
+ }
186
+
187
+ TEST(CompareTest, UnknownFieldsOrdering) {
188
+ EXPECT_EQ(kUpb_UnknownCompareResult_Equal,
189
+ CompareUnknown({{1, Varint(111)},
190
+ {2, Delimited("ABC")},
191
+ {3, Fixed32(456)},
192
+ {4, Fixed64(123)},
193
+ {5, Group({})}},
194
+ {{5, Group({})},
195
+ {4, Fixed64(123)},
196
+ {3, Fixed32(456)},
197
+ {2, Delimited("ABC")},
198
+ {1, Varint(111)}}));
199
+ EXPECT_EQ(kUpb_UnknownCompareResult_NotEqual,
200
+ CompareUnknown({{1, Varint(111)},
201
+ {2, Delimited("ABC")},
202
+ {3, Fixed32(456)},
203
+ {4, Fixed64(123)},
204
+ {5, Group({})}},
205
+ {{5, Group({})},
206
+ {4, Fixed64(123)},
207
+ {3, Fixed32(455)}, // Small difference.
208
+ {2, Delimited("ABC")},
209
+ {1, Varint(111)}}));
210
+ EXPECT_EQ(kUpb_UnknownCompareResult_Equal,
211
+ CompareUnknown({{3, Fixed32(456)}, {4, Fixed64(123)}},
212
+ {{4, Fixed64(123)}, {3, Fixed32(456)}}));
213
+ EXPECT_EQ(
214
+ kUpb_UnknownCompareResult_Equal,
215
+ CompareUnknown(
216
+ {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}},
217
+ {{1, Group({{2, Group({{4, Fixed64(123)}, {3, Fixed32(456)}})}})}}));
218
+ }
219
+
220
+ TEST(CompareTest, LongVarint) {
221
+ EXPECT_EQ(kUpb_UnknownCompareResult_Equal,
222
+ CompareUnknown({{1, LongVarint(123)}, {2, LongVarint(456)}},
223
+ {{1, Varint(123)}, {2, Varint(456)}}));
224
+ EXPECT_EQ(kUpb_UnknownCompareResult_Equal,
225
+ CompareUnknown({{2, LongVarint(456)}, {1, LongVarint(123)}},
226
+ {{1, Varint(123)}, {2, Varint(456)}}));
227
+ }
228
+
229
+ TEST(CompareTest, MaxDepth) {
230
+ EXPECT_EQ(
231
+ kUpb_UnknownCompareResult_MaxDepthExceeded,
232
+ CompareUnknownWithMaxDepth(
233
+ {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}},
234
+ {{1, Group({{2, Group({{4, Fixed64(123)}, {3, Fixed32(456)}})}})}},
235
+ 2));
236
+ }