Skip to content

Commit aefdd2b

Browse files
committed
CDRIVER-2621 write concern tests fixed
1 parent 4a511a3 commit aefdd2b

File tree

2 files changed

+139
-58
lines changed

2 files changed

+139
-58
lines changed

src/libmongoc/src/mongoc/mongoc-uri.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,6 +1345,13 @@ _mongoc_uri_build_write_concern (mongoc_uri_t *uri, bson_error_t *error)
13451345
}
13461346

13471347
wtimeoutms = mongoc_uri_get_option_as_int32 (uri, MONGOC_URI_WTIMEOUTMS, 0);
1348+
if (wtimeoutms < 0) {
1349+
MONGOC_URI_ERROR (
1350+
error, "Unsupported wtimeoutMS value [w=%d]", wtimeoutms);
1351+
return false;
1352+
} else {
1353+
mongoc_write_concern_set_wtimeout (write_concern, wtimeoutms);
1354+
}
13481355

13491356
if (bson_iter_init_find_case (&iter, &uri->options, MONGOC_URI_JOURNAL) &&
13501357
BSON_ITER_HOLDS_BOOL (&iter)) {
@@ -1368,9 +1375,6 @@ _mongoc_uri_build_write_concern (mongoc_uri_t *uri, bson_error_t *error)
13681375
default:
13691376
if (value > 0) {
13701377
mongoc_write_concern_set_w (write_concern, value);
1371-
if (value > 1) {
1372-
mongoc_write_concern_set_wtimeout (write_concern, wtimeoutms);
1373-
}
13741378
break;
13751379
}
13761380
MONGOC_URI_ERROR (error, "Unsupported w value [w=%d]", value);
@@ -1383,7 +1387,6 @@ _mongoc_uri_build_write_concern (mongoc_uri_t *uri, bson_error_t *error)
13831387
mongoc_write_concern_set_wmajority (write_concern, wtimeoutms);
13841388
} else {
13851389
mongoc_write_concern_set_wtag (write_concern, str);
1386-
mongoc_write_concern_set_wtimeout (write_concern, wtimeoutms);
13871390
}
13881391
} else {
13891392
BSON_ASSERT (false);
Lines changed: 132 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,109 @@
11
#include <mongoc.h>
2+
#include <bson-types.h>
23

34
#include "mongoc-util-private.h"
45
#include "mongoc-write-concern-private.h"
6+
#include "mongoc-read-concern-private.h"
7+
#include "mongoc-opts-helpers-private.h"
58
#include "json-test.h"
69
#include "test-libmongoc.h"
710

811

912
static void
10-
compare_write_concern (const bson_t *wc_doc, const mongoc_write_concern_t *wc)
13+
compare_write_concern (const mongoc_write_concern_t *wc_correct,
14+
const mongoc_write_concern_t *wc)
1115
{
12-
if (bson_has_field (wc_doc, "w")) {
13-
ASSERT_CMPINT32 (wc->w, ==, bson_lookup_int32 (wc_doc, "w"));
14-
} else {
15-
ASSERT_CMPINT32 (wc->w, ==, MONGOC_WRITE_CONCERN_W_DEFAULT);
16-
}
16+
ASSERT_CMPINT32 (wc_correct->w, ==, wc->w);
17+
ASSERT_CMPINT32 (wc_correct->wtimeout, ==, wc->wtimeout);
18+
ASSERT_CMPINT (wc_correct->journal, ==, wc->journal);
19+
}
1720

18-
if (bson_has_field (wc_doc, "wtimeoutMS")) {
19-
ASSERT_CMPINT32 (
20-
wc->wtimeout, ==, bson_lookup_int32 (wc_doc, "wtimeoutMS"));
21-
} else {
22-
ASSERT_CMPINT32 (wc->wtimeout, ==, 0);
23-
}
2421

25-
if (bson_has_field (wc_doc, "journal")) {
26-
if (_mongoc_lookup_bool (wc_doc, "journal", false)) {
27-
ASSERT_CMPINT ((int) wc->journal, ==, 1);
28-
} else {
29-
ASSERT_CMPINT ((int) wc->journal, ==, 0);
22+
static void
23+
compare_read_concern (const mongoc_read_concern_t *rc_correct,
24+
const mongoc_read_concern_t *rc)
25+
{
26+
ASSERT_CMPSTR (rc_correct->level, rc->level);
27+
}
28+
29+
mongoc_write_concern_t *
30+
convert_write_concern (const bson_t *wc_doc)
31+
{
32+
mongoc_write_concern_t *wc;
33+
bson_iter_t iter;
34+
const char *key;
35+
36+
wc = mongoc_write_concern_new ();
37+
bson_iter_init (&iter, wc_doc);
38+
39+
while (bson_iter_next (&iter)) {
40+
key = bson_iter_key (&iter);
41+
42+
if (strcmp (key, "w") == 0) {
43+
if (BSON_ITER_HOLDS_UTF8 (&iter)) {
44+
if (strcmp (bson_lookup_utf8 (wc_doc, "w"), "majority") == 0) {
45+
mongoc_write_concern_set_w (wc, MONGOC_WRITE_CONCERN_W_MAJORITY);
46+
} else {
47+
mongoc_write_concern_set_wtag (wc,
48+
bson_lookup_utf8 (wc_doc, "w"));
49+
}
50+
} else {
51+
if (bson_lookup_int32 (wc_doc, "w") < 0) {
52+
goto invalid;
53+
}
54+
mongoc_write_concern_set_w (wc, bson_lookup_int32 (wc_doc, "w"));
55+
}
56+
} else if (strcmp (key, "wtimeoutMS") == 0) {
57+
if (bson_lookup_int32 (wc_doc, "wtimeoutMS") < 0) {
58+
goto invalid;
59+
}
60+
mongoc_write_concern_set_wtimeout (
61+
wc, bson_lookup_int32 (wc_doc, "wtimeoutMS"));
62+
} else if (strcmp (key, "journal") == 0) {
63+
mongoc_write_concern_set_journal (
64+
wc, bson_iter_value (&iter)->value.v_bool);
3065
}
31-
} else {
32-
ASSERT_CMPINT (
33-
(int) wc->journal, ==, MONGOC_WRITE_CONCERN_JOURNAL_DEFAULT);
3466
}
35-
}
3667

68+
if (wc->w == 0 && wc->journal == 1) {
69+
goto invalid;
70+
}
3771

38-
static void
39-
compare_read_concern (const bson_t *rc_doc, const mongoc_read_concern_t *rc)
40-
{
41-
const char *level;
72+
return wc;
4273

43-
if (bson_has_field (rc_doc, "level")) {
44-
level = bson_lookup_utf8 (rc_doc, "level");
45-
ASSERT_CMPSTR (level, mongoc_read_concern_get_level (rc));
46-
} else {
47-
BSON_ASSERT (!mongoc_read_concern_get_level (rc));
74+
invalid:
75+
mongoc_write_concern_destroy (wc);
76+
return NULL;
77+
}
78+
79+
mongoc_read_concern_t *
80+
convert_read_concern (const bson_t *rc_doc)
81+
{
82+
mongoc_read_concern_t *rc;
83+
bson_iter_t iter;
84+
const char *key;
85+
86+
rc = mongoc_read_concern_new ();
87+
bson_iter_init (&iter, rc_doc);
88+
89+
while (bson_iter_next (&iter)) {
90+
key = bson_iter_key (&iter);
91+
92+
if (strcmp (key, "level") == 0) {
93+
if (BSON_ITER_HOLDS_UTF8 (&iter)) {
94+
mongoc_read_concern_set_level (rc,
95+
bson_lookup_utf8 (rc_doc, "level"));
96+
} else {
97+
goto invalid;
98+
}
99+
}
48100
}
101+
102+
return rc;
103+
104+
invalid:
105+
mongoc_read_concern_destroy (rc);
106+
return NULL;
49107
}
50108

51109

@@ -60,10 +118,13 @@ test_rw_concern_uri (bson_t *scenario)
60118
bool valid;
61119
mongoc_uri_t *uri;
62120
bson_t rc_doc;
63-
const mongoc_read_concern_t *rc;
64121
bson_t wc_doc;
122+
const mongoc_read_concern_t *rc;
65123
const mongoc_write_concern_t *wc;
124+
mongoc_write_concern_t *wc_correct;
125+
mongoc_read_concern_t *rc_correct;
66126

127+
/* initialize tests with the scenario */
67128
BSON_ASSERT (bson_iter_init_find (&scenario_iter, scenario, "tests"));
68129
BSON_ASSERT (bson_iter_recurse (&scenario_iter, &test_iter));
69130

@@ -83,71 +144,87 @@ test_rw_concern_uri (bson_t *scenario)
83144
uri = mongoc_uri_new_with_error (uri_str, NULL);
84145
if (!valid) {
85146
BSON_ASSERT (!uri);
86-
return;
147+
continue;
87148
}
88149

89150
BSON_ASSERT (uri);
90151

91152
if (bson_has_field (&test, "readConcern")) {
92153
rc = mongoc_uri_get_read_concern (uri);
93154
bson_lookup_doc (&test, "readConcern", &rc_doc);
94-
compare_read_concern (&rc_doc, rc);
155+
rc_correct = convert_read_concern (&rc_doc);
156+
compare_read_concern (rc_correct, rc);
157+
mongoc_read_concern_destroy (rc_correct);
95158
}
96159

97160
if (bson_has_field (&test, "writeConcern")) {
98161
wc = mongoc_uri_get_write_concern (uri);
99162
bson_lookup_doc (&test, "writeConcern", &wc_doc);
100-
compare_write_concern (&wc_doc, wc);
163+
wc_correct = convert_write_concern (&wc_doc);
164+
compare_write_concern (wc_correct, wc);
165+
mongoc_write_concern_destroy (wc_correct);
101166
}
102167

103168
mongoc_uri_destroy (uri);
104169
}
105170
}
106171

107-
108172
static void
109173
test_rw_concern_document (bson_t *scenario)
110174
{
111175
bson_iter_t scenario_iter;
112176
bson_iter_t test_iter;
113-
mongoc_read_write_opts_t read_write_opts;
114-
bson_error_t error;
115177
bson_t test;
116178
bool valid;
117-
bool r;
118179
bson_t rc_doc;
119180
bson_t wc_doc;
181+
mongoc_write_concern_t *wc;
182+
mongoc_read_concern_t *rc;
183+
const bson_t *wc_doc_result;
184+
const bson_t *rc_doc_result;
185+
bson_t rc_doc_correct;
186+
bson_t wc_doc_correct;
120187

121188
BSON_ASSERT (bson_iter_init_find (&scenario_iter, scenario, "tests"));
122189
BSON_ASSERT (bson_iter_recurse (&scenario_iter, &test_iter));
123190

124191
while (bson_iter_next (&test_iter)) {
125192
bson_iter_bson (&test_iter, &test);
126-
127193
valid = _mongoc_lookup_bool (&test, "valid", true);
128-
r = _mongoc_read_write_opts_parse (
129-
NULL /* client */, &test, &read_write_opts, &error);
130-
131-
if (!valid) {
132-
BSON_ASSERT (!r);
133-
_mongoc_read_write_opts_cleanup (&read_write_opts);
134-
return;
135-
}
136-
137-
ASSERT_OR_PRINT (r, error);
138194

139195
if (bson_has_field (&test, "readConcern")) {
140196
bson_lookup_doc (&test, "readConcern", &rc_doc);
141-
match_bson (
142-
&rc_doc, &read_write_opts.readConcern, false /* is_command */);
197+
rc = convert_read_concern (&rc_doc);
198+
} else {
199+
rc = mongoc_read_concern_new ();
143200
}
144201

145202
if (bson_has_field (&test, "writeConcern")) {
146203
bson_lookup_doc (&test, "writeConcern", &wc_doc);
147-
compare_write_concern (&wc_doc, read_write_opts.writeConcern);
204+
wc = convert_write_concern (&wc_doc);
205+
} else {
206+
wc = mongoc_write_concern_new ();
207+
}
208+
209+
if (!valid) {
210+
BSON_ASSERT (rc == NULL || wc == NULL);
211+
continue;
212+
}
213+
214+
if (bson_has_field (&test, "readConcernDocument")) {
215+
bson_lookup_doc (&test, "readConcernDocument", &rc_doc_correct);
216+
rc_doc_result = _mongoc_read_concern_get_bson (rc);
217+
match_bson (&rc_doc_correct, rc_doc_result, false /* is_command */);
218+
}
219+
220+
if (bson_has_field (&test, "writeConcernDocument")) {
221+
bson_lookup_doc (&test, "writeConcernDocument", &wc_doc_correct);
222+
wc_doc_result = _mongoc_write_concern_get_bson (wc);
223+
match_bson (&wc_doc_correct, wc_doc_result, false);
148224
}
149225

150-
_mongoc_read_write_opts_cleanup (&read_write_opts);
226+
mongoc_write_concern_destroy (wc);
227+
mongoc_read_concern_destroy (rc);
151228
}
152229
}
153230

@@ -161,6 +238,7 @@ test_read_write_concern_install (TestSuite *suite)
161238
realpath (JSON_DIR "/read_write_concern/connection-string", resolved));
162239
install_json_test_suite (suite, resolved, &test_rw_concern_uri);
163240

164-
test_framework_resolve_path (JSON_DIR "/read_write_concern/document", resolved);
241+
test_framework_resolve_path (JSON_DIR "/read_write_concern/document",
242+
resolved);
165243
install_json_test_suite (suite, resolved, &test_rw_concern_document);
166244
}

0 commit comments

Comments
 (0)