re2 1.24.0 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/LICENSE +15 -20
  2. package/README.md +63 -4
  3. package/binding.gyp +1 -2
  4. package/lib/addon.cc +9 -5
  5. package/lib/exec.cc +4 -4
  6. package/lib/match.cc +4 -4
  7. package/lib/new.cc +6 -6
  8. package/lib/pattern.cc +148 -1
  9. package/lib/replace.cc +5 -4
  10. package/lib/search.cc +1 -1
  11. package/lib/set.cc +85 -10
  12. package/lib/test.cc +1 -1
  13. package/lib/unicode_properties.h +15840 -0
  14. package/lib/wrapped_re2.h +40 -4
  15. package/lib/wrapped_re2_set.h +3 -1
  16. package/llms-full.txt +497 -0
  17. package/llms.txt +135 -0
  18. package/package.json +19 -11
  19. package/re2.d.ts +2 -0
  20. package/re2.js +1 -0
  21. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +87 -74
  22. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  23. package/vendor/abseil-cpp/FAQ.md +130 -79
  24. package/vendor/abseil-cpp/MODULE.bazel +6 -7
  25. package/vendor/abseil-cpp/absl/BUILD.bazel +6 -0
  26. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +4 -0
  27. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +4 -0
  28. package/vendor/abseil-cpp/absl/algorithm/algorithm.h +34 -2
  29. package/vendor/abseil-cpp/absl/algorithm/container.h +164 -17
  30. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +390 -13
  31. package/vendor/abseil-cpp/absl/base/BUILD.bazel +53 -6
  32. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +28 -4
  33. package/vendor/abseil-cpp/absl/base/attributes.h +61 -42
  34. package/vendor/abseil-cpp/absl/base/call_once.h +1 -0
  35. package/vendor/abseil-cpp/absl/base/casts.h +8 -1
  36. package/vendor/abseil-cpp/absl/base/casts_test.cc +3 -6
  37. package/vendor/abseil-cpp/absl/base/config.h +53 -9
  38. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +9 -9
  39. package/vendor/abseil-cpp/absl/base/fast_type_id.h +30 -2
  40. package/vendor/abseil-cpp/absl/base/fast_type_id_test.cc +3 -0
  41. package/vendor/abseil-cpp/absl/base/internal/exception_safety_testing.h +15 -12
  42. package/vendor/abseil-cpp/absl/base/internal/hardening.h +136 -0
  43. package/vendor/abseil-cpp/absl/base/internal/hardening_test.cc +168 -0
  44. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +2 -2
  45. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -0
  46. package/vendor/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
  47. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +1 -2
  48. package/vendor/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
  49. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
  50. package/vendor/abseil-cpp/absl/base/macros.h +36 -20
  51. package/vendor/abseil-cpp/absl/base/nullability.h +4 -3
  52. package/vendor/abseil-cpp/absl/base/optimization.h +3 -2
  53. package/vendor/abseil-cpp/absl/base/optimization_test.cc +4 -3
  54. package/vendor/abseil-cpp/absl/base/options.h +55 -1
  55. package/vendor/abseil-cpp/absl/base/policy_checks.h +5 -5
  56. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
  57. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
  58. package/vendor/abseil-cpp/absl/base/throw_delegate_test.cc +19 -28
  59. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -0
  60. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +2 -0
  61. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +3 -2
  62. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
  63. package/vendor/abseil-cpp/absl/container/BUILD.bazel +19 -7
  64. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +6 -5
  65. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +3 -5
  66. package/vendor/abseil-cpp/absl/container/btree_set.h +5 -5
  67. package/vendor/abseil-cpp/absl/container/btree_test.cc +11 -14
  68. package/vendor/abseil-cpp/absl/container/chunked_queue.h +8 -6
  69. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +5 -5
  70. package/vendor/abseil-cpp/absl/container/fixed_array.h +14 -13
  71. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +3 -3
  72. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +18 -6
  73. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +34 -1
  74. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +21 -7
  75. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +39 -7
  76. package/vendor/abseil-cpp/absl/container/inlined_vector.h +29 -29
  77. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +2 -2
  78. package/vendor/abseil-cpp/absl/container/internal/btree.h +32 -24
  79. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +16 -17
  80. package/vendor/abseil-cpp/absl/container/internal/common.h +6 -5
  81. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  82. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +16 -16
  83. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +13 -13
  84. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +41 -31
  85. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +2 -2
  86. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +4 -4
  87. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +3 -3
  88. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +27 -19
  89. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -2
  90. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +0 -17
  91. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +12 -30
  92. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +28 -28
  93. package/vendor/abseil-cpp/absl/container/internal/layout.h +13 -13
  94. package/vendor/abseil-cpp/absl/container/internal/layout_test.cc +3 -2
  95. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +60 -62
  96. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +59 -39
  97. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +619 -326
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +25 -2
  99. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +4 -4
  100. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +575 -159
  101. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +2 -2
  102. package/vendor/abseil-cpp/absl/container/node_hash_map.h +27 -15
  103. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +34 -0
  104. package/vendor/abseil-cpp/absl/container/node_hash_set.h +25 -11
  105. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +39 -7
  106. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +7 -4
  107. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +0 -1
  108. package/vendor/abseil-cpp/absl/crc/CMakeLists.txt +2 -3
  109. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +2 -1
  110. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +6 -6
  111. package/vendor/abseil-cpp/absl/crc/internal/crc.cc +4 -6
  112. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
  113. package/vendor/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
  114. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +143 -81
  115. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +9 -31
  116. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +3 -33
  117. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
  118. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +2 -1
  119. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +12 -2
  120. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +2 -3
  121. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +11 -0
  122. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -4
  123. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
  124. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +4 -0
  125. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +46 -36
  126. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +18 -58
  127. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +5 -48
  128. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +10 -124
  129. package/vendor/abseil-cpp/absl/debugging/symbolize.cc +20 -2
  130. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +58 -106
  131. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +37 -36
  132. package/vendor/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
  133. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -3
  134. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +1 -1
  135. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +8 -6
  136. package/vendor/abseil-cpp/absl/flags/commandlineflag_test.cc +1 -1
  137. package/vendor/abseil-cpp/absl/flags/flag_benchmark.cc +5 -5
  138. package/vendor/abseil-cpp/absl/flags/flag_test.cc +30 -30
  139. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +4 -4
  140. package/vendor/abseil-cpp/absl/flags/internal/flag.h +6 -6
  141. package/vendor/abseil-cpp/absl/flags/marshalling.h +2 -28
  142. package/vendor/abseil-cpp/absl/flags/marshalling_test.cc +12 -11
  143. package/vendor/abseil-cpp/absl/flags/reflection_test.cc +1 -1
  144. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +26 -1
  145. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +29 -1
  146. package/vendor/abseil-cpp/absl/functional/any_invocable.h +13 -14
  147. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +46 -47
  148. package/vendor/abseil-cpp/absl/functional/bind_back.h +79 -0
  149. package/vendor/abseil-cpp/absl/functional/bind_back_test.cc +237 -0
  150. package/vendor/abseil-cpp/absl/functional/bind_front.h +7 -1
  151. package/vendor/abseil-cpp/absl/functional/bind_front_test.cc +4 -4
  152. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +2 -2
  153. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +28 -28
  154. package/vendor/abseil-cpp/absl/functional/internal/back_binder.h +95 -0
  155. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
  156. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  157. package/vendor/abseil-cpp/absl/functional/overload_test.cc +13 -13
  158. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +1 -2
  159. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +1 -2
  160. package/vendor/abseil-cpp/absl/hash/hash.h +1 -1
  161. package/vendor/abseil-cpp/absl/hash/hash_test.cc +14 -20
  162. package/vendor/abseil-cpp/absl/hash/hash_testing.h +11 -9
  163. package/vendor/abseil-cpp/absl/hash/internal/city.cc +39 -51
  164. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +165 -47
  165. package/vendor/abseil-cpp/absl/hash/internal/hash.h +86 -27
  166. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +36 -1
  167. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +8 -5
  168. package/vendor/abseil-cpp/absl/log/BUILD.bazel +5 -2
  169. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +5 -3
  170. package/vendor/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
  171. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +15 -1
  172. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -4
  173. package/vendor/abseil-cpp/absl/log/internal/log_message.h +14 -0
  174. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -1
  175. package/vendor/abseil-cpp/absl/log/internal/proto.cc +13 -0
  176. package/vendor/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
  177. package/vendor/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
  178. package/vendor/abseil-cpp/absl/log/internal/structured_proto_test.cc +3 -3
  179. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +2 -2
  180. package/vendor/abseil-cpp/absl/log/internal/vlog_config_benchmark.cc +3 -3
  181. package/vendor/abseil-cpp/absl/log/log_format_test.cc +19 -2
  182. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +18 -0
  183. package/vendor/abseil-cpp/absl/log/log_streamer.h +29 -2
  184. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +18 -0
  185. package/vendor/abseil-cpp/absl/log/scoped_mock_log_test.cc +1 -1
  186. package/vendor/abseil-cpp/absl/log/vlog_is_on.h +0 -2
  187. package/vendor/abseil-cpp/absl/log/vlog_is_on_test.cc +6 -5
  188. package/vendor/abseil-cpp/absl/memory/memory.h +55 -5
  189. package/vendor/abseil-cpp/absl/memory/memory_test.cc +55 -1
  190. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  191. package/vendor/abseil-cpp/absl/meta/internal/requires.h +1 -1
  192. package/vendor/abseil-cpp/absl/meta/type_traits.h +119 -55
  193. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +7 -7
  194. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +6 -6
  195. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +3 -1
  196. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +0 -4
  197. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +32 -33
  198. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +25 -2
  199. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +8 -5
  200. package/vendor/abseil-cpp/absl/random/BUILD.bazel +13 -1
  201. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +23 -2
  202. package/vendor/abseil-cpp/absl/random/benchmarks.cc +1 -1
  203. package/vendor/abseil-cpp/absl/random/beta_distribution.h +2 -2
  204. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
  205. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +43 -0
  206. package/vendor/abseil-cpp/absl/random/discrete_distribution.h +1 -1
  207. package/vendor/abseil-cpp/absl/random/distributions.h +17 -17
  208. package/vendor/abseil-cpp/absl/random/distributions_test.cc +4 -4
  209. package/vendor/abseil-cpp/absl/random/exponential_distribution.h +1 -1
  210. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +4 -2
  211. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
  212. package/vendor/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
  213. package/vendor/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  214. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
  215. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc +3 -2
  216. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +14 -40
  217. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
  218. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +2 -2
  219. package/vendor/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
  220. package/vendor/abseil-cpp/absl/random/internal/pcg_engine_test.cc +3 -2
  221. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
  222. package/vendor/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
  223. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +3 -2
  224. package/vendor/abseil-cpp/absl/random/internal/randen_test.cc +3 -2
  225. package/vendor/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
  226. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +4 -4
  227. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +2 -1
  228. package/vendor/abseil-cpp/absl/random/internal/traits.h +21 -0
  229. package/vendor/abseil-cpp/absl/random/internal/traits_test.cc +5 -0
  230. package/vendor/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
  231. package/vendor/abseil-cpp/absl/random/internal/uniform_helper_test.cc +2 -1
  232. package/vendor/abseil-cpp/absl/random/mocking_access.h +74 -0
  233. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +9 -19
  234. package/vendor/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  235. package/vendor/abseil-cpp/absl/status/BUILD.bazel +81 -0
  236. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +91 -0
  237. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
  238. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +26 -2
  239. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +22 -8
  240. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +43 -43
  241. package/vendor/abseil-cpp/absl/status/status.cc +62 -70
  242. package/vendor/abseil-cpp/absl/status/status.h +249 -23
  243. package/vendor/abseil-cpp/absl/status/status_benchmark.cc +12 -0
  244. package/vendor/abseil-cpp/absl/status/status_builder.cc +196 -0
  245. package/vendor/abseil-cpp/absl/status/status_builder.h +978 -0
  246. package/vendor/abseil-cpp/absl/status/status_builder_test.cc +380 -0
  247. package/vendor/abseil-cpp/absl/status/status_macros.h +484 -0
  248. package/vendor/abseil-cpp/absl/status/status_macros_test.cc +634 -0
  249. package/vendor/abseil-cpp/absl/status/status_matchers.h +2 -1
  250. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +3 -4
  251. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  252. package/vendor/abseil-cpp/absl/status/status_test.cc +443 -13
  253. package/vendor/abseil-cpp/absl/status/statusor.h +69 -36
  254. package/vendor/abseil-cpp/absl/status/statusor_test.cc +132 -35
  255. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +42 -7
  256. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +33 -4
  257. package/vendor/abseil-cpp/absl/strings/ascii.h +1 -2
  258. package/vendor/abseil-cpp/absl/strings/atod_manual_test.cc +5 -5
  259. package/vendor/abseil-cpp/absl/strings/cord.cc +26 -7
  260. package/vendor/abseil-cpp/absl/strings/cord.h +23 -13
  261. package/vendor/abseil-cpp/absl/strings/cord_buffer.h +4 -2
  262. package/vendor/abseil-cpp/absl/strings/cord_test.cc +85 -9
  263. package/vendor/abseil-cpp/absl/strings/escaping.cc +183 -35
  264. package/vendor/abseil-cpp/absl/strings/escaping.h +12 -2
  265. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +1 -3
  266. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +22 -18
  267. package/vendor/abseil-cpp/absl/strings/has_absl_stringify_test.cc +2 -2
  268. package/vendor/abseil-cpp/absl/strings/has_ostream_operator_test.cc +2 -2
  269. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +10 -10
  270. package/vendor/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc +1 -1
  271. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
  272. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
  273. package/vendor/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
  274. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +2 -26
  275. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +23 -2
  276. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +6 -2
  277. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -24
  278. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized_test.cc +16 -41
  279. package/vendor/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
  280. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
  281. package/vendor/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
  282. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +12 -20
  283. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +510 -307
  284. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +0 -1
  285. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +9 -10
  286. package/vendor/abseil-cpp/absl/strings/internal/string_constant_test.cc +6 -5
  287. package/vendor/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
  288. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream.h +119 -0
  289. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream_test.cc +111 -0
  290. package/vendor/abseil-cpp/absl/strings/numbers.cc +406 -0
  291. package/vendor/abseil-cpp/absl/strings/numbers.h +4 -0
  292. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +33 -0
  293. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +10 -6
  294. package/vendor/abseil-cpp/absl/strings/str_cat.h +36 -1
  295. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +1 -2
  296. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +28 -0
  297. package/vendor/abseil-cpp/absl/strings/str_join_test.cc +4 -4
  298. package/vendor/abseil-cpp/absl/strings/str_split.h +11 -6
  299. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +13 -0
  300. package/vendor/abseil-cpp/absl/strings/substitute.h +2 -2
  301. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +3 -0
  302. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +21 -0
  303. package/vendor/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
  304. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +13 -0
  305. package/vendor/abseil-cpp/absl/synchronization/mutex.h +32 -2
  306. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +17 -3
  307. package/vendor/abseil-cpp/absl/time/BUILD.bazel +80 -0
  308. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +73 -0
  309. package/vendor/abseil-cpp/absl/time/clock.h +3 -0
  310. package/vendor/abseil-cpp/absl/time/clock_interface.cc +71 -0
  311. package/vendor/abseil-cpp/absl/time/clock_interface.h +93 -0
  312. package/vendor/abseil-cpp/absl/time/clock_interface_test.cc +128 -0
  313. package/vendor/abseil-cpp/absl/time/format.cc +3 -10
  314. package/vendor/abseil-cpp/absl/time/format_test.cc +12 -0
  315. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +90 -89
  316. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +80 -5
  317. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +1 -2
  318. package/vendor/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
  319. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  320. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver +0 -0
  321. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
  322. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh +0 -0
  323. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon +0 -0
  324. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi +0 -0
  325. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane +0 -0
  326. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific +0 -0
  327. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau +0 -0
  328. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol +0 -0
  329. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +1 -1
  330. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +3 -3
  331. package/vendor/abseil-cpp/absl/time/simulated_clock.cc +225 -0
  332. package/vendor/abseil-cpp/absl/time/simulated_clock.h +109 -0
  333. package/vendor/abseil-cpp/absl/time/simulated_clock_test.cc +614 -0
  334. package/vendor/abseil-cpp/absl/types/BUILD.bazel +116 -0
  335. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +100 -0
  336. package/vendor/abseil-cpp/absl/types/any.h +26 -4
  337. package/vendor/abseil-cpp/absl/types/any_span.h +1067 -0
  338. package/vendor/abseil-cpp/absl/types/any_span_benchmark.cc +258 -0
  339. package/vendor/abseil-cpp/absl/types/any_span_test.cc +1210 -0
  340. package/vendor/abseil-cpp/absl/types/compare.h +4 -4
  341. package/vendor/abseil-cpp/absl/types/internal/any_span.h +477 -0
  342. package/vendor/abseil-cpp/absl/types/internal/span.h +5 -6
  343. package/vendor/abseil-cpp/absl/types/optional.h +30 -3
  344. package/vendor/abseil-cpp/absl/types/optional_ref.h +295 -0
  345. package/vendor/abseil-cpp/absl/types/optional_ref_test.cc +370 -0
  346. package/vendor/abseil-cpp/absl/types/source_location.cc +18 -0
  347. package/vendor/abseil-cpp/absl/types/source_location.h +172 -0
  348. package/vendor/abseil-cpp/absl/types/source_location_test.cc +139 -0
  349. package/vendor/abseil-cpp/absl/types/span.h +19 -23
  350. package/vendor/abseil-cpp/absl/types/variant.h +75 -18
  351. package/vendor/abseil-cpp/absl/types/variant_test.cc +23 -23
  352. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -0
  353. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +1 -0
  354. package/vendor/abseil-cpp/absl/utility/utility.h +99 -16
  355. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -0
  356. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +10 -4
  357. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +13 -6
  358. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +10 -4
  359. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +12 -5
  360. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +9 -2
  361. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  362. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +10 -3
  363. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +8 -2
  364. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +4 -3
  365. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +2 -2
  366. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -1
  367. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -1
  368. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +0 -118
  369. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +0 -71
  370. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +0 -97
@@ -0,0 +1,614 @@
1
+ // Copyright 2026 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/time/simulated_clock.h"
16
+
17
+ #include <cstddef>
18
+ #include <cstdint>
19
+ #include <memory>
20
+ #include <thread> // NOLINT(build/c++11)
21
+ #include <vector>
22
+
23
+ #include "gmock/gmock.h"
24
+ #include "gtest/gtest.h"
25
+ #include "absl/base/internal/raw_logging.h"
26
+ #include "absl/base/thread_annotations.h"
27
+ #include "absl/random/random.h"
28
+ #include "absl/synchronization/blocking_counter.h"
29
+ #include "absl/synchronization/mutex.h"
30
+ #include "absl/synchronization/notification.h"
31
+ #include "absl/time/clock.h"
32
+ #include "absl/time/clock_interface.h"
33
+ #include "absl/time/time.h"
34
+
35
+ namespace {
36
+
37
+ constexpr absl::Duration kShortPause = absl::Milliseconds(20);
38
+ constexpr absl::Duration kLongPause = absl::Milliseconds(1000);
39
+
40
+ #ifdef _MSC_VER
41
+ // As of 2026-01-29, multithreaded tests on MSVC are too flaky.
42
+ const char* kSkipFlakyReason =
43
+ "Skipping this timing test because it is too flaky";
44
+ #else
45
+ const char* kSkipFlakyReason = nullptr;
46
+ #endif
47
+
48
+ TEST(SimulatedClock, TimeInitializedToZero) {
49
+ absl::SimulatedClock simclock;
50
+ EXPECT_EQ(absl::UnixEpoch(), simclock.TimeNow());
51
+ }
52
+
53
+ TEST(SimulatedClock, NowSetTime) {
54
+ absl::SimulatedClock simclock;
55
+ absl::Time now = simclock.TimeNow();
56
+
57
+ now += absl::Seconds(123);
58
+ simclock.SetTime(now);
59
+ EXPECT_EQ(now, simclock.TimeNow());
60
+
61
+ now += absl::Seconds(123);
62
+ simclock.SetTime(now);
63
+ EXPECT_EQ(now, simclock.TimeNow());
64
+
65
+ now += absl::ZeroDuration();
66
+ simclock.SetTime(now);
67
+ EXPECT_EQ(now, simclock.TimeNow());
68
+ }
69
+
70
+ TEST(SimulatedClock, NowAdvanceTime) {
71
+ absl::SimulatedClock simclock;
72
+ absl::Time now = simclock.TimeNow();
73
+
74
+ simclock.AdvanceTime(absl::Seconds(123));
75
+ now += absl::Seconds(123);
76
+ EXPECT_EQ(now, simclock.TimeNow());
77
+
78
+ simclock.AdvanceTime(absl::Seconds(123));
79
+ now += absl::Seconds(123);
80
+ EXPECT_EQ(now, simclock.TimeNow());
81
+
82
+ simclock.AdvanceTime(absl::ZeroDuration());
83
+ now += absl::ZeroDuration();
84
+ EXPECT_EQ(now, simclock.TimeNow());
85
+ }
86
+
87
+ void SleepAndNotify(absl::Clock* clock, absl::Duration sleep_secs,
88
+ absl::Notification* note) {
89
+ clock->Sleep(sleep_secs);
90
+ note->Notify();
91
+ }
92
+
93
+ TEST(SimulatedClock, Sleep_SetToSleepTime) {
94
+ if (kSkipFlakyReason != nullptr) {
95
+ GTEST_SKIP() << kSkipFlakyReason;
96
+ }
97
+
98
+ absl::SimulatedClock simclock;
99
+ absl::Notification note;
100
+
101
+ std::thread tr(SleepAndNotify, &simclock, absl::Seconds(123), &note);
102
+
103
+ // wait for SleepAndNotify() to block
104
+ absl::SleepFor(kLongPause);
105
+ simclock.SetTime(absl::FromUnixSeconds(122));
106
+ // give Sleep() the opportunity to fail
107
+ absl::SleepFor(kShortPause);
108
+ EXPECT_FALSE(note.HasBeenNotified());
109
+ simclock.SetTime(absl::FromUnixSeconds(122 + 1));
110
+ // wait for Sleep() to return
111
+ absl::SleepFor(kLongPause);
112
+ EXPECT_TRUE(note.HasBeenNotified());
113
+ note.WaitForNotification(); // in case the expectation fails
114
+ tr.join();
115
+ }
116
+
117
+ TEST(SimulatedClock, SleepAdvanceToSleepTime) {
118
+ if (kSkipFlakyReason != nullptr) {
119
+ GTEST_SKIP() << kSkipFlakyReason;
120
+ }
121
+
122
+ absl::SimulatedClock simclock;
123
+ absl::Notification note;
124
+
125
+ std::thread tr(SleepAndNotify, &simclock, absl::Seconds(123), &note);
126
+ // wait for SleepAndNotify() to block
127
+ absl::SleepFor(kLongPause);
128
+ simclock.AdvanceTime(absl::Seconds(122));
129
+ // give Sleep() the opportunity to fail
130
+ absl::SleepFor(kShortPause);
131
+ EXPECT_FALSE(note.HasBeenNotified());
132
+ simclock.AdvanceTime(absl::Seconds(1));
133
+ // wait for Sleep() to return
134
+ absl::SleepFor(kLongPause);
135
+ EXPECT_TRUE(note.HasBeenNotified());
136
+ note.WaitForNotification(); // in case the expectation fails
137
+ tr.join();
138
+ }
139
+
140
+ TEST(SimulatedClock, SleepSetPastSleepTime) {
141
+ if (kSkipFlakyReason != nullptr) {
142
+ GTEST_SKIP() << kSkipFlakyReason;
143
+ }
144
+
145
+ absl::SimulatedClock simclock;
146
+ absl::Notification note;
147
+
148
+ std::thread tr(SleepAndNotify, &simclock, absl::Seconds(123), &note);
149
+ // wait for SleepAndNotify() to block
150
+ absl::SleepFor(kLongPause);
151
+ simclock.SetTime(absl::FromUnixSeconds(122));
152
+ // give Sleep() the opportunity to fail
153
+ absl::SleepFor(kShortPause);
154
+ EXPECT_FALSE(note.HasBeenNotified());
155
+ simclock.SetTime(absl::FromUnixSeconds(122 + 2));
156
+ // wait for Sleep() to return
157
+ absl::SleepFor(kLongPause);
158
+ EXPECT_TRUE(note.HasBeenNotified());
159
+ note.WaitForNotification(); // in case the expectation fails
160
+ tr.join();
161
+ }
162
+
163
+ TEST(SimulatedClock, SleepAdvancePastSleepTime) {
164
+ if (kSkipFlakyReason != nullptr) {
165
+ GTEST_SKIP() << kSkipFlakyReason;
166
+ }
167
+
168
+ absl::SimulatedClock simclock;
169
+ absl::Notification note;
170
+
171
+ std::thread tr(SleepAndNotify, &simclock, absl::Seconds(123), &note);
172
+ // wait for SleepAndNotify() to block
173
+ absl::SleepFor(kLongPause);
174
+ simclock.AdvanceTime(absl::Seconds(122));
175
+ // give Sleep() the opportunity to fail
176
+ absl::SleepFor(kShortPause);
177
+ EXPECT_FALSE(note.HasBeenNotified());
178
+ simclock.AdvanceTime(absl::Seconds(2));
179
+ // wait for Sleep() to return
180
+ absl::SleepFor(kLongPause);
181
+ EXPECT_TRUE(note.HasBeenNotified());
182
+ note.WaitForNotification(); // in case the expectation fails
183
+ tr.join();
184
+ }
185
+
186
+ TEST(SimulatedClock, SleepZeroSleepTime) {
187
+ if (kSkipFlakyReason != nullptr) {
188
+ GTEST_SKIP() << kSkipFlakyReason;
189
+ }
190
+
191
+ absl::SimulatedClock simclock;
192
+ absl::Notification note;
193
+
194
+ std::thread tr(SleepAndNotify, &simclock, absl::ZeroDuration(), &note);
195
+ // wait for SleepAndNotify() to ping note
196
+ absl::SleepFor(kLongPause);
197
+ EXPECT_TRUE(note.HasBeenNotified());
198
+ note.WaitForNotification(); // in case the expectation fails
199
+ tr.join();
200
+ }
201
+
202
+ void SleepUntilAndNotify(absl::Clock* clock, absl::Time wakeup_time,
203
+ absl::Notification* note) {
204
+ clock->SleepUntil(wakeup_time);
205
+ note->Notify();
206
+ }
207
+
208
+ TEST(SimulatedClock, SleepUntilSetToSleepTime) {
209
+ if (kSkipFlakyReason != nullptr) {
210
+ GTEST_SKIP() << kSkipFlakyReason;
211
+ }
212
+
213
+ absl::SimulatedClock simclock;
214
+ absl::Notification note;
215
+
216
+ simclock.SetTime(absl::FromUnixSeconds(123));
217
+ std::thread tr(SleepUntilAndNotify, &simclock,
218
+ absl::UnixEpoch() + absl::Seconds(246), &note);
219
+ // wait for SleepUntilAndNotify() to block
220
+ absl::SleepFor(kLongPause);
221
+ simclock.SetTime(absl::FromUnixSeconds(123 + 122));
222
+ // give SleepUntil() the opportunity to fail
223
+ absl::SleepFor(kShortPause);
224
+ EXPECT_FALSE(note.HasBeenNotified());
225
+ simclock.SetTime(absl::FromUnixSeconds(123 + 122 + 1));
226
+ absl::Time start = absl::Now();
227
+ note.WaitForNotification(); // SleepUntilAndNotify() should ping note
228
+ EXPECT_GE(absl::Milliseconds(50), absl::Now() - start);
229
+ tr.join();
230
+ }
231
+
232
+ TEST(SimulatedClock, SleepUntilAdvanceToSleepTime) {
233
+ if (kSkipFlakyReason != nullptr) {
234
+ GTEST_SKIP() << kSkipFlakyReason;
235
+ }
236
+
237
+ absl::SimulatedClock simclock;
238
+ absl::Notification note;
239
+
240
+ simclock.AdvanceTime(absl::Seconds(123));
241
+ std::thread tr(SleepUntilAndNotify, &simclock,
242
+ absl::UnixEpoch() + absl::Seconds(246), &note);
243
+ // wait for SleepUntilAndNotify() to block
244
+ absl::SleepFor(kLongPause);
245
+ simclock.AdvanceTime(absl::Seconds(122));
246
+ // give SleepUntil() the opportunity to fail
247
+ absl::SleepFor(kShortPause);
248
+ EXPECT_FALSE(note.HasBeenNotified());
249
+ simclock.AdvanceTime(absl::Seconds(1));
250
+ absl::Time start = absl::Now();
251
+ note.WaitForNotification(); // SleepUntilAndNotify() should ping note
252
+ EXPECT_GE(absl::Milliseconds(70), absl::Now() - start);
253
+ tr.join();
254
+ }
255
+
256
+ TEST(SimulatedClock, SleepUntilSetPastSleepTime) {
257
+ if (kSkipFlakyReason != nullptr) {
258
+ GTEST_SKIP() << kSkipFlakyReason;
259
+ }
260
+
261
+ absl::SimulatedClock simclock;
262
+ absl::Notification note;
263
+
264
+ simclock.SetTime(absl::FromUnixSeconds(123));
265
+ std::thread tr(SleepUntilAndNotify, &simclock,
266
+ absl::UnixEpoch() + absl::Seconds(246), &note);
267
+ // wait for SleepUntilAndNotify() to block
268
+ absl::SleepFor(kLongPause);
269
+ simclock.SetTime(absl::FromUnixSeconds(123 + 122));
270
+ // give SleepUntil() the opportunity to fail
271
+ absl::SleepFor(kShortPause);
272
+ EXPECT_FALSE(note.HasBeenNotified());
273
+ simclock.SetTime(absl::FromUnixSeconds(123 + 122 + 2));
274
+ // wait for SleepUntilAndNotify() to ping note
275
+ absl::SleepFor(kLongPause);
276
+ EXPECT_TRUE(note.HasBeenNotified());
277
+ note.WaitForNotification(); // in case the expectation fails
278
+ tr.join();
279
+ }
280
+
281
+ TEST(SimulatedClock, SleepUntilAdvancePastSleepTime) {
282
+ if (kSkipFlakyReason != nullptr) {
283
+ GTEST_SKIP() << kSkipFlakyReason;
284
+ }
285
+
286
+ absl::SimulatedClock simclock;
287
+ absl::Notification note;
288
+
289
+ simclock.AdvanceTime(absl::Seconds(123));
290
+ std::thread tr(SleepUntilAndNotify, &simclock,
291
+ absl::UnixEpoch() + absl::Seconds(246), &note);
292
+ // wait for SleepUntilAndNotify() to block
293
+ absl::SleepFor(kLongPause);
294
+ simclock.AdvanceTime(absl::Seconds(122));
295
+ // give SleepUntil() the opportunity to fail
296
+ absl::SleepFor(kShortPause);
297
+ EXPECT_FALSE(note.HasBeenNotified());
298
+ simclock.AdvanceTime(absl::Seconds(2));
299
+ // wait for SleepUntilAndNotify() to ping note
300
+ absl::SleepFor(kLongPause);
301
+ EXPECT_TRUE(note.HasBeenNotified());
302
+ note.WaitForNotification(); // in case the expectation fails
303
+ tr.join();
304
+ }
305
+
306
+ TEST(SimulatedClock, SleepUntilTimeAlreadyPassed) {
307
+ if (kSkipFlakyReason != nullptr) {
308
+ GTEST_SKIP() << kSkipFlakyReason;
309
+ }
310
+
311
+ absl::SimulatedClock simclock;
312
+ absl::Notification note;
313
+
314
+ simclock.AdvanceTime(absl::Seconds(123));
315
+ std::thread tr(SleepUntilAndNotify, &simclock,
316
+ absl::UnixEpoch() + absl::Seconds(123), &note);
317
+ // wait for SleepUntilAndNotify() to ping note
318
+ absl::SleepFor(kLongPause);
319
+ EXPECT_TRUE(note.HasBeenNotified());
320
+ note.WaitForNotification(); // in case the expectation fails
321
+ tr.join();
322
+ }
323
+
324
+ void AwaitWithDeadlineAndNotify(absl::Clock* clock, absl::Mutex* mu,
325
+ absl::Condition* cond, absl::Time wakeup_time,
326
+ absl::Notification* note, bool* return_val) {
327
+ mu->lock_shared();
328
+ *return_val = clock->AwaitWithDeadline(mu, *cond, wakeup_time);
329
+ mu->unlock_shared();
330
+ note->Notify();
331
+ }
332
+
333
+ TEST(SimulatedClock, AwaitWithDeadlineConditionInitiallyTrue) {
334
+ absl::SimulatedClock simclock;
335
+ absl::Mutex mu;
336
+ bool f = true;
337
+ absl::Condition cond(&f);
338
+ absl::MutexLock lock(mu);
339
+ ASSERT_TRUE(simclock.AwaitWithDeadline(&mu, cond, absl::InfiniteFuture()));
340
+ }
341
+
342
+ TEST(SimulatedClock, AwaitWithDeadlineConditionInitiallyFalse) {
343
+ if (kSkipFlakyReason != nullptr) {
344
+ GTEST_SKIP() << kSkipFlakyReason;
345
+ }
346
+
347
+ absl::SimulatedClock simclock;
348
+ absl::Mutex mu;
349
+ bool f = false;
350
+ absl::Condition cond(&f);
351
+ absl::Notification note;
352
+ bool return_val;
353
+
354
+ std::thread tr(AwaitWithDeadlineAndNotify, &simclock, &mu, &cond,
355
+ absl::UnixEpoch() + absl::Seconds(123), &note, &return_val);
356
+ // wait for AwaitWithDeadline...() to block
357
+ absl::SleepFor(kShortPause);
358
+ EXPECT_FALSE(note.HasBeenNotified());
359
+ mu.lock();
360
+ f = true;
361
+ mu.unlock();
362
+ // wait for AwaitWithDeadline...() to ping note
363
+ absl::SleepFor(kLongPause);
364
+ EXPECT_TRUE(note.HasBeenNotified());
365
+ EXPECT_TRUE(return_val);
366
+ note.WaitForNotification(); // in case the expectation fails
367
+ tr.join();
368
+ }
369
+
370
+ TEST(SimulatedClock, AwaitWithDeadlineDeadlinePassed) {
371
+ if (kSkipFlakyReason != nullptr) {
372
+ GTEST_SKIP() << kSkipFlakyReason;
373
+ }
374
+
375
+ absl::SimulatedClock simclock;
376
+ absl::Mutex mu;
377
+ bool f = false;
378
+ absl::Condition cond(&f);
379
+ absl::Notification note;
380
+ bool return_val;
381
+
382
+ std::thread tr(AwaitWithDeadlineAndNotify, &simclock, &mu, &cond,
383
+ absl::UnixEpoch() + absl::Seconds(123), &note, &return_val);
384
+ // wait for AwaitWithDeadline...() to block
385
+ absl::SleepFor(kLongPause);
386
+ EXPECT_FALSE(note.HasBeenNotified());
387
+ simclock.AdvanceTime(absl::Seconds(124));
388
+ // wait for AwaitWithDeadline...() to ping note
389
+ absl::SleepFor(kLongPause);
390
+ EXPECT_TRUE(note.HasBeenNotified());
391
+ EXPECT_FALSE(return_val);
392
+ note.WaitForNotification(); // in case the expectation fails
393
+ tr.join();
394
+ }
395
+
396
+ TEST(SimulatedClock, AwaitWithDeadlineDeadlineAlreadyPassed) {
397
+ if (kSkipFlakyReason != nullptr) {
398
+ GTEST_SKIP() << kSkipFlakyReason;
399
+ }
400
+
401
+ absl::SimulatedClock simclock;
402
+ absl::Mutex mu;
403
+ bool f = false;
404
+ absl::Condition cond(&f);
405
+ absl::Notification note;
406
+ bool return_val;
407
+
408
+ std::thread tr(AwaitWithDeadlineAndNotify, &simclock, &mu, &cond,
409
+ absl::UnixEpoch(), &note, &return_val);
410
+ // wait for AwaitWithDeadline...() to ping note
411
+ absl::SleepFor(kLongPause);
412
+ EXPECT_TRUE(note.HasBeenNotified());
413
+ EXPECT_FALSE(return_val);
414
+ note.WaitForNotification(); // in case the expectation fails
415
+ tr.join();
416
+ }
417
+
418
+ void RacerMakesConditionTrue(absl::Notification* start_note, absl::Mutex* mu,
419
+ bool* f, absl::BlockingCounter* threads_done) {
420
+ start_note->WaitForNotification();
421
+ absl::SleepFor(absl::Milliseconds(1));
422
+ mu->lock();
423
+ *f = true;
424
+ mu->unlock();
425
+ threads_done->DecrementCount();
426
+ }
427
+
428
+ void RacerAdvancesTime(absl::Notification* start_note,
429
+ absl::SimulatedClock* simclock, absl::Duration d,
430
+ absl::BlockingCounter* threads_done) {
431
+ start_note->WaitForNotification();
432
+ absl::SleepFor(absl::Milliseconds(1));
433
+ simclock->AdvanceTime(d);
434
+ threads_done->DecrementCount();
435
+ }
436
+
437
+ TEST(SimulatedClock, SimultaneousConditionTrueAndDeadline) {
438
+ absl::SimulatedClock simclock;
439
+ for (int iteration = 0; iteration < 100; ++iteration) {
440
+ auto mu = std::make_unique<absl::Mutex>();
441
+ bool f = false;
442
+ absl::Condition cond(&f);
443
+ absl::Notification note_start;
444
+ absl::BlockingCounter threads_done(2);
445
+ std::thread tr1(RacerMakesConditionTrue, &note_start, mu.get(), &f,
446
+ &threads_done);
447
+ std::thread tr2(RacerAdvancesTime, &note_start, &simclock,
448
+ absl::Seconds(20), &threads_done);
449
+ note_start.Notify();
450
+ mu->lock();
451
+ absl::Time deadline = simclock.TimeNow() + absl::Seconds(10);
452
+ simclock.AwaitWithDeadline(mu.get(), cond, deadline);
453
+ EXPECT_TRUE(f || (simclock.TimeNow() >= deadline));
454
+ if (f) {
455
+ // RacerMakesConditionTrue has unlocked mu and AwaitWithDeadline has
456
+ // returned, so it is safe to destruct mu. Do so while RacerAdvancesTime
457
+ // is possibly still running in an attempt to catch simclock holding on
458
+ // to a reference to mu and using it after AwaitWithDeadline returns.
459
+ mu->unlock();
460
+ mu = nullptr;
461
+ } else {
462
+ mu->unlock();
463
+ }
464
+ threads_done.Wait();
465
+ tr1.join();
466
+ tr2.join();
467
+ }
468
+ }
469
+
470
+ void RacerDeletesClock(absl::Mutex* mu, absl::Notification* start_note,
471
+ absl::Clock* clock,
472
+ absl::BlockingCounter* threads_done) {
473
+ start_note->WaitForNotification();
474
+ // mu is acquired temporarily to make sure that AwaitWithDeadline() in
475
+ // SimultaneousConditionTrueAndDestruction has blocked.
476
+ mu->lock();
477
+ mu->unlock();
478
+ absl::SleepFor(absl::Milliseconds(1));
479
+ delete clock;
480
+ threads_done->DecrementCount();
481
+ }
482
+
483
+ TEST(SimulatedClock, SimultaneousConditionTrueAndDestruction) {
484
+ for (int iteration = 0; iteration < 100; ++iteration) {
485
+ absl::Clock* clock = new absl::SimulatedClock();
486
+ absl::Mutex mu;
487
+ bool f = false;
488
+ absl::Condition cond(&f);
489
+ absl::Notification note_start;
490
+ absl::BlockingCounter threads_done(2);
491
+ std::thread tr1([&note_start, &mu, &f, &threads_done] {
492
+ RacerMakesConditionTrue(&note_start, &mu, &f, &threads_done);
493
+ });
494
+ std::thread tr2([&mu, &note_start, clock, &threads_done] {
495
+ RacerDeletesClock(&mu, &note_start, clock, &threads_done);
496
+ });
497
+ mu.lock();
498
+ note_start.Notify();
499
+ absl::Time deadline = absl::UnixEpoch() + absl::Seconds(100000);
500
+ clock->AwaitWithDeadline(&mu, cond, deadline);
501
+ mu.unlock();
502
+ threads_done.Wait();
503
+ tr1.join();
504
+ tr2.join();
505
+ }
506
+ }
507
+
508
+ class SimulatedClockTorturer {
509
+ public:
510
+ SimulatedClockTorturer(absl::SimulatedClock* simclock, int num_threads,
511
+ int num_iterations)
512
+ : simclock_(simclock),
513
+ num_threads_(num_threads),
514
+ num_iterations_(num_iterations),
515
+ num_flags_(2 * num_threads),
516
+ mutex_and_flag_(static_cast<size_t>(num_flags_)) {}
517
+
518
+ // Implements a torture test.
519
+ //
520
+ // This method uses several groups of:
521
+ // SimulatedClock
522
+ // Mutex protected flag
523
+ // It starts several threads that call AwaitWithDeadline() and several
524
+ // threads that call AdvanceTime() or toggle flag values.
525
+ void DoTorture() {
526
+ // The threads calling AwaitWithDeadline() have a separate BlockingCounter
527
+ // than the threads calling AdvanceTime()/toggling flags, since the former
528
+ // would be deadlocked if all the threads that might unblock them had
529
+ // already finished.
530
+ absl::Notification go;
531
+ absl::BlockingCounter await_threads_done(num_threads_);
532
+ absl::Notification signal_threads_should_exit;
533
+ absl::BlockingCounter signal_threads_done(num_threads_);
534
+ std::vector<std::thread> trs;
535
+ for (int i = 0; i < num_threads_; ++i) {
536
+ trs.emplace_back(&SimulatedClockTorturer::AwaitRandomly, this, &go,
537
+ &await_threads_done);
538
+ }
539
+ for (int i = 0; i < num_threads_; ++i) {
540
+ trs.emplace_back(&SimulatedClockTorturer::SignalRandomly, this, &go,
541
+ &signal_threads_should_exit, &signal_threads_done);
542
+ }
543
+ go.Notify();
544
+ await_threads_done.Wait();
545
+ signal_threads_should_exit.Notify();
546
+ signal_threads_done.Wait();
547
+ for (auto& thread : trs) {
548
+ thread.join();
549
+ }
550
+ }
551
+
552
+ private:
553
+ // Randomly call AwaitWithDeadline() for num_iterations_ times.
554
+ void AwaitRandomly(absl::Notification* go,
555
+ absl::BlockingCounter* threads_done) {
556
+ go->WaitForNotification();
557
+
558
+ absl::BitGen gen;
559
+ for (int i = 0; i < num_iterations_; ++i) {
560
+ auto& [mu, f] = mutex_and_flag_[absl::Uniform<size_t>(gen, size_t{0},
561
+ static_cast<size_t>(num_flags_))];
562
+ absl::MutexLock lock(mu);
563
+ absl::Time deadline = simclock_->TimeNow() + absl::Seconds(1);
564
+ simclock_->AwaitWithDeadline(&mu, absl::Condition(&f), deadline);
565
+ ABSL_RAW_CHECK(f || simclock_->TimeNow() >= deadline, "");
566
+ }
567
+
568
+ threads_done->DecrementCount();
569
+ }
570
+
571
+ // Randomly call AdvanceTime() or toggle a flag value until notified to
572
+ // stop.
573
+ void SignalRandomly(absl::Notification* go, absl::Notification* should_exit,
574
+ absl::BlockingCounter* threads_done) {
575
+ go->WaitForNotification();
576
+
577
+ absl::BitGen gen;
578
+ while (!should_exit->HasBeenNotified()) {
579
+ int action = absl::Uniform<int>(gen, 0, num_flags_ + 1);
580
+ if (action < num_flags_) {
581
+ // Change a flag value.
582
+ auto& [mutex, flag] = mutex_and_flag_[static_cast<size_t>(action)];
583
+ absl::MutexLock lock(mutex);
584
+ flag = !flag;
585
+ } else {
586
+ // Advance time.
587
+ simclock_->AdvanceTime(absl::Seconds(1));
588
+ }
589
+ }
590
+
591
+ threads_done->DecrementCount();
592
+ }
593
+
594
+ absl::SimulatedClock* simclock_;
595
+ int num_threads_;
596
+ int num_iterations_;
597
+ int num_flags_;
598
+
599
+ struct MutexAndFlag {
600
+ absl::Mutex mutex;
601
+ bool flag ABSL_GUARDED_BY(mutex) = false;
602
+ };
603
+ std::vector<MutexAndFlag> mutex_and_flag_;
604
+ };
605
+
606
+ TEST(SimulatedClock, Torture) {
607
+ absl::SimulatedClock simclock;
608
+ constexpr int kNumThreads = 10;
609
+ constexpr int kNumIterations = 1000;
610
+ SimulatedClockTorturer torturer(&simclock, kNumThreads, kNumIterations);
611
+ torturer.DoTorture();
612
+ }
613
+
614
+ } // namespace