@@ -1305,6 +1305,52 @@ dollar_query_test_t tests[] = {
1305
1305
true},
1306
1306
{NULL }};
1307
1307
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
+ }
1308
1354
1309
1355
void
1310
1356
test_cluster_install (TestSuite * suite )
@@ -1426,4 +1472,6 @@ test_cluster_install (TestSuite *suite)
1426
1472
"/Cluster/not_master_auth/pooled/op_msg" ,
1427
1473
test_not_master_auth_pooled_op_msg ,
1428
1474
test_framework_skip_if_slow );
1475
+ TestSuite_AddMockServerTest (
1476
+ suite , "/Cluster/ismaster_fails" , test_cluster_ismaster_fails );
1429
1477
}
0 commit comments