Skip to content

Commit 8d120e2

Browse files
committed
CDRIVER-3535 add SDAM integration tests
- Add support for new spec test operations: waitForEvent, assertEventCount, configureFailPoint, wait, runAdminCommand, waitForPrimaryChange, startThread, waitForThread, runOnThread - Add prose test for RTT. - Generalize URI option initialization in tests.
1 parent b6b4d42 commit 8d120e2

File tree

9 files changed

+883
-53
lines changed

9 files changed

+883
-53
lines changed

src/libmongoc/src/mongoc/mongoc-server-monitor.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,13 +395,14 @@ _server_monitor_poll_with_interrupt (mongoc_server_monitor_t *server_monitor,
395395
const int32_t monitor_tick_ms = 500;
396396
int64_t timeleft_ms;
397397

398-
MONITOR_LOG (server_monitor,
399-
"_server_monitor_poll_with_interrupt expire_at_ms: %" PRIu64,
400-
expire_at_ms);
401398
while ((timeleft_ms = expire_at_ms - _now_ms ()) > 0) {
402399
ssize_t ret;
403400
mongoc_stream_poll_t poller[1];
404401

402+
MONITOR_LOG (server_monitor,
403+
"_server_monitor_poll_with_interrupt expires in: %" PRIu64
404+
"ms",
405+
timeleft_ms);
405406
poller[0].stream = server_monitor->stream;
406407
poller[0].events =
407408
POLLIN; /* POLLERR and POLLHUP are added in mongoc_socket_poll. */

src/libmongoc/tests/TestSuite.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,6 +943,7 @@ int
943943
TestSuite_Run (TestSuite *suite) /* IN */
944944
{
945945
int failures = 0;
946+
int64_t start_us;
946947

947948
if (suite->flags & TEST_HELPTEXT) {
948949
TestSuite_PrintHelp (suite);
@@ -963,6 +964,7 @@ TestSuite_Run (TestSuite *suite) /* IN */
963964
}
964965
}
965966

967+
start_us = bson_get_monotonic_time ();
966968
if (suite->tests) {
967969
if (suite->testname) {
968970
failures += TestSuite_RunNamed (suite, suite->testname);
@@ -975,6 +977,8 @@ TestSuite_Run (TestSuite *suite) /* IN */
975977
TestSuite_PrintJsonFooter (suite->outfile);
976978
}
977979
}
980+
MONGOC_DEBUG ("Duration of all tests (s): %" PRId64,
981+
(bson_get_monotonic_time () - start_us) / (1000 * 1000));
978982

979983
return failures;
980984
}

src/libmongoc/tests/json-test-monitoring.c

Lines changed: 76 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717

18+
#include "mongoc/mongoc-client-private.h"
1819
#include "mongoc/mongoc-config.h"
1920
#include "mongoc/mongoc-collection-private.h"
2021
#include "mongoc/mongoc-host-list-private.h"
@@ -85,19 +86,22 @@ started_cb (const mongoc_apm_command_started_t *event)
8586
{
8687
json_test_ctx_t *ctx =
8788
(json_test_ctx_t *) mongoc_apm_command_started_get_context (event);
88-
char *cmd_json;
8989
bson_t *events = &ctx->events;
9090
char str[16];
9191
const char *key;
9292
bson_t *new_event;
9393

9494
if (ctx->verbose) {
95+
char *cmd_json;
96+
9597
cmd_json = bson_as_canonical_extended_json (event->command, NULL);
9698
printf ("%s\n", cmd_json);
9799
fflush (stdout);
98100
bson_free (cmd_json);
99101
}
100102

103+
bson_mutex_lock (&ctx->mutex);
104+
101105
/* Track the last two lsid's */
102106
if (bson_has_field (event->command, "lsid")) {
103107
bson_t lsid;
@@ -132,6 +136,7 @@ started_cb (const mongoc_apm_command_started_t *event)
132136
ctx->n_events++;
133137

134138
bson_destroy (new_event);
139+
bson_mutex_unlock (&ctx->mutex);
135140
}
136141

137142

@@ -140,18 +145,22 @@ succeeded_cb (const mongoc_apm_command_succeeded_t *event)
140145
{
141146
json_test_ctx_t *ctx =
142147
(json_test_ctx_t *) mongoc_apm_command_succeeded_get_context (event);
143-
char *reply_json;
144148
char str[16];
145149
const char *key;
146150
bson_t *new_event;
147151

148152
if (ctx->verbose) {
153+
char *reply_json;
154+
149155
reply_json = bson_as_canonical_extended_json (event->reply, NULL);
150-
printf ("\t\t<-- %s\n", reply_json);
151-
fflush (stdout);
156+
MONGOC_DEBUG ("<-- COMMAND SUCCEEDED: %s\n", reply_json);
152157
bson_free (reply_json);
153158
}
154159

160+
if (ctx->config->command_started_events_only) {
161+
return;
162+
}
163+
155164
BSON_ASSERT (mongoc_apm_command_succeeded_get_request_id (event) > 0);
156165
BSON_ASSERT (mongoc_apm_command_succeeded_get_server_id (event) > 0);
157166
assert_host_in_uri (event->host, ctx->test_framework_uri);
@@ -165,12 +174,14 @@ succeeded_cb (const mongoc_apm_command_succeeded_t *event)
165174
BCON_INT64 (event->operation_id),
166175
"}");
167176

177+
bson_mutex_lock (&ctx->mutex);
168178
bson_uint32_to_string (ctx->n_events, &key, str, sizeof str);
169179
BSON_APPEND_DOCUMENT (&ctx->events, key, new_event);
170180

171181
ctx->n_events++;
172182

173183
bson_destroy (new_event);
184+
bson_mutex_unlock (&ctx->mutex);
174185
}
175186

176187

@@ -179,15 +190,23 @@ failed_cb (const mongoc_apm_command_failed_t *event)
179190
{
180191
json_test_ctx_t *ctx =
181192
(json_test_ctx_t *) mongoc_apm_command_failed_get_context (event);
182-
bson_t reply = BSON_INITIALIZER;
183193
char str[16];
184194
const char *key;
185195
bson_t *new_event;
186196

187197
if (ctx->verbose) {
188-
printf (
189-
"\t\t<-- %s FAILED: %s\n", event->command_name, event->error->message);
190-
fflush (stdout);
198+
char *reply_json;
199+
200+
reply_json = bson_as_canonical_extended_json (event->reply, NULL);
201+
MONGOC_DEBUG ("<-- %s COMMAND FAILED: %s\nREPLY: %s\n",
202+
event->command_name,
203+
event->error->message,
204+
reply_json);
205+
bson_free (reply_json);
206+
}
207+
208+
if (ctx->config->command_started_events_only) {
209+
return;
191210
}
192211

193212
BSON_ASSERT (mongoc_apm_command_failed_get_request_id (event) > 0);
@@ -202,15 +221,44 @@ failed_cb (const mongoc_apm_command_failed_t *event)
202221
BCON_INT64 (event->operation_id),
203222
"}");
204223

224+
bson_mutex_lock (&ctx->mutex);
205225
bson_uint32_to_string (ctx->n_events, &key, str, sizeof str);
206226
BSON_APPEND_DOCUMENT (&ctx->events, key, new_event);
207227

208228
ctx->n_events++;
209229

210230
bson_destroy (new_event);
211-
bson_destroy (&reply);
231+
bson_mutex_unlock (&ctx->mutex);
212232
}
213233

234+
static void
235+
server_changed_cb (const mongoc_apm_server_changed_t *event)
236+
{
237+
json_test_ctx_t *ctx;
238+
const mongoc_server_description_t *sd;
239+
const mongoc_server_description_t *prev_sd;
240+
241+
ctx = mongoc_apm_server_changed_get_context (event);
242+
sd = mongoc_apm_server_changed_get_new_description (event);
243+
prev_sd = mongoc_apm_server_changed_get_previous_description (event);
244+
if (ctx->verbose) {
245+
MONGOC_DEBUG ("SERVER CHANGED: (%s) %s --> %s\n",
246+
sd->host.host_and_port,
247+
mongoc_server_description_type (prev_sd),
248+
mongoc_server_description_type (sd));
249+
}
250+
251+
bson_mutex_lock (&ctx->mutex);
252+
if (sd->type == MONGOC_SERVER_UNKNOWN) {
253+
ctx->total_ServerMarkedUnknownEvent++;
254+
}
255+
if (sd->type == MONGOC_SERVER_RS_PRIMARY &&
256+
!_mongoc_host_list_compare_one (&sd->host, &ctx->primary_host)) {
257+
ctx->total_PrimaryChangedEvent++;
258+
memcpy (&ctx->primary_host, &sd->host, sizeof (mongoc_host_list_t));
259+
}
260+
bson_mutex_unlock (&ctx->mutex);
261+
}
214262

215263
void
216264
set_apm_callbacks (json_test_ctx_t *ctx, mongoc_client_t *client)
@@ -219,13 +267,27 @@ set_apm_callbacks (json_test_ctx_t *ctx, mongoc_client_t *client)
219267

220268
callbacks = mongoc_apm_callbacks_new ();
221269
mongoc_apm_set_command_started_cb (callbacks, started_cb);
270+
/* Even if test only checks command started events (i.e.
271+
* command_started_events_only is set on test config), set callbacks for the
272+
* benefit of logging. */
273+
mongoc_apm_set_command_succeeded_cb (callbacks, succeeded_cb);
274+
mongoc_apm_set_command_failed_cb (callbacks, failed_cb);
275+
mongoc_client_set_apm_callbacks (ctx->client, callbacks, ctx);
222276

223-
if (!ctx->config->command_started_events_only) {
224-
mongoc_apm_set_command_succeeded_cb (callbacks, succeeded_cb);
225-
mongoc_apm_set_command_failed_cb (callbacks, failed_cb);
226-
}
277+
mongoc_apm_callbacks_destroy (callbacks);
278+
}
227279

228-
mongoc_client_set_apm_callbacks (client, callbacks, ctx);
280+
void
281+
set_apm_callbacks_pooled (json_test_ctx_t *ctx, mongoc_client_pool_t *pool)
282+
{
283+
mongoc_apm_callbacks_t *callbacks;
284+
285+
callbacks = mongoc_apm_callbacks_new ();
286+
mongoc_apm_set_command_started_cb (callbacks, started_cb);
287+
mongoc_apm_set_server_changed_cb (callbacks, server_changed_cb);
288+
mongoc_apm_set_command_succeeded_cb (callbacks, succeeded_cb);
289+
mongoc_apm_set_command_failed_cb (callbacks, failed_cb);
290+
mongoc_client_pool_set_apm_callbacks (pool, callbacks, ctx);
229291
mongoc_apm_callbacks_destroy (callbacks);
230292
}
231293

src/libmongoc/tests/json-test-monitoring.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ typedef void (*json_test_events_check_cb_t) (const bson_t *events);
3030
void
3131
set_apm_callbacks (json_test_ctx_t *ctx, mongoc_client_t *client);
3232

33+
void
34+
set_apm_callbacks_pooled (json_test_ctx_t *ctx, mongoc_client_pool_t *pool);
35+
3336
void
3437
check_json_apm_events (json_test_ctx_t *ctx, const bson_t *expectations);
3538

0 commit comments

Comments
 (0)