@@ -496,7 +496,59 @@ test_retry_no_crypto (void *ctx)
496
496
mongoc_uri_destroy (uri );
497
497
}
498
498
499
+ static void
500
+ test_unsupported_storage_engine_error (void )
501
+ {
502
+ mock_rs_t * rs ;
503
+ mongoc_client_t * client ;
504
+ mongoc_collection_t * coll ;
505
+ bson_t reply ;
506
+ bson_error_t error ;
507
+ future_t * future ;
508
+ request_t * request ;
509
+ mongoc_client_session_t * session ;
510
+ bson_t opts ;
511
+ const char * expected_msg = "This MongoDB deployment does not support "
512
+ "retryable writes. Please add retryWrites=false "
513
+ "to your connection string." ;
514
+
515
+ rs = mock_rs_with_autoismaster (WIRE_VERSION_RETRY_WRITES , true, 0 , 0 );
516
+ mock_rs_run (rs );
517
+ client = mongoc_client_new_from_uri (mock_rs_get_uri (rs ));
518
+ session = mongoc_client_start_session (client , NULL , & error );
519
+ ASSERT_OR_PRINT (session , error );
520
+ mongoc_client_set_error_api (client , MONGOC_ERROR_API_VERSION_2 );
521
+ coll = mongoc_client_get_collection (client , "test" , "test" );
522
+ bson_init (& opts );
523
+ ASSERT_OR_PRINT (mongoc_client_session_append (session , & opts , & error ),
524
+ error );
525
+ /* findandmodify is retryable through mongoc_client_write_command_with_opts.
526
+ */
527
+ future = future_client_write_command_with_opts (
528
+ client ,
529
+ "test" ,
530
+ tmp_bson ("{'findandmodify': 'coll' }" ),
531
+ & opts ,
532
+ & reply ,
533
+ & error );
534
+ request = mock_rs_receives_request (rs );
535
+ mock_server_replies_simple (
536
+ request ,
537
+ "{'ok': 0, 'code': 20, 'errmsg': 'Transaction numbers are great'}" );
538
+ request_destroy (request );
539
+
540
+ BSON_ASSERT (!future_get_bool (future ));
541
+ ASSERT_ERROR_CONTAINS (error , MONGOC_ERROR_SERVER , 20 , expected_msg );
542
+ ASSERT_MATCH (& reply , "{'code': 20, 'errmsg': '%s'}" , expected_msg );
499
543
544
+ bson_destroy (& opts );
545
+ mongoc_client_session_destroy (session );
546
+ bson_destroy (& reply );
547
+ future_destroy (future );
548
+ mongoc_collection_destroy (coll );
549
+ mongoc_client_destroy (client );
550
+ mock_rs_destroy (rs );
551
+ }
500
552
/*
501
553
*-----------------------------------------------------------------------
502
554
*
@@ -558,4 +610,9 @@ test_retryable_writes_install (TestSuite *suite)
558
610
NULL ,
559
611
NULL ,
560
612
test_framework_skip_if_crypto );
613
+ TestSuite_AddMockServerTest (
614
+ suite ,
615
+ "/retryable_writes/unsupported_storage_engine_error" ,
616
+ test_unsupported_storage_engine_error ,
617
+ test_framework_skip_if_no_crypto );
561
618
}
0 commit comments