couchbase 4.1.0 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +8 -0
  2. package/deps/couchbase-cxx-client/.github/workflows/linters.yml +2 -2
  3. package/deps/couchbase-cxx-client/.github/workflows/sanitizers.yml +18 -2
  4. package/deps/couchbase-cxx-client/.github/workflows/tests.yml +14 -34
  5. package/deps/couchbase-cxx-client/.github/workflows/windows.yml +13 -15
  6. package/deps/couchbase-cxx-client/CMakeLists.txt +6 -1
  7. package/deps/couchbase-cxx-client/bin/build-tests +3 -0
  8. package/deps/couchbase-cxx-client/bin/build-tests.rb +3 -0
  9. package/deps/couchbase-cxx-client/bin/init-cluster +1 -1
  10. package/deps/couchbase-cxx-client/bin/run-tests +1 -1
  11. package/deps/couchbase-cxx-client/cmake/StandardProjectSettings.cmake +1 -1
  12. package/deps/couchbase-cxx-client/couchbase/cluster.hxx +25 -6
  13. package/deps/couchbase-cxx-client/couchbase/io/mcbp_session.hxx +21 -7
  14. package/deps/couchbase-cxx-client/couchbase/meta/version.cxx +7 -0
  15. package/deps/couchbase-cxx-client/couchbase/operations/document_decrement.cxx +0 -3
  16. package/deps/couchbase-cxx-client/couchbase/operations/document_decrement.hxx +0 -1
  17. package/deps/couchbase-cxx-client/couchbase/operations/document_increment.cxx +0 -3
  18. package/deps/couchbase-cxx-client/couchbase/operations/document_increment.hxx +0 -1
  19. package/deps/couchbase-cxx-client/couchbase/operations/management/analytics_dataset_get_all.cxx +1 -1
  20. package/deps/couchbase-cxx-client/couchbase/operations/management/analytics_get_pending_mutations.cxx +1 -1
  21. package/deps/couchbase-cxx-client/couchbase/operations/management/analytics_get_pending_mutations.hxx +1 -1
  22. package/deps/couchbase-cxx-client/couchbase/operations/management/query_index_drop.cxx +4 -3
  23. package/deps/couchbase-cxx-client/couchbase/origin.hxx +10 -0
  24. package/deps/couchbase-cxx-client/couchbase/protocol/cmd_decrement.cxx +3 -8
  25. package/deps/couchbase-cxx-client/couchbase/protocol/cmd_decrement.hxx +0 -2
  26. package/deps/couchbase-cxx-client/couchbase/protocol/cmd_increment.cxx +0 -9
  27. package/deps/couchbase-cxx-client/couchbase/protocol/cmd_increment.hxx +0 -2
  28. package/deps/couchbase-cxx-client/couchbase/utils/json_streaming_lexer.cxx +6 -2
  29. package/deps/couchbase-cxx-client/test/test_integration_collections.cxx +4 -6
  30. package/deps/couchbase-cxx-client/test/test_integration_connect.cxx +4 -0
  31. package/deps/couchbase-cxx-client/test/test_integration_management.cxx +194 -138
  32. package/deps/couchbase-cxx-client/test/test_integration_query.cxx +26 -10
  33. package/deps/couchbase-cxx-client/test/test_unit_json_streaming_lexer.cxx +119 -0
  34. package/deps/couchbase-cxx-client/test/utils/integration_test_guard.cxx +1 -1
  35. package/deps/couchbase-cxx-client/test/utils/server_version.cxx +2 -1
  36. package/deps/couchbase-cxx-client/test/utils/server_version.hxx +22 -4
  37. package/deps/couchbase-cxx-client/test/utils/test_context.cxx +11 -1
  38. package/deps/couchbase-cxx-client/test/utils/test_context.hxx +1 -0
  39. package/deps/couchbase-transactions-cxx/CMakeLists.txt +2 -2
  40. package/deps/couchbase-transactions-cxx/deps/couchbase-cxx-client/couchbase/{management/design_document_fmt.hxx → design_document_namespace_fmt.hxx} +5 -5
  41. package/deps/couchbase-transactions-cxx/deps/couchbase-cxx-client/couchbase/operations/management/query_index_get_all.cxx +26 -16
  42. package/deps/couchbase-transactions-cxx/include/couchbase/transactions/durability_level.hxx +15 -0
  43. package/deps/couchbase-transactions-cxx/include/couchbase/transactions.hxx +2 -6
  44. package/deps/couchbase-transactions-cxx/src/transactions/attempt_context_impl.cxx +1 -1
  45. package/deps/couchbase-transactions-cxx/src/transactions/logging.cxx +20 -17
  46. package/deps/couchbase-transactions-cxx/tests/transactions/simple_t.cpp +22 -0
  47. package/deps/couchbase-transactions-cxx/tests/transactions/transactions_env.h +1 -1
  48. package/dist/binding.d.ts +0 -2
  49. package/dist/collection.js +0 -2
  50. package/dist/httpexecutor.d.ts +1 -0
  51. package/package.json +1 -1
  52. package/src/jstocbpp_autogen.hpp +3 -9
  53. package/deps/couchbase-cxx-client/.github/workflows/benchmarks.yml +0 -94
  54. package/deps/couchbase-transactions-cxx/deps/couchbase-cxx-client/.github/workflows/benchmarks.yml +0 -94
@@ -53,6 +53,10 @@ TEST_CASE("integration: bucket management", "[integration]")
53
53
  {
54
54
  test::utils::integration_test_guard integration;
55
55
 
56
+ if (!integration.cluster_version().supports_bucket_management()) {
57
+ return;
58
+ }
59
+
56
60
  if (!integration.cluster_version().supports_gcccp()) {
57
61
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
58
62
  }
@@ -377,7 +381,7 @@ TEST_CASE("integration: bucket management", "[integration]")
377
381
  SECTION("magma")
378
382
  {
379
383
  {
380
- bucket_settings.ram_quota_mb = 256;
384
+ bucket_settings.ram_quota_mb = integration.cluster_version().is_neo() ? 1'024 : 256;
381
385
  bucket_settings.storage_backend = couchbase::management::cluster::bucket_storage_backend::magma;
382
386
  couchbase::operations::management::bucket_create_request req{ bucket_settings };
383
387
  auto resp = test::utils::execute(integration.cluster, req);
@@ -497,6 +501,7 @@ scope_exists(std::shared_ptr<couchbase::cluster> cluster, const std::string& buc
497
501
  TEST_CASE("integration: collection management", "[integration]")
498
502
  {
499
503
  test::utils::integration_test_guard integration;
504
+ test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
500
505
 
501
506
  if (!integration.cluster_version().supports_collections()) {
502
507
  return;
@@ -509,6 +514,8 @@ TEST_CASE("integration: collection management", "[integration]")
509
514
  couchbase::operations::management::scope_create_request req{ integration.ctx.bucket, scope_name };
510
515
  auto resp = test::utils::execute(integration.cluster, req);
511
516
  REQUIRE_FALSE(resp.ctx.ec);
517
+ auto created = test::utils::wait_until_collection_manifest_propagated(integration.cluster, integration.ctx.bucket, resp.uid);
518
+ REQUIRE(created);
512
519
  }
513
520
 
514
521
  {
@@ -529,6 +536,8 @@ TEST_CASE("integration: collection management", "[integration]")
529
536
  }
530
537
  auto resp = test::utils::execute(integration.cluster, req);
531
538
  REQUIRE_FALSE(resp.ctx.ec);
539
+ auto created = test::utils::wait_until_collection_manifest_propagated(integration.cluster, integration.ctx.bucket, resp.uid);
540
+ REQUIRE(created);
532
541
  }
533
542
 
534
543
  {
@@ -836,6 +845,10 @@ TEST_CASE("integration: user management", "[integration]")
836
845
  {
837
846
  test::utils::integration_test_guard integration;
838
847
 
848
+ if (!integration.cluster_version().supports_user_management()) {
849
+ return;
850
+ }
851
+
839
852
  if (!integration.cluster_version().supports_gcccp()) {
840
853
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
841
854
  }
@@ -868,7 +881,8 @@ TEST_CASE("integration: user management collections roles", "[integration]")
868
881
  test::utils::integration_test_guard integration;
869
882
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
870
883
 
871
- if (!integration.cluster_version().supports_collections() || integration.cluster_version().is_community()) {
884
+ if (!integration.cluster_version().supports_user_management() || !integration.cluster_version().supports_collections() ||
885
+ integration.cluster_version().is_community()) {
872
886
  return;
873
887
  }
874
888
 
@@ -947,42 +961,50 @@ TEST_CASE("integration: query index management", "[integration]")
947
961
  return;
948
962
  }
949
963
 
950
- auto bucket_name = test::utils::uniq_id("bucket");
951
964
  auto index_name = test::utils::uniq_id("index");
952
965
 
953
- {
954
- couchbase::operations::management::bucket_create_request req;
955
- req.bucket.name = bucket_name;
956
- req.bucket.bucket_type = couchbase::management::cluster::bucket_type::couchbase;
957
- req.bucket.num_replicas = 0;
958
- auto resp = test::utils::execute(integration.cluster, req);
959
- }
966
+ if (integration.cluster_version().supports_bucket_management()) {
967
+ SECTION("primary index")
968
+ {
969
+ auto bucket_name = test::utils::uniq_id("bucket");
960
970
 
961
- REQUIRE(!wait_for_bucket_created(integration, bucket_name).ctx.ec);
971
+ {
972
+ couchbase::operations::management::bucket_create_request req;
973
+ req.bucket.name = bucket_name;
974
+ req.bucket.bucket_type = couchbase::management::cluster::bucket_type::couchbase;
975
+ req.bucket.num_replicas = 0;
976
+ auto resp = test::utils::execute(integration.cluster, req);
977
+ }
962
978
 
963
- SECTION("primary index")
964
- {
965
- {
966
- couchbase::operations::management::query_index_create_response resp;
967
- bool operation_completed = test::utils::wait_until([&integration, &bucket_name, &resp]() {
968
- couchbase::operations::management::query_index_create_request req{};
979
+ REQUIRE(!wait_for_bucket_created(integration, bucket_name).ctx.ec);
980
+
981
+ {
982
+ couchbase::operations::management::query_index_create_response resp;
983
+ bool operation_completed = test::utils::wait_until([&integration, &bucket_name, &resp]() {
984
+ couchbase::operations::management::query_index_create_request req{};
985
+ req.bucket_name = bucket_name;
986
+ req.is_primary = true;
987
+ resp = test::utils::execute(integration.cluster, req);
988
+ return resp.ctx.ec != couchbase::error::common_errc::bucket_not_found;
989
+ });
990
+ REQUIRE(operation_completed);
991
+ REQUIRE_FALSE(resp.ctx.ec);
992
+ }
993
+
994
+ {
995
+ couchbase::operations::management::query_index_get_all_request req{};
969
996
  req.bucket_name = bucket_name;
970
- req.is_primary = true;
971
- resp = test::utils::execute(integration.cluster, req);
972
- return resp.ctx.ec != couchbase::error::common_errc::bucket_not_found;
973
- });
974
- REQUIRE(operation_completed);
975
- REQUIRE_FALSE(resp.ctx.ec);
976
- }
997
+ auto resp = test::utils::execute(integration.cluster, req);
998
+ REQUIRE_FALSE(resp.ctx.ec);
999
+ REQUIRE(resp.indexes.size() == 1);
1000
+ REQUIRE(resp.indexes[0].name == "#primary");
1001
+ REQUIRE(resp.indexes[0].is_primary);
1002
+ }
977
1003
 
978
- {
979
- couchbase::operations::management::query_index_get_all_request req{};
980
- req.bucket_name = bucket_name;
981
- auto resp = test::utils::execute(integration.cluster, req);
982
- REQUIRE_FALSE(resp.ctx.ec);
983
- REQUIRE(resp.indexes.size() == 1);
984
- REQUIRE(resp.indexes[0].name == "#primary");
985
- REQUIRE(resp.indexes[0].is_primary);
1004
+ {
1005
+ couchbase::operations::management::bucket_drop_request req{ bucket_name };
1006
+ test::utils::execute(integration.cluster, req);
1007
+ }
986
1008
  }
987
1009
  }
988
1010
 
@@ -990,11 +1012,11 @@ TEST_CASE("integration: query index management", "[integration]")
990
1012
  {
991
1013
  {
992
1014
  couchbase::operations::management::query_index_create_response resp;
993
- bool operation_completed = test::utils::wait_until([&integration, &bucket_name, &index_name, &resp]() {
1015
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &resp]() {
994
1016
  couchbase::operations::management::query_index_create_request req{};
995
- req.bucket_name = bucket_name;
1017
+ req.bucket_name = integration.ctx.bucket;
996
1018
  req.index_name = index_name;
997
- req.fields = { "field" };
1019
+ req.fields = { "field", "field2 DESC", "`two words` DESC" };
998
1020
  resp = test::utils::execute(integration.cluster, req);
999
1021
  return resp.ctx.ec != couchbase::error::common_errc::bucket_not_found;
1000
1022
  });
@@ -1004,7 +1026,7 @@ TEST_CASE("integration: query index management", "[integration]")
1004
1026
 
1005
1027
  {
1006
1028
  couchbase::operations::management::query_index_create_request req{};
1007
- req.bucket_name = bucket_name;
1029
+ req.bucket_name = integration.ctx.bucket;
1008
1030
  req.index_name = index_name;
1009
1031
  req.fields = { "field" };
1010
1032
  auto resp = test::utils::execute(integration.cluster, req);
@@ -1013,7 +1035,7 @@ TEST_CASE("integration: query index management", "[integration]")
1013
1035
 
1014
1036
  {
1015
1037
  couchbase::operations::management::query_index_create_request req{};
1016
- req.bucket_name = bucket_name;
1038
+ req.bucket_name = integration.ctx.bucket;
1017
1039
  req.index_name = index_name;
1018
1040
  req.fields = { "field" };
1019
1041
  req.ignore_if_exists = true;
@@ -1023,21 +1045,25 @@ TEST_CASE("integration: query index management", "[integration]")
1023
1045
 
1024
1046
  {
1025
1047
  couchbase::operations::management::query_index_get_all_request req{};
1026
- req.bucket_name = bucket_name;
1048
+ req.bucket_name = integration.ctx.bucket;
1027
1049
  auto resp = test::utils::execute(integration.cluster, req);
1028
1050
  REQUIRE_FALSE(resp.ctx.ec);
1029
- REQUIRE(resp.indexes.size() == 1);
1030
- REQUIRE(resp.indexes[0].name == index_name);
1031
- REQUIRE_FALSE(resp.indexes[0].is_primary);
1032
- REQUIRE(resp.indexes[0].index_key.size() == 1);
1033
- REQUIRE(resp.indexes[0].index_key[0] == "`field`");
1034
- REQUIRE(resp.indexes[0].bucket_name == bucket_name);
1035
- REQUIRE(resp.indexes[0].state == "online");
1051
+ auto index = std::find_if(
1052
+ resp.indexes.begin(), resp.indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1053
+ REQUIRE(index != resp.indexes.end());
1054
+ REQUIRE(index->name == index_name);
1055
+ REQUIRE_FALSE(index->is_primary);
1056
+ REQUIRE(index->index_key.size() == 3);
1057
+ REQUIRE(index->index_key[0] == "`field`");
1058
+ REQUIRE(index->index_key[1] == "`field2` DESC");
1059
+ REQUIRE(index->index_key[2] == "`two words` DESC");
1060
+ REQUIRE(index->bucket_name == integration.ctx.bucket);
1061
+ REQUIRE(index->state == "online");
1036
1062
  }
1037
1063
 
1038
1064
  {
1039
1065
  couchbase::operations::management::query_index_drop_request req{};
1040
- req.bucket_name = bucket_name;
1066
+ req.bucket_name = integration.ctx.bucket;
1041
1067
  req.index_name = index_name;
1042
1068
  auto resp = test::utils::execute(integration.cluster, req);
1043
1069
  REQUIRE_FALSE(resp.ctx.ec);
@@ -1045,7 +1071,7 @@ TEST_CASE("integration: query index management", "[integration]")
1045
1071
 
1046
1072
  {
1047
1073
  couchbase::operations::management::query_index_drop_request req{};
1048
- req.bucket_name = bucket_name;
1074
+ req.bucket_name = integration.ctx.bucket;
1049
1075
  req.index_name = index_name;
1050
1076
  auto resp = test::utils::execute(integration.cluster, req);
1051
1077
  REQUIRE(resp.ctx.ec == couchbase::error::common_errc::index_not_found);
@@ -1056,9 +1082,9 @@ TEST_CASE("integration: query index management", "[integration]")
1056
1082
  {
1057
1083
  {
1058
1084
  couchbase::operations::management::query_index_create_response resp;
1059
- bool operation_completed = test::utils::wait_until([&integration, &bucket_name, &index_name, &resp]() {
1085
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &resp]() {
1060
1086
  couchbase::operations::management::query_index_create_request req{};
1061
- req.bucket_name = bucket_name;
1087
+ req.bucket_name = integration.ctx.bucket;
1062
1088
  req.index_name = index_name;
1063
1089
  req.fields = { "field" };
1064
1090
  req.deferred = true;
@@ -1071,29 +1097,33 @@ TEST_CASE("integration: query index management", "[integration]")
1071
1097
 
1072
1098
  {
1073
1099
  couchbase::operations::management::query_index_get_all_request req{};
1074
- req.bucket_name = bucket_name;
1100
+ req.bucket_name = integration.ctx.bucket;
1075
1101
  auto resp = test::utils::execute(integration.cluster, req);
1076
1102
  REQUIRE_FALSE(resp.ctx.ec);
1077
- REQUIRE(resp.indexes.size() == 1);
1078
- REQUIRE(resp.indexes[0].name == index_name);
1079
- REQUIRE(resp.indexes[0].state == "deferred");
1103
+ auto index = std::find_if(
1104
+ resp.indexes.begin(), resp.indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1105
+ REQUIRE(index != resp.indexes.end());
1106
+ REQUIRE(index->name == index_name);
1107
+ REQUIRE(index->state == "deferred");
1080
1108
  }
1081
1109
 
1082
1110
  {
1083
1111
  couchbase::operations::management::query_index_build_deferred_request req{};
1084
- req.bucket_name = bucket_name;
1112
+ req.bucket_name = integration.ctx.bucket;
1085
1113
  auto resp = test::utils::execute(integration.cluster, req);
1086
1114
  REQUIRE_FALSE(resp.ctx.ec);
1087
1115
  }
1088
1116
 
1089
- test::utils::wait_until([&integration, bucket_name]() {
1117
+ test::utils::wait_until([&integration, &index_name]() {
1090
1118
  couchbase::operations::management::query_index_get_all_request req{};
1091
- req.bucket_name = bucket_name;
1119
+ req.bucket_name = integration.ctx.bucket;
1092
1120
  auto resp = test::utils::execute(integration.cluster, req);
1093
1121
  if (resp.indexes.empty()) {
1094
1122
  return false;
1095
1123
  }
1096
- return resp.indexes[0].state == "online";
1124
+ auto index = std::find_if(
1125
+ resp.indexes.begin(), resp.indexes.end(), [&index_name](const auto& exp_index) { return exp_index.name == index_name; });
1126
+ return index->state == "online";
1097
1127
  });
1098
1128
  }
1099
1129
 
@@ -1123,12 +1153,6 @@ TEST_CASE("integration: query index management", "[integration]")
1123
1153
  auto resp = test::utils::execute(integration.cluster, req);
1124
1154
  REQUIRE(resp.ctx.ec == couchbase::error::common_errc::bucket_not_found);
1125
1155
  }
1126
-
1127
- // drop any buckets that haven't already been dropped
1128
- {
1129
- couchbase::operations::management::bucket_drop_request req{ bucket_name };
1130
- test::utils::execute(integration.cluster, req);
1131
- }
1132
1156
  }
1133
1157
 
1134
1158
  TEST_CASE("integration: collections query index management", "[integration]")
@@ -1138,45 +1162,41 @@ TEST_CASE("integration: collections query index management", "[integration]")
1138
1162
  if (!integration.cluster_version().supports_query_index_management()) {
1139
1163
  return;
1140
1164
  }
1165
+
1141
1166
  if (!integration.cluster_version().supports_collections()) {
1142
1167
  return;
1143
1168
  }
1144
1169
 
1145
- auto bucket_name = test::utils::uniq_id("collections_bucket");
1146
1170
  auto index_name = test::utils::uniq_id("collections_index");
1147
1171
  auto scope_name = test::utils::uniq_id("indexscope");
1148
1172
  auto collection_name = test::utils::uniq_id("indexcollection");
1149
1173
 
1150
- {
1151
- couchbase::operations::management::bucket_create_request req;
1152
- req.bucket.name = bucket_name;
1153
- req.bucket.bucket_type = couchbase::management::cluster::bucket_type::couchbase;
1154
- req.bucket.num_replicas = 0;
1155
- auto resp = test::utils::execute(integration.cluster, req);
1156
- }
1157
-
1158
- REQUIRE(!wait_for_bucket_created(integration, bucket_name).ctx.ec);
1174
+ test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
1159
1175
 
1160
1176
  // create the scope and collection that we'll do index management on.
1161
1177
  {
1162
- couchbase::operations::management::scope_create_request req{ bucket_name, scope_name };
1178
+ couchbase::operations::management::scope_create_request req{ integration.ctx.bucket, scope_name };
1163
1179
  auto resp = test::utils::execute(integration.cluster, req);
1164
1180
  REQUIRE_FALSE(resp.ctx.ec);
1181
+ auto created = test::utils::wait_until_collection_manifest_propagated(integration.cluster, integration.ctx.bucket, resp.uid);
1182
+ REQUIRE(created);
1165
1183
  }
1166
1184
 
1167
1185
  {
1168
- couchbase::operations::management::collection_create_request req{ bucket_name, scope_name, collection_name };
1186
+ couchbase::operations::management::collection_create_request req{ integration.ctx.bucket, scope_name, collection_name };
1169
1187
  auto resp = test::utils::execute(integration.cluster, req);
1170
1188
  REQUIRE_FALSE(resp.ctx.ec);
1189
+ auto created = test::utils::wait_until_collection_manifest_propagated(integration.cluster, integration.ctx.bucket, resp.uid);
1190
+ REQUIRE(created);
1171
1191
  }
1172
1192
 
1173
1193
  SECTION("primary index")
1174
1194
  {
1175
1195
  {
1176
1196
  couchbase::operations::management::query_index_create_response resp;
1177
- bool operation_completed = test::utils::wait_until([&integration, &bucket_name, &scope_name, &collection_name, &resp]() {
1197
+ bool operation_completed = test::utils::wait_until([&integration, &scope_name, &collection_name, &resp]() {
1178
1198
  couchbase::operations::management::query_index_create_request req{};
1179
- req.bucket_name = bucket_name;
1199
+ req.bucket_name = integration.ctx.bucket;
1180
1200
  req.scope_name = scope_name;
1181
1201
  req.collection_name = collection_name;
1182
1202
  req.is_primary = true;
@@ -1189,7 +1209,7 @@ TEST_CASE("integration: collections query index management", "[integration]")
1189
1209
 
1190
1210
  {
1191
1211
  couchbase::operations::management::query_index_get_all_request req{};
1192
- req.bucket_name = bucket_name;
1212
+ req.bucket_name = integration.ctx.bucket;
1193
1213
  req.scope_name = scope_name;
1194
1214
  req.collection_name = collection_name;
1195
1215
  auto resp = test::utils::execute(integration.cluster, req);
@@ -1200,28 +1220,69 @@ TEST_CASE("integration: collections query index management", "[integration]")
1200
1220
  }
1201
1221
  }
1202
1222
 
1223
+ SECTION("named primary index")
1224
+ {
1225
+ {
1226
+ couchbase::operations::management::query_index_create_response resp;
1227
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &scope_name, &collection_name, &resp]() {
1228
+ couchbase::operations::management::query_index_create_request req{};
1229
+ req.bucket_name = integration.ctx.bucket;
1230
+ req.scope_name = scope_name;
1231
+ req.collection_name = collection_name;
1232
+ req.index_name = index_name;
1233
+ req.is_primary = true;
1234
+ resp = test::utils::execute(integration.cluster, req);
1235
+ return resp.ctx.ec != couchbase::error::common_errc::bucket_not_found;
1236
+ });
1237
+ REQUIRE(operation_completed);
1238
+ REQUIRE_FALSE(resp.ctx.ec);
1239
+ }
1240
+
1241
+ {
1242
+ couchbase::operations::management::query_index_get_all_request req{};
1243
+ req.bucket_name = integration.ctx.bucket;
1244
+ req.scope_name = scope_name;
1245
+ req.collection_name = collection_name;
1246
+ auto resp = test::utils::execute(integration.cluster, req);
1247
+ REQUIRE_FALSE(resp.ctx.ec);
1248
+ REQUIRE(resp.indexes.size() == 1);
1249
+ REQUIRE(resp.indexes[0].name == index_name);
1250
+ REQUIRE(resp.indexes[0].is_primary);
1251
+ }
1252
+
1253
+ {
1254
+ couchbase::operations::management::query_index_drop_request req{};
1255
+ req.bucket_name = integration.ctx.bucket;
1256
+ req.index_name = index_name;
1257
+ req.scope_name = scope_name;
1258
+ req.is_primary = true;
1259
+ req.collection_name = collection_name;
1260
+ auto resp = test::utils::execute(integration.cluster, req);
1261
+ REQUIRE_FALSE(resp.ctx.ec);
1262
+ }
1263
+ }
1264
+
1203
1265
  SECTION("non primary index")
1204
1266
  {
1205
1267
  {
1206
1268
  couchbase::operations::management::query_index_create_response resp;
1207
- bool operation_completed =
1208
- test::utils::wait_until([&integration, &bucket_name, &index_name, &scope_name, &collection_name, &resp]() {
1209
- couchbase::operations::management::query_index_create_request req{};
1210
- req.bucket_name = bucket_name;
1211
- req.index_name = index_name;
1212
- req.scope_name = scope_name;
1213
- req.collection_name = collection_name;
1214
- req.fields = { "field" };
1215
- resp = test::utils::execute(integration.cluster, req);
1216
- return resp.ctx.ec != couchbase::error::common_errc::bucket_not_found;
1217
- });
1269
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &scope_name, &collection_name, &resp]() {
1270
+ couchbase::operations::management::query_index_create_request req{};
1271
+ req.bucket_name = integration.ctx.bucket;
1272
+ req.index_name = index_name;
1273
+ req.scope_name = scope_name;
1274
+ req.collection_name = collection_name;
1275
+ req.fields = { "field" };
1276
+ resp = test::utils::execute(integration.cluster, req);
1277
+ return resp.ctx.ec != couchbase::error::common_errc::bucket_not_found;
1278
+ });
1218
1279
  REQUIRE(operation_completed);
1219
1280
  REQUIRE_FALSE(resp.ctx.ec);
1220
1281
  }
1221
1282
 
1222
1283
  {
1223
1284
  couchbase::operations::management::query_index_create_request req{};
1224
- req.bucket_name = bucket_name;
1285
+ req.bucket_name = integration.ctx.bucket;
1225
1286
  req.index_name = index_name;
1226
1287
  req.scope_name = scope_name;
1227
1288
  req.collection_name = collection_name;
@@ -1232,7 +1293,7 @@ TEST_CASE("integration: collections query index management", "[integration]")
1232
1293
 
1233
1294
  {
1234
1295
  couchbase::operations::management::query_index_create_request req{};
1235
- req.bucket_name = bucket_name;
1296
+ req.bucket_name = integration.ctx.bucket;
1236
1297
  req.index_name = index_name;
1237
1298
  req.scope_name = scope_name;
1238
1299
  req.collection_name = collection_name;
@@ -1244,7 +1305,7 @@ TEST_CASE("integration: collections query index management", "[integration]")
1244
1305
 
1245
1306
  {
1246
1307
  couchbase::operations::management::query_index_get_all_request req{};
1247
- req.bucket_name = bucket_name;
1308
+ req.bucket_name = integration.ctx.bucket;
1248
1309
  req.scope_name = scope_name;
1249
1310
  req.collection_name = collection_name;
1250
1311
  auto resp = test::utils::execute(integration.cluster, req);
@@ -1256,13 +1317,13 @@ TEST_CASE("integration: collections query index management", "[integration]")
1256
1317
  REQUIRE(resp.indexes[0].index_key[0] == "`field`");
1257
1318
  REQUIRE(resp.indexes[0].collection_name == collection_name);
1258
1319
  REQUIRE(resp.indexes[0].scope_name == scope_name);
1259
- REQUIRE(resp.indexes[0].bucket_name == bucket_name);
1320
+ REQUIRE(resp.indexes[0].bucket_name == integration.ctx.bucket);
1260
1321
  REQUIRE(resp.indexes[0].state == "online");
1261
1322
  }
1262
1323
 
1263
1324
  {
1264
1325
  couchbase::operations::management::query_index_drop_request req{};
1265
- req.bucket_name = bucket_name;
1326
+ req.bucket_name = integration.ctx.bucket;
1266
1327
  req.index_name = index_name;
1267
1328
  req.scope_name = scope_name;
1268
1329
  req.collection_name = collection_name;
@@ -1272,7 +1333,7 @@ TEST_CASE("integration: collections query index management", "[integration]")
1272
1333
 
1273
1334
  {
1274
1335
  couchbase::operations::management::query_index_drop_request req{};
1275
- req.bucket_name = bucket_name;
1336
+ req.bucket_name = integration.ctx.bucket;
1276
1337
  req.index_name = index_name;
1277
1338
  req.scope_name = scope_name;
1278
1339
  req.collection_name = collection_name;
@@ -1285,25 +1346,24 @@ TEST_CASE("integration: collections query index management", "[integration]")
1285
1346
  {
1286
1347
  {
1287
1348
  couchbase::operations::management::query_index_create_response resp;
1288
- bool operation_completed =
1289
- test::utils::wait_until([&integration, &bucket_name, &index_name, &scope_name, &collection_name, &resp]() {
1290
- couchbase::operations::management::query_index_create_request req{};
1291
- req.bucket_name = bucket_name;
1292
- req.index_name = index_name;
1293
- req.scope_name = scope_name;
1294
- req.collection_name = collection_name;
1295
- req.fields = { "field" };
1296
- req.deferred = true;
1297
- resp = test::utils::execute(integration.cluster, req);
1298
- return resp.ctx.ec != couchbase::error::common_errc::bucket_not_found;
1299
- });
1349
+ bool operation_completed = test::utils::wait_until([&integration, &index_name, &scope_name, &collection_name, &resp]() {
1350
+ couchbase::operations::management::query_index_create_request req{};
1351
+ req.bucket_name = integration.ctx.bucket;
1352
+ req.index_name = index_name;
1353
+ req.scope_name = scope_name;
1354
+ req.collection_name = collection_name;
1355
+ req.fields = { "field" };
1356
+ req.deferred = true;
1357
+ resp = test::utils::execute(integration.cluster, req);
1358
+ return resp.ctx.ec != couchbase::error::common_errc::bucket_not_found;
1359
+ });
1300
1360
  REQUIRE(operation_completed);
1301
1361
  REQUIRE_FALSE(resp.ctx.ec);
1302
1362
  }
1303
1363
 
1304
1364
  {
1305
1365
  couchbase::operations::management::query_index_get_all_request req{};
1306
- req.bucket_name = bucket_name;
1366
+ req.bucket_name = integration.ctx.bucket;
1307
1367
  req.scope_name = scope_name;
1308
1368
  req.collection_name = collection_name;
1309
1369
  auto resp = test::utils::execute(integration.cluster, req);
@@ -1315,16 +1375,16 @@ TEST_CASE("integration: collections query index management", "[integration]")
1315
1375
 
1316
1376
  {
1317
1377
  couchbase::operations::management::query_index_build_deferred_request req{};
1318
- req.bucket_name = bucket_name;
1378
+ req.bucket_name = integration.ctx.bucket;
1319
1379
  req.scope_name = scope_name;
1320
1380
  req.collection_name = collection_name;
1321
1381
  auto resp = test::utils::execute(integration.cluster, req);
1322
1382
  REQUIRE_FALSE(resp.ctx.ec);
1323
1383
  }
1324
1384
 
1325
- test::utils::wait_until([&integration, bucket_name, scope_name, collection_name]() {
1385
+ test::utils::wait_until([&integration, scope_name, collection_name]() {
1326
1386
  couchbase::operations::management::query_index_get_all_request req{};
1327
- req.bucket_name = bucket_name;
1387
+ req.bucket_name = integration.ctx.bucket;
1328
1388
  req.scope_name = scope_name;
1329
1389
  req.collection_name = collection_name;
1330
1390
  auto resp = test::utils::execute(integration.cluster, req);
@@ -1338,7 +1398,7 @@ TEST_CASE("integration: collections query index management", "[integration]")
1338
1398
  SECTION("create missing collection")
1339
1399
  {
1340
1400
  couchbase::operations::management::query_index_create_request req{};
1341
- req.bucket_name = bucket_name;
1401
+ req.bucket_name = integration.ctx.bucket;
1342
1402
  req.scope_name = scope_name;
1343
1403
  req.collection_name = "missing_collection";
1344
1404
  req.is_primary = true;
@@ -1349,7 +1409,7 @@ TEST_CASE("integration: collections query index management", "[integration]")
1349
1409
  SECTION("create missing scope")
1350
1410
  {
1351
1411
  couchbase::operations::management::query_index_create_request req{};
1352
- req.bucket_name = bucket_name;
1412
+ req.bucket_name = integration.ctx.bucket;
1353
1413
  req.scope_name = "missing_scope";
1354
1414
  req.collection_name = collection_name;
1355
1415
  req.is_primary = true;
@@ -1360,7 +1420,7 @@ TEST_CASE("integration: collections query index management", "[integration]")
1360
1420
  SECTION("get missing collection")
1361
1421
  {
1362
1422
  couchbase::operations::management::query_index_get_all_request req{};
1363
- req.bucket_name = bucket_name;
1423
+ req.bucket_name = integration.ctx.bucket;
1364
1424
  req.scope_name = scope_name;
1365
1425
  req.collection_name = "missing_collection";
1366
1426
  auto resp = test::utils::execute(integration.cluster, req);
@@ -1371,7 +1431,7 @@ TEST_CASE("integration: collections query index management", "[integration]")
1371
1431
  SECTION("drop missing collection")
1372
1432
  {
1373
1433
  couchbase::operations::management::query_index_drop_request req{};
1374
- req.bucket_name = bucket_name;
1434
+ req.bucket_name = integration.ctx.bucket;
1375
1435
  req.scope_name = scope_name;
1376
1436
  req.collection_name = "missing_collection";
1377
1437
  req.is_primary = true;
@@ -1382,19 +1442,13 @@ TEST_CASE("integration: collections query index management", "[integration]")
1382
1442
  SECTION("drop missing scope")
1383
1443
  {
1384
1444
  couchbase::operations::management::query_index_drop_request req{};
1385
- req.bucket_name = bucket_name;
1445
+ req.bucket_name = integration.ctx.bucket;
1386
1446
  req.scope_name = "missing_scope";
1387
1447
  req.collection_name = collection_name;
1388
1448
  req.is_primary = true;
1389
1449
  auto resp = test::utils::execute(integration.cluster, req);
1390
1450
  REQUIRE(resp.ctx.ec == couchbase::error::common_errc::scope_not_found);
1391
1451
  }
1392
-
1393
- // drop any buckets that haven't already been dropped
1394
- {
1395
- couchbase::operations::management::bucket_drop_request req{ bucket_name };
1396
- test::utils::execute(integration.cluster, req);
1397
- }
1398
1452
  }
1399
1453
 
1400
1454
  TEST_CASE("integration: analytics index management", "[integration]")
@@ -2346,23 +2400,25 @@ TEST_CASE("integration: freeform HTTP request", "[integration]")
2346
2400
  REQUIRE(result.is_object());
2347
2401
  }
2348
2402
 
2349
- SECTION("view")
2350
- {
2351
- auto document_name = test::utils::uniq_id("design_document");
2352
- auto view_name = test::utils::uniq_id("view");
2403
+ if (integration.cluster_version().supports_views()) {
2404
+ SECTION("view")
2405
+ {
2406
+ auto document_name = test::utils::uniq_id("design_document");
2407
+ auto view_name = test::utils::uniq_id("view");
2353
2408
 
2354
- couchbase::operations::management::freeform_request req{};
2355
- req.type = couchbase::service_type::view;
2356
- req.method = "POST";
2357
- req.path = fmt::format("/{}/_design/{}/_view/{}", integration.ctx.bucket, document_name, view_name);
2358
- req.body = R"({"keys":["foo","bar"]})";
2359
- auto resp = test::utils::execute(integration.cluster, req);
2360
- REQUIRE_FALSE(resp.ctx.ec);
2361
- REQUIRE(resp.status == 404);
2362
- REQUIRE_FALSE(resp.body.empty());
2363
- auto result = couchbase::utils::json::parse(resp.body);
2364
- INFO(resp.body)
2365
- REQUIRE(result["error"].get_string() == "not_found");
2409
+ couchbase::operations::management::freeform_request req{};
2410
+ req.type = couchbase::service_type::view;
2411
+ req.method = "POST";
2412
+ req.path = fmt::format("/{}/_design/{}/_view/{}", integration.ctx.bucket, document_name, view_name);
2413
+ req.body = R"({"keys":["foo","bar"]})";
2414
+ auto resp = test::utils::execute(integration.cluster, req);
2415
+ REQUIRE_FALSE(resp.ctx.ec);
2416
+ REQUIRE(resp.status == 404);
2417
+ REQUIRE_FALSE(resp.body.empty());
2418
+ auto result = couchbase::utils::json::parse(resp.body);
2419
+ INFO(resp.body)
2420
+ REQUIRE(result["error"].get_string() == "not_found");
2421
+ }
2366
2422
  }
2367
2423
 
2368
2424
  SECTION("management")