Skip to content

Commit 5f5e804

Browse files
committed
CDRIVER-2959 fix 'validate' for bulk insert
1 parent 8f087ff commit 5f5e804

File tree

4 files changed

+152
-39
lines changed

4 files changed

+152
-39
lines changed

src/libmongoc/src/mongoc/mongoc-bulk-operation-private.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,6 @@ _mongoc_bulk_operation_new (mongoc_client_t *client,
4949
const mongoc_write_concern_t *write_concern);
5050

5151

52-
bson_validate_flags_t
53-
_mongoc_bulk_operation_parse_vflags (const bson_t *opts,
54-
bson_validate_flags_t default_vflags);
55-
56-
5752
BSON_END_DECLS
5853

5954

src/libmongoc/src/mongoc/mongoc-bulk-operation.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ mongoc_bulk_operation_insert_with_opts (mongoc_bulk_operation_t *bulk,
380380
_mongoc_write_command_init_insert (
381381
&command,
382382
document,
383-
opts,
383+
&insert_opts.extra,
384384
bulk->flags,
385385
bulk->operation_id,
386386
!mongoc_write_concern_is_acknowledged (bulk->write_concern));
@@ -574,7 +574,7 @@ mongoc_bulk_operation_update (mongoc_bulk_operation_t *bulk,
574574
}
575575

576576
if (!mongoc_bulk_operation_update_many_with_opts (
577-
bulk, selector, document, &opts, error)) {
577+
bulk, selector, document, &opts, error)) {
578578
MONGOC_WARNING ("%s", error->message);
579579
}
580580

src/libmongoc/tests/test-mongoc-bulk.c

Lines changed: 71 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -847,37 +847,60 @@ test_update_with_opts_validate (void)
847847
mongoc_collection_t *collection;
848848
mongoc_bulk_operation_t *bulk;
849849
bson_error_t error;
850+
update_with_opts_fn fns[] = {
851+
mongoc_bulk_operation_update_one_with_opts,
852+
mongoc_bulk_operation_update_many_with_opts,
853+
};
854+
int i;
850855

851856
client = test_framework_client_new ();
852857
collection = get_test_collection (client, "test_update_with_opts_validate");
853-
bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
854858

855-
BSON_ASSERT (!mongoc_bulk_operation_update_one_with_opts (
856-
bulk, tmp_bson ("{}"), tmp_bson ("{'a.a': 1}"), NULL, &error));
857-
ASSERT_ERROR_CONTAINS (error,
858-
MONGOC_ERROR_COMMAND,
859-
MONGOC_ERROR_COMMAND_INVALID_ARG,
860-
"update only works with $ operators");
859+
for (i = 0; i < 2; i++) {
860+
update_with_opts_fn update_function;
861861

862-
BSON_ASSERT (mongoc_bulk_operation_update_one_with_opts (
863-
bulk,
864-
tmp_bson ("{}"),
865-
tmp_bson ("{'a.a': 1}"),
866-
tmp_bson ("{'validate': %d}", BSON_VALIDATE_NONE),
867-
&error));
868-
BSON_ASSERT (!mongoc_bulk_operation_update_one_with_opts (
869-
bulk,
870-
tmp_bson ("{}"),
871-
tmp_bson ("{'a.a': 1}"),
872-
tmp_bson ("{'validate': %d}", BSON_VALIDATE_DOT_KEYS),
873-
&error));
874-
ASSERT_ERROR_CONTAINS (
875-
error,
876-
MONGOC_ERROR_COMMAND,
877-
MONGOC_ERROR_COMMAND_INVALID_ARG,
878-
"invalid argument for update: keys cannot contain \".\": \"a.a\"");
862+
update_function = fns[i];
863+
bulk =
864+
mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
865+
BSON_ASSERT (!update_function (
866+
bulk, tmp_bson ("{}"), tmp_bson ("{'a.a': 1}"), NULL, &error));
867+
ASSERT_ERROR_CONTAINS (error,
868+
MONGOC_ERROR_COMMAND,
869+
MONGOC_ERROR_COMMAND_INVALID_ARG,
870+
"update only works with $ operators");
871+
872+
BSON_ASSERT (update_function (bulk,
873+
tmp_bson ("{}"),
874+
tmp_bson ("{'a.a': 1}"),
875+
tmp_bson ("{'validate': %d}", BSON_VALIDATE_NONE),
876+
&error));
877+
BSON_ASSERT (
878+
!update_function (bulk,
879+
tmp_bson ("{}"),
880+
tmp_bson ("{'a.a': 1}"),
881+
tmp_bson ("{'validate': %d}", BSON_VALIDATE_DOT_KEYS),
882+
&error));
883+
ASSERT_ERROR_CONTAINS (
884+
error,
885+
MONGOC_ERROR_COMMAND,
886+
MONGOC_ERROR_COMMAND_INVALID_ARG,
887+
"invalid argument for update: keys cannot contain \".\": \"a.a\"");
888+
mongoc_bulk_operation_destroy (bulk);
889+
890+
/* Test a valid update_one with explicit validation on the server. */
891+
bulk =
892+
mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
893+
BSON_ASSERT (
894+
update_function (bulk,
895+
tmp_bson ("{}"),
896+
tmp_bson ("{'$set': {'a': 1}}"),
897+
tmp_bson ("{'validate': %d}", BSON_VALIDATE_DOT_KEYS),
898+
&error));
899+
ASSERT_OR_PRINT (mongoc_bulk_operation_execute (bulk, NULL, &error),
900+
error);
901+
mongoc_bulk_operation_destroy (bulk);
902+
}
879903

880-
mongoc_bulk_operation_destroy (bulk);
881904
mongoc_collection_destroy (collection);
882905
mongoc_client_destroy (client);
883906
}
@@ -1206,6 +1229,18 @@ test_replace_one_with_opts_validate (void)
12061229
"invalid argument for replace: keys cannot contain \".\": \"a.a\"");
12071230

12081231
mongoc_bulk_operation_destroy (bulk);
1232+
1233+
/* Test a valid replace_one with explicit validation on the server. */
1234+
bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
1235+
BSON_ASSERT (mongoc_bulk_operation_replace_one_with_opts (
1236+
bulk,
1237+
tmp_bson ("{}"),
1238+
tmp_bson ("{'a': 1}"),
1239+
tmp_bson ("{'validate': %d}", BSON_VALIDATE_DOT_KEYS),
1240+
&error));
1241+
ASSERT_OR_PRINT (mongoc_bulk_operation_execute (bulk, NULL, &error), error);
1242+
mongoc_bulk_operation_destroy (bulk);
1243+
12091244
mongoc_collection_destroy (collection);
12101245
mongoc_client_destroy (client);
12111246
}
@@ -1987,6 +2022,17 @@ test_insert_with_opts_validate (void)
19872022
"invalid document for insert: keys cannot contain \".\": \"a.a\"");
19882023

19892024
mongoc_bulk_operation_destroy (bulk);
2025+
2026+
/* Test a valid insert with explicit validation on the server. */
2027+
bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
2028+
BSON_ASSERT (mongoc_bulk_operation_insert_with_opts (
2029+
bulk,
2030+
tmp_bson ("{'a': 1}"),
2031+
tmp_bson ("{'validate': %d}", BSON_VALIDATE_DOT_KEYS),
2032+
&error));
2033+
ASSERT_OR_PRINT (mongoc_bulk_operation_execute (bulk, NULL, &error), error);
2034+
mongoc_bulk_operation_destroy (bulk);
2035+
19902036
mongoc_collection_destroy (collection);
19912037
mongoc_client_destroy (client);
19922038
}

src/libmongoc/tests/test-mongoc-collection.c

Lines changed: 79 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3780,10 +3780,65 @@ _test_insert_validate (insert_fn_t insert_fn)
37803780
tmp_bson ("{'validate': 0}"),
37813781
&error));
37823782

3783+
BSON_ASSERT (insert_fn (collection,
3784+
tmp_bson ("{'a': 1}"),
3785+
tmp_bson ("{'validate': 31}"),
3786+
&error));
3787+
37833788
mongoc_collection_destroy (collection);
37843789
mongoc_client_destroy (client);
37853790
}
37863791

3792+
static void
3793+
test_insert_bulk_validate (void)
3794+
{
3795+
mongoc_client_t *client;
3796+
mongoc_collection_t *collection;
3797+
bson_error_t error;
3798+
const bson_t *docs[] = {tmp_bson ("{'a': 1}"), tmp_bson ("{'$': 2}")};
3799+
3800+
BEGIN_IGNORE_DEPRECATIONS
3801+
client = test_framework_client_new ();
3802+
mongoc_client_set_error_api (client, 2);
3803+
collection = get_test_collection (client, "test_insert_validate");
3804+
3805+
/* Invalid documents, validation. */
3806+
BSON_ASSERT (!mongoc_collection_insert_bulk (collection,
3807+
MONGOC_INSERT_NONE,
3808+
docs,
3809+
2,
3810+
NULL /* write concern */,
3811+
&error));
3812+
ASSERT_ERROR_CONTAINS (error,
3813+
MONGOC_ERROR_COMMAND,
3814+
MONGOC_ERROR_COMMAND_INVALID_ARG,
3815+
"invalid document");
3816+
3817+
/* Invalid documents, no validation. */
3818+
BSON_ASSERT (!mongoc_collection_insert_bulk (
3819+
collection,
3820+
(mongoc_insert_flags_t) MONGOC_INSERT_NO_VALIDATE,
3821+
docs,
3822+
2,
3823+
NULL /* write concern */,
3824+
&error));
3825+
ASSERT_CMPUINT32 (error.domain, ==, (uint32_t) MONGOC_ERROR_SERVER);
3826+
3827+
/* Valid document, validation. */
3828+
ASSERT_OR_PRINT (
3829+
mongoc_collection_insert_bulk (collection,
3830+
MONGOC_INSERT_NONE,
3831+
docs,
3832+
1 /* don't include invalid second doc. */,
3833+
NULL /* write concern */,
3834+
&error),
3835+
error);
3836+
3837+
mongoc_collection_destroy (collection);
3838+
mongoc_client_destroy (client);
3839+
END_IGNORE_DEPRECATIONS
3840+
}
3841+
37873842

37883843
static void
37893844
test_insert_one_validate (void)
@@ -5341,7 +5396,7 @@ _test_update_validate (update_fn_t update_fn)
53415396
mongoc_client_t *client;
53425397
mongoc_collection_t *collection;
53435398
bson_t *selector;
5344-
bson_t *update;
5399+
bson_t *invalid_update, *valid_update;
53455400
const char *msg;
53465401
bson_error_t error;
53475402
bool r;
@@ -5353,21 +5408,26 @@ _test_update_validate (update_fn_t update_fn)
53535408

53545409
if (update_fn == mongoc_collection_replace_one) {
53555410
/* prohibited for replace */
5356-
update = tmp_bson ("{'$set': {'x': 1}}");
5411+
invalid_update = tmp_bson ("{'$set': {'x': 1}}");
5412+
/* permitted for replace */
5413+
valid_update = tmp_bson ("{'x': 1}");
53575414
msg = "invalid argument for replace";
53585415
} else {
53595416
/* prohibited for update */
5360-
update = tmp_bson ("{'x': 1}");
5417+
invalid_update = tmp_bson ("{'x': 1}");
5418+
/* permitted for update */
5419+
valid_update = tmp_bson ("{'$set': {'x': 1}}");
53615420
msg = "only works with $ operators";
53625421
}
53635422

5364-
BSON_ASSERT (!update_fn (collection, selector, update, NULL, NULL, &error));
5423+
BSON_ASSERT (
5424+
!update_fn (collection, selector, invalid_update, NULL, NULL, &error));
53655425
ASSERT_ERROR_CONTAINS (
53665426
error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, msg);
53675427

53685428
r = update_fn (collection,
53695429
selector,
5370-
update,
5430+
invalid_update,
53715431
tmp_bson ("{'validate': false}"),
53725432
NULL,
53735433
&error);
@@ -5379,7 +5439,7 @@ _test_update_validate (update_fn_t update_fn)
53795439

53805440
BSON_ASSERT (!update_fn (collection,
53815441
selector,
5382-
update,
5442+
invalid_update,
53835443
tmp_bson ("{'validate': 'foo'}"),
53845444
NULL,
53855445
&error));
@@ -5391,13 +5451,23 @@ _test_update_validate (update_fn_t update_fn)
53915451
/* Set all validation flags */
53925452
BSON_ASSERT (!update_fn (collection,
53935453
selector,
5394-
update,
5454+
invalid_update,
53955455
tmp_bson ("{'validate': 31}"),
53965456
NULL,
53975457
&error));
53985458
ASSERT_ERROR_CONTAINS (
53995459
error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, msg);
54005460

5461+
/* Check that validation passes for a valid update. */
5462+
ASSERT_OR_PRINT (
5463+
update_fn (collection,
5464+
selector,
5465+
valid_update,
5466+
tmp_bson ("{'validate': %d}", BSON_VALIDATE_UTF8),
5467+
NULL,
5468+
&error),
5469+
error);
5470+
54015471
mongoc_collection_destroy (collection);
54025472
mongoc_client_destroy (client);
54035473
}
@@ -5942,4 +6012,6 @@ test_collection_install (TestSuite *suite)
59426012
TestSuite_AddLive (suite,
59436013
"/Collection/estimated_document_count_live",
59446014
test_estimated_document_count_live);
6015+
TestSuite_AddLive (
6016+
suite, "/Collection/insert_bulk_validate", test_insert_bulk_validate);
59456017
}

0 commit comments

Comments
 (0)