Skip to content

Commit 7607ccb

Browse files
committed
Test success and failure for legacy update code path
The failure code path is testing that arguments are still validated by mongoc-util.c, despite replacement validation being removed in a previous commit.
1 parent 02691be commit 7607ccb

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

src/libmongoc/tests/test-mongoc-write-commands.c

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,132 @@ test_w0_legacy_insert_many (void)
576576
mock_server_destroy (server);
577577
}
578578

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+
579705
static void
580706
_configure_failpoint (mongoc_client_t *client,
581707
const char *mode,
@@ -651,6 +777,12 @@ test_write_command_install (TestSuite *suite)
651777
test_opmsg_disconnect_mid_batch);
652778
TestSuite_AddMockServerTest (
653779
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);
654786
TestSuite_AddFull (suite,
655787
"/WriteCommand/invalid_wc_server_error",
656788
_test_invalid_wc_server_error,

0 commit comments

Comments
 (0)