@@ -576,6 +576,132 @@ test_w0_legacy_insert_many (void)
576
576
mock_server_destroy (server );
577
577
}
578
578
579
+ static void
580
+ test_w0_legacy_update_one (void )
581
+ {
582
+ mock_server_t * server ;
583
+ mongoc_client_t * client ;
584
+ mongoc_collection_t * coll ;
585
+ bson_error_t error ;
586
+ future_t * future ;
587
+ request_t * request ;
588
+ bson_t opts ;
589
+ mongoc_write_concern_t * wc ;
590
+
591
+ /* wire version will use OP_UPDATE for w:0 update (since no OP_MSG) */
592
+ server = mock_server_new ();
593
+ mock_server_auto_hello (server ,
594
+ "{'isWritablePrimary': true,"
595
+ " 'maxWireVersion': 5}" );
596
+ mock_server_run (server );
597
+
598
+ client =
599
+ test_framework_client_new_from_uri (mock_server_get_uri (server ), NULL );
600
+ coll = mongoc_client_get_collection (client , "db" , "coll" );
601
+
602
+ /* Add unacknowldged write concern */
603
+ bson_init (& opts );
604
+ wc = mongoc_write_concern_new ();
605
+ mongoc_write_concern_set_w (wc , 0 );
606
+ mongoc_write_concern_append (wc , & opts );
607
+ mongoc_write_concern_destroy (wc );
608
+
609
+ future = future_collection_update_one (coll ,
610
+ tmp_bson ("{'x':1}" ),
611
+ tmp_bson ("{'$set': {'y':1}}" ),
612
+ & opts ,
613
+ NULL ,
614
+ & error );
615
+
616
+ /* Mock server receives OP_UPDATE */
617
+ request = mock_server_receives_update (
618
+ server , "db.coll" , 0 , "{'x':1}" , "{'$set': {'y':1}}" );
619
+ BSON_ASSERT (request );
620
+
621
+ mock_server_replies_ok_and_destroys (request );
622
+ BSON_ASSERT (future_get_bool (future ));
623
+
624
+ future_destroy (future );
625
+ bson_destroy (& opts );
626
+ mongoc_collection_destroy (coll );
627
+ mongoc_client_destroy (client );
628
+ mock_server_destroy (server );
629
+ }
630
+
631
+ static void
632
+ test_w0_legacy_update_and_replace_validation (void )
633
+ {
634
+ mock_server_t * server ;
635
+ mongoc_client_t * client ;
636
+ mongoc_collection_t * coll ;
637
+ bson_error_t error ;
638
+ bool r ;
639
+ bson_t opts ;
640
+ mongoc_write_concern_t * wc ;
641
+
642
+ /* wire version will use OP_UPDATE for w:0 update (since no OP_MSG) */
643
+ server = mock_server_new ();
644
+ mock_server_auto_hello (server ,
645
+ "{'isWritablePrimary': true,"
646
+ " 'maxWireVersion': 5}" );
647
+ mock_server_run (server );
648
+
649
+ client =
650
+ test_framework_client_new_from_uri (mock_server_get_uri (server ), NULL );
651
+ coll = mongoc_client_get_collection (client , "db" , "coll" );
652
+
653
+ /* Add unacknowldged write concern */
654
+ bson_init (& opts );
655
+ wc = mongoc_write_concern_new ();
656
+ mongoc_write_concern_set_w (wc , 0 );
657
+ mongoc_write_concern_append (wc , & opts );
658
+ mongoc_write_concern_destroy (wc );
659
+
660
+ /* replace_one prohibits top-level, dollar-prefixed keys */
661
+ memset (& error , 0 , sizeof (bson_error_t ));
662
+ r = mongoc_collection_replace_one (coll ,
663
+ tmp_bson ("{'x':1}" ),
664
+ tmp_bson ("{'$set': {'y':1}}" ),
665
+ & opts ,
666
+ NULL ,
667
+ & error );
668
+
669
+ BSON_ASSERT (!r );
670
+ ASSERT_ERROR_CONTAINS (error ,
671
+ MONGOC_ERROR_COMMAND ,
672
+ MONGOC_ERROR_COMMAND_INVALID_ARG ,
673
+ "Invalid key '$set': replace prohibits $ operators" );
674
+
675
+ /* update_one requires top-level, dollar-prefixed keys */
676
+ memset (& error , 0 , sizeof (bson_error_t ));
677
+ r = mongoc_collection_update_one (
678
+ coll , tmp_bson ("{'x':1}" ), tmp_bson ("{'y':1}" ), & opts , NULL , & error );
679
+
680
+ BSON_ASSERT (!r );
681
+ ASSERT_ERROR_CONTAINS (
682
+ error ,
683
+ MONGOC_ERROR_COMMAND ,
684
+ MONGOC_ERROR_COMMAND_INVALID_ARG ,
685
+ "Invalid key 'y': update only works with $ operators and pipelines" );
686
+
687
+ /* update_many requires top-level, dollar-prefixed keys */
688
+ memset (& error , 0 , sizeof (bson_error_t ));
689
+ r = mongoc_collection_update_many (
690
+ coll , tmp_bson ("{'x':1}" ), tmp_bson ("{'y':1}" ), & opts , NULL , & error );
691
+
692
+ BSON_ASSERT (!r );
693
+ ASSERT_ERROR_CONTAINS (
694
+ error ,
695
+ MONGOC_ERROR_COMMAND ,
696
+ MONGOC_ERROR_COMMAND_INVALID_ARG ,
697
+ "Invalid key 'y': update only works with $ operators and pipelines" );
698
+
699
+ bson_destroy (& opts );
700
+ mongoc_collection_destroy (coll );
701
+ mongoc_client_destroy (client );
702
+ mock_server_destroy (server );
703
+ }
704
+
579
705
static void
580
706
_configure_failpoint (mongoc_client_t * client ,
581
707
const char * mode ,
@@ -651,6 +777,12 @@ test_write_command_install (TestSuite *suite)
651
777
test_opmsg_disconnect_mid_batch );
652
778
TestSuite_AddMockServerTest (
653
779
suite , "/WriteCommand/w0_legacy_insert_many" , test_w0_legacy_insert_many );
780
+ TestSuite_AddMockServerTest (
781
+ suite , "/WriteCommand/w0_legacy_update_one" , test_w0_legacy_update_one );
782
+ TestSuite_AddMockServerTest (
783
+ suite ,
784
+ "/WriteCommand/w0_legacy_update_and_replace_validation" ,
785
+ test_w0_legacy_update_and_replace_validation );
654
786
TestSuite_AddFull (suite ,
655
787
"/WriteCommand/invalid_wc_server_error" ,
656
788
_test_invalid_wc_server_error ,
0 commit comments