@@ -1305,6 +1305,52 @@ dollar_query_test_t tests[] = {
13051305 true},
13061306 {NULL }};
13071307
1308+ static void
1309+ test_cluster_ismaster_fails (void )
1310+ {
1311+ mock_server_t * mock_server ;
1312+ mongoc_uri_t * uri ;
1313+ mongoc_server_description_t * sd ;
1314+ mongoc_client_pool_t * pool ;
1315+ mongoc_client_t * client ;
1316+ request_t * request ;
1317+ future_t * future ;
1318+ bson_error_t error ;
1319+ int autoresponder_id ;
1320+
1321+ mock_server = mock_server_new ();
1322+ autoresponder_id =
1323+ mock_server_auto_ismaster (mock_server , "{ 'isMaster': 1.0 }" );
1324+ mock_server_run (mock_server );
1325+ uri = mongoc_uri_copy (mock_server_get_uri (mock_server ));
1326+ /* increase heartbeatFrequencyMS to prevent background server selection. */
1327+ mongoc_uri_set_option_as_int32 (uri , "heartbeatFrequencyMS" , 99999 );
1328+ pool = mongoc_client_pool_new (uri );
1329+ mongoc_uri_destroy (uri );
1330+ client = mongoc_client_pool_pop (pool );
1331+ /* do server selection to add this server to the topology. this does not add
1332+ * a cluster node for this server. */
1333+ sd = mongoc_client_select_server (client , false, NULL , NULL );
1334+ BSON_ASSERT (sd );
1335+ mongoc_server_description_destroy (sd );
1336+ mock_server_remove_autoresponder (mock_server , autoresponder_id );
1337+ /* now create a cluster node by running a command. */
1338+ future = future_client_command_simple (
1339+ client , "test" , tmp_bson ("{'ping': 1}" ), NULL , NULL , & error );
1340+ /* the client adds a cluster node, creating a stream to the server, and then
1341+ * sends an ismaster request. */
1342+ request = mock_server_receives_ismaster (mock_server );
1343+ /* CDRIVER-2576: the server replies with an error, so
1344+ * _mongoc_stream_run_ismaster returns NULL, which
1345+ * _mongoc_cluster_run_ismaster must check. */
1346+ mock_server_replies_simple (request , "{'ok': 0}" );
1347+ request_destroy (request );
1348+ future_wait (future );
1349+ future_destroy (future );
1350+ mock_server_destroy (mock_server );
1351+ mongoc_client_pool_push (pool , client );
1352+ mongoc_client_pool_destroy (pool );
1353+ }
13081354
13091355void
13101356test_cluster_install (TestSuite * suite )
@@ -1426,4 +1472,6 @@ test_cluster_install (TestSuite *suite)
14261472 "/Cluster/not_master_auth/pooled/op_msg" ,
14271473 test_not_master_auth_pooled_op_msg ,
14281474 test_framework_skip_if_slow );
1475+ TestSuite_AddMockServerTest (
1476+ suite , "/Cluster/ismaster_fails" , test_cluster_ismaster_fails );
14291477}
0 commit comments