static mock_server_t * _run_server (read_pref_test_type_t test_type, int32_t max_wire_version) { mock_server_t *server; server = mock_server_new (); mock_server_run (server); switch (test_type) { case READ_PREF_TEST_STANDALONE: mock_server_auto_ismaster (server, "{'ok': 1," " 'maxWireVersion': %d," " 'ismaster': true}", max_wire_version); break; case READ_PREF_TEST_MONGOS: mock_server_auto_ismaster (server, "{'ok': 1," " 'maxWireVersion': %d," " 'ismaster': true," " 'msg': 'isdbgrid'}", max_wire_version); break; case READ_PREF_TEST_PRIMARY: mock_server_auto_ismaster (server, "{'ok': 1," " 'maxWireVersion': %d," " 'ismaster': true," " 'setName': 'rs'," " 'hosts': ['%s']}", max_wire_version, mock_server_get_host_and_port (server)); break; case READ_PREF_TEST_SECONDARY: mock_server_auto_ismaster (server, "{'ok': 1," " 'maxWireVersion': %d," " 'ismaster': false," " 'secondary': true," " 'setName': 'rs'," " 'hosts': ['%s']}", max_wire_version, mock_server_get_host_and_port (server)); break; default: fprintf (stderr, "Invalid test_type: : %d\n", test_type); abort (); } return server; }
static void _test_heartbeat_events (bool pooled, bool succeeded) { context_t context; mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; future_t *future; request_t *request; char *expected_json; bson_error_t error; context_init (&context); /* auto-respond to "foo" command */ server = mock_server_new (); mock_server_run (server); mock_server_autoresponds (server, responder, NULL, NULL); uri = mongoc_uri_copy (mock_server_get_uri (server)); mongoc_uri_set_option_as_int32 (uri, "serverSelectionTimeoutMS", 400); if (pooled) { pool = mongoc_client_pool_new (uri); pool_set_heartbeat_event_callbacks (pool, &context); client = mongoc_client_pool_pop (pool); } else { client = mongoc_client_new_from_uri (uri); client_set_heartbeat_event_callbacks (client, &context); } /* trigger "ismaster" handshake */ future = future_client_command_simple (client, "admin", tmp_bson ("{'foo': 1}"), NULL, NULL, &error); /* topology scanner calls ismaster once */ request = mock_server_receives_ismaster (server); if (succeeded) { mock_server_replies_ok_and_destroys (request); } else { mock_server_hangs_up (request); request_destroy (request); } /* pooled client opens new socket, handshakes it by calling ismaster again */ if (pooled && succeeded) { request = mock_server_receives_ismaster (server); mock_server_replies_ok_and_destroys (request); } if (succeeded) { /* "foo" command succeeds */ ASSERT_OR_PRINT (future_get_bool (future), error); } else { ASSERT (!future_get_bool (future)); } if (pooled) { mongoc_client_pool_push (pool, client); mongoc_client_pool_destroy (pool); } else { mongoc_client_destroy (client); } /* even if pooled, only topology scanner sends events, so we get one pair */ if (succeeded) { expected_json = bson_strdup_printf ( "{'0': {'heartbeat_started_event': {'host': '%s'}}," " '1': {'heartbeat_succeeded_event': {'host': '%s'}}}", mock_server_get_host_and_port (server), mock_server_get_host_and_port (server)); } else { expected_json = bson_strdup_printf ( "{'0': {'heartbeat_started_event': {'host': '%s'}}," " '1': {'heartbeat_failed_event': {'host': '%s'}}}", mock_server_get_host_and_port (server), mock_server_get_host_and_port (server)); } check_json_apm_events (&context.events, tmp_bson (expected_json)); future_destroy (future); bson_free (expected_json); mongoc_uri_destroy (uri); mock_server_destroy (server); context_destroy (&context); }