/* *----------------------------------------------------------------------- * * Run the JSON tests from the SDAM Monitoring spec. * *----------------------------------------------------------------------- */ static void test_sdam_monitoring_cb (bson_t *test) { mongoc_client_t *client; mongoc_topology_t *topology; bson_t phase; bson_t phases; bson_t outcome; bson_iter_t phase_iter; bson_iter_t phase_field_iter; bson_iter_t outcome_iter; bson_iter_t iter; bson_t events_expected; context_t context; /* parse out the uri and use it to create a client */ BSON_ASSERT (bson_iter_init_find (&iter, test, "uri")); client = mongoc_client_new (bson_iter_utf8 (&iter, NULL)); topology = client->topology; context_init (&context); client_set_topology_event_callbacks (client, &context); /* for each phase, parse and validate */ BSON_ASSERT (bson_iter_init_find (&iter, test, "phases")); bson_iter_bson (&iter, &phases); bson_iter_init (&phase_iter, &phases); while (bson_iter_next (&phase_iter)) { bson_iter_bson (&phase_iter, &phase); /* this test doesn't exercise this code path naturally, see below in * _test_topology_events for a non-hacky test of this event */ _mongoc_topology_description_monitor_opening (&topology->description); process_sdam_test_ismaster_responses (&phase, &client->topology->description); /* parse out "outcome" and validate */ BSON_ASSERT (bson_iter_init_find (&phase_field_iter, &phase, "outcome")); bson_iter_bson (&phase_field_iter, &outcome); bson_iter_init (&outcome_iter, &outcome); while (bson_iter_next (&outcome_iter)) { if (strcmp ("events", bson_iter_key (&outcome_iter)) == 0) { bson_iter_bson (&outcome_iter, &events_expected); check_json_apm_events (&context.events, &events_expected); } else { fprintf (stderr, "ERROR: unparsed test field %s\n", bson_iter_key (&outcome_iter)); BSON_ASSERT (false); } } } mongoc_client_destroy (client); context_destroy (&context); }
static bool with_transaction_callback_runner (mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error) { cb_ctx_t *cb_ctx = (cb_ctx_t *) ctx; bson_t local_reply; bson_t operation; bson_t operations; bson_t *test; bson_iter_t iter; bool res = false; test = &(cb_ctx->callback); if (bson_has_field (test, "operation")) { bson_lookup_doc (test, "operation", &operation); res = json_test_operation (cb_ctx->ctx, test, &operation, cb_ctx->ctx->collection, session, &local_reply); } else { ASSERT (bson_has_field (test, "operations")); bson_lookup_doc (test, "operations", &operations); BSON_ASSERT (bson_iter_init (&iter, &operations)); bson_init (&local_reply); while (bson_iter_next (&iter)) { bson_destroy (&local_reply); bson_iter_bson (&iter, &operation); res = json_test_operation (cb_ctx->ctx, test, &operation, cb_ctx->ctx->collection, session, &local_reply); if (!res) { break; } } } *reply = bson_copy (&local_reply); bson_destroy (&local_reply); return res; }