couchbase 3.8.1 → 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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/ext/CMakeLists.txt +16 -1
- data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
- data/ext/cache/extconf_include.rb +6 -6
- data/ext/cache/mozilla-ca-bundle.crt +214 -155
- data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
- data/ext/couchbase/CMakeLists.txt +130 -21
- data/ext/couchbase/cmake/APKBUILD.in +25 -4
- data/ext/couchbase/cmake/Bundler.cmake +143 -34
- data/ext/couchbase/cmake/CPM.cmake +126 -12
- data/ext/couchbase/cmake/Cache.cmake +7 -1
- data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
- data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
- data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
- data/ext/couchbase/cmake/OpenSSL.cmake +10 -3
- data/ext/couchbase/cmake/Packaging.cmake +519 -65
- data/ext/couchbase/cmake/Protostellar.cmake +250 -0
- data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
- data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
- data/ext/couchbase/cmake/TestFramework.cmake +283 -0
- data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
- data/ext/couchbase/cmake/Testing.cmake +27 -9
- data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
- data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
- data/ext/couchbase/cmake/build_config.hxx.in +2 -1
- data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
- data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
- data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
- data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
- data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
- data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
- data/ext/couchbase/cmake/tarball_glob.txt +49 -0
- data/ext/couchbase/core/agent_group.cxx +0 -8
- data/ext/couchbase/core/agent_group.hxx +0 -4
- data/ext/couchbase/core/analytics_stream.cxx +314 -0
- data/ext/couchbase/core/analytics_stream.hxx +129 -0
- data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
- data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
- data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
- data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
- data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
- data/ext/couchbase/core/bucket.cxx +381 -87
- data/ext/couchbase/core/bucket.hxx +105 -25
- data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
- data/ext/couchbase/core/capella.hxx +91 -0
- data/ext/couchbase/core/cluster.cxx +1554 -398
- data/ext/couchbase/core/cluster.hxx +39 -8
- data/ext/couchbase/core/cluster_agent.cxx +0 -8
- data/ext/couchbase/core/cluster_agent.hxx +0 -4
- data/ext/couchbase/core/cluster_options.hxx +26 -3
- data/ext/couchbase/core/collections_component.cxx +39 -15
- data/ext/couchbase/core/config_profiles.cxx +1 -1
- data/ext/couchbase/core/crud_component.cxx +2 -2
- data/ext/couchbase/core/crud_options.hxx +34 -0
- data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
- data/ext/couchbase/core/document_id_redaction.hxx +81 -0
- data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
- data/ext/couchbase/core/error_context/key_value.cxx +25 -2
- data/ext/couchbase/core/error_context/key_value.hxx +60 -33
- data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
- data/ext/couchbase/core/error_context/search.hxx +5 -0
- data/ext/couchbase/core/error_context/search_json.hxx +3 -0
- data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
- data/ext/couchbase/core/error_context/view.hxx +5 -0
- data/ext/couchbase/core/free_form_http_request.cxx +237 -4
- data/ext/couchbase/core/free_form_http_request.hxx +41 -8
- data/ext/couchbase/core/http_component.cxx +300 -284
- data/ext/couchbase/core/http_component.hxx +0 -4
- data/ext/couchbase/core/impl/analytics.cxx +38 -5
- data/ext/couchbase/core/impl/analytics.hxx +34 -0
- data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
- data/ext/couchbase/core/impl/collection.cxx +215 -202
- data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
- data/ext/couchbase/core/impl/error.cxx +22 -2
- data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
- data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
- data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
- data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
- data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
- data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
- data/ext/couchbase/core/impl/node_id.cxx +49 -13
- data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
- data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
- data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
- data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
- data/ext/couchbase/core/impl/public_cluster.cxx +325 -25
- data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
- data/ext/couchbase/core/impl/query.cxx +76 -7
- data/ext/couchbase/core/impl/query.hxx +36 -0
- data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
- data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
- data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
- data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
- data/ext/couchbase/core/impl/scope.cxx +70 -0
- data/ext/couchbase/core/impl/search.cxx +31 -1
- data/ext/couchbase/core/impl/transactions.cxx +130 -0
- data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
- data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
- data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
- data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
- data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +66 -0
- data/ext/couchbase/core/io/dns_client.cxx +122 -45
- data/ext/couchbase/core/io/dns_codec.hxx +21 -21
- data/ext/couchbase/core/io/dns_config.cxx +21 -6
- data/ext/couchbase/core/io/http_command.hxx +149 -121
- data/ext/couchbase/core/io/http_error.hxx +107 -0
- data/ext/couchbase/core/io/http_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_session.cxx +606 -154
- data/ext/couchbase/core/io/http_session.hxx +147 -30
- data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
- data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
- data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
- data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
- data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
- data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
- data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
- data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
- data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
- data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
- data/ext/couchbase/core/io/mcbp_session.cxx +316 -317
- data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
- data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
- data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
- data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
- data/ext/couchbase/core/io/streams.cxx +275 -14
- data/ext/couchbase/core/io/streams.hxx +53 -0
- data/ext/couchbase/core/logger/logger.cxx +36 -0
- data/ext/couchbase/core/logger/logger.hxx +46 -6
- data/ext/couchbase/core/logger/redaction.hxx +503 -0
- data/ext/couchbase/core/management/eventing_status.hxx +10 -0
- data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
- data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
- data/ext/couchbase/core/mcbp/codec.cxx +27 -18
- data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
- data/ext/couchbase/core/mcbp/packet.hxx +2 -2
- data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
- data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
- data/ext/couchbase/core/meta/features.hxx +13 -0
- data/ext/couchbase/core/meta/version.cxx +6 -3
- data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
- data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
- data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
- data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
- data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
- data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
- data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
- data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
- data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
- data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
- data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
- data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
- data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
- data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
- data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
- data/ext/couchbase/core/operations/document_query.cxx +108 -221
- data/ext/couchbase/core/operations/document_query.hxx +18 -4
- data/ext/couchbase/core/operations/document_search.cxx +52 -8
- data/ext/couchbase/core/operations/document_search.hxx +3 -0
- data/ext/couchbase/core/operations/document_view.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
- data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
- data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
- data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
- data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
- data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
- data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
- data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
- data/ext/couchbase/core/operations/management/bucket_create.cxx +37 -38
- data/ext/couchbase/core/operations/management/bucket_update.cxx +26 -28
- data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
- data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/error_utils.cxx +59 -5
- data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
- data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
- data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
- data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
- data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
- data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
- data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
- data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
- data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
- data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
- data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
- data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
- data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
- data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
- data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
- data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
- data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
- data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
- data/ext/couchbase/core/operations_fwd.hxx +3 -3
- data/ext/couchbase/core/origin.cxx +54 -26
- data/ext/couchbase/core/origin.hxx +12 -0
- data/ext/couchbase/core/orphan_reporter.cxx +2 -1
- data/ext/couchbase/core/platform/random.cc +7 -7
- data/ext/couchbase/core/protocol/client_request.cxx +2 -2
- data/ext/couchbase/core/protocol/client_request.hxx +38 -21
- data/ext/couchbase/core/protocol/client_response.cxx +11 -3
- data/ext/couchbase/core/protocol/client_response.hxx +27 -6
- data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
- data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
- data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
- data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
- data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
- data/ext/couchbase/core/protocol/datatype.hxx +118 -1
- data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
- data/ext/couchbase/core/protocol/magic.hxx +4 -0
- data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
- data/ext/couchbase/core/protocol/server_request.hxx +3 -1
- data/ext/couchbase/core/protocol/status.cxx +1 -1
- data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
- data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
- data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
- data/ext/couchbase/core/protostellar/component.cxx +2445 -0
- data/ext/couchbase/core/protostellar/component.hxx +391 -0
- data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
- data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
- data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
- data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
- data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
- data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
- data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
- data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
- data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
- data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
- data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
- data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
- data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
- data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
- data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
- data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
- data/ext/couchbase/core/query_stream.cxx +447 -0
- data/ext/couchbase/core/query_stream.hxx +141 -0
- data/ext/couchbase/core/query_stream_component.cxx +243 -0
- data/ext/couchbase/core/query_stream_component.hxx +68 -0
- data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
- data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
- data/ext/couchbase/core/response_handler.hxx +41 -4
- data/ext/couchbase/core/row_streamer.cxx +332 -46
- data/ext/couchbase/core/row_streamer.hxx +31 -1
- data/ext/couchbase/core/row_streamer_options.hxx +55 -0
- data/ext/couchbase/core/sasl/client.h +3 -0
- data/ext/couchbase/core/search_scoring.hxx +66 -0
- data/ext/couchbase/core/stream_error_details.hxx +69 -0
- data/ext/couchbase/core/timeout_defaults.hxx +0 -1
- data/ext/couchbase/core/topology/capabilities.hxx +6 -0
- data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
- data/ext/couchbase/core/topology/configuration.cxx +21 -6
- data/ext/couchbase/core/topology/configuration.hxx +29 -8
- data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
- data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
- data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
- data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
- data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +362 -241
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +24 -3
- data/ext/couchbase/core/transactions/error_list.hxx +2 -2
- data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
- data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
- data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
- data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
- data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
- data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
- data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
- data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
- data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
- data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
- data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
- data/ext/couchbase/core/transactions/transactions.cxx +3 -55
- data/ext/couchbase/core/transactions/transactions_cleanup.cxx +194 -66
- data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
- data/ext/couchbase/core/transactions/utils.cxx +10 -0
- data/ext/couchbase/core/transactions/waitable_op_list.hxx +15 -4
- data/ext/couchbase/core/transactions.hxx +9 -9
- data/ext/couchbase/core/utils/byteswap.hxx +166 -9
- data/ext/couchbase/core/utils/connection_string.cxx +50 -85
- data/ext/couchbase/core/utils/connection_string.hxx +15 -0
- data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
- data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
- data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
- data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
- data/ext/couchbase/core/utils/movable_function.hxx +301 -52
- data/ext/couchbase/core/utils/name_codec.hxx +154 -11
- data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
- data/ext/couchbase/core/utils/url_codec.cxx +12 -51
- data/ext/couchbase/core/websocket_codec.cxx +3 -29
- data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
- data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
- data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
- data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
- data/ext/couchbase/couchbase/bucket.hxx +57 -0
- data/ext/couchbase/couchbase/cluster.hxx +216 -5
- data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
- data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
- data/ext/couchbase/couchbase/collection.hxx +234 -14
- data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
- data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
- data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
- data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
- data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/error.hxx +32 -0
- data/ext/couchbase/couchbase/error_codes.hxx +32 -0
- data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
- data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
- data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
- data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
- data/ext/couchbase/couchbase/get_result.hxx +1 -0
- data/ext/couchbase/couchbase/increment_options.hxx +1 -1
- data/ext/couchbase/couchbase/insert_options.hxx +1 -1
- data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/match_query.hxx +1 -1
- data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
- data/ext/couchbase/couchbase/network_options.hxx +1 -1
- data/ext/couchbase/couchbase/node_id.hxx +42 -14
- data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
- data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
- data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
- data/ext/couchbase/couchbase/query_options.hxx +23 -12
- data/ext/couchbase/couchbase/query_row.hxx +111 -0
- data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
- data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
- data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
- data/ext/couchbase/couchbase/replace_options.hxx +3 -3
- data/ext/couchbase/couchbase/result.hxx +14 -3
- data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
- data/ext/couchbase/couchbase/scope.hxx +85 -2
- data/ext/couchbase/couchbase/search_options.hxx +58 -8
- data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
- data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
- data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
- data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
- data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
- data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
- data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
- data/ext/couchbase/couchbase/transactions.hxx +27 -18
- data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
- data/ext/couchbase/couchbase/vector_query.hxx +1 -1
- data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
- data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
- data/ext/extconf.rb +15 -10
- data/ext/rcb_analytics.cxx +82 -102
- data/ext/rcb_backend.cxx +42 -36
- data/ext/rcb_backend.hxx +2 -0
- data/ext/rcb_buckets.cxx +47 -59
- data/ext/rcb_collections.cxx +42 -52
- data/ext/rcb_crud.cxx +345 -224
- data/ext/rcb_diagnostics.cxx +117 -27
- data/ext/rcb_exceptions.cxx +152 -99
- data/ext/rcb_exceptions.hxx +25 -0
- data/ext/rcb_extras.cxx +18 -19
- data/ext/rcb_hdr_histogram.cxx +19 -4
- data/ext/rcb_logger.cxx +202 -27
- data/ext/rcb_logger.hxx +12 -0
- data/ext/rcb_multi.cxx +40 -40
- data/ext/rcb_observability.cxx +7 -5
- data/ext/rcb_query.cxx +99 -142
- data/ext/rcb_range_scan.cxx +41 -35
- data/ext/rcb_search.cxx +98 -99
- data/ext/rcb_users.cxx +36 -56
- data/ext/rcb_utils.cxx +100 -37
- data/ext/rcb_utils.hxx +287 -33
- data/ext/rcb_version.cxx +1 -1
- data/ext/rcb_views.cxx +55 -51
- data/lib/active_support/cache/couchbase_store.rb +77 -12
- data/lib/couchbase/bucket.rb +20 -0
- data/lib/couchbase/cluster.rb +33 -14
- data/lib/couchbase/collection.rb +36 -1
- data/lib/couchbase/errors.rb +18 -0
- data/lib/couchbase/fork_hooks.rb +16 -7
- data/lib/couchbase/get_replica_strategy.rb +89 -0
- data/lib/couchbase/logger.rb +1 -1
- data/lib/couchbase/management/analytics_index_manager.rb +15 -15
- data/lib/couchbase/management/bucket_manager.rb +6 -6
- data/lib/couchbase/management/collection_manager.rb +6 -6
- data/lib/couchbase/management/query_index_manager.rb +7 -7
- data/lib/couchbase/management/search_index_manager.rb +13 -13
- data/lib/couchbase/management/user_manager.rb +10 -10
- data/lib/couchbase/management/view_index_manager.rb +5 -5
- data/lib/couchbase/options.rb +181 -44
- data/lib/couchbase/protostellar/bucket.rb +4 -0
- data/lib/couchbase/protostellar/cluster.rb +4 -0
- data/lib/couchbase/protostellar/collection.rb +4 -0
- data/lib/couchbase/protostellar/error_handling.rb +2 -1
- data/lib/couchbase/protostellar/request.rb +1 -0
- data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
- data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
- data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
- data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
- data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
- data/lib/couchbase/search_options.rb +95 -6
- data/lib/couchbase/version.rb +1 -1
- metadata +92 -33
- data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
- data/ext/couchbase/core/columnar/agent.hxx +0 -71
- data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
- data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
- data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
- data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
- data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
- data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
- data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
- data/ext/couchbase/core/columnar/error.hxx +0 -51
- data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
- data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
- data/ext/couchbase/core/columnar/management_component.cxx +0 -300
- data/ext/couchbase/core/columnar/management_component.hxx +0 -56
- data/ext/couchbase/core/columnar/query_component.cxx +0 -523
- data/ext/couchbase/core/columnar/query_component.hxx +0 -57
- data/ext/couchbase/core/columnar/query_options.hxx +0 -59
- data/ext/couchbase/core/columnar/query_result.cxx +0 -130
- data/ext/couchbase/core/columnar/query_result.hxx +0 -78
- data/ext/couchbase/core/io/config_tracker.cxx +0 -687
- 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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
-
#
|
|
45
|
-
# OpenTelemetry
|
|
46
|
-
#
|
|
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
|
|
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
|
-
|
|
291
|
-
|
|
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)
|