couchbase 3.4.1 → 3.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (278) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/couchbase/CMakeLists.txt +59 -7
  4. data/ext/couchbase/cmake/Documentation.cmake +0 -1
  5. data/ext/couchbase/cmake/OpenSSL.cmake +98 -3
  6. data/ext/couchbase/cmake/Testing.cmake +12 -4
  7. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +4 -0
  8. data/ext/couchbase/cmake/build_config.hxx.in +3 -0
  9. data/ext/couchbase/core/bucket.cxx +3 -2
  10. data/ext/couchbase/core/bucket.hxx +9 -0
  11. data/ext/couchbase/core/cluster.hxx +17 -0
  12. data/ext/couchbase/core/cluster_options.cxx +2 -2
  13. data/ext/couchbase/core/cluster_options.hxx +4 -7
  14. data/ext/couchbase/core/{config_profile.cxx → cluster_options_fwd.hxx} +7 -6
  15. data/ext/couchbase/core/config_profile.hxx +2 -65
  16. data/ext/couchbase/core/config_profiles.cxx +79 -0
  17. data/ext/couchbase/core/config_profiles.hxx +56 -0
  18. data/ext/couchbase/core/error_context/search.hxx +1 -1
  19. data/ext/couchbase/core/impl/analytics.cxx +237 -0
  20. data/ext/couchbase/core/impl/boolean_field_query.cxx +40 -0
  21. data/ext/couchbase/core/impl/boolean_query.cxx +62 -0
  22. data/ext/couchbase/core/impl/cluster.cxx +2 -1
  23. data/ext/couchbase/core/impl/conjunction_query.cxx +51 -0
  24. data/ext/couchbase/core/impl/date_range.cxx +89 -0
  25. data/ext/couchbase/core/impl/date_range_facet.cxx +54 -0
  26. data/ext/couchbase/core/impl/date_range_facet_result.cxx +64 -0
  27. data/ext/couchbase/core/impl/date_range_query.cxx +125 -0
  28. data/ext/couchbase/core/impl/disjunction_query.cxx +51 -0
  29. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +5 -3
  30. data/ext/couchbase/core/impl/encoded_search_facet.hxx +29 -0
  31. data/ext/couchbase/core/impl/encoded_search_query.hxx +29 -0
  32. data/ext/couchbase/core/impl/encoded_search_sort.hxx +29 -0
  33. data/ext/couchbase/core/impl/geo_bounding_box_query.cxx +46 -0
  34. data/ext/couchbase/core/impl/geo_distance_query.cxx +43 -0
  35. data/ext/couchbase/core/impl/geo_polygon_query.cxx +46 -0
  36. data/ext/couchbase/core/impl/internal_date_range_facet_result.cxx +80 -0
  37. data/ext/couchbase/core/impl/internal_date_range_facet_result.hxx +48 -0
  38. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.cxx +80 -0
  39. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.hxx +48 -0
  40. data/ext/couchbase/core/impl/internal_search_error_context.cxx +141 -0
  41. data/ext/couchbase/core/impl/internal_search_error_context.hxx +61 -0
  42. data/ext/couchbase/core/impl/internal_search_meta_data.cxx +60 -0
  43. data/ext/couchbase/core/impl/internal_search_meta_data.hxx +41 -0
  44. data/ext/couchbase/core/impl/internal_search_result.cxx +84 -0
  45. data/ext/couchbase/core/impl/internal_search_result.hxx +43 -0
  46. data/ext/couchbase/core/impl/internal_search_row.cxx +82 -0
  47. data/ext/couchbase/core/impl/internal_search_row.hxx +56 -0
  48. data/ext/couchbase/core/impl/internal_search_row_location.hxx +32 -0
  49. data/ext/couchbase/core/impl/internal_search_row_locations.cxx +137 -0
  50. data/ext/couchbase/core/impl/internal_search_row_locations.hxx +45 -0
  51. data/ext/couchbase/core/impl/internal_term_facet_result.cxx +80 -0
  52. data/ext/couchbase/core/impl/internal_term_facet_result.hxx +48 -0
  53. data/ext/couchbase/core/impl/match_all_query.cxx +35 -0
  54. data/ext/couchbase/core/impl/match_none_query.cxx +35 -0
  55. data/ext/couchbase/core/impl/match_phrase_query.cxx +43 -0
  56. data/ext/couchbase/core/impl/match_query.cxx +59 -0
  57. data/ext/couchbase/core/impl/numeric_range.cxx +49 -0
  58. data/ext/couchbase/core/impl/numeric_range_facet.cxx +54 -0
  59. data/ext/couchbase/core/impl/numeric_range_facet_result.cxx +64 -0
  60. data/ext/couchbase/core/impl/numeric_range_query.cxx +56 -0
  61. data/ext/couchbase/core/impl/phrase_query.cxx +42 -0
  62. data/ext/couchbase/core/impl/prefix_query.cxx +40 -0
  63. data/ext/couchbase/core/impl/query.cxx +5 -5
  64. data/ext/couchbase/core/impl/query_string_query.cxx +37 -0
  65. data/ext/couchbase/core/impl/regexp_query.cxx +40 -0
  66. data/ext/couchbase/core/impl/search.cxx +191 -0
  67. data/ext/couchbase/core/impl/search_error_context.cxx +147 -0
  68. data/ext/couchbase/core/impl/search_meta_data.cxx +46 -0
  69. data/ext/couchbase/core/impl/search_result.cxx +66 -0
  70. data/ext/couchbase/core/impl/search_row.cxx +74 -0
  71. data/ext/couchbase/core/impl/search_row_location.cxx +64 -0
  72. data/ext/couchbase/core/impl/search_row_locations.cxx +66 -0
  73. data/ext/couchbase/core/impl/search_sort_field.cxx +104 -0
  74. data/ext/couchbase/core/impl/search_sort_id.cxx +43 -0
  75. data/ext/couchbase/core/impl/search_sort_score.cxx +43 -0
  76. data/ext/couchbase/core/impl/term_facet.cxx +36 -0
  77. data/ext/couchbase/core/impl/term_facet_result.cxx +64 -0
  78. data/ext/couchbase/core/impl/term_query.cxx +56 -0
  79. data/ext/couchbase/core/impl/term_range_query.cxx +57 -0
  80. data/ext/couchbase/core/impl/wildcard_query.cxx +40 -0
  81. data/ext/couchbase/core/io/dns_client.cxx +225 -0
  82. data/ext/couchbase/core/io/dns_client.hxx +19 -188
  83. data/ext/couchbase/core/io/http_context.hxx +1 -1
  84. data/ext/couchbase/core/io/http_session.hxx +10 -0
  85. data/ext/couchbase/core/io/http_session_manager.hxx +5 -3
  86. data/ext/couchbase/core/io/mcbp_session.cxx +28 -1
  87. data/ext/couchbase/core/io/retry_orchestrator.hxx +3 -2
  88. data/ext/couchbase/core/json_string.hxx +5 -0
  89. data/ext/couchbase/core/meta/version.cxx +18 -4
  90. data/ext/couchbase/core/mozilla_ca_bundle.hxx +39 -0
  91. data/ext/couchbase/core/operations/document_analytics.cxx +1 -0
  92. data/ext/couchbase/core/operations/document_analytics.hxx +1 -0
  93. data/ext/couchbase/core/operations/document_append.hxx +1 -1
  94. data/ext/couchbase/core/operations/document_decrement.hxx +1 -1
  95. data/ext/couchbase/core/operations/document_exists.hxx +1 -1
  96. data/ext/couchbase/core/operations/document_get.hxx +1 -1
  97. data/ext/couchbase/core/operations/document_get_and_lock.hxx +1 -1
  98. data/ext/couchbase/core/operations/document_get_and_touch.hxx +1 -1
  99. data/ext/couchbase/core/operations/document_get_projected.hxx +1 -1
  100. data/ext/couchbase/core/operations/document_increment.hxx +1 -1
  101. data/ext/couchbase/core/operations/document_insert.hxx +1 -1
  102. data/ext/couchbase/core/operations/document_lookup_in.hxx +1 -1
  103. data/ext/couchbase/core/operations/document_mutate_in.hxx +1 -1
  104. data/ext/couchbase/core/operations/document_prepend.hxx +1 -1
  105. data/ext/couchbase/core/operations/document_query.cxx +2 -0
  106. data/ext/couchbase/core/operations/document_query.hxx +6 -0
  107. data/ext/couchbase/core/operations/document_remove.hxx +1 -1
  108. data/ext/couchbase/core/operations/document_replace.hxx +1 -1
  109. data/ext/couchbase/core/operations/document_search.cxx +4 -1
  110. data/ext/couchbase/core/operations/document_search.hxx +2 -1
  111. data/ext/couchbase/core/operations/document_touch.hxx +1 -1
  112. data/ext/couchbase/core/operations/document_unlock.hxx +1 -1
  113. data/ext/couchbase/core/operations/document_upsert.hxx +1 -1
  114. data/ext/couchbase/core/operations/document_view.hxx +1 -0
  115. data/ext/couchbase/core/protocol/client_request.hxx +11 -2
  116. data/ext/couchbase/core/public_fwd.hxx +21 -0
  117. data/ext/couchbase/core/tls_verify_mode.hxx +26 -0
  118. data/ext/couchbase/core/topology/configuration.cxx +15 -2
  119. data/ext/couchbase/core/topology/configuration.hxx +5 -1
  120. data/ext/couchbase/core/transactions/active_transaction_record.hxx +2 -2
  121. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +3 -0
  122. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +1 -1
  123. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.cxx +93 -0
  124. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.hxx +48 -75
  125. data/ext/couchbase/core/transactions/cleanup_testing_hooks.cxx +52 -0
  126. data/ext/couchbase/core/transactions/cleanup_testing_hooks.hxx +17 -31
  127. data/ext/couchbase/core/transactions/exceptions.hxx +12 -9
  128. data/ext/couchbase/core/transactions/internal/transaction_context.hxx +12 -12
  129. data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +7 -1
  130. data/ext/couchbase/core/transactions/transaction_context.cxx +1 -0
  131. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +144 -155
  132. data/ext/couchbase/core/utils/connection_string.cxx +27 -3
  133. data/ext/couchbase/core/utils/connection_string.hxx +3 -3
  134. data/ext/couchbase/core/utils/json.cxx +4 -1
  135. data/ext/couchbase/couchbase/analytics_error_context.hxx +143 -0
  136. data/ext/couchbase/couchbase/analytics_meta_data.hxx +155 -0
  137. data/ext/couchbase/couchbase/analytics_metrics.hxx +163 -0
  138. data/ext/couchbase/couchbase/analytics_options.hxx +359 -0
  139. data/ext/couchbase/couchbase/analytics_result.hxx +102 -0
  140. data/ext/couchbase/couchbase/analytics_scan_consistency.hxx +46 -0
  141. data/ext/couchbase/couchbase/analytics_status.hxx +41 -0
  142. data/ext/couchbase/couchbase/analytics_warning.hxx +85 -0
  143. data/ext/couchbase/couchbase/behavior_options.hxx +10 -1
  144. data/ext/couchbase/couchbase/boolean_field_query.hxx +77 -0
  145. data/ext/couchbase/couchbase/boolean_query.hxx +223 -0
  146. data/ext/couchbase/couchbase/cluster.hxx +75 -1
  147. data/ext/couchbase/couchbase/conjunction_query.hxx +88 -0
  148. data/ext/couchbase/couchbase/date_range.hxx +69 -0
  149. data/ext/couchbase/couchbase/date_range_facet.hxx +56 -0
  150. data/ext/couchbase/couchbase/date_range_facet_result.hxx +55 -0
  151. data/ext/couchbase/couchbase/date_range_query.hxx +265 -0
  152. data/ext/couchbase/couchbase/disjunction_query.hxx +109 -0
  153. data/ext/couchbase/couchbase/doc_id_query.hxx +111 -0
  154. data/ext/couchbase/couchbase/error_context.hxx +7 -6
  155. data/ext/couchbase/couchbase/fmt/analytics_scan_consistency.hxx +52 -0
  156. data/ext/couchbase/couchbase/fmt/analytics_status.hxx +76 -0
  157. data/ext/couchbase/couchbase/fmt/search_scan_consistency.hxx +49 -0
  158. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +107 -0
  159. data/ext/couchbase/couchbase/geo_distance_query.hxx +109 -0
  160. data/ext/couchbase/couchbase/geo_point.hxx +32 -0
  161. data/ext/couchbase/couchbase/geo_polygon_query.hxx +85 -0
  162. data/ext/couchbase/couchbase/highlight_style.hxx +45 -0
  163. data/ext/couchbase/couchbase/match_all_query.hxx +43 -0
  164. data/ext/couchbase/couchbase/match_none_query.hxx +43 -0
  165. data/ext/couchbase/couchbase/match_operator.hxx +45 -0
  166. data/ext/couchbase/couchbase/match_phrase_query.hxx +108 -0
  167. data/ext/couchbase/couchbase/match_query.hxx +163 -0
  168. data/ext/couchbase/couchbase/numeric_range.hxx +58 -0
  169. data/ext/couchbase/couchbase/numeric_range_facet.hxx +56 -0
  170. data/ext/couchbase/couchbase/numeric_range_facet_result.hxx +55 -0
  171. data/ext/couchbase/couchbase/numeric_range_query.hxx +143 -0
  172. data/ext/couchbase/couchbase/phrase_query.hxx +93 -0
  173. data/ext/couchbase/couchbase/prefix_query.hxx +82 -0
  174. data/ext/couchbase/couchbase/query_options.hxx +0 -1
  175. data/ext/couchbase/couchbase/query_string_query.hxx +72 -0
  176. data/ext/couchbase/couchbase/regexp_query.hxx +82 -0
  177. data/ext/couchbase/couchbase/scope.hxx +73 -0
  178. data/ext/couchbase/couchbase/search_date_range.hxx +68 -0
  179. data/ext/couchbase/couchbase/search_error_context.hxx +138 -0
  180. data/ext/couchbase/couchbase/search_facet.hxx +60 -0
  181. data/ext/couchbase/couchbase/search_facet_result.hxx +50 -0
  182. data/ext/couchbase/couchbase/search_meta_data.hxx +85 -0
  183. data/ext/couchbase/couchbase/search_metrics.hxx +127 -0
  184. data/ext/couchbase/couchbase/search_numeric_range.hxx +69 -0
  185. data/ext/couchbase/couchbase/search_options.hxx +509 -0
  186. data/ext/couchbase/couchbase/search_query.hxx +69 -0
  187. data/ext/couchbase/couchbase/search_result.hxx +77 -0
  188. data/ext/couchbase/couchbase/search_row.hxx +104 -0
  189. data/ext/couchbase/couchbase/search_row_location.hxx +55 -0
  190. data/ext/couchbase/couchbase/search_row_locations.hxx +86 -0
  191. data/ext/couchbase/couchbase/search_scan_consistency.hxx +34 -0
  192. data/ext/couchbase/couchbase/search_sort.hxx +58 -0
  193. data/ext/couchbase/couchbase/search_sort_field.hxx +117 -0
  194. data/ext/couchbase/couchbase/search_sort_field_missing.hxx +26 -0
  195. data/ext/couchbase/couchbase/search_sort_field_mode.hxx +27 -0
  196. data/ext/couchbase/couchbase/search_sort_field_type.hxx +28 -0
  197. data/ext/couchbase/couchbase/search_sort_id.hxx +60 -0
  198. data/ext/couchbase/couchbase/search_sort_score.hxx +60 -0
  199. data/ext/couchbase/couchbase/search_term_range.hxx +51 -0
  200. data/ext/couchbase/couchbase/security_options.hxx +3 -0
  201. data/ext/couchbase/couchbase/term_facet.hxx +48 -0
  202. data/ext/couchbase/couchbase/term_facet_result.hxx +55 -0
  203. data/ext/couchbase/couchbase/term_query.hxx +151 -0
  204. data/ext/couchbase/couchbase/term_range_query.hxx +142 -0
  205. data/ext/couchbase/couchbase/tracing/request_span.hxx +63 -0
  206. data/ext/couchbase/couchbase/tracing/request_tracer.hxx +2 -40
  207. data/ext/couchbase/couchbase/transactions/async_attempt_context.hxx +83 -4
  208. data/ext/couchbase/couchbase/transactions/attempt_context.hxx +68 -1
  209. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +2 -0
  210. data/ext/couchbase/couchbase/transactions/transaction_keyspace.hxx +11 -1
  211. data/ext/couchbase/couchbase/transactions/transaction_options.hxx +79 -8
  212. data/ext/couchbase/couchbase/transactions/transaction_query_options.hxx +128 -15
  213. data/ext/couchbase/couchbase/transactions/transaction_query_result.hxx +4 -0
  214. data/ext/couchbase/couchbase/transactions/transaction_result.hxx +1 -1
  215. data/ext/couchbase/couchbase/transactions/transactions_cleanup_config.hxx +5 -3
  216. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +9 -5
  217. data/ext/couchbase/couchbase/transactions/transactions_query_config.hxx +6 -3
  218. data/ext/couchbase/couchbase/transactions.hxx +34 -1
  219. data/ext/couchbase/couchbase/wildcard_query.hxx +83 -0
  220. data/ext/couchbase/test/CMakeLists.txt +8 -7
  221. data/ext/couchbase/test/benchmark_helper_integration.hxx +2 -2
  222. data/ext/couchbase/test/test_helper.hxx +6 -6
  223. data/ext/couchbase/test/test_integration_analytics.cxx +314 -16
  224. data/ext/couchbase/test/test_integration_collections.cxx +7 -3
  225. data/ext/couchbase/test/test_integration_connect.cxx +7 -3
  226. data/ext/couchbase/test/test_integration_crud.cxx +19 -2
  227. data/ext/couchbase/test/test_integration_diagnostics.cxx +11 -5
  228. data/ext/couchbase/test/test_integration_durability.cxx +12 -7
  229. data/ext/couchbase/test/test_integration_examples.cxx +324 -11
  230. data/ext/couchbase/test/test_integration_management.cxx +162 -94
  231. data/ext/couchbase/test/test_integration_query.cxx +68 -10
  232. data/ext/couchbase/test/test_integration_range_scan.cxx +12 -12
  233. data/ext/couchbase/test/test_integration_read_replica.cxx +48 -11
  234. data/ext/couchbase/test/test_integration_search.cxx +621 -0
  235. data/ext/couchbase/test/test_integration_subdoc.cxx +62 -11
  236. data/ext/couchbase/test/test_integration_tracer.cxx +5 -0
  237. data/ext/couchbase/test/test_integration_transcoders.cxx +13 -5
  238. data/ext/couchbase/test/{test_transaction_transaction_context.cxx → test_transaction_context.cxx} +1 -1
  239. data/ext/couchbase/test/test_transaction_examples.cxx +195 -0
  240. data/ext/couchbase/test/{test_transaction_transaction_simple.cxx → test_transaction_simple.cxx} +90 -5
  241. data/ext/couchbase/test/{test_transaction_transaction_simple_async.cxx → test_transaction_simple_async.cxx} +19 -21
  242. data/ext/couchbase/test/test_unit_config_profiles.cxx +13 -13
  243. data/ext/couchbase/test/test_unit_connection_string.cxx +35 -0
  244. data/ext/couchbase/test/test_unit_json_transcoder.cxx +4 -0
  245. data/ext/couchbase/test/test_unit_search.cxx +427 -0
  246. data/ext/couchbase/test/test_unit_transaction_utils.cxx +10 -1
  247. data/ext/couchbase/test/test_unit_utils.cxx +8 -4
  248. data/ext/couchbase/third_party/snappy/CMakeLists.txt +150 -27
  249. data/ext/couchbase/third_party/snappy/cmake/config.h.in +28 -24
  250. data/ext/couchbase/third_party/snappy/snappy-internal.h +189 -25
  251. data/ext/couchbase/third_party/snappy/snappy-sinksource.cc +26 -9
  252. data/ext/couchbase/third_party/snappy/snappy-sinksource.h +11 -11
  253. data/ext/couchbase/third_party/snappy/snappy-stubs-internal.cc +1 -1
  254. data/ext/couchbase/third_party/snappy/snappy-stubs-internal.h +227 -308
  255. data/ext/couchbase/third_party/snappy/snappy-stubs-public.h.in +0 -11
  256. data/ext/couchbase/third_party/snappy/snappy.cc +1176 -410
  257. data/ext/couchbase/third_party/snappy/snappy.h +19 -4
  258. data/ext/couchbase.cxx +85 -22
  259. data/ext/revisions.rb +3 -3
  260. data/lib/couchbase/authenticator.rb +0 -1
  261. data/lib/couchbase/cluster.rb +13 -13
  262. data/lib/couchbase/cluster_registry.rb +7 -2
  263. data/lib/couchbase/config_profiles.rb +1 -1
  264. data/lib/couchbase/configuration.rb +3 -4
  265. data/lib/couchbase/json_transcoder.rb +12 -5
  266. data/lib/couchbase/management/collection_query_index_manager.rb +54 -15
  267. data/lib/couchbase/management/query_index_manager.rb +70 -5
  268. data/lib/couchbase/options.rb +85 -2
  269. data/lib/couchbase/raw_binary_transcoder.rb +37 -0
  270. data/lib/couchbase/raw_json_transcoder.rb +38 -0
  271. data/lib/couchbase/raw_string_transcoder.rb +40 -0
  272. data/lib/couchbase/search_options.rb +163 -240
  273. data/lib/couchbase/transcoder_flags.rb +62 -0
  274. data/lib/couchbase/version.rb +1 -1
  275. metadata +151 -12
  276. data/ext/couchbase/core/CMakeLists.txt +0 -0
  277. /data/ext/couchbase/test/{test_transaction_transaction_public_async_api.cxx → test_transaction_public_async_api.cxx} +0 -0
  278. /data/ext/couchbase/test/{test_transaction_transaction_public_blocking_api.cxx → test_transaction_public_blocking_api.cxx} +0 -0
@@ -17,15 +17,19 @@
17
17
 
18
18
  #include "core/operations/management/analytics.hxx"
19
19
  #include "core/operations/management/collection_create.hxx"
20
- #include "core/operations/management/scope_create.hxx"
20
+ #include "core/operations/management/collections.hxx"
21
21
  #include "test_helper_integration.hxx"
22
22
 
23
23
  TEST_CASE("integration: analytics query")
24
24
  {
25
25
  test::utils::integration_test_guard integration;
26
26
 
27
+ if (integration.ctx.deployment == test::utils::deployment_type::elixir) {
28
+ SKIP("elixir deployment does not support analytics");
29
+ }
30
+
27
31
  if (!integration.cluster_version().supports_analytics()) {
28
- return;
32
+ SKIP("cluster does not support analytics");
29
33
  }
30
34
 
31
35
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
@@ -78,7 +82,7 @@ TEST_CASE("integration: analytics query")
78
82
  REQUIRE(test::utils::wait_until([&]() {
79
83
  couchbase::core::operations::analytics_request req{};
80
84
  req.statement = fmt::format(R"(SELECT testkey FROM `Default`.`{}` WHERE testkey = ?)", dataset_name);
81
- req.positional_parameters.emplace_back(couchbase::core::json_string(couchbase::core::utils::json::generate(test_value)));
85
+ req.positional_parameters.emplace_back(couchbase::core::utils::json::generate(test_value));
82
86
  resp = test::utils::execute(integration.cluster, req);
83
87
  return resp.rows.size() == 1;
84
88
  }));
@@ -130,10 +134,30 @@ TEST_CASE("integration: analytics query")
130
134
 
131
135
  SECTION("consistency")
132
136
  {
133
- couchbase::core::operations::analytics_request req{};
134
- req.statement = fmt::format(R"(SELECT testkey FROM `Default`.`{}` WHERE testkey = "{}")", dataset_name, test_value);
135
- req.scan_consistency = couchbase::core::analytics_scan_consistency::request_plus;
136
- auto resp = test::utils::execute(integration.cluster, req);
137
+ couchbase::core::operations::analytics_response resp{};
138
+ CHECK(test::utils::wait_until([&]() {
139
+ /*
140
+ * In consistency test, always do fresh mutation
141
+ */
142
+ test_value = test::utils::uniq_id("value");
143
+ value = couchbase::core::utils::json::generate({ { "testkey", test_value } });
144
+ {
145
+ auto id = couchbase::core::document_id(integration.ctx.bucket, "_default", "_default", key);
146
+ couchbase::core::operations::upsert_request req{ id, couchbase::core::utils::to_binary(value) };
147
+ REQUIRE_SUCCESS(test::utils::execute(integration.cluster, req).ctx.ec());
148
+ }
149
+
150
+ couchbase::core::operations::analytics_request req{};
151
+ req.statement = fmt::format(R"(SELECT testkey FROM `Default`.`{}` WHERE testkey = "{}")", dataset_name, test_value);
152
+ req.scan_consistency = couchbase::core::analytics_scan_consistency::request_plus;
153
+ resp = test::utils::execute(integration.cluster, req);
154
+ /* Analytics might give us code 23027, ignore it here
155
+ *
156
+ * "errors": [{"code": 23027, "msg": "Bucket default on link Default.Local is not connected"} ],
157
+ */
158
+ return resp.ctx.first_error_code != 23027;
159
+ }));
160
+
137
161
  REQUIRE_SUCCESS(resp.ctx.ec);
138
162
  REQUIRE(resp.rows.size() == 1);
139
163
  REQUIRE(resp.rows[0] == value);
@@ -160,8 +184,15 @@ TEST_CASE("integration: analytics scope query")
160
184
  {
161
185
  test::utils::integration_test_guard integration;
162
186
 
163
- if (!integration.cluster_version().supports_analytics() || !integration.cluster_version().supports_collections()) {
164
- return;
187
+ if (integration.ctx.deployment == test::utils::deployment_type::elixir) {
188
+ SKIP("elixir deployment does not support analytics");
189
+ }
190
+
191
+ if (!integration.cluster_version().supports_analytics()) {
192
+ SKIP("cluster does not support analytics");
193
+ }
194
+ if (!integration.cluster_version().supports_collections()) {
195
+ SKIP("cluster does not support collections");
165
196
  }
166
197
 
167
198
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
@@ -185,13 +216,15 @@ TEST_CASE("integration: analytics scope query")
185
216
  REQUIRE(created);
186
217
  }
187
218
 
188
- {
189
- couchbase::core::operations::analytics_request req{};
190
- req.statement =
191
- fmt::format("ALTER COLLECTION `{}`.`{}`.`{}` ENABLE ANALYTICS", integration.ctx.bucket, scope_name, collection_name);
192
- auto resp = test::utils::execute(integration.cluster, req);
193
- REQUIRE_SUCCESS(resp.ctx.ec);
194
- }
219
+ CHECK(test::utils::wait_until(
220
+ [&]() {
221
+ couchbase::core::operations::analytics_request req{};
222
+ req.statement =
223
+ fmt::format("ALTER COLLECTION `{}`.`{}`.`{}` ENABLE ANALYTICS", integration.ctx.bucket, scope_name, collection_name);
224
+ auto resp = test::utils::execute(integration.cluster, req);
225
+ return !resp.ctx.ec;
226
+ },
227
+ std::chrono::minutes{ 5 }));
195
228
 
196
229
  auto key = test::utils::uniq_id("key");
197
230
  auto test_value = test::utils::uniq_id("value");
@@ -259,3 +292,268 @@ TEST_CASE("unit: analytics query")
259
292
  REQUIRE(http_req.headers.find("analytics-priority") == http_req.headers.end());
260
293
  }
261
294
  }
295
+
296
+ TEST_CASE("integration: public API analytics query")
297
+ {
298
+ test::utils::integration_test_guard integration;
299
+
300
+ if (integration.ctx.deployment == test::utils::deployment_type::elixir) {
301
+ SKIP("elixir deployment does not support analytics");
302
+ }
303
+
304
+ if (!integration.cluster_version().supports_analytics()) {
305
+ SKIP("cluster does not support analytics");
306
+ }
307
+
308
+ auto cluster = couchbase::cluster(integration.cluster);
309
+ auto bucket = cluster.bucket(integration.ctx.bucket);
310
+ auto collection = bucket.default_collection();
311
+
312
+ auto dataset_name = test::utils::uniq_id("dataset");
313
+
314
+ {
315
+ couchbase::core::operations::management::analytics_dataset_create_request req{};
316
+ req.dataset_name = dataset_name;
317
+ req.bucket_name = integration.ctx.bucket;
318
+ auto resp = test::utils::execute(integration.cluster, req);
319
+ REQUIRE_SUCCESS(resp.ctx.ec);
320
+ }
321
+
322
+ {
323
+ couchbase::core::operations::management::analytics_link_connect_request req{};
324
+ req.force = true;
325
+ auto resp = test::utils::execute(integration.cluster, req);
326
+ REQUIRE_SUCCESS(resp.ctx.ec);
327
+ }
328
+
329
+ auto key = test::utils::uniq_id("key");
330
+ auto test_value = test::utils::uniq_id("value");
331
+ tao::json::value document = {
332
+ { "testkey", test_value },
333
+ };
334
+ {
335
+ auto [ctx, resp] = collection.upsert(key, document).get();
336
+ REQUIRE_SUCCESS(ctx.ec());
337
+ }
338
+
339
+ SECTION("simple query")
340
+ {
341
+ couchbase::analytics_result resp{};
342
+ couchbase::analytics_error_context ctx{};
343
+ CHECK(test::utils::wait_until([&]() {
344
+ std::tie(ctx, resp) =
345
+ cluster.analytics_query(fmt::format(R"(SELECT testkey FROM `Default`.`{}` WHERE testkey = "{}")", dataset_name, test_value))
346
+ .get();
347
+ return !ctx.ec() && resp.meta_data().metrics().result_count() == 1;
348
+ }));
349
+ REQUIRE_SUCCESS(ctx.ec());
350
+ REQUIRE_FALSE(resp.meta_data().request_id().empty());
351
+ REQUIRE_FALSE(resp.meta_data().client_context_id().empty());
352
+ REQUIRE(resp.meta_data().status() == couchbase::analytics_status::success);
353
+ auto rows = resp.rows_as_json();
354
+ REQUIRE(rows.size() == 1);
355
+ REQUIRE(rows[0] == document);
356
+ }
357
+
358
+ SECTION("positional params")
359
+ {
360
+ couchbase::analytics_result resp{};
361
+ couchbase::analytics_error_context ctx{};
362
+ CHECK(test::utils::wait_until([&]() {
363
+ std::tie(ctx, resp) = cluster
364
+ .analytics_query(fmt::format(R"(SELECT testkey FROM `Default`.`{}` WHERE testkey = ?)", dataset_name),
365
+ couchbase::analytics_options{}.positional_parameters(test_value))
366
+ .get();
367
+ return !ctx.ec() && resp.meta_data().metrics().result_count() == 1;
368
+ }));
369
+ REQUIRE_SUCCESS(ctx.ec());
370
+ auto rows = resp.rows_as_json();
371
+ REQUIRE(rows.size() == 1);
372
+ REQUIRE(rows[0] == document);
373
+ }
374
+
375
+ SECTION("named params")
376
+ {
377
+ couchbase::analytics_result resp{};
378
+ couchbase::analytics_error_context ctx{};
379
+ CHECK(test::utils::wait_until([&]() {
380
+ std::tie(ctx, resp) =
381
+ cluster
382
+ .analytics_query(fmt::format(R"(SELECT testkey FROM `Default`.`{}` WHERE testkey = $testkey)", dataset_name),
383
+ couchbase::analytics_options{}.named_parameters(std::pair{ "testkey", test_value }))
384
+ .get();
385
+ return !ctx.ec() && resp.meta_data().metrics().result_count() == 1;
386
+ }));
387
+ REQUIRE_SUCCESS(ctx.ec());
388
+ auto rows = resp.rows_as_json();
389
+ REQUIRE(rows.size() == 1);
390
+ REQUIRE(rows[0] == document);
391
+ }
392
+
393
+ SECTION("named params preformatted")
394
+ {
395
+ couchbase::analytics_result resp{};
396
+ couchbase::analytics_error_context ctx{};
397
+ CHECK(test::utils::wait_until([&]() {
398
+ std::tie(ctx, resp) =
399
+ cluster
400
+ .analytics_query(fmt::format(R"(SELECT testkey FROM `Default`.`{}` WHERE testkey = $testkey)", dataset_name),
401
+ couchbase::analytics_options{}.encoded_named_parameters(
402
+ { { "testkey", couchbase::core::utils::json::generate_binary(test_value) } }))
403
+ .get();
404
+ return !ctx.ec() && resp.meta_data().metrics().result_count() == 1;
405
+ }));
406
+ REQUIRE_SUCCESS(ctx.ec());
407
+ auto rows = resp.rows_as_json();
408
+ REQUIRE(rows.size() == 1);
409
+ REQUIRE(rows[0] == document);
410
+ }
411
+
412
+ SECTION("raw")
413
+ {
414
+ couchbase::analytics_result resp{};
415
+ couchbase::analytics_error_context ctx{};
416
+ CHECK(test::utils::wait_until([&]() {
417
+ std::tie(ctx, resp) =
418
+ cluster
419
+ .analytics_query(fmt::format(R"(SELECT testkey FROM `Default`.`{}` WHERE testkey = $testkey)", dataset_name),
420
+ couchbase::analytics_options{}.raw("$testkey", test_value))
421
+ .get();
422
+ return !ctx.ec() && resp.meta_data().metrics().result_count() == 1;
423
+ }));
424
+ REQUIRE_SUCCESS(ctx.ec());
425
+ auto rows = resp.rows_as_json();
426
+ REQUIRE(rows.size() == 1);
427
+ REQUIRE(rows[0] == document);
428
+ }
429
+
430
+ SECTION("consistency")
431
+ {
432
+ couchbase::analytics_result resp{};
433
+ couchbase::analytics_error_context ctx{};
434
+ CHECK(test::utils::wait_until([&]() {
435
+ /*
436
+ * In consistency test, always do fresh mutation
437
+ */
438
+ test_value = test::utils::uniq_id("value");
439
+ document = {
440
+ { "testkey", test_value },
441
+ };
442
+ {
443
+ auto [ctx2, _] = collection.upsert(key, document).get();
444
+ REQUIRE_SUCCESS(ctx2.ec());
445
+ }
446
+
447
+ std::tie(ctx, resp) =
448
+ cluster
449
+ .analytics_query(fmt::format(R"(SELECT testkey FROM `Default`.`{}` WHERE testkey = "{}")", dataset_name, test_value),
450
+ couchbase::analytics_options{}.scan_consistency(couchbase::analytics_scan_consistency::request_plus))
451
+ .get();
452
+ /* Analytics might give us code 23027, ignore it here
453
+ *
454
+ * "errors": [{"code": 23027, "msg": "Bucket default on link Default.Local is not connected"} ],
455
+ */
456
+ return ctx.first_error_code() != 23027;
457
+ }));
458
+
459
+ REQUIRE_SUCCESS(ctx.ec());
460
+ auto rows = resp.rows_as_json();
461
+ REQUIRE(rows.size() == 1);
462
+ REQUIRE(rows[0] == document);
463
+ }
464
+
465
+ SECTION("readonly")
466
+ {
467
+ auto [ctx, resp] =
468
+ cluster.analytics_query(fmt::format("DROP DATASET Default.`{}`", dataset_name), couchbase::analytics_options{}.readonly(true))
469
+ .get();
470
+
471
+ REQUIRE(ctx.ec() == couchbase::errc::common::internal_server_failure);
472
+ REQUIRE(resp.meta_data().status() == couchbase::analytics_status::fatal);
473
+ }
474
+
475
+ {
476
+ couchbase::core::operations::management::analytics_dataset_drop_request req{};
477
+ req.dataset_name = dataset_name;
478
+ test::utils::execute(integration.cluster, req);
479
+ }
480
+ }
481
+
482
+ TEST_CASE("integration: public API analytics scope query")
483
+ {
484
+ test::utils::integration_test_guard integration;
485
+
486
+ if (integration.ctx.deployment == test::utils::deployment_type::elixir) {
487
+ SKIP("elixir deployment does not support analytics");
488
+ }
489
+
490
+ if (!integration.cluster_version().supports_analytics()) {
491
+ SKIP("cluster does not support analytics");
492
+ }
493
+ if (!integration.cluster_version().supports_collections()) {
494
+ SKIP("cluster does not support collections");
495
+ }
496
+
497
+ auto cluster = couchbase::cluster(integration.cluster);
498
+ auto bucket = cluster.bucket(integration.ctx.bucket);
499
+
500
+ auto scope_name = test::utils::uniq_id("scope");
501
+ auto collection_name = test::utils::uniq_id("collection");
502
+
503
+ {
504
+ const couchbase::core::operations::management::scope_create_request req{ integration.ctx.bucket, scope_name };
505
+ auto resp = test::utils::execute(integration.cluster, req);
506
+ REQUIRE_SUCCESS(resp.ctx.ec);
507
+ auto created = test::utils::wait_until_collection_manifest_propagated(integration.cluster, integration.ctx.bucket, resp.uid);
508
+ REQUIRE(created);
509
+ }
510
+
511
+ {
512
+ const couchbase::core::operations::management::collection_create_request req{ integration.ctx.bucket, scope_name, collection_name };
513
+ auto resp = test::utils::execute(integration.cluster, req);
514
+ REQUIRE_SUCCESS(resp.ctx.ec);
515
+ auto created = test::utils::wait_until_collection_manifest_propagated(integration.cluster, integration.ctx.bucket, resp.uid);
516
+ REQUIRE(created);
517
+ }
518
+
519
+ CHECK(test::utils::wait_until(
520
+ [&]() {
521
+ auto [ctx, resp] = cluster
522
+ .analytics_query(fmt::format(
523
+ "ALTER COLLECTION `{}`.`{}`.`{}` ENABLE ANALYTICS", integration.ctx.bucket, scope_name, collection_name))
524
+ .get();
525
+ return !ctx.ec();
526
+ },
527
+ std::chrono::minutes{ 5 }));
528
+
529
+ auto scope = bucket.scope(scope_name);
530
+ auto collection = scope.collection(collection_name);
531
+
532
+ auto key = test::utils::uniq_id("key");
533
+ auto test_value = test::utils::uniq_id("value");
534
+ const tao::json::value document = {
535
+ { "testkey", test_value },
536
+ };
537
+ {
538
+ auto [ctx, resp] = collection.upsert(key, document).get();
539
+ REQUIRE_SUCCESS(ctx.ec());
540
+ }
541
+
542
+ couchbase::analytics_result resp{};
543
+ couchbase::analytics_error_context ctx{};
544
+ CHECK(test::utils::wait_until([&]() {
545
+ std::tie(ctx, resp) =
546
+ scope.analytics_query(fmt::format(R"(SELECT testkey FROM `{}` WHERE testkey = "{}")", collection_name, test_value)).get();
547
+ return !ctx.ec() && resp.meta_data().metrics().result_count() == 1;
548
+ }));
549
+ REQUIRE_SUCCESS(ctx.ec());
550
+ REQUIRE(resp.rows_as_json()[0] == document);
551
+ REQUIRE_FALSE(resp.meta_data().request_id().empty());
552
+ REQUIRE_FALSE(resp.meta_data().client_context_id().empty());
553
+ REQUIRE(resp.meta_data().status() == couchbase::analytics_status::success);
554
+
555
+ {
556
+ const couchbase::core::operations::management::scope_drop_request req{ integration.ctx.bucket, scope_name };
557
+ test::utils::execute(integration.cluster, req);
558
+ }
559
+ }
@@ -25,7 +25,7 @@ TEST_CASE("integration: missing scope and collection", "[integration]")
25
25
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
26
26
 
27
27
  if (!integration.cluster_version().supports_collections()) {
28
- return;
28
+ SKIP("cluster does not support collections");
29
29
  }
30
30
 
31
31
  SECTION("get missing scope")
@@ -77,7 +77,7 @@ TEST_CASE("integration: get and insert non default scope and collection", "[inte
77
77
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
78
78
 
79
79
  if (!integration.cluster_version().supports_collections()) {
80
- return;
80
+ SKIP("cluster does not support collections");
81
81
  }
82
82
 
83
83
  auto scope_name = test::utils::uniq_id("scope");
@@ -121,7 +121,7 @@ TEST_CASE("integration: insert into dropped scope", "[integration]")
121
121
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
122
122
 
123
123
  if (!integration.cluster_version().supports_collections()) {
124
- return;
124
+ SKIP("cluster does not support collections");
125
125
  }
126
126
 
127
127
  auto scope_name = test::utils::uniq_id("scope");
@@ -166,6 +166,10 @@ TEST_CASE("integration: insert into dropped scope", "[integration]")
166
166
  REQUIRE(dropped);
167
167
  }
168
168
 
169
+ if (integration.cluster_version().is_mock()) {
170
+ SKIP("GOCAVES does not generate error when inserting into dropped collection. See "
171
+ "https://github.com/couchbaselabs/gocaves/issues/108");
172
+ }
169
173
  {
170
174
  couchbase::core::operations::upsert_request req{ id, couchbase::core::utils::to_binary(key) };
171
175
  auto resp = test::utils::execute(integration.cluster, req);
@@ -42,9 +42,9 @@ TEST_CASE("integration: connecting with unresponsive first node in bootstrap nod
42
42
  test::utils::init_logger();
43
43
  asio::io_context io{};
44
44
  auto ctx = test::utils::test_context::load_from_environment();
45
- if (ctx.deployment == test::utils::deployment_type::capella) {
45
+ if (ctx.deployment == test::utils::deployment_type::capella || ctx.deployment == test::utils::deployment_type::elixir) {
46
46
  // This breaks SRV assumptions (only one host in connection string)
47
- return;
47
+ SKIP("capella deployment uses single host in the connection string, which assumed to be reachable");
48
48
  }
49
49
  auto connstr = couchbase::core::utils::parse_connection_string(ctx.connection_string);
50
50
  REQUIRE_FALSE(connstr.bootstrap_nodes.empty());
@@ -125,6 +125,10 @@ TEST_CASE("integration: destroy cluster without waiting for close completion", "
125
125
  test::utils::init_logger();
126
126
  auto ctx = test::utils::test_context::load_from_environment();
127
127
 
128
+ if (ctx.deployment == test::utils::deployment_type::elixir) {
129
+ SKIP("elixir deployment is incompatible with parts of this test, but it is probably bug in SDK. FIXME");
130
+ }
131
+
128
132
  asio::io_context io{};
129
133
 
130
134
  auto cluster = couchbase::core::cluster::create(io);
@@ -143,7 +147,7 @@ TEST_CASE("integration: destroy cluster without waiting for close completion", "
143
147
  }
144
148
 
145
149
  // hit Query
146
- {
150
+ if (ctx.version.supports_query()) {
147
151
  couchbase::core::operations::query_request req{ R"(SELECT 42 AS the_answer)" };
148
152
  auto resp = test::utils::execute(cluster, req);
149
153
  REQUIRE_SUCCESS(resp.ctx.ec);
@@ -35,6 +35,10 @@ TEST_CASE("integration: switching off mutation token", "[integration]")
35
35
  opts.enable_mutation_tokens = false;
36
36
  test::utils::integration_test_guard integration(opts);
37
37
 
38
+ if (integration.cluster_version().is_mock()) {
39
+ SKIP("GOCAVES does not allow to switching off mutation tokens. See https://github.com/couchbaselabs/gocaves/issues/100");
40
+ }
41
+
38
42
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
39
43
  couchbase::core::document_id id{ integration.ctx.bucket, "_default", "_default", test::utils::uniq_id("foo") };
40
44
 
@@ -228,6 +232,10 @@ TEST_CASE("integration: pessimistic locking", "[integration]")
228
232
  {
229
233
  couchbase::core::operations::get_and_lock_request req{ id };
230
234
  req.lock_time = lock_time;
235
+ if (integration.ctx.deployment == test::utils::deployment_type::capella ||
236
+ integration.ctx.deployment == test::utils::deployment_type::elixir) {
237
+ req.timeout = std::chrono::seconds{ 2 };
238
+ }
231
239
  auto resp = test::utils::execute(integration.cluster, req);
232
240
  REQUIRE(resp.ctx.ec() == couchbase::errc::common::ambiguous_timeout);
233
241
  REQUIRE(resp.ctx.retried_because_of(couchbase::retry_reason::key_value_locked));
@@ -486,7 +494,7 @@ TEST_CASE("integration: upsert preserve expiry", "[integration]")
486
494
  test::utils::integration_test_guard integration;
487
495
 
488
496
  if (!integration.cluster_version().supports_preserve_expiry()) {
489
- return;
497
+ SKIP("cluster does not support preserve expiry");
490
498
  }
491
499
 
492
500
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
@@ -667,6 +675,10 @@ TEST_CASE("integration: open bucket that does not exist", "[integration]")
667
675
  {
668
676
  test::utils::integration_test_guard integration;
669
677
 
678
+ if (integration.cluster_version().is_mock()) {
679
+ SKIP("GOCAVES returns not_found (0x01) instead of no_access (0x24). See https://github.com/couchbaselabs/gocaves/issues/102");
680
+ }
681
+
670
682
  auto bucket_name = test::utils::uniq_id("missing_bucket");
671
683
 
672
684
  auto barrier = std::make_shared<std::promise<std::error_code>>();
@@ -810,7 +822,12 @@ TEST_CASE("integration: pessimistic locking with public API", "[integration]")
810
822
 
811
823
  // it is not allowed to lock the same key twice
812
824
  {
813
- auto [ctx, resp] = collection.get_and_lock(id, lock_time, {}).get();
825
+ couchbase::get_and_lock_options options{};
826
+ if (integration.ctx.deployment == test::utils::deployment_type::capella ||
827
+ integration.ctx.deployment == test::utils::deployment_type::elixir) {
828
+ options.timeout(std::chrono::seconds{ 2 });
829
+ }
830
+ auto [ctx, resp] = collection.get_and_lock(id, lock_time, options).get();
814
831
  REQUIRE(ctx.ec() == couchbase::errc::common::ambiguous_timeout);
815
832
  REQUIRE(ctx.retried_because_of(couchbase::retry_reason::key_value_locked));
816
833
  }
@@ -321,14 +321,18 @@ TEST_CASE("integration: fetch diagnostics after N1QL query", "[integration]")
321
321
  {
322
322
  test::utils::integration_test_guard integration;
323
323
 
324
+ if (!integration.cluster_version().supports_query() || integration.ctx.deployment == test::utils::deployment_type::elixir) {
325
+ SKIP("cluster does not support query or cluster level query");
326
+ }
327
+
324
328
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
325
329
  {
326
330
  couchbase::core::operations::query_request req{ "SELECT 'hello, couchbase' AS greetings" };
327
331
  auto resp = test::utils::execute(integration.cluster, req);
328
332
  REQUIRE_SUCCESS(resp.ctx.ec);
329
- INFO("rows.size() =" << resp.rows.size())
333
+ INFO("rows.size() =" << resp.rows.size());
330
334
  REQUIRE(resp.rows.size() == 1);
331
- INFO("row=" << resp.rows[0])
335
+ INFO("row=" << resp.rows[0]);
332
336
  REQUIRE(resp.rows[0] == R"({"greetings":"hello, couchbase"})");
333
337
  }
334
338
  {
@@ -365,8 +369,10 @@ TEST_CASE("integration: ping", "[integration]")
365
369
  REQUIRE(res.services.count(couchbase::core::service_type::management) > 0);
366
370
  REQUIRE(res.services[couchbase::core::service_type::management].size() > 0);
367
371
 
368
- REQUIRE(res.services.count(couchbase::core::service_type::view) > 0);
369
- REQUIRE(res.services[couchbase::core::service_type::view].size() > 0);
372
+ if (integration.ctx.deployment != test::utils::deployment_type::elixir) {
373
+ REQUIRE(res.services.count(couchbase::core::service_type::view) > 0);
374
+ REQUIRE(res.services[couchbase::core::service_type::view].size() > 0);
375
+ }
370
376
 
371
377
  REQUIRE(res.services.count(couchbase::core::service_type::query) > 0);
372
378
  REQUIRE(res.services[couchbase::core::service_type::query].size() > 0);
@@ -385,7 +391,7 @@ TEST_CASE("integration: ping", "[integration]")
385
391
  }
386
392
 
387
393
  REQUIRE(res.id == "my_report_id");
388
- INFO(res.sdk)
394
+ INFO(res.sdk);
389
395
  REQUIRE(res.sdk.find("cxx/") == 0);
390
396
  }
391
397
  }
@@ -25,7 +25,7 @@ TEST_CASE("integration: durable operations", "[integration]")
25
25
  {
26
26
  test::utils::integration_test_guard integration;
27
27
  if (!integration.cluster_version().supports_enhanced_durability()) {
28
- return;
28
+ SKIP("cluster does not support enhanced durability");
29
29
  }
30
30
 
31
31
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
@@ -68,7 +68,7 @@ TEST_CASE("integration: durable operations", "[integration]")
68
68
  auto resp = test::utils::execute(integration.cluster, req);
69
69
  REQUIRE_SUCCESS(resp.ctx.ec());
70
70
  REQUIRE(!resp.cas.empty());
71
- REQUIRE(resp.value == couchbase::core::utils::to_binary(R"({"foo":"bar","baz":42})"));
71
+ REQUIRE(couchbase::core::utils::json::parse_binary(resp.value) == couchbase::core::utils::json::parse(R"({"foo":"bar","baz":42})"));
72
72
  }
73
73
  {
74
74
  couchbase::core::operations::remove_request req{ id };
@@ -83,8 +83,13 @@ TEST_CASE("integration: durable operations", "[integration]")
83
83
  TEST_CASE("integration: legacy durability persist to active and replicate to one", "[integration]")
84
84
  {
85
85
  test::utils::integration_test_guard integration;
86
- if (integration.number_of_replicas() == 0 || integration.number_of_nodes() <= integration.number_of_replicas()) {
87
- return;
86
+ if (integration.number_of_replicas() == 0) {
87
+ SKIP("bucket has zero replicas");
88
+ }
89
+ if (integration.number_of_nodes() <= integration.number_of_replicas()) {
90
+ SKIP(fmt::format("number of nodes ({}) is less or equal to number of replicas ({})",
91
+ integration.number_of_nodes(),
92
+ integration.number_of_replicas()));
88
93
  }
89
94
 
90
95
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
@@ -124,7 +129,7 @@ TEST_CASE("integration: low level legacy durability impossible if number of node
124
129
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
125
130
 
126
131
  if (integration.number_of_replicas() == 3) {
127
- return;
132
+ SKIP("bucket has three replicas configured, so the test will not be applicable");
128
133
  }
129
134
 
130
135
  couchbase::core::document_id id{ integration.ctx.bucket, "_default", "_default", test::utils::uniq_id("foo") };
@@ -159,7 +164,7 @@ TEST_CASE("integration: low level legacy durability persist to active and replic
159
164
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
160
165
 
161
166
  if (integration.number_of_replicas() < 1) {
162
- return;
167
+ SKIP("bucket does not have replicas configured");
163
168
  }
164
169
 
165
170
  couchbase::core::document_id id{ integration.ctx.bucket, "_default", "_default", test::utils::uniq_id("foo") };
@@ -211,7 +216,7 @@ TEST_CASE("integration: low level legacy durability persist to active and replic
211
216
  auto resp = test::utils::execute(integration.cluster, req);
212
217
  REQUIRE_SUCCESS(resp.ctx.ec());
213
218
  REQUIRE(!resp.cas.empty());
214
- REQUIRE(resp.value == couchbase::core::utils::to_binary(R"({"foo":"bar","baz":42})"));
219
+ REQUIRE(couchbase::core::utils::json::parse_binary(resp.value) == couchbase::core::utils::json::parse(R"({"foo":"bar","baz":42})"));
215
220
  }
216
221
  {
217
222
  couchbase::core::operations::remove_request_with_legacy_durability req{