couchbase 3.8.2 → 3.9.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 (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/CMakeLists.txt +16 -1
  4. data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
  5. data/ext/cache/extconf_include.rb +6 -6
  6. data/ext/cache/mozilla-ca-bundle.crt +121 -55
  7. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  8. data/ext/couchbase/CMakeLists.txt +130 -21
  9. data/ext/couchbase/cmake/APKBUILD.in +25 -4
  10. data/ext/couchbase/cmake/Bundler.cmake +143 -34
  11. data/ext/couchbase/cmake/CPM.cmake +126 -12
  12. data/ext/couchbase/cmake/Cache.cmake +7 -1
  13. data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
  14. data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
  15. data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
  16. data/ext/couchbase/cmake/OpenSSL.cmake +10 -3
  17. data/ext/couchbase/cmake/Packaging.cmake +519 -65
  18. data/ext/couchbase/cmake/Protostellar.cmake +250 -0
  19. data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
  20. data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
  21. data/ext/couchbase/cmake/TestFramework.cmake +283 -0
  22. data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
  23. data/ext/couchbase/cmake/Testing.cmake +27 -9
  24. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
  25. data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
  26. data/ext/couchbase/cmake/build_config.hxx.in +2 -1
  27. data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
  28. data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
  29. data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
  30. data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
  31. data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
  32. data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
  33. data/ext/couchbase/cmake/tarball_glob.txt +49 -0
  34. data/ext/couchbase/core/agent_group.cxx +0 -8
  35. data/ext/couchbase/core/agent_group.hxx +0 -4
  36. data/ext/couchbase/core/analytics_stream.cxx +314 -0
  37. data/ext/couchbase/core/analytics_stream.hxx +129 -0
  38. data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
  39. data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
  40. data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
  41. data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
  42. data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
  43. data/ext/couchbase/core/bucket.cxx +381 -87
  44. data/ext/couchbase/core/bucket.hxx +105 -25
  45. data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
  46. data/ext/couchbase/core/capella.hxx +91 -0
  47. data/ext/couchbase/core/cluster.cxx +1554 -398
  48. data/ext/couchbase/core/cluster.hxx +39 -8
  49. data/ext/couchbase/core/cluster_agent.cxx +0 -8
  50. data/ext/couchbase/core/cluster_agent.hxx +0 -4
  51. data/ext/couchbase/core/cluster_options.hxx +26 -3
  52. data/ext/couchbase/core/collections_component.cxx +39 -15
  53. data/ext/couchbase/core/config_profiles.cxx +1 -1
  54. data/ext/couchbase/core/crud_component.cxx +2 -2
  55. data/ext/couchbase/core/crud_options.hxx +34 -0
  56. data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
  57. data/ext/couchbase/core/document_id_redaction.hxx +81 -0
  58. data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
  59. data/ext/couchbase/core/error_context/key_value.cxx +25 -2
  60. data/ext/couchbase/core/error_context/key_value.hxx +60 -33
  61. data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
  62. data/ext/couchbase/core/error_context/search.hxx +5 -0
  63. data/ext/couchbase/core/error_context/search_json.hxx +3 -0
  64. data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
  65. data/ext/couchbase/core/error_context/view.hxx +5 -0
  66. data/ext/couchbase/core/free_form_http_request.cxx +237 -4
  67. data/ext/couchbase/core/free_form_http_request.hxx +41 -8
  68. data/ext/couchbase/core/http_component.cxx +300 -284
  69. data/ext/couchbase/core/http_component.hxx +0 -4
  70. data/ext/couchbase/core/impl/analytics.cxx +38 -5
  71. data/ext/couchbase/core/impl/analytics.hxx +34 -0
  72. data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
  73. data/ext/couchbase/core/impl/collection.cxx +215 -202
  74. data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
  75. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
  76. data/ext/couchbase/core/impl/error.cxx +22 -2
  77. data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
  78. data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
  79. data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
  80. data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
  81. data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
  82. data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
  83. data/ext/couchbase/core/impl/node_id.cxx +49 -13
  84. data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
  85. data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
  86. data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
  87. data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
  88. data/ext/couchbase/core/impl/public_cluster.cxx +229 -42
  89. data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
  90. data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
  91. data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
  92. data/ext/couchbase/core/impl/query.cxx +76 -7
  93. data/ext/couchbase/core/impl/query.hxx +36 -0
  94. data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
  95. data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
  96. data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
  97. data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
  98. data/ext/couchbase/core/impl/scope.cxx +70 -0
  99. data/ext/couchbase/core/impl/search.cxx +31 -1
  100. data/ext/couchbase/core/impl/transactions.cxx +130 -0
  101. data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
  102. data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
  103. data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
  104. data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
  105. data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +1 -2
  106. data/ext/couchbase/core/io/dns_client.cxx +122 -45
  107. data/ext/couchbase/core/io/dns_codec.hxx +21 -21
  108. data/ext/couchbase/core/io/dns_config.cxx +21 -6
  109. data/ext/couchbase/core/io/http_command.hxx +149 -121
  110. data/ext/couchbase/core/io/http_error.hxx +107 -0
  111. data/ext/couchbase/core/io/http_parser.cxx +4 -0
  112. data/ext/couchbase/core/io/http_session.cxx +606 -154
  113. data/ext/couchbase/core/io/http_session.hxx +147 -30
  114. data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
  115. data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
  116. data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
  117. data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
  118. data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
  119. data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
  120. data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
  121. data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
  122. data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
  123. data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
  124. data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
  125. data/ext/couchbase/core/io/mcbp_session.cxx +309 -301
  126. data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
  127. data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
  128. data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
  129. data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
  130. data/ext/couchbase/core/io/streams.cxx +151 -21
  131. data/ext/couchbase/core/io/streams.hxx +48 -1
  132. data/ext/couchbase/core/logger/logger.cxx +36 -0
  133. data/ext/couchbase/core/logger/logger.hxx +46 -6
  134. data/ext/couchbase/core/logger/redaction.hxx +503 -0
  135. data/ext/couchbase/core/management/eventing_status.hxx +10 -0
  136. data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
  137. data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
  138. data/ext/couchbase/core/mcbp/codec.cxx +27 -18
  139. data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
  140. data/ext/couchbase/core/mcbp/packet.hxx +2 -2
  141. data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
  142. data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
  143. data/ext/couchbase/core/meta/features.hxx +13 -0
  144. data/ext/couchbase/core/meta/version.cxx +6 -3
  145. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
  146. data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
  147. data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
  148. data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
  149. data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
  150. data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
  151. data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
  152. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
  153. data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
  154. data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
  155. data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
  156. data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
  157. data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
  158. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
  159. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
  160. data/ext/couchbase/core/operations/document_query.cxx +108 -221
  161. data/ext/couchbase/core/operations/document_query.hxx +18 -4
  162. data/ext/couchbase/core/operations/document_search.cxx +52 -8
  163. data/ext/couchbase/core/operations/document_search.hxx +3 -0
  164. data/ext/couchbase/core/operations/document_view.cxx +3 -3
  165. data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
  166. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
  167. data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
  168. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
  169. data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
  170. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
  171. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
  172. data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
  173. data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
  174. data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
  175. data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
  176. data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
  177. data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
  178. data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
  179. data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
  180. data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
  181. data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
  182. data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
  183. data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
  184. data/ext/couchbase/core/operations/management/error_utils.cxx +59 -5
  185. data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
  186. data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
  187. data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
  188. data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
  189. data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
  190. data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
  191. data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
  192. data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
  193. data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
  194. data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
  195. data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
  196. data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
  197. data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
  198. data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
  199. data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
  200. data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
  201. data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
  202. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
  203. data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
  204. data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
  205. data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
  206. data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
  207. data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
  208. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
  209. data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
  210. data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
  211. data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
  212. data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
  213. data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
  214. data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
  215. data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
  216. data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
  217. data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
  218. data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
  219. data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
  220. data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
  221. data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
  222. data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
  223. data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
  224. data/ext/couchbase/core/operations_fwd.hxx +3 -3
  225. data/ext/couchbase/core/origin.cxx +54 -26
  226. data/ext/couchbase/core/origin.hxx +12 -0
  227. data/ext/couchbase/core/orphan_reporter.cxx +2 -1
  228. data/ext/couchbase/core/platform/random.cc +7 -7
  229. data/ext/couchbase/core/protocol/client_request.cxx +2 -2
  230. data/ext/couchbase/core/protocol/client_request.hxx +38 -21
  231. data/ext/couchbase/core/protocol/client_response.cxx +11 -3
  232. data/ext/couchbase/core/protocol/client_response.hxx +27 -6
  233. data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
  234. data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
  235. data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
  236. data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
  237. data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
  238. data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
  239. data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
  240. data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
  241. data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
  242. data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
  243. data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
  244. data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
  245. data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
  246. data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
  247. data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
  248. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
  249. data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
  250. data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
  251. data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
  252. data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
  253. data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
  254. data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
  255. data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
  256. data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
  257. data/ext/couchbase/core/protocol/datatype.hxx +118 -1
  258. data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
  259. data/ext/couchbase/core/protocol/magic.hxx +4 -0
  260. data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
  261. data/ext/couchbase/core/protocol/server_request.hxx +3 -1
  262. data/ext/couchbase/core/protocol/status.cxx +1 -1
  263. data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
  264. data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
  265. data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
  266. data/ext/couchbase/core/protostellar/component.cxx +2445 -0
  267. data/ext/couchbase/core/protostellar/component.hxx +391 -0
  268. data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
  269. data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
  270. data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
  271. data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
  272. data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
  273. data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
  274. data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
  275. data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
  276. data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
  277. data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
  278. data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
  279. data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
  280. data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
  281. data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
  282. data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
  283. data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
  284. data/ext/couchbase/core/query_stream.cxx +447 -0
  285. data/ext/couchbase/core/query_stream.hxx +141 -0
  286. data/ext/couchbase/core/query_stream_component.cxx +243 -0
  287. data/ext/couchbase/core/query_stream_component.hxx +68 -0
  288. data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
  289. data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
  290. data/ext/couchbase/core/response_handler.hxx +41 -4
  291. data/ext/couchbase/core/row_streamer.cxx +332 -46
  292. data/ext/couchbase/core/row_streamer.hxx +31 -1
  293. data/ext/couchbase/core/row_streamer_options.hxx +55 -0
  294. data/ext/couchbase/core/sasl/client.h +3 -0
  295. data/ext/couchbase/core/search_scoring.hxx +66 -0
  296. data/ext/couchbase/core/stream_error_details.hxx +69 -0
  297. data/ext/couchbase/core/timeout_defaults.hxx +0 -1
  298. data/ext/couchbase/core/topology/capabilities.hxx +6 -0
  299. data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
  300. data/ext/couchbase/core/topology/configuration.cxx +21 -6
  301. data/ext/couchbase/core/topology/configuration.hxx +29 -8
  302. data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
  303. data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
  304. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
  305. data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
  306. data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
  307. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +108 -63
  308. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +19 -2
  309. data/ext/couchbase/core/transactions/error_list.hxx +2 -2
  310. data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
  311. data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
  312. data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
  313. data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
  314. data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
  315. data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
  316. data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
  317. data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
  318. data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
  319. data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
  320. data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
  321. data/ext/couchbase/core/transactions/transactions.cxx +3 -55
  322. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +165 -72
  323. data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
  324. data/ext/couchbase/core/transactions/utils.cxx +10 -0
  325. data/ext/couchbase/core/transactions/waitable_op_list.hxx +2 -2
  326. data/ext/couchbase/core/transactions.hxx +9 -9
  327. data/ext/couchbase/core/utils/byteswap.hxx +166 -9
  328. data/ext/couchbase/core/utils/connection_string.cxx +50 -85
  329. data/ext/couchbase/core/utils/connection_string.hxx +15 -0
  330. data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
  331. data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
  332. data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
  333. data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
  334. data/ext/couchbase/core/utils/movable_function.hxx +301 -52
  335. data/ext/couchbase/core/utils/name_codec.hxx +154 -11
  336. data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
  337. data/ext/couchbase/core/utils/url_codec.cxx +12 -51
  338. data/ext/couchbase/core/websocket_codec.cxx +3 -29
  339. data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
  340. data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
  341. data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
  342. data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
  343. data/ext/couchbase/couchbase/bucket.hxx +57 -0
  344. data/ext/couchbase/couchbase/cluster.hxx +183 -5
  345. data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
  346. data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
  347. data/ext/couchbase/couchbase/collection.hxx +234 -14
  348. data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
  349. data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
  350. data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
  351. data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
  352. data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
  353. data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
  354. data/ext/couchbase/couchbase/error.hxx +32 -0
  355. data/ext/couchbase/couchbase/error_codes.hxx +32 -0
  356. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
  357. data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
  358. data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
  359. data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
  360. data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
  361. data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
  362. data/ext/couchbase/couchbase/get_result.hxx +1 -0
  363. data/ext/couchbase/couchbase/increment_options.hxx +1 -1
  364. data/ext/couchbase/couchbase/insert_options.hxx +1 -1
  365. data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
  366. data/ext/couchbase/couchbase/match_query.hxx +1 -1
  367. data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
  368. data/ext/couchbase/couchbase/network_options.hxx +1 -1
  369. data/ext/couchbase/couchbase/node_id.hxx +42 -14
  370. data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
  371. data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
  372. data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
  373. data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
  374. data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
  375. data/ext/couchbase/couchbase/query_options.hxx +23 -12
  376. data/ext/couchbase/couchbase/query_row.hxx +111 -0
  377. data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
  378. data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
  379. data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
  380. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  381. data/ext/couchbase/couchbase/result.hxx +14 -3
  382. data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
  383. data/ext/couchbase/couchbase/scope.hxx +85 -2
  384. data/ext/couchbase/couchbase/search_options.hxx +58 -8
  385. data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
  386. data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
  387. data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
  388. data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
  389. data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
  390. data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
  391. data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
  392. data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
  393. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
  394. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
  395. data/ext/couchbase/couchbase/transactions.hxx +27 -18
  396. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  397. data/ext/couchbase/couchbase/vector_query.hxx +1 -1
  398. data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
  399. data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
  400. data/ext/extconf.rb +15 -10
  401. data/ext/rcb_analytics.cxx +82 -102
  402. data/ext/rcb_backend.cxx +42 -36
  403. data/ext/rcb_backend.hxx +2 -0
  404. data/ext/rcb_buckets.cxx +47 -59
  405. data/ext/rcb_collections.cxx +42 -52
  406. data/ext/rcb_crud.cxx +345 -224
  407. data/ext/rcb_diagnostics.cxx +117 -27
  408. data/ext/rcb_exceptions.cxx +152 -99
  409. data/ext/rcb_exceptions.hxx +25 -0
  410. data/ext/rcb_extras.cxx +18 -19
  411. data/ext/rcb_hdr_histogram.cxx +19 -4
  412. data/ext/rcb_logger.cxx +202 -27
  413. data/ext/rcb_logger.hxx +12 -0
  414. data/ext/rcb_multi.cxx +40 -40
  415. data/ext/rcb_observability.cxx +7 -5
  416. data/ext/rcb_query.cxx +99 -142
  417. data/ext/rcb_range_scan.cxx +41 -35
  418. data/ext/rcb_search.cxx +98 -99
  419. data/ext/rcb_users.cxx +36 -56
  420. data/ext/rcb_utils.cxx +100 -37
  421. data/ext/rcb_utils.hxx +287 -33
  422. data/ext/rcb_version.cxx +1 -1
  423. data/ext/rcb_views.cxx +55 -51
  424. data/lib/active_support/cache/couchbase_store.rb +77 -12
  425. data/lib/couchbase/bucket.rb +20 -0
  426. data/lib/couchbase/cluster.rb +17 -0
  427. data/lib/couchbase/collection.rb +36 -1
  428. data/lib/couchbase/errors.rb +18 -0
  429. data/lib/couchbase/fork_hooks.rb +16 -7
  430. data/lib/couchbase/get_replica_strategy.rb +89 -0
  431. data/lib/couchbase/logger.rb +1 -1
  432. data/lib/couchbase/management/analytics_index_manager.rb +15 -15
  433. data/lib/couchbase/management/bucket_manager.rb +6 -6
  434. data/lib/couchbase/management/collection_manager.rb +6 -6
  435. data/lib/couchbase/management/query_index_manager.rb +7 -7
  436. data/lib/couchbase/management/search_index_manager.rb +13 -13
  437. data/lib/couchbase/management/user_manager.rb +10 -10
  438. data/lib/couchbase/management/view_index_manager.rb +5 -5
  439. data/lib/couchbase/options.rb +174 -42
  440. data/lib/couchbase/protostellar/bucket.rb +4 -0
  441. data/lib/couchbase/protostellar/cluster.rb +4 -0
  442. data/lib/couchbase/protostellar/collection.rb +4 -0
  443. data/lib/couchbase/protostellar/error_handling.rb +2 -1
  444. data/lib/couchbase/protostellar/request.rb +1 -0
  445. data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
  446. data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
  447. data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
  448. data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
  449. data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
  450. data/lib/couchbase/search_options.rb +95 -6
  451. data/lib/couchbase/version.rb +1 -1
  452. metadata +91 -33
  453. data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
  454. data/ext/couchbase/core/columnar/agent.hxx +0 -71
  455. data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
  456. data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
  457. data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
  458. data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
  459. data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
  460. data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
  461. data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
  462. data/ext/couchbase/core/columnar/error.hxx +0 -51
  463. data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
  464. data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
  465. data/ext/couchbase/core/columnar/management_component.cxx +0 -300
  466. data/ext/couchbase/core/columnar/management_component.hxx +0 -56
  467. data/ext/couchbase/core/columnar/query_component.cxx +0 -523
  468. data/ext/couchbase/core/columnar/query_component.hxx +0 -57
  469. data/ext/couchbase/core/columnar/query_options.hxx +0 -59
  470. data/ext/couchbase/core/columnar/query_result.cxx +0 -130
  471. data/ext/couchbase/core/columnar/query_result.hxx +0 -78
  472. data/ext/couchbase/core/io/config_tracker.cxx +0 -687
  473. data/ext/couchbase/core/io/config_tracker.hxx +0 -123
@@ -0,0 +1,283 @@
1
+ # The shared test framework: the runner, the common main(), the registration helpers, and the
2
+ # framework's own self-test.
3
+ #
4
+ # Hand-rolled (CXXCBC-885), deliberately NOT Catch2. It lives outside either test subdirectory
5
+ # because both test trees link it. See test/cng/README.md to build and run the CNG tests.
6
+
7
+ find_package(Threads REQUIRED)
8
+
9
+ # Each test executable links this and provides its own tests(). fmt comes from spdlog's bundled
10
+ # copy (header include dirs only). ${PROJECT_SOURCE_DIR}/test is PUBLIC so every test spells its
11
+ # includes from one root: "framework/test_runner.hxx", "cng/fixtures/live_fixture.hxx".
12
+ add_library(
13
+ test_framework_main STATIC
14
+ ${PROJECT_SOURCE_DIR}/test/framework/context.cxx
15
+ ${PROJECT_SOURCE_DIR}/test/framework/requirement.cxx
16
+ ${PROJECT_SOURCE_DIR}/test/framework/test_runner.cxx
17
+ ${PROJECT_SOURCE_DIR}/test/framework/test_main.cxx)
18
+ target_include_directories(test_framework_main PUBLIC ${PROJECT_SOURCE_DIR}/test
19
+ ${PROJECT_SOURCE_DIR})
20
+ # spdlog is linked, not merely included, so the framework compiles bundled fmt in the same mode as
21
+ # the client library. Borrowing only spdlog's include directories left SPDLOG_COMPILED_LIB undefined
22
+ # here, and spdlog/fmt/fmt.h responds by defining FMT_HEADER_ONLY, which emits definitions of
23
+ # fmt::v11::vformat, report_error, is_printable, write_loc and friends into test_runner.obj and
24
+ # test_main.obj. A test that also links the client then puts those next to the compiled spdlog's
25
+ # copies of the same symbols. ld folds that silently; link.exe does not, and fails with LNK2005.
26
+ # declare_system_library() already marks spdlog's includes SYSTEM, so linking it keeps its headers
27
+ # out of /W4 /WX without the manual BEFORE override.
28
+ target_link_libraries(test_framework_main PUBLIC Threads::Threads spdlog::spdlog)
29
+ set_project_options(test_framework_main)
30
+ set_project_warnings(test_framework_main)
31
+ # Sanitized like test_utils, for the reason test/utils/CMakeLists.txt gives.
32
+ enable_sanitizers(test_framework_main)
33
+
34
+ # The shared cluster helpers. Promoted out of test/CMakeLists.txt because the framework's cluster
35
+ # probes are built on them, so they have to exist whenever either suite is built rather than only
36
+ # when the Catch2 suite is.
37
+ if(NOT TARGET test_utils)
38
+ add_subdirectory(test/utils)
39
+ endif()
40
+
41
+ # Exactly one of these provides make_probe_backend(), and couchbase_add_test() picks which by
42
+ # whether the test links the client library. OBJECT rather than STATIC so the definition is always
43
+ # contributed: an archive is only searched when something already references what it holds, and the
44
+ # reference here comes from the framework's own main().
45
+ #
46
+ # The null one answers every probe with "I cannot ask", which the runner reports as undetermined and
47
+ # therefore as a failure. A test that asks about the server from a binary with no way to reach one
48
+ # is a registration mistake, and skipping it would hide the mistake for as long as it existed.
49
+ add_library(test_framework_null_probes OBJECT ${PROJECT_SOURCE_DIR}/test/framework/null_probes.cxx)
50
+ target_include_directories(test_framework_null_probes PRIVATE ${PROJECT_SOURCE_DIR}/test)
51
+ target_include_directories(
52
+ test_framework_null_probes SYSTEM BEFORE
53
+ PRIVATE $<BUILD_INTERFACE:$<TARGET_PROPERTY:spdlog::spdlog,INTERFACE_INCLUDE_DIRECTORIES>>)
54
+ set_target_properties(test_framework_null_probes PROPERTIES POSITION_INDEPENDENT_CODE ON)
55
+ set_project_options(test_framework_null_probes)
56
+ set_project_warnings(test_framework_null_probes)
57
+ enable_sanitizers(test_framework_null_probes)
58
+
59
+ # The real one drives a connection through test::utils::integration_test_guard, so it is the only
60
+ # part of the framework that includes core headers -- and it is a .cxx, which is what keeps
61
+ # context.hxx lean.
62
+ add_library(test_framework_cluster_probes OBJECT
63
+ ${PROJECT_SOURCE_DIR}/test/framework/cluster_probes.cxx)
64
+ target_include_directories(
65
+ test_framework_cluster_probes PRIVATE ${PROJECT_SOURCE_DIR}/test ${PROJECT_SOURCE_DIR}
66
+ ${PROJECT_BINARY_DIR}/generated
67
+ ${PROJECT_BINARY_DIR}/generated_$<CONFIG>)
68
+ target_include_directories(
69
+ test_framework_cluster_probes SYSTEM BEFORE
70
+ PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
71
+ $<BUILD_INTERFACE:$<TARGET_PROPERTY:spdlog::spdlog,INTERFACE_INCLUDE_DIRECTORIES>>
72
+ $<BUILD_INTERFACE:$<TARGET_PROPERTY:asio,INTERFACE_INCLUDE_DIRECTORIES>>)
73
+ propagate_public_compile_definitions(test_framework_cluster_probes spdlog::spdlog asio)
74
+ target_link_libraries(test_framework_cluster_probes PRIVATE $<BUILD_INTERFACE:Microsoft.GSL::GSL>
75
+ $<BUILD_INTERFACE:taocpp::json>)
76
+ set_target_properties(test_framework_cluster_probes PROPERTIES POSITION_INDEPENDENT_CODE ON)
77
+ set_project_options(test_framework_cluster_probes)
78
+ set_project_warnings(test_framework_cluster_probes)
79
+ enable_sanitizers(test_framework_cluster_probes)
80
+
81
+ # couchbase_discover_tests(<target> PROPERTIES <prop> <value>...)
82
+ #
83
+ # Registers one ctest entry per case, named <target>.<case>, the way catch_discover_tests does for
84
+ # the Catch2 suites. Per-executable registration would be coarser than what the suite already
85
+ # depends on: bin/run-integration-tests shards the valgrind leg with `ctest -I i,,n`, whose stride
86
+ # runs over ctest entries, and --output-junit builds the CI report from one row per entry.
87
+ #
88
+ # The list is produced at post-build by running the executable with --list-tests, which reports
89
+ # every case regardless of what the environment satisfies -- so the registered set does not depend
90
+ # on the machine that built it.
91
+ #
92
+ # NAMING RULE, which the whole scheme relies on: a case name is the name of the function that
93
+ # implements it -- the CASE macro in test/framework/test_registry.hxx stringifies the identifier, so
94
+ # the two cannot drift -- and is therefore a C++ identifier, [A-Za-z_][A-Za-z0-9_]* and nothing
95
+ # else, lower_snake_case by convention rather than by enforcement. No spaces, no punctuation, no
96
+ # colons. A Catch2 case is
97
+ # converted to one ONCE, when it is migrated: the category prefix is dropped because the target's
98
+ # ctest label and the case's own requirements already carry it, and the remaining words are joined
99
+ # with underscores. So
100
+ # "integration: cluster remains usable in a forked child" is migrated as the function
101
+ # cluster_remains_usable_in_a_forked_child.
102
+ #
103
+ # Keep that rule and nothing here needs quoting or escaping: the name is safe as a CMake list
104
+ # element, as a ctest -R pattern, and as an argv entry in bash, zsh, cmd and PowerShell alike. Break
105
+ # it and the fix is the name, never an escaping scheme in this file.
106
+ function(couchbase_discover_tests target)
107
+ cmake_parse_arguments(ARG "" "" "PROPERTIES" ${ARGN})
108
+
109
+ get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
110
+ if(is_multi_config)
111
+ set(ctest_file "${CMAKE_CURRENT_BINARY_DIR}/${target}_tests_$<CONFIG>.cmake")
112
+ set(ctest_file_at_test_time "${CMAKE_CURRENT_BINARY_DIR}/${target}_tests_\${CTEST_CONFIGURATION_TYPE}.cmake")
113
+ # No BYPRODUCTS here. It accepts a generator expression only from CMake 3.20, and this project
114
+ # declares 3.19, so a multi-config generate would break on the minimum version this repository
115
+ # claims to support. The declaration only tells the build graph that the command writes this
116
+ # file -- it is a `clean` and dependency-tracking hint, not a correctness requirement, and the
117
+ # per-config file name is worth more than the hint. catch_discover_tests() avoids the question
118
+ # by keying its file on an argument hash rather than the configuration, which is why one file
119
+ # there serves every config.
120
+ set(byproducts "")
121
+ else()
122
+ set(ctest_file "${CMAKE_CURRENT_BINARY_DIR}/${target}_tests.cmake")
123
+ set(ctest_file_at_test_time "${ctest_file}")
124
+ set(byproducts BYPRODUCTS "${ctest_file}")
125
+ endif()
126
+
127
+ add_custom_command(
128
+ TARGET ${target}
129
+ POST_BUILD
130
+ ${byproducts}
131
+ COMMAND
132
+ "${CMAKE_COMMAND}" -D "TEST_TARGET=${target}" -D "TEST_EXECUTABLE=$<TARGET_FILE:${target}>" -D
133
+ "TEST_PROPERTIES=${ARG_PROPERTIES}" -D "CTEST_FILE=${ctest_file}" -P
134
+ "${PROJECT_SOURCE_DIR}/cmake/TestFrameworkAddTests.cmake"
135
+ COMMENT "Enumerating test cases in ${target}"
136
+ VERBATIM)
137
+
138
+ # ctest reads TEST_INCLUDE_FILES at the start of a run, when the generated file may not exist --
139
+ # a fresh configure, or a build that never got as far as linking this target. Registering a test
140
+ # that cannot pass is the point: an unbuilt binary must not read as a binary with no failures.
141
+ #
142
+ # The placeholder runs cmake -E false rather than a command named after the target: a missing
143
+ # command fails with a different message on every platform ("command not found", "file not
144
+ # found", a Windows error box), and one of them has to be recognisable as the intended failure.
145
+ set(include_file "${CMAKE_CURRENT_BINARY_DIR}/${target}_include.cmake")
146
+ file(
147
+ WRITE "${include_file}"
148
+ "if(EXISTS \"${ctest_file_at_test_time}\")\n"
149
+ " include(\"${ctest_file_at_test_time}\")\n"
150
+ "else()\n"
151
+ # Positional, not add_test(NAME ... COMMAND ...): the keyword signature is a CMakeLists
152
+ # feature. Meeting one in an include file, ctest takes the first argument as the test name and
153
+ # the rest as the command, so it registers an entry literally called "NAME" that reports Not
154
+ # Run. The positional form is what makes the entry carry the target's name and fail for the
155
+ # reason it was registered.
156
+ " add_test([==[${target}_NOT_BUILT]==] [==[${CMAKE_COMMAND}]==] -E false)\n"
157
+ # The placeholder carries the same labels as the real cases would. Without them a labelled run
158
+ # -- which is how CI runs everything -- would filter the placeholder out, and an unbuilt binary
159
+ # would once again read as a binary with no failures.
160
+ " set(properties [==[${ARG_PROPERTIES}]==])\n"
161
+ " set_tests_properties(${target}_NOT_BUILT PROPERTIES \${properties})\n"
162
+ "endif()\n")
163
+ set_property(DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES "${include_file}")
164
+ endfunction()
165
+
166
+ # Which client library a LINK_CLIENT test links. test/cng/CMakeLists.txt narrows this for the
167
+ # couchbase2 tests, which also link the generated protobuf stubs directly.
168
+ set(couchbase_cxx_client_test_library ${couchbase_cxx_client_DEFAULT_LIBRARY})
169
+
170
+ # couchbase_add_test(<relpath> LABEL <label> [LINK_CLIENT] [LIBS <lib>...])
171
+ #
172
+ # relpath is under test/ without the extension (e.g. cng/protostellar/dispatcher). The target name
173
+ # is that path with the separators flattened, which makes it unique by construction: keying on the
174
+ # file stem instead would collide the moment two subsystems each have a parser.cxx. LINK_CLIENT
175
+ # links the client library and its core header include set, for tests that exercise core code.
176
+ function(couchbase_add_test relpath)
177
+ cmake_parse_arguments(ARG "LINK_CLIENT" "LABEL" "LIBS" ${ARGN})
178
+
179
+ # Every entry is a label some leg in bin/ or .github/workflows/ selects with --label-regex. A
180
+ # label no runner selects is worse than a typo: it configures, builds and links, and the cases
181
+ # are then never executed by anything. Do not add one here without the leg that runs it.
182
+ set(known_labels unit integration transaction benchmark cng)
183
+ if(NOT ARG_LABEL IN_LIST known_labels)
184
+ # A typo here is invisible at build time and then quietly drops the binary out of the CI leg
185
+ # that was supposed to run it.
186
+ message(FATAL_ERROR "couchbase_add_test(${relpath}): LABEL must be one of ${known_labels}, "
187
+ "got \"${ARG_LABEL}\"")
188
+ endif()
189
+
190
+ string(REPLACE "/" "_" target "${relpath}")
191
+ add_executable(${target} ${PROJECT_SOURCE_DIR}/test/${relpath}.cxx)
192
+ # The suite name in the run's own output, taken from the path rather than written out again in
193
+ # the file: a hand-written one drifts the moment the file is renamed and nothing notices.
194
+ target_compile_definitions(${target} PRIVATE COUCHBASE_TEST_SUITE_NAME="${target}")
195
+ target_include_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR})
196
+ target_include_directories(
197
+ ${target} SYSTEM BEFORE
198
+ PRIVATE $<BUILD_INTERFACE:$<TARGET_PROPERTY:spdlog::spdlog,INTERFACE_INCLUDE_DIRECTORIES>>)
199
+ target_link_libraries(${target} PRIVATE test_framework_main Threads::Threads)
200
+ if(ARG_LINK_CLIENT)
201
+ target_include_directories(${target} PRIVATE ${PROJECT_BINARY_DIR}/generated
202
+ ${PROJECT_BINARY_DIR}/generated_$<CONFIG>)
203
+ target_include_directories(
204
+ ${target} SYSTEM BEFORE
205
+ PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
206
+ $<BUILD_INTERFACE:$<TARGET_PROPERTY:asio,INTERFACE_INCLUDE_DIRECTORIES>>)
207
+ propagate_public_compile_definitions(${target} spdlog::spdlog asio)
208
+ target_link_libraries(
209
+ ${target}
210
+ PRIVATE ${couchbase_cxx_client_test_library} test_framework_cluster_probes test_utils
211
+ $<BUILD_INTERFACE:Microsoft.GSL::GSL> $<BUILD_INTERFACE:taocpp::json>)
212
+ # The TLS backend the tree settled on, named the way test/utils/CMakeLists.txt names it:
213
+ # cmake/OpenSSL.cmake switches to the pkg-config target where find_package(OpenSSL) is absent
214
+ # or fails its usability probe, and creates neither under
215
+ # COUCHBASE_CXX_CLIENT_POST_LINKED_OPENSSL, where the application supplies the symbols.
216
+ # Naming OpenSSL::SSL unconditionally fails to generate in both of those configurations.
217
+ if(TARGET PkgConfig::PKG_CONFIG_OPENSSL)
218
+ target_link_libraries(${target} PRIVATE PkgConfig::PKG_CONFIG_OPENSSL)
219
+ elseif(TARGET OpenSSL::SSL)
220
+ target_link_libraries(${target} PRIVATE OpenSSL::SSL)
221
+ endif()
222
+ if(COUCHBASE_CXX_CLIENT_STATIC_BORINGSSL AND WIN32)
223
+ # Ignore the `LNK4099: PDB ['crypto.pdb'|'ssl.pdb'] was not found` warnings: the BoringSSL
224
+ # build's *.PDB files are not kept. bin/build-tests.rb configures every Windows test build
225
+ # with STATIC_BORINGSSL, and cmake/Testing.cmake carries the same line for each Catch2
226
+ # target, so without this a migrated test is the only executable in the tree that reports it.
227
+ set_target_properties(${target} PROPERTIES LINK_FLAGS "/ignore:4099")
228
+ endif()
229
+ else()
230
+ target_link_libraries(${target} PRIVATE test_framework_null_probes)
231
+ endif()
232
+ if(ARG_LIBS)
233
+ target_link_libraries(${target} PRIVATE ${ARG_LIBS})
234
+ endif()
235
+ set_project_options(${target})
236
+ set_project_warnings(${target})
237
+
238
+ # Join the aggregate that build_<suite>_tests depends on. bin/build-tests builds that aggregate
239
+ # rather than `all` whenever CB_TEST_SUITE is set, and a target missing from it is not built --
240
+ # which leaves the discovery file absent and the case registered as the _NOT_BUILT placeholder.
241
+ #
242
+ # cmake/Testing.cmake blanks these properties, and it is included after this file, so an append
243
+ # made while this file is being read is discarded. Only calls from test/CMakeLists.txt, which
244
+ # Testing.cmake reads later, survive -- which is why a framework test that needs to be in an
245
+ # aggregate is registered there and not here. cng has no aggregate; it is built only by `all`.
246
+ if(ARG_LABEL STREQUAL "unit")
247
+ set_property(GLOBAL APPEND PROPERTY COUCHBASE_UNIT_TESTS ${target})
248
+ elseif(ARG_LABEL STREQUAL "integration")
249
+ set_property(GLOBAL APPEND PROPERTY COUCHBASE_INTEGRATION_TESTS ${target})
250
+ elseif(ARG_LABEL STREQUAL "transaction")
251
+ set_property(GLOBAL APPEND PROPERTY COUCHBASE_TRANSACTION_TESTS ${target})
252
+ elseif(ARG_LABEL STREQUAL "benchmark")
253
+ set_property(GLOBAL APPEND PROPERTY COUCHBASE_BENCHMARKS ${target})
254
+ endif()
255
+
256
+ # The harness returns 77 when every case was skipped; map that to ctest's "Skipped".
257
+ set(properties SKIP_RETURN_CODE 77 LABELS "${ARG_LABEL}")
258
+ # Sanitizers are applied per target (cmake/Sanitizers.cmake), so dependencies fetched and built
259
+ # as ordinary packages -- gRPC and abseil among them -- carry no instrumentation, and TSan cannot
260
+ # see the happens-before edges inside their event-engine and futex code. Without
261
+ # ignore_noninstrumented_modules it reports those as races: the dispatcher tests drive real gRPC
262
+ # threads and produced 54 such reports. Set on the test rather than in CI so a local `ctest` under
263
+ # TSan behaves the same way.
264
+ if(DEFINED COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS AND EXISTS "${COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS}")
265
+ list(
266
+ APPEND
267
+ properties
268
+ ENVIRONMENT
269
+ "TSAN_OPTIONS=halt_on_error=0,second_deadlock_stack=1,ignore_noninstrumented_modules=1,suppressions=${COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS}"
270
+ )
271
+ endif()
272
+ couchbase_discover_tests(${target} PROPERTIES ${properties})
273
+
274
+ endfunction()
275
+
276
+ # cng, because that is the leg whose steps deliberately do not apply --test-action memcheck: the
277
+ # inner suites here assert on absolute millisecond budgets, which valgrind would blow with no
278
+ # multiplier able to reach them.
279
+ couchbase_add_test(framework/selftest LABEL cng)
280
+
281
+ # What assert_success prints. It needs couchbase::error, and therefore the client library, but no
282
+ # server: every value it asserts on is constructed by hand. cng for the same reason as above.
283
+ couchbase_add_test(framework/errors_selftest LABEL cng LINK_CLIENT)
@@ -0,0 +1,51 @@
1
+ # Post-build enumerator for couchbase_discover_tests(). Runs the freshly linked test executable
2
+ # with --list-tests and writes one add_test() per case, so ctest sees the same granularity
3
+ # catch_discover_tests gives the Catch2 suites: `ctest -I i,,n` can shard a binary, `-R` can select
4
+ # a single case, and --output-junit carries one row per case.
5
+ #
6
+ # Driven by cmake -P with TEST_TARGET, TEST_EXECUTABLE, TEST_PROPERTIES and CTEST_FILE defined.
7
+
8
+ execute_process(
9
+ COMMAND "${TEST_EXECUTABLE}" --list-tests
10
+ OUTPUT_VARIABLE listing
11
+ ERROR_VARIABLE listing_error
12
+ RESULT_VARIABLE listing_result)
13
+
14
+ if(NOT listing_result EQUAL 0)
15
+ message(FATAL_ERROR "${TEST_EXECUTABLE} --list-tests failed (${listing_result}):\n${listing_error}")
16
+ endif()
17
+
18
+ # Splitting on newlines below makes ";" the list separator, so any semicolon already in the text
19
+ # has to be escaped first or one line becomes two entries. Case names cannot contain one -- they are
20
+ # C++ identifiers, see the naming rule in couchbase_discover_tests() -- so this guards whatever else
21
+ # the listing carries beside the name.
22
+ string(REPLACE ";" "\\;" listing "${listing}")
23
+ string(REPLACE "\n" ";" listing "${listing}")
24
+
25
+ # Bracket-quoted once, then expanded unquoted at ctest time: interpolating the list straight into
26
+ # the file splits it on any space inside a value -- a TSan suppressions path containing one would
27
+ # have silently truncated the ENVIRONMENT property rather than failing.
28
+ set(script "set(properties [==[${TEST_PROPERTIES}]==])\n")
29
+ set(case_count 0)
30
+ foreach(line IN LISTS listing)
31
+ # Each line is "<case name>\t<what it requires>". Only the name is registered; the requirements
32
+ # are there for whoever runs --list-tests by hand.
33
+ string(REGEX REPLACE "\t.*$" "" case_name "${line}")
34
+ string(STRIP "${case_name}" case_name)
35
+ if(case_name STREQUAL "")
36
+ continue()
37
+ endif()
38
+ math(EXPR case_count "${case_count} + 1")
39
+ set(test_name "${TEST_TARGET}.${case_name}")
40
+ string(APPEND script "add_test([==[${test_name}]==] [==[${TEST_EXECUTABLE}]==] [==[${case_name}]==])\n")
41
+ string(APPEND script "set_tests_properties([==[${test_name}]==] PROPERTIES \${properties})\n")
42
+ endforeach()
43
+
44
+ # A binary that reports no cases has to break the build. Writing an empty file instead would leave
45
+ # ctest green with nothing registered, which is the failure this whole scheme exists to make
46
+ # impossible.
47
+ if(case_count EQUAL 0)
48
+ message(FATAL_ERROR "${TEST_EXECUTABLE} --list-tests reported no test cases")
49
+ endif()
50
+
51
+ file(WRITE "${CTEST_FILE}" "${script}")
@@ -14,8 +14,12 @@ if(COUCHBASE_CXX_CLIENT_ENABLE_VALGRIND)
14
14
  find_program(VALGRIND valgrind)
15
15
  if(VALGRIND)
16
16
  set(VALGRIND_COMMAND "${VALGRIND}")
17
+ # --run-libc-freeres=no: at exit, memcheck runs glibc's __libc_freeres on the last thread after
18
+ # exit_group has killed the others. Its stdio cleanup takes every FILE lock, so a thread killed
19
+ # while writing a log line to stderr leaves that lock held and the process waits on it forever.
20
+ # A fork child that leaves through _Exit() while the SDK's threads still log is such a process.
17
21
  set(VALGRIND_COMMAND_OPTIONS
18
- "-v --tool=memcheck --leak-check=full --track-fds=yes --num-callers=50 --show-reachable=yes --track-origins=yes --malloc-fill=0xff --free-fill=0xfe --suppressions=${PROJECT_SOURCE_DIR}/.valgrind_suppressions.txt"
22
+ "-v --tool=memcheck --leak-check=full --track-fds=yes --num-callers=50 --show-reachable=yes --track-origins=yes --malloc-fill=0xff --free-fill=0xfe --run-libc-freeres=no --suppressions=${PROJECT_SOURCE_DIR}/.valgrind_suppressions.txt"
19
23
  )
20
24
  set(MEMORYCHECK_COMMAND "${VALGRIND}")
21
25
  set(MEMORYCHECK_COMMAND_OPTIONS "${VALGRIND_COMMAND_OPTIONS}")
@@ -43,8 +47,7 @@ macro(integration_test name)
43
47
  ${PROJECT_BINARY_DIR}/generated_$<CONFIG>)
44
48
  target_include_directories(
45
49
  test_integration_${name} SYSTEM BEFORE
46
- PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/cxx_function>
47
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
50
+ PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
48
51
  $<BUILD_INTERFACE:$<TARGET_PROPERTY:spdlog::spdlog,INTERFACE_INCLUDE_DIRECTORIES>>
49
52
  $<BUILD_INTERFACE:$<TARGET_PROPERTY:asio,INTERFACE_INCLUDE_DIRECTORIES>>)
50
53
  propagate_public_compile_definitions(test_integration_${name} spdlog::spdlog asio)
@@ -63,9 +66,15 @@ macro(integration_test name)
63
66
  # *.PDB from the BoringSSL build
64
67
  set_target_properties(test_integration_${name} PROPERTIES LINK_FLAGS "/ignore:4099")
65
68
  endif()
69
+ set(_catch_extra_args "")
70
+ if(DEFINED COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS AND EXISTS "${COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS}")
71
+ set(_catch_extra_args ENVIRONMENT
72
+ "TSAN_OPTIONS=halt_on_error=0,second_deadlock_stack=1,ignore_noninstrumented_modules=1,suppressions=${COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS}")
73
+ endif()
66
74
  catch_discover_tests(
67
75
  test_integration_${name}
68
76
  PROPERTIES
77
+ ${_catch_extra_args}
69
78
  SKIP_REGULAR_EXPRESSION
70
79
  "SKIP"
71
80
  LABELS
@@ -86,8 +95,7 @@ macro(transaction_test name)
86
95
  ${PROJECT_BINARY_DIR}/generated_$<CONFIG>)
87
96
  target_include_directories(
88
97
  test_transaction_${name} SYSTEM BEFORE
89
- PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/cxx_function>
90
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
98
+ PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
91
99
  $<BUILD_INTERFACE:$<TARGET_PROPERTY:spdlog::spdlog,INTERFACE_INCLUDE_DIRECTORIES>>
92
100
  $<BUILD_INTERFACE:$<TARGET_PROPERTY:asio,INTERFACE_INCLUDE_DIRECTORIES>>)
93
101
  propagate_public_compile_definitions(test_transaction_${name} spdlog::spdlog asio)
@@ -106,9 +114,15 @@ macro(transaction_test name)
106
114
  # *.PDB from the BoringSSL build
107
115
  set_target_properties(test_transaction_${name} PROPERTIES LINK_FLAGS "/ignore:4099")
108
116
  endif()
117
+ set(_catch_extra_args "")
118
+ if(DEFINED COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS AND EXISTS "${COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS}")
119
+ set(_catch_extra_args ENVIRONMENT
120
+ "TSAN_OPTIONS=halt_on_error=0,second_deadlock_stack=1,ignore_noninstrumented_modules=1,suppressions=${COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS}")
121
+ endif()
109
122
  catch_discover_tests(
110
123
  test_transaction_${name}
111
124
  PROPERTIES
125
+ ${_catch_extra_args}
112
126
  SKIP_REGULAR_EXPRESSION
113
127
  "SKIP"
114
128
  LABELS
@@ -128,8 +142,7 @@ macro(unit_test name)
128
142
  ${PROJECT_BINARY_DIR}/generated_$<CONFIG>)
129
143
  target_include_directories(
130
144
  test_unit_${name} SYSTEM BEFORE
131
- PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/cxx_function>
132
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
145
+ PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
133
146
  $<BUILD_INTERFACE:$<TARGET_PROPERTY:spdlog::spdlog,INTERFACE_INCLUDE_DIRECTORIES>>
134
147
  $<BUILD_INTERFACE:$<TARGET_PROPERTY:asio,INTERFACE_INCLUDE_DIRECTORIES>>)
135
148
  propagate_public_compile_definitions(test_unit_${name} spdlog::spdlog asio)
@@ -148,9 +161,15 @@ macro(unit_test name)
148
161
  # *.PDB from the BoringSSL build
149
162
  set_target_properties(test_unit_${name} PROPERTIES LINK_FLAGS "/ignore:4099")
150
163
  endif()
164
+ set(_catch_extra_args "")
165
+ if(DEFINED COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS AND EXISTS "${COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS}")
166
+ set(_catch_extra_args ENVIRONMENT
167
+ "TSAN_OPTIONS=halt_on_error=0,second_deadlock_stack=1,ignore_noninstrumented_modules=1,suppressions=${COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS}")
168
+ endif()
151
169
  catch_discover_tests(
152
170
  test_unit_${name}
153
171
  PROPERTIES
172
+ ${_catch_extra_args}
154
173
  SKIP_REGULAR_EXPRESSION
155
174
  "SKIP"
156
175
  LABELS
@@ -171,8 +190,7 @@ macro(integration_benchmark name)
171
190
  ${PROJECT_BINARY_DIR}/generated_$<CONFIG>)
172
191
  target_include_directories(
173
192
  benchmark_integration_${name} SYSTEM BEFORE
174
- PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/cxx_function>
175
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
193
+ PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
176
194
  $<BUILD_INTERFACE:$<TARGET_PROPERTY:spdlog::spdlog,INTERFACE_INCLUDE_DIRECTORIES>>
177
195
  $<BUILD_INTERFACE:$<TARGET_PROPERTY:asio,INTERFACE_INCLUDE_DIRECTORIES>>)
178
196
  propagate_public_compile_definitions(benchmark_integration_${name} spdlog::spdlog asio)
@@ -16,6 +16,11 @@ function(declare_system_library target)
16
16
  $<TARGET_PROPERTY:${target},INTERFACE_INCLUDE_DIRECTORIES>)
17
17
  endfunction()
18
18
 
19
+ # Vendored dependencies that declare install rules no option can switch off send them here instead,
20
+ # and the packaging install step deletes this one directory. Defined before any of them is added so
21
+ # gRPC and curl share it.
22
+ set(COUCHBASE_CXX_CLIENT_VENDORED_INSTALL_JUNK_DIR "vendored-not-installed")
23
+
19
24
  include(cmake/OpenSSL.cmake)
20
25
 
21
26
  if(NOT TARGET spdlog::spdlog)
@@ -39,12 +44,125 @@ if(NOT TARGET spdlog::spdlog)
39
44
  "SPDLOG_FMT_EXTERNAL OFF")
40
45
  endif()
41
46
 
47
+ if((COUCHBASE_CXX_CLIENT_BUILD_TOOLS AND COUCHBASE_CXX_CLIENT_BUILD_FIT_PERFORMER)
48
+ OR COUCHBASE_CXX_CLIENT_BUILD_COUCHBASE2)
49
+ # gRPC/Protobuf are pulled in only for gRPC-based components (the FIT performer and the
50
+ # couchbase2:// transport). This MUST come before OpenTelemetry so OTel reuses these targets.
51
+ include(cmake/GrpcProtobuf.cmake)
52
+ endif()
53
+
42
54
  if(COUCHBASE_CXX_CLIENT_BUILD_OPENTELEMETRY)
55
+ # OpenTelemetry's OTLP/HTTP exporter needs libcurl, and its cmake/curl.cmake takes the platform's
56
+ # copy when find_package(CURL) succeeds. That copy is linked against the platform's OpenSSL, so it
57
+ # puts a second TLS implementation into every process loading the SDK next to the BoringSSL linked
58
+ # here -- visible as libssl/libcrypto among cbc's dependencies.
59
+ #
60
+ # Declaring curl first is what avoids it. OpenTelemetry declares curl under the name "curl" and
61
+ # then calls FetchContent_MakeAvailable(curl), which does nothing when the name is already
62
+ # populated, and its own alias step is skipped because CURL::libcurl already exists. Its fetch
63
+ # branch is also the wrong shape for packaging: it forces BUILD_SHARED_LIBS ON, producing a
64
+ # libcurl.so this project would have to ship.
65
+ #
66
+ # CMAKE_DISABLE_FIND_PACKAGE_CURL stops it preferring a system libcurl over this one; both of its
67
+ # call sites are QUIET and not REQUIRED, so disabling the search is safe.
68
+ if(COUCHBASE_CXX_CLIENT_STATIC_BORINGSSL AND NOT TARGET CURL::libcurl)
69
+ set(CMAKE_DISABLE_FIND_PACKAGE_CURL ON)
70
+
71
+ # Keep the tag in step with the one OpenTelemetry pins in its third_party_release, so the
72
+ # version it expects is the version it gets.
73
+ cpmaddpackage(
74
+ NAME
75
+ curl
76
+ GITHUB_REPOSITORY
77
+ "curl/curl"
78
+ GIT_TAG
79
+ curl-8_12_0
80
+ OPTIONS
81
+ # curl asks find_package(OpenSSL REQUIRED) and then links OpenSSL::SSL and OpenSSL::Crypto by
82
+ # target. Those targets are already BoringSSL aliases, so the only thing missing is a
83
+ # find_package that succeeds without an OpenSSL installation: see
84
+ # cmake/vendored_openssl/FindOpenSSL.cmake. curl appends its own CMake directory to
85
+ # CMAKE_MODULE_PATH, so replacing it here costs nothing.
86
+ "CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/vendored_openssl"
87
+ "COUCHBASE_CXX_CLIENT_BORINGSSL_INCLUDE_DIR ${boringssl_SOURCE_DIR}/src/include"
88
+ "CURL_USE_OPENSSL ON"
89
+ # curl identifies the TLS library, and probes for a few functions, with check_symbol_exists.
90
+ # Those compile a TryCompile project which does NOT inherit ALIAS targets, so the probes
91
+ # cannot resolve OpenSSL::SSL -> BoringSSL and fail outright ("Target links to OpenSSL::SSL
92
+ # but the target was not found"). Every one of them is guarded by if(NOT DEFINED ...), so
93
+ # answering in advance skips them. The answers describe BoringSSL: it is not AWS-LC or
94
+ # LibreSSL, and it does provide SSL_set0_wbio. SRP is not probed at all because
95
+ # CURL_DISABLE_SRP is on below.
96
+ "HAVE_BORINGSSL 1"
97
+ "HAVE_AWSLC 0"
98
+ "HAVE_LIBRESSL 0"
99
+ "HAVE_SSL_SET0_WBIO 1"
100
+ # TLS-SRP probes against <openssl/ssl.h> and would find the platform OpenSSL's declarations
101
+ # while compiling against BoringSSL headers, which omit SRP: curl then fails on implicit
102
+ # declarations of SSL_CTX_set_srp_username. Nothing here uses TLS-SRP.
103
+ "CURL_DISABLE_SRP ON"
104
+ # curl's install(TARGETS libcurl_static EXPORT ...) fails because the BoringSSL targets it
105
+ # links belong to no export set, and nothing here consumes curl's export files.
106
+ "CURL_ENABLE_EXPORT_TARGET OFF"
107
+ # CURL_ENABLE_EXPORT_TARGET only suppresses the CMake export file: curl still installs its
108
+ # archive, its headers, curl-config and libcurl.pc. Send them where gRPC's go, so the single
109
+ # cleanup in the packaging install step covers both.
110
+ "CMAKE_INSTALL_BINDIR ${COUCHBASE_CXX_CLIENT_VENDORED_INSTALL_JUNK_DIR}/bin"
111
+ "CMAKE_INSTALL_LIBDIR ${COUCHBASE_CXX_CLIENT_VENDORED_INSTALL_JUNK_DIR}/lib"
112
+ "CMAKE_INSTALL_INCLUDEDIR ${COUCHBASE_CXX_CLIENT_VENDORED_INSTALL_JUNK_DIR}/include"
113
+ "CMAKE_INSTALL_DATADIR ${COUCHBASE_CXX_CLIENT_VENDORED_INSTALL_JUNK_DIR}/share"
114
+ "CMAKE_INSTALL_DATAROOTDIR ${COUCHBASE_CXX_CLIENT_VENDORED_INSTALL_JUNK_DIR}/share"
115
+ "BUILD_SHARED_LIBS OFF"
116
+ "BUILD_STATIC_LIBS ON"
117
+ "BUILD_CURL_EXE OFF"
118
+ "BUILD_LIBCURL_DOCS OFF"
119
+ "BUILD_MISC_DOCS OFF"
120
+ "ENABLE_CURL_MANUAL OFF"
121
+ "BUILD_TESTING OFF"
122
+ # Everything below is a dependency the exporter does not need and that would otherwise become
123
+ # a build requirement or another shared library in the package.
124
+ "CURL_USE_LIBPSL OFF"
125
+ "CURL_USE_LIBSSH2 OFF"
126
+ "CURL_USE_LIBSSH OFF"
127
+ "CURL_USE_GSSAPI OFF"
128
+ "USE_LIBIDN2 OFF"
129
+ "CURL_BROTLI OFF"
130
+ "CURL_ZSTD OFF"
131
+ "USE_NGHTTP2 OFF"
132
+ "CURL_DISABLE_LDAP ON"
133
+ "CURL_DISABLE_LDAPS ON"
134
+ "CMAKE_C_VISIBILITY_PRESET hidden"
135
+ "CMAKE_POSITION_INDEPENDENT_CODE ON")
136
+
137
+ if(TARGET libcurl_static AND NOT TARGET CURL::libcurl)
138
+ add_library(CURL::libcurl ALIAS libcurl_static)
139
+ endif()
140
+ if(NOT TARGET CURL::libcurl)
141
+ message(FATAL_ERROR "Vendored curl did not provide CURL::libcurl")
142
+ endif()
143
+ declare_system_library(CURL::libcurl)
144
+ endif()
145
+
146
+ # The FIT driver gives the C++ performer an OTLP/gRPC collector endpoint, so the performer needs
147
+ # the gRPC exporters. OpenTelemetry finds the gRPC that GrpcProtobuf.cmake resolved: the cached
148
+ # gRPC_DIR for a platform package, CPM's grpc-config.cmake redirect for a source build.
149
+ set(_couchbase_otel_protobuf_option)
150
+ if(COUCHBASE_CXX_CLIENT_BUILD_TOOLS AND COUCHBASE_CXX_CLIENT_BUILD_FIT_PERFORMER)
151
+ set(_couchbase_otel_with_otlp_grpc ON)
152
+ if(COUCHBASE_CXX_CLIENT_BUNDLED_PROTOBUF_DIR)
153
+ set(_couchbase_otel_protobuf_option "Protobuf_DIR ${COUCHBASE_CXX_CLIENT_BUNDLED_PROTOBUF_DIR}")
154
+ endif()
155
+ else()
156
+ set(_couchbase_otel_with_otlp_grpc OFF)
157
+ endif()
158
+
43
159
  if(NOT TARGET opentelemetry)
44
- # Disable curl HTTP client to avoid curl downloading and linking to BoringSSL
45
- # OpenTelemetry will fall back to using its own HTTP client implementation
46
- # This avoids CMake export errors when curl tries to reference ssl/crypto targets
47
-
160
+ # These curl settings apply to the configuration that does NOT vendor curl above, where
161
+ # OpenTelemetry resolves the platform's libcurl: they are no-ops against a system package, and
162
+ # they keep the from-source path working for a build that does not use BoringSSL.
163
+ set(CURL_ENABLE_EXPORT_TARGET OFF CACHE BOOL "" FORCE)
164
+ set(CURL_DISABLE_SRP ON CACHE BOOL "" FORCE)
165
+
48
166
  # https://github.com/open-telemetry/opentelemetry-cpp/releases
49
167
  cpmaddpackage(
50
168
  NAME
@@ -62,9 +180,9 @@ if(COUCHBASE_CXX_CLIENT_BUILD_OPENTELEMETRY)
62
180
  "WITH_BENCHMARK OFF"
63
181
  "WITH_EXAMPLES OFF"
64
182
  "WITH_FUNC_TESTS OFF"
65
- "WITH_OTLP_GRPC OFF"
183
+ "WITH_OTLP_GRPC ${_couchbase_otel_with_otlp_grpc}"
184
+ ${_couchbase_otel_protobuf_option}
66
185
  "WITH_OTLP_HTTP ON"
67
- "WITH_HTTP_CLIENT_CURL OFF"
68
186
  "WITH_PROMETHEUS OFF"
69
187
  "WITH_OPENTRACING OFF"
70
188
  "WITH_STL CXX17"
@@ -77,6 +195,10 @@ if(COUCHBASE_CXX_CLIENT_BUILD_OPENTELEMETRY)
77
195
 
78
196
  declare_system_library(opentelemetry_exporter_otlp_http)
79
197
  declare_system_library(opentelemetry_exporter_otlp_http_metric)
198
+ if(_couchbase_otel_with_otlp_grpc)
199
+ declare_system_library(opentelemetry_exporter_otlp_grpc)
200
+ declare_system_library(opentelemetry_exporter_otlp_grpc_metrics)
201
+ endif()
80
202
  endif()
81
203
 
82
204
  if(NOT TARGET Microsoft.GSL::GSL)
@@ -287,8 +409,19 @@ if(asio_ADDED)
287
409
 
288
410
  message(STATUS "Set _WIN32_WINNT=${_WIN32_WINNT}")
289
411
 
290
- target_compile_definitions(asio INTERFACE _WIN32_WINNT=${_WIN32_WINNT} WIN32_LEAN_AND_MEAN)
291
- target_compile_options(asio INTERFACE /bigobj)
412
+ # PUBLIC: asio.cpp and the code including asio's headers must see the same values. asio otherwise
413
+ # derives ASIO_HAS_THREADS per translation unit from predefined macros and earlier includes, and two
414
+ # translation units that disagree compile the same asio classes against different mutex and thread types.
415
+ target_compile_definitions(asio PUBLIC _WIN32_WINNT=${_WIN32_WINNT} WIN32_LEAN_AND_MEAN ASIO_HAS_THREADS=1)
416
+ if(MSVC)
417
+ target_compile_options(asio INTERFACE /bigobj)
418
+ else()
419
+ # MSVC gets these through asio's #pragma comment(lib); MinGW needs them on the link line.
420
+ target_link_libraries(asio PUBLIC ws2_32 mswsock bcrypt)
421
+ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
422
+ target_compile_options(asio INTERFACE -Wa,-mbig-obj)
423
+ endif()
424
+ endif()
292
425
  endif()
293
426
 
294
427
  add_library(asio::asio ALIAS asio)