@@ -2538,6 +2538,83 @@ test_client_appname_pooled_no_uri (void)
2538
2538
test_client_appname (true, false);
2539
2539
}
2540
2540
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
+ }
2541
2618
2542
2619
void
2543
2620
test_client_install (TestSuite * suite )
@@ -2640,4 +2717,10 @@ test_client_install (TestSuite *suite)
2640
2717
TestSuite_AddLive (suite , "/Client/select_server/pooled" , test_mongoc_client_select_server_pooled );
2641
2718
TestSuite_AddLive (suite , "/Client/select_server/err/single" , test_mongoc_client_select_server_error_single );
2642
2719
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 );
2643
2726
}
0 commit comments