@@ -2538,6 +2538,83 @@ test_client_appname_pooled_no_uri (void)
25382538 test_client_appname (true, false);
25392539}
25402540
2541+ /* test a disconnect with a NULL bson_error_t * passed to command_simple() */
2542+ static void
2543+ _test_null_error_pointer (bool pooled )
2544+ {
2545+ mock_server_t * server ;
2546+ mongoc_uri_t * uri ;
2547+ mongoc_client_pool_t * pool = NULL ;
2548+ mongoc_client_t * client ;
2549+ future_t * future ;
2550+ request_t * request ;
2551+
2552+ capture_logs (true);
2553+
2554+ server = mock_server_with_autoismaster (0 );
2555+ mock_server_run (server );
2556+ uri = mongoc_uri_copy (mock_server_get_uri (server ));
2557+ mongoc_uri_set_option_as_int32 (uri , "serverSelectionTimeoutMS" , 1000 );
2558+
2559+ if (pooled ) {
2560+ pool = mongoc_client_pool_new (uri );
2561+ client = mongoc_client_pool_pop (pool );
2562+ } else {
2563+ client = mongoc_client_new_from_uri (uri );
2564+ }
2565+
2566+ /* connect */
2567+ future = future_client_command_simple (client , "test" ,
2568+ tmp_bson ("{'ping': 1}" ), NULL , NULL ,
2569+ NULL );
2570+ request = mock_server_receives_command (server , "test" ,
2571+ MONGOC_QUERY_SLAVE_OK , NULL );
2572+ mock_server_replies_ok_and_destroys (request );
2573+ ASSERT (future_get_bool (future ));
2574+ future_destroy (future );
2575+
2576+ /* disconnect */
2577+ mock_server_destroy (server );
2578+ if (pooled ) {
2579+ mongoc_cluster_disconnect_node (& client -> cluster , 1 );
2580+ } else {
2581+ mongoc_topology_scanner_node_t * scanner_node ;
2582+
2583+ scanner_node = mongoc_topology_scanner_get_node (
2584+ client -> topology -> scanner , 1 );
2585+ mongoc_stream_destroy (scanner_node -> stream );
2586+ scanner_node -> stream = NULL ;
2587+ }
2588+
2589+ /* doesn't abort with assertion failure */
2590+ future = future_client_command_simple (client , "test" ,
2591+ tmp_bson ("{'ping': 1}" ), NULL , NULL ,
2592+ NULL /* error */ );
2593+
2594+ ASSERT (!future_get_bool (future ));
2595+ future_destroy (future );
2596+
2597+ if (pooled ) {
2598+ mongoc_client_pool_push (pool , client );
2599+ mongoc_client_pool_destroy (pool );
2600+ } else {
2601+ mongoc_client_destroy (client );
2602+ }
2603+
2604+ mongoc_uri_destroy (uri );
2605+ }
2606+
2607+ static void
2608+ test_null_error_pointer_single (void * ctx )
2609+ {
2610+ _test_null_error_pointer (false);
2611+ }
2612+
2613+ static void
2614+ test_null_error_pointer_pooled (void * ctx )
2615+ {
2616+ _test_null_error_pointer (true);
2617+ }
25412618
25422619void
25432620test_client_install (TestSuite * suite )
@@ -2640,4 +2717,10 @@ test_client_install (TestSuite *suite)
26402717 TestSuite_AddLive (suite , "/Client/select_server/pooled" , test_mongoc_client_select_server_pooled );
26412718 TestSuite_AddLive (suite , "/Client/select_server/err/single" , test_mongoc_client_select_server_error_single );
26422719 TestSuite_AddLive (suite , "/Client/select_server/err/pooled" , test_mongoc_client_select_server_error_pooled );
2720+ TestSuite_AddFull (suite , "/Client/null_error_pointer/single" ,
2721+ test_null_error_pointer_single , NULL , NULL ,
2722+ test_framework_skip_if_slow );
2723+ TestSuite_AddFull (suite , "/Client/null_error_pointer/pooled" ,
2724+ test_null_error_pointer_pooled , NULL , NULL ,
2725+ test_framework_skip_if_slow );
26432726}
0 commit comments