@@ -206,7 +206,8 @@ test_find_and_modify_write_concern (int wire_version)
206
206
"{ 'findAndModify' : 'test_find_and_modify', "
207
207
"'query' : { 'superduper' : 77889 },"
208
208
"'update' : { '$set' : { 'superduper' : 1234 } },"
209
- "'new' : true }" );
209
+ "'new' : true,"
210
+ "'writeConcern' : { '$exists': false } }" );
210
211
}
211
212
212
213
mock_server_replies_simple (request , "{ 'value' : null, 'ok' : 1 }" );
@@ -416,6 +417,71 @@ test_find_and_modify_opts (void)
416
417
}
417
418
418
419
420
+ static void
421
+ test_find_and_modify_opts_write_concern (void )
422
+ {
423
+ mongoc_write_concern_t * w2 ;
424
+ mongoc_write_concern_t * w3 ;
425
+ mock_server_t * server ;
426
+ mongoc_client_t * client ;
427
+ mongoc_collection_t * collection ;
428
+ bson_error_t error ;
429
+ mongoc_find_and_modify_opts_t * opts ;
430
+ bson_t extra = BSON_INITIALIZER ;
431
+ future_t * future ;
432
+ request_t * request ;
433
+
434
+ w2 = mongoc_write_concern_new ();
435
+ mongoc_write_concern_set_w (w2 , 2 );
436
+ w3 = mongoc_write_concern_new ();
437
+ mongoc_write_concern_set_w (w3 , 3 );
438
+
439
+ server = mock_server_with_autoismaster (WIRE_VERSION_FAM_WRITE_CONCERN );
440
+ mock_server_run (server );
441
+
442
+ client = mongoc_client_new_from_uri (mock_server_get_uri (server ));
443
+ collection = mongoc_client_get_collection (client , "db" , "collection" );
444
+
445
+ opts = mongoc_find_and_modify_opts_new ();
446
+ mongoc_write_concern_append (w2 , & extra );
447
+ BSON_ASSERT (mongoc_find_and_modify_opts_append (opts , & extra ));
448
+ bson_destroy (& extra );
449
+
450
+ future = future_collection_find_and_modify_with_opts (
451
+ collection , tmp_bson ("{}" ), opts , NULL , & error );
452
+ request = mock_server_receives_command (
453
+ server ,
454
+ "db" ,
455
+ MONGOC_QUERY_NONE ,
456
+ "{'findAndModify': 'collection', 'writeConcern': {'w': 2}}" );
457
+ mock_server_replies_ok_and_destroys (request );
458
+ ASSERT_OR_PRINT (future_get_bool (future ), error );
459
+ future_destroy (future );
460
+
461
+ /* opts overrides collection */
462
+ mongoc_collection_set_write_concern (collection , w3 );
463
+ future = future_collection_find_and_modify_with_opts (
464
+ collection , tmp_bson ("{}" ), opts , NULL , & error );
465
+
466
+ /* still w: 2 */
467
+ request = mock_server_receives_command (
468
+ server ,
469
+ "db" ,
470
+ MONGOC_QUERY_NONE ,
471
+ "{'findAndModify': 'collection', 'writeConcern': {'w': 2}}" );
472
+ mock_server_replies_ok_and_destroys (request );
473
+ ASSERT_OR_PRINT (future_get_bool (future ), error );
474
+ future_destroy (future );
475
+
476
+ mongoc_find_and_modify_opts_destroy (opts );
477
+ mongoc_collection_destroy (collection );
478
+ mongoc_client_destroy (client );
479
+ mock_server_destroy (server );
480
+ mongoc_write_concern_destroy (w2 );
481
+ mongoc_write_concern_destroy (w3 );
482
+ }
483
+
484
+
419
485
static void
420
486
test_find_and_modify_collation (int wire )
421
487
{
@@ -518,6 +584,9 @@ test_find_and_modify_install (TestSuite *suite)
518
584
should_run_fam_wc );
519
585
TestSuite_AddMockServerTest (
520
586
suite , "/find_and_modify/opts" , test_find_and_modify_opts );
587
+ TestSuite_AddMockServerTest (suite ,
588
+ "/find_and_modify/opts/write_concern" ,
589
+ test_find_and_modify_opts_write_concern );
521
590
TestSuite_AddMockServerTest (suite ,
522
591
"/find_and_modify/collation/ok" ,
523
592
test_find_and_modify_collation_ok );
0 commit comments