couchbase 3.2.3 → 3.2.4
Sign up to get free protection for your applications and to get access to all the features.
- package/deps/lcb/CMakeLists.txt +1 -1
- package/deps/lcb/CONTRIBUTING.md +1 -1
- package/deps/lcb/README.markdown +2 -2
- package/deps/lcb/RELEASE_NOTES.markdown +72 -17
- package/deps/lcb/cmake/Modules/GetVersionInfo.cmake +1 -1
- package/deps/lcb/contrib/cbsasl/src/scram-sha/scram_utils.cc +22 -26
- package/deps/lcb/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +20 -6
- package/deps/lcb/doc/Doxyfile +1 -1
- package/deps/lcb/example/minimal/query.c +9 -7
- package/deps/lcb/gyp_config/common/libcouchbase/configuration.h +3 -3
- package/deps/lcb/include/libcouchbase/couchbase.h +3 -1
- package/deps/lcb/include/libcouchbase/error.h +2 -0
- package/deps/lcb/include/libcouchbase/ixmgmt.h +15 -10
- package/deps/lcb/include/libcouchbase/tracing.h +2 -2
- package/deps/lcb/include/memcached/protocol_binary.h +21 -0
- package/deps/lcb/libcouchbase.gyp +347 -349
- package/deps/lcb/packaging/deb/control +1 -1
- package/deps/lcb/src/analytics/analytics_handle.cc +7 -5
- package/deps/lcb/src/analytics/analytics_handle.hh +28 -0
- package/deps/lcb/src/capi/cmd_counter.hh +6 -0
- package/deps/lcb/src/capi/cmd_exists.hh +6 -0
- package/deps/lcb/src/capi/cmd_get.hh +5 -0
- package/deps/lcb/src/capi/cmd_get_replica.hh +6 -0
- package/deps/lcb/src/capi/cmd_remove.hh +6 -0
- package/deps/lcb/src/capi/cmd_search.hh +6 -0
- package/deps/lcb/src/capi/cmd_store.hh +16 -21
- package/deps/lcb/src/capi/cmd_subdoc.hh +18 -0
- package/deps/lcb/src/capi/cmd_touch.hh +6 -0
- package/deps/lcb/src/capi/cmd_unlock.hh +6 -0
- package/deps/lcb/src/capi/cmd_view.hh +6 -0
- package/deps/lcb/src/capi/collection_qualifier.hh +2 -2
- package/deps/lcb/src/cntl.cc +42 -8
- package/deps/lcb/src/dns-srv.cc +5 -3
- package/deps/lcb/src/errmap.cc +5 -9
- package/deps/lcb/src/errmap.h +7 -3
- package/deps/lcb/src/handler.cc +24 -18
- package/deps/lcb/src/lcbio/ctx.cc +4 -2
- package/deps/lcb/src/mcserver/mcserver.cc +8 -5
- package/deps/lcb/src/mcserver/negotiate.cc +39 -17
- package/deps/lcb/src/n1ql/ixmgmt.cc +1 -2
- package/deps/lcb/src/n1ql/query_handle.cc +27 -16
- package/deps/lcb/src/n1ql/query_handle.hh +27 -1
- package/deps/lcb/src/operations/counter.cc +1 -1
- package/deps/lcb/src/operations/exists.cc +2 -2
- package/deps/lcb/src/operations/get.cc +2 -2
- package/deps/lcb/src/operations/observe.cc +1 -1
- package/deps/lcb/src/operations/remove.cc +1 -1
- package/deps/lcb/src/operations/store.cc +1 -1
- package/deps/lcb/src/operations/subdoc.cc +1 -2
- package/deps/lcb/src/operations/touch.cc +2 -2
- package/deps/lcb/src/operations/unlock.cc +2 -2
- package/deps/lcb/src/search/search_handle.cc +27 -8
- package/deps/lcb/src/search/search_handle.hh +29 -0
- package/deps/lcb/src/ssl/ssl_common.c +6 -7
- package/deps/lcb/src/tracing/span.cc +43 -10
- package/deps/lcb/src/tracing/tracing-internal.h +105 -93
- package/deps/lcb/src/views/view_handle.cc +13 -5
- package/deps/lcb/src/views/view_handle.hh +29 -0
- package/deps/lcb/tests/CMakeLists.txt +21 -0
- package/deps/lcb/tests/basic/t_ctlcodes.cc +24 -3
- package/deps/lcb/tests/basic/t_jsparse.cc +8 -0
- package/deps/lcb/tests/iotests/mock-environment.cc +15 -0
- package/deps/lcb/tests/iotests/mock-environment.h +47 -0
- package/deps/lcb/tests/iotests/mock-unit-test.cc +96 -5
- package/deps/lcb/tests/iotests/mock-unit-test.h +32 -0
- package/deps/lcb/tests/iotests/t_collections.cc +1 -1
- package/deps/lcb/tests/iotests/t_confmon.cc +4 -2
- package/deps/lcb/tests/iotests/t_get.cc +14 -4
- package/deps/lcb/tests/iotests/t_n1ql.cc +17 -1
- package/deps/lcb/tests/iotests/t_views.cc +1 -0
- package/deps/lcb/tests/iotests/testutil.cc +168 -0
- package/deps/lcb/tests/iotests/testutil.h +111 -0
- package/deps/lcb/tests/mocksupport/procutil.c +32 -28
- package/deps/lcb/tests/mocksupport/server.c +0 -1
- package/deps/lcb/tools/cbc.cc +7 -0
- package/dist/analyticsindexmanager.js +3 -3
- package/dist/binding.d.ts +2 -0
- package/dist/bindingutilities.js +4 -0
- package/dist/bucketmanager.d.ts +31 -1
- package/dist/bucketmanager.js +28 -2
- package/dist/collection.js +2 -2
- package/dist/collectionmanager.js +2 -2
- package/dist/connection.js +3 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.js +26 -2
- package/dist/eventingfunctionmanager.js +6 -6
- package/dist/queryindexmanager.js +3 -3
- package/dist/searchexecutor.js +3 -0
- package/dist/searchindexmanager.js +1 -1
- package/dist/searchquery.d.ts +17 -0
- package/dist/searchquery.js +22 -1
- package/dist/searchtypes.d.ts +7 -2
- package/dist/searchtypes.js +2 -2
- package/dist/usermanager.js +1 -1
- package/dist/viewindexmanager.js +1 -1
- package/package.json +1 -1
- package/src/connection.cpp +2 -0
- package/src/constants.cpp +2 -0
- package/src/instance.cpp +8 -1
- package/src/instance.h +1 -0
@@ -26,6 +26,13 @@
|
|
26
26
|
#include <queue>
|
27
27
|
#include <map>
|
28
28
|
#include <string>
|
29
|
+
#include <memory>
|
30
|
+
|
31
|
+
LCB_INTERNAL_API
|
32
|
+
void lcbtrace_span_add_system_tags(lcbtrace_SPAN *span, const lcb_settings *settings, lcbtrace_THRESHOLDOPTS svc);
|
33
|
+
LIBCOUCHBASE_API
|
34
|
+
void lcbtrace_span_add_tag_str_nocopy(lcbtrace_SPAN *span, const char *name, const char *value);
|
35
|
+
void lcbtrace_span_add_host_and_port(lcbtrace_SPAN *span, lcbio_CONNINFO *info);
|
29
36
|
|
30
37
|
namespace lcb
|
31
38
|
{
|
@@ -45,6 +52,7 @@ class Span
|
|
45
52
|
return m_finish - m_start;
|
46
53
|
}
|
47
54
|
|
55
|
+
void add_tag(const char *name, const std::string &value);
|
48
56
|
void add_tag(const char *name, int copy, const char *value, int copy_value);
|
49
57
|
void add_tag(const char *name, int copy_key, const char *value, size_t value_len, int copy_value);
|
50
58
|
void add_tag(const char *name, int copy, uint64_t value);
|
@@ -141,7 +149,7 @@ class ThresholdLoggingTracer
|
|
141
149
|
QueueEntry convert(lcbtrace_SPAN *span);
|
142
150
|
|
143
151
|
public:
|
144
|
-
ThresholdLoggingTracer(lcb_INSTANCE *instance);
|
152
|
+
explicit ThresholdLoggingTracer(lcb_INSTANCE *instance);
|
145
153
|
|
146
154
|
lcbtrace_TRACER *wrap();
|
147
155
|
void add_orphan(lcbtrace_SPAN *span);
|
@@ -156,108 +164,112 @@ class ThresholdLoggingTracer
|
|
156
164
|
lcb::io::Timer<ThresholdLoggingTracer, &ThresholdLoggingTracer::flush_threshold> m_tflush;
|
157
165
|
};
|
158
166
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
span->
|
167
|
+
template <typename COMMAND>
|
168
|
+
lcbtrace_SPAN *start_kv_span(const lcb_settings *settings, const mc_PACKET *packet, std::shared_ptr<COMMAND> cmd)
|
169
|
+
{
|
170
|
+
if (settings == nullptr || settings->tracer == nullptr) {
|
171
|
+
return nullptr;
|
172
|
+
}
|
173
|
+
lcbtrace_SPAN *span;
|
174
|
+
lcbtrace_SPAN *parent_span = cmd->parent_span();
|
175
|
+
if (parent_span != nullptr && parent_span->is_outer() && settings->tracer->flags & LCBTRACE_F_THRESHOLD) {
|
176
|
+
span = parent_span;
|
177
|
+
span->should_finish(false);
|
178
|
+
} else {
|
179
|
+
lcbtrace_REF ref;
|
180
|
+
ref.type = LCBTRACE_REF_CHILD_OF;
|
181
|
+
ref.span = parent_span;
|
182
|
+
bool is_dispatch = (parent_span != nullptr && parent_span->is_outer());
|
183
|
+
span = lcbtrace_span_start((settings)->tracer,
|
184
|
+
is_dispatch ? LCBTRACE_OP_DISPATCH_TO_SERVER : cmd->operation_name().c_str(),
|
185
|
+
LCBTRACE_NOW, &ref);
|
186
|
+
span->should_finish(true);
|
187
|
+
span->is_outer(!is_dispatch);
|
179
188
|
}
|
189
|
+
span->is_dispatch(true);
|
190
|
+
std::string operation_id = std::to_string(packet->opaque);
|
191
|
+
lcbtrace_span_add_tag_str(span, LCBTRACE_TAG_OPERATION_ID, operation_id.c_str());
|
192
|
+
lcbtrace_span_add_system_tags(span, settings, LCBTRACE_THRESHOLD_KV);
|
193
|
+
span->add_tag(LCBTRACE_TAG_SCOPE, cmd->collection().scope());
|
194
|
+
span->add_tag(LCBTRACE_TAG_COLLECTION, cmd->collection().collection());
|
195
|
+
span->add_tag(LCBTRACE_TAG_OPERATION, cmd->operation_name());
|
196
|
+
return span;
|
197
|
+
}
|
180
198
|
|
181
|
-
|
182
|
-
#define LCBTRACE_HTTP_START(settings, opaque, pspan, operation_name, svc, outspan) \
|
183
|
-
LCBTRACE_START(settings, opaque, pspan, operation_name, svc, outspan)
|
199
|
+
void finish_kv_span(const mc_PIPELINE *pipeline, const mc_PACKET *request_pkt, const MemcachedResponse *response_pkt);
|
184
200
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
201
|
+
template <typename COMMAND>
|
202
|
+
lcbtrace_SPAN *start_kv_span_with_durability(const lcb_settings *settings, const mc_PACKET *packet,
|
203
|
+
std::shared_ptr<COMMAND> cmd)
|
204
|
+
{
|
205
|
+
lcbtrace_SPAN *span = start_kv_span(settings, packet, cmd);
|
206
|
+
if (span != nullptr && cmd->durability_level() != LCB_DURABILITYLEVEL_NONE) {
|
207
|
+
span->add_tag(LCBTRACE_TAG_DURABILITY, 0, dur_level_to_string(cmd->durability_level()), 0);
|
191
208
|
}
|
209
|
+
return span;
|
210
|
+
}
|
192
211
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
if (nullptr
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
} \
|
215
|
-
lcbtrace_span_add_system_tags(outspan, settings, svc); \
|
216
|
-
} else { \
|
217
|
-
outspan = nullptr; \
|
212
|
+
template <typename COMMAND>
|
213
|
+
lcbtrace_SPAN *start_http_span(const lcb_settings *settings, const COMMAND *cmd)
|
214
|
+
{
|
215
|
+
if (settings == nullptr || settings->tracer == nullptr) {
|
216
|
+
return nullptr;
|
217
|
+
}
|
218
|
+
lcbtrace_SPAN *span;
|
219
|
+
lcbtrace_SPAN *parent_span = cmd->parent_span();
|
220
|
+
if (parent_span != nullptr && parent_span->is_outer() && settings->tracer->flags & LCBTRACE_F_THRESHOLD) {
|
221
|
+
span = parent_span;
|
222
|
+
span->should_finish(false);
|
223
|
+
} else {
|
224
|
+
lcbtrace_REF ref;
|
225
|
+
ref.type = LCBTRACE_REF_CHILD_OF;
|
226
|
+
ref.span = parent_span;
|
227
|
+
bool is_dispatch = (parent_span != nullptr && parent_span->is_outer());
|
228
|
+
span = lcbtrace_span_start((settings)->tracer,
|
229
|
+
is_dispatch ? LCBTRACE_OP_DISPATCH_TO_SERVER : cmd->operation_name().c_str(),
|
230
|
+
LCBTRACE_NOW, &ref);
|
231
|
+
span->should_finish(true);
|
232
|
+
span->is_outer(!is_dispatch);
|
218
233
|
}
|
234
|
+
span->is_dispatch(true);
|
235
|
+
lcbtrace_span_add_tag_str(span, LCBTRACE_TAG_OPERATION_ID, cmd->client_context_id().c_str());
|
236
|
+
lcbtrace_span_add_system_tags(span, settings, cmd->service());
|
237
|
+
span->add_tag(LCBTRACE_TAG_OPERATION, cmd->operation_name());
|
238
|
+
return span;
|
239
|
+
}
|
219
240
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
241
|
+
template <typename COMMAND>
|
242
|
+
lcbtrace_SPAN *start_http_span_with_statement(const lcb_settings *settings, const COMMAND *cmd,
|
243
|
+
const std::string &statement)
|
244
|
+
{
|
245
|
+
lcbtrace_SPAN *span = start_http_span(settings, cmd);
|
246
|
+
if (span != nullptr && !statement.empty()) {
|
247
|
+
span->add_tag(LCBTRACE_TAG_STATEMENT, statement);
|
224
248
|
}
|
249
|
+
return span;
|
250
|
+
}
|
225
251
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
lcbio_CTX *ctx = server->connctx; \
|
235
|
-
if (ctx) { \
|
236
|
-
char local_id[34] = {}; \
|
237
|
-
snprintf(local_id, sizeof(local_id), "%016" PRIx64 "/%016" PRIx64, \
|
238
|
-
(uint64_t)server->get_settings()->iid, (uint64_t)ctx->sock->id); \
|
239
|
-
lcbtrace_span_add_tag_str(dispatch_span__, LCBTRACE_TAG_LOCAL_ID, local_id); \
|
240
|
-
lcbtrace_span_add_host_and_port(dispatch_span__, ctx->sock->info); \
|
241
|
-
} \
|
242
|
-
if (dispatch_span__->should_finish()) { \
|
243
|
-
lcbtrace_span_finish(dispatch_span__, LCBTRACE_NOW); \
|
244
|
-
} \
|
245
|
-
} \
|
246
|
-
} while (0)
|
247
|
-
|
248
|
-
#define LCBTRACE_HTTP_FINISH(span) \
|
249
|
-
if (nullptr != span) { \
|
250
|
-
lcbtrace_span_add_tag_str_nocopy(span, LCBTRACE_TAG_TRANSPORT, "IP.TCP"); \
|
251
|
-
if (span->should_finish()) { \
|
252
|
-
lcbtrace_span_finish(span, LCBTRACE_NOW); \
|
253
|
-
} \
|
254
|
-
span = nullptr; \
|
252
|
+
template <typename COMMAND>
|
253
|
+
void finish_http_span(lcbtrace_SPAN *span, const COMMAND *cmd)
|
254
|
+
{
|
255
|
+
if (span != nullptr) {
|
256
|
+
span->find_outer_or_this()->add_tag(LCBTRACE_TAG_RETRIES, 0, (uint64_t)cmd->retries());
|
257
|
+
if (span->should_finish()) {
|
258
|
+
lcbtrace_span_finish(span, LCBTRACE_NOW);
|
259
|
+
}
|
255
260
|
}
|
256
261
|
}
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
+
|
263
|
+
} // namespace trace
|
264
|
+
} // namespace lcb
|
265
|
+
|
266
|
+
extern "C" {
|
267
|
+
#endif /* __cplusplus */
|
268
|
+
LCB_INTERNAL_API
|
269
|
+
void lcbtrace_span_set_orphaned(lcbtrace_SPAN *span, int val);
|
270
|
+
|
271
|
+
const char *dur_level_to_string(lcb_DURABILITY_LEVEL dur_level);
|
272
|
+
#ifdef __cplusplus
|
273
|
+
}
|
262
274
|
#endif /* __cplusplus*/
|
263
275
|
#endif /* LCB_TRACING_INTERNAL_H */
|
@@ -80,8 +80,8 @@ void lcb_VIEW_HANDLE_::invoke_last(lcb_STATUS err)
|
|
80
80
|
if (http_response_ && http_response_->ctx.response_code != 200 && http_response_->ctx.body_len) {
|
81
81
|
// chances that were not able to parse response
|
82
82
|
Json::Value meta;
|
83
|
-
if (Json::Reader()
|
84
|
-
|
83
|
+
if (Json::Reader(Json::Features::strictMode())
|
84
|
+
.parse(http_response_->ctx.body, http_response_->ctx.body + http_response_->ctx.body_len, meta)) {
|
85
85
|
const Json::Value &error = meta["error"];
|
86
86
|
if (error.isString()) {
|
87
87
|
first_error_code_ = error.asString();
|
@@ -101,7 +101,10 @@ void lcb_VIEW_HANDLE_::invoke_last(lcb_STATUS err)
|
|
101
101
|
resp.ctx.rc = LCB_ERR_VIEW_NOT_FOUND;
|
102
102
|
}
|
103
103
|
|
104
|
-
|
104
|
+
if (span_ != nullptr) {
|
105
|
+
lcb::trace::finish_http_span(span_, this);
|
106
|
+
span_ = nullptr;
|
107
|
+
}
|
105
108
|
if (http_request_ != nullptr) {
|
106
109
|
http_request_->span = nullptr;
|
107
110
|
}
|
@@ -379,11 +382,16 @@ lcb_VIEW_HANDLE_::lcb_VIEW_HANDLE_(lcb_INSTANCE *instance, void *cookie, const l
|
|
379
382
|
document_queue_->max_pending_response = cmd->max_concurrent_documents();
|
380
383
|
}
|
381
384
|
}
|
385
|
+
{
|
386
|
+
char buf[32];
|
387
|
+
size_t nbuf = snprintf(buf, sizeof(buf), "%016" PRIx64, lcb_next_rand64());
|
388
|
+
client_context_id_.assign(buf, nbuf);
|
389
|
+
}
|
382
390
|
|
383
391
|
lcb_aspend_add(&instance_->pendops, LCB_PENDTYPE_COUNTER, nullptr);
|
384
392
|
if (instance->settings->tracer) {
|
385
|
-
|
386
|
-
|
393
|
+
parent_span_ = cmd->parent_span();
|
394
|
+
span_ = lcb::trace::start_http_span(instance_->settings, this);
|
387
395
|
}
|
388
396
|
last_error_ = request_http(cmd);
|
389
397
|
}
|
@@ -118,6 +118,32 @@ struct lcb_VIEW_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
118
118
|
return http_request_;
|
119
119
|
}
|
120
120
|
|
121
|
+
static lcbtrace_THRESHOLDOPTS service()
|
122
|
+
{
|
123
|
+
return LCBTRACE_THRESHOLD_VIEW;
|
124
|
+
}
|
125
|
+
|
126
|
+
static const std::string &operation_name()
|
127
|
+
{
|
128
|
+
static std::string name = LCBTRACE_OP_VIEW;
|
129
|
+
return name;
|
130
|
+
}
|
131
|
+
|
132
|
+
lcbtrace_SPAN *parent_span() const
|
133
|
+
{
|
134
|
+
return parent_span_;
|
135
|
+
}
|
136
|
+
|
137
|
+
const std::string &client_context_id() const
|
138
|
+
{
|
139
|
+
return client_context_id_;
|
140
|
+
}
|
141
|
+
|
142
|
+
int retries() const
|
143
|
+
{
|
144
|
+
return retries_;
|
145
|
+
}
|
146
|
+
|
121
147
|
private:
|
122
148
|
/** Current HTTP response to provide in callbacks */
|
123
149
|
const lcb_RESPHTTP *http_response_{nullptr};
|
@@ -134,12 +160,15 @@ struct lcb_VIEW_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
134
160
|
std::string query_params_{};
|
135
161
|
std::string first_error_code_{};
|
136
162
|
std::string first_error_message_{};
|
163
|
+
std::string client_context_id_{};
|
137
164
|
|
138
165
|
unsigned refcount_{1};
|
139
166
|
bool include_docs_{false};
|
140
167
|
bool do_not_parse_rows_{false};
|
141
168
|
bool spatial_{false};
|
169
|
+
int retries_{0};
|
142
170
|
|
143
171
|
lcb_STATUS last_error_{LCB_SUCCESS};
|
172
|
+
lcbtrace_SPAN *parent_span_{nullptr};
|
144
173
|
lcbtrace_SPAN *span_{nullptr};
|
145
174
|
};
|
@@ -152,8 +152,29 @@ MACRO(DEFINE_MOCKTEST plugin test)
|
|
152
152
|
--tests ${test}
|
153
153
|
--verbose
|
154
154
|
--
|
155
|
+
--gtest_filter="-ContaminatingUnitTest.*"
|
156
|
+
--gtest_throw_on_failure=1
|
155
157
|
--gtest_print_time=1
|
156
158
|
--gtest_output=xml:"${PROJECT_BINARY_DIR}/REPORT_${plugin}_${test}.xml")
|
159
|
+
SET_TESTS_PROPERTIES(check-${plugin}-${test} PROPERTIES LABELS "normal" )
|
160
|
+
|
161
|
+
ADD_TEST(
|
162
|
+
NAME
|
163
|
+
check-contaminating-${plugin}-${test}
|
164
|
+
COMMAND
|
165
|
+
$<TARGET_FILE:check-all>
|
166
|
+
--srcdir "${PROJECT_SOURCE_DIR}"
|
167
|
+
--testdir "$<TARGET_FILE_DIR:check-all>"
|
168
|
+
--libdir "$<TARGET_FILE_DIR:couchbase>"
|
169
|
+
--plugins ${plugin}
|
170
|
+
--tests ${test}
|
171
|
+
--verbose
|
172
|
+
--
|
173
|
+
--gtest_filter="ContaminatingUnitTest.*"
|
174
|
+
--gtest_throw_on_failure=1
|
175
|
+
--gtest_print_time=1
|
176
|
+
--gtest_output=xml:"${PROJECT_BINARY_DIR}/REPORT_${plugin}_${test}.xml")
|
177
|
+
SET_TESTS_PROPERTIES(check-contaminating-${plugin}-${test} PROPERTIES LABELS "contaminating" )
|
157
178
|
ENDMACRO()
|
158
179
|
|
159
180
|
# Since we need a plugin name, we'll use 'select'. However none of these
|
@@ -18,6 +18,9 @@
|
|
18
18
|
#include "config.h"
|
19
19
|
#include <gtest/gtest.h>
|
20
20
|
#include <libcouchbase/couchbase.h>
|
21
|
+
#include <iotests/testutil.h>
|
22
|
+
|
23
|
+
#include "internal.h"
|
21
24
|
|
22
25
|
class CtlTest : public ::testing::Test
|
23
26
|
{
|
@@ -61,9 +64,9 @@ TEST_F(CtlTest, testStringCtls)
|
|
61
64
|
{
|
62
65
|
lcb_INSTANCE *instance;
|
63
66
|
lcb_STATUS err;
|
64
|
-
err = lcb_create(&instance,
|
67
|
+
err = lcb_create(&instance, nullptr);
|
65
68
|
ASSERT_EQ(LCB_SUCCESS, err);
|
66
|
-
ASSERT_FALSE(instance ==
|
69
|
+
ASSERT_FALSE(instance == nullptr);
|
67
70
|
|
68
71
|
// These are all U32
|
69
72
|
PairMap ctlMap[] = {{"operation_timeout", LCB_CNTL_OP_TIMEOUT},
|
@@ -74,7 +77,7 @@ TEST_F(CtlTest, testStringCtls)
|
|
74
77
|
{"error_thresh_delay", LCB_CNTL_CONFDELAY_THRESH},
|
75
78
|
{"config_total_timeout", LCB_CNTL_CONFIGURATION_TIMEOUT},
|
76
79
|
{"config_node_timeout", LCB_CNTL_CONFIG_NODE_TIMEOUT},
|
77
|
-
{
|
80
|
+
{nullptr, 0}};
|
78
81
|
|
79
82
|
for (PairMap *cur = ctlMap; cur->key; cur++) {
|
80
83
|
err = lcb_cntl_string(instance, cur->key, "50");
|
@@ -111,3 +114,21 @@ TEST_F(CtlTest, testStringCtls)
|
|
111
114
|
|
112
115
|
lcb_destroy(instance);
|
113
116
|
}
|
117
|
+
|
118
|
+
TEST_F(CtlTest, testTimeDurationParsing)
|
119
|
+
{
|
120
|
+
lcb_INSTANCE *instance;
|
121
|
+
ASSERT_EQ(LCB_SUCCESS, lcb_create(&instance, nullptr));
|
122
|
+
ASSERT_FALSE(instance == nullptr);
|
123
|
+
|
124
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "analytics_timeout", "123.456"));
|
125
|
+
ASSERT_EQ(123456000, instance->settings->analytics_timeout);
|
126
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "analytics_timeout", "42"));
|
127
|
+
ASSERT_EQ(42000000, instance->settings->analytics_timeout);
|
128
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "analytics_timeout", "42us"));
|
129
|
+
ASSERT_EQ(42, instance->settings->analytics_timeout);
|
130
|
+
ASSERT_STATUS_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "analytics_timeout", "5s42us"));
|
131
|
+
ASSERT_EQ(5000042, instance->settings->analytics_timeout);
|
132
|
+
|
133
|
+
lcb_destroy(instance);
|
134
|
+
}
|
@@ -105,3 +105,11 @@ TEST_F(JsonParseTest, testN1QL)
|
|
105
105
|
ASSERT_TRUE(validateJsonRows(JSON_n1ql_empty, sizeof(JSON_n1ql_empty), Parser::MODE_N1QL));
|
106
106
|
ASSERT_TRUE(validateBadParse(JSON_n1ql_bad, sizeof(JSON_n1ql_bad), Parser::MODE_N1QL));
|
107
107
|
}
|
108
|
+
|
109
|
+
TEST_F(JsonParseTest, testInvalidJSON)
|
110
|
+
{
|
111
|
+
std::string input = "503 Service Unavailable";
|
112
|
+
Json::Value meta;
|
113
|
+
ASSERT_TRUE(Json::Reader().parse(input.c_str(), input.c_str() + input.size(), meta));
|
114
|
+
ASSERT_FALSE(Json::Reader(Json::Features::strictMode()).parse(input.c_str(), input.c_str() + input.size(), meta));
|
115
|
+
}
|
@@ -21,6 +21,7 @@
|
|
21
21
|
#include "mock-environment.h"
|
22
22
|
#include <sstream>
|
23
23
|
#include "internal.h" /* settings from lcb_INSTANCE *for logging */
|
24
|
+
#include "testutil.h"
|
24
25
|
|
25
26
|
#define LOGARGS(instance, lvl) instance->settings, "tests-ENV", LCB_LOG_##lvl, __FILE__, __LINE__
|
26
27
|
|
@@ -288,6 +289,7 @@ void MockEnvironment::createConnection(HandleWrap &handle, lcb_INSTANCE **instan
|
|
288
289
|
}
|
289
290
|
|
290
291
|
lcb_createopts_io(&options, io);
|
292
|
+
|
291
293
|
lcb_STATUS err = lcb_create(instance, &options);
|
292
294
|
ASSERT_EQ(LCB_SUCCESS, err);
|
293
295
|
postCreate(*instance);
|
@@ -302,6 +304,15 @@ void MockEnvironment::createConnection(HandleWrap &handle, lcb_INSTANCE **instan
|
|
302
304
|
{
|
303
305
|
lcb_CREATEOPTS *options = nullptr;
|
304
306
|
makeConnectParams(options, nullptr);
|
307
|
+
|
308
|
+
if (test_tracer.enabled()) {
|
309
|
+
lcb_createopts_tracer(options, test_tracer.lcb_tracer());
|
310
|
+
}
|
311
|
+
|
312
|
+
if (test_meter.enabled()) {
|
313
|
+
lcb_createopts_meter(options, test_meter.lcb_meter());
|
314
|
+
}
|
315
|
+
|
305
316
|
createConnection(handle, instance, options);
|
306
317
|
lcb_createopts_destroy(options);
|
307
318
|
}
|
@@ -311,6 +322,7 @@ void MockEnvironment::createConnection(HandleWrap &handle, lcb_INSTANCE **instan
|
|
311
322
|
{
|
312
323
|
lcb_CREATEOPTS *options = nullptr;
|
313
324
|
makeConnectParams(options, nullptr);
|
325
|
+
|
314
326
|
lcb_createopts_credentials(options, username.c_str(), username.size(), password.c_str(), password.size());
|
315
327
|
createConnection(handle, instance, options);
|
316
328
|
lcb_createopts_destroy(options);
|
@@ -556,6 +568,9 @@ void MockEnvironment::SetUp()
|
|
556
568
|
featureRegistry.insert("replica_read");
|
557
569
|
featureRegistry.insert("lock");
|
558
570
|
|
571
|
+
test_tracer = TestTracer();
|
572
|
+
test_meter = TestMeter();
|
573
|
+
|
559
574
|
clearAndReset();
|
560
575
|
}
|
561
576
|
|
@@ -20,6 +20,7 @@
|
|
20
20
|
#include "config.h"
|
21
21
|
#include <gtest/gtest.h>
|
22
22
|
#include <libcouchbase/couchbase.h>
|
23
|
+
#include "testutil.h"
|
23
24
|
|
24
25
|
#include <utility>
|
25
26
|
#include "serverparams.h"
|
@@ -451,6 +452,16 @@ class MockEnvironment : public ::testing::Environment
|
|
451
452
|
std::cerr << std::endl;
|
452
453
|
}
|
453
454
|
|
455
|
+
TestTracer &getTracer()
|
456
|
+
{
|
457
|
+
return test_tracer;
|
458
|
+
}
|
459
|
+
|
460
|
+
TestMeter &getMeter()
|
461
|
+
{
|
462
|
+
return test_meter;
|
463
|
+
}
|
464
|
+
|
454
465
|
explicit MockEnvironment(const char **argv, const std::string &name = "default");
|
455
466
|
~MockEnvironment() override;
|
456
467
|
void postCreate(lcb_INSTANCE *instance) const;
|
@@ -478,11 +489,47 @@ class MockEnvironment : public ::testing::Environment
|
|
478
489
|
std::string userName;
|
479
490
|
const char **argv_{nullptr};
|
480
491
|
void clearAndReset();
|
492
|
+
TestTracer test_tracer;
|
493
|
+
TestMeter test_meter;
|
481
494
|
|
482
495
|
private:
|
483
496
|
lcb_INSTANCE *innerClient{nullptr};
|
484
497
|
};
|
485
498
|
|
499
|
+
class tracing_guard
|
500
|
+
{
|
501
|
+
public:
|
502
|
+
tracing_guard()
|
503
|
+
{
|
504
|
+
was_enabled_ = MockEnvironment::getInstance()->getTracer().set_enabled(true);
|
505
|
+
}
|
506
|
+
|
507
|
+
~tracing_guard()
|
508
|
+
{
|
509
|
+
MockEnvironment::getInstance()->getTracer().set_enabled(was_enabled_);
|
510
|
+
}
|
511
|
+
|
512
|
+
private:
|
513
|
+
bool was_enabled_{false};
|
514
|
+
};
|
515
|
+
|
516
|
+
class metrics_guard
|
517
|
+
{
|
518
|
+
public:
|
519
|
+
metrics_guard()
|
520
|
+
{
|
521
|
+
was_enabled_ = MockEnvironment::getInstance()->getMeter().set_enabled(true);
|
522
|
+
}
|
523
|
+
|
524
|
+
~metrics_guard()
|
525
|
+
{
|
526
|
+
MockEnvironment::getInstance()->getMeter().set_enabled(was_enabled_);
|
527
|
+
}
|
528
|
+
|
529
|
+
private:
|
530
|
+
bool was_enabled_{false};
|
531
|
+
};
|
532
|
+
|
486
533
|
#define LCB_TEST_REQUIRE_CLUSTER_VERSION(v) \
|
487
534
|
if (!MockEnvironment::getInstance()->isRealCluster()) { \
|
488
535
|
MockEnvironment::printSkipMessage(__FILE__, __LINE__, "need real cluster"); \
|