1
1
#include <mongoc.h>
2
+ #include <bson-types.h>
2
3
3
4
#include "mongoc-util-private.h"
4
5
#include "mongoc-write-concern-private.h"
6
+ #include "mongoc-read-concern-private.h"
7
+ #include "mongoc-opts-helpers-private.h"
5
8
#include "json-test.h"
6
9
#include "test-libmongoc.h"
7
10
8
11
9
12
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 )
11
15
{
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
+ }
17
20
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
- }
24
21
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 );
30
65
}
31
- } else {
32
- ASSERT_CMPINT (
33
- (int ) wc -> journal , = = , MONGOC_WRITE_CONCERN_JOURNAL_DEFAULT );
34
66
}
35
- }
36
67
68
+ if (wc -> w == 0 && wc -> journal == 1 ) {
69
+ goto invalid ;
70
+ }
37
71
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 ;
42
73
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
+ }
48
100
}
101
+
102
+ return rc ;
103
+
104
+ invalid :
105
+ mongoc_read_concern_destroy (rc );
106
+ return NULL ;
49
107
}
50
108
51
109
@@ -60,10 +118,13 @@ test_rw_concern_uri (bson_t *scenario)
60
118
bool valid ;
61
119
mongoc_uri_t * uri ;
62
120
bson_t rc_doc ;
63
- const mongoc_read_concern_t * rc ;
64
121
bson_t wc_doc ;
122
+ const mongoc_read_concern_t * rc ;
65
123
const mongoc_write_concern_t * wc ;
124
+ mongoc_write_concern_t * wc_correct ;
125
+ mongoc_read_concern_t * rc_correct ;
66
126
127
+ /* initialize tests with the scenario */
67
128
BSON_ASSERT (bson_iter_init_find (& scenario_iter , scenario , "tests" ));
68
129
BSON_ASSERT (bson_iter_recurse (& scenario_iter , & test_iter ));
69
130
@@ -83,71 +144,87 @@ test_rw_concern_uri (bson_t *scenario)
83
144
uri = mongoc_uri_new_with_error (uri_str , NULL );
84
145
if (!valid ) {
85
146
BSON_ASSERT (!uri );
86
- return ;
147
+ continue ;
87
148
}
88
149
89
150
BSON_ASSERT (uri );
90
151
91
152
if (bson_has_field (& test , "readConcern" )) {
92
153
rc = mongoc_uri_get_read_concern (uri );
93
154
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 );
95
158
}
96
159
97
160
if (bson_has_field (& test , "writeConcern" )) {
98
161
wc = mongoc_uri_get_write_concern (uri );
99
162
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 );
101
166
}
102
167
103
168
mongoc_uri_destroy (uri );
104
169
}
105
170
}
106
171
107
-
108
172
static void
109
173
test_rw_concern_document (bson_t * scenario )
110
174
{
111
175
bson_iter_t scenario_iter ;
112
176
bson_iter_t test_iter ;
113
- mongoc_read_write_opts_t read_write_opts ;
114
- bson_error_t error ;
115
177
bson_t test ;
116
178
bool valid ;
117
- bool r ;
118
179
bson_t rc_doc ;
119
180
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 ;
120
187
121
188
BSON_ASSERT (bson_iter_init_find (& scenario_iter , scenario , "tests" ));
122
189
BSON_ASSERT (bson_iter_recurse (& scenario_iter , & test_iter ));
123
190
124
191
while (bson_iter_next (& test_iter )) {
125
192
bson_iter_bson (& test_iter , & test );
126
-
127
193
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 );
138
194
139
195
if (bson_has_field (& test , "readConcern" )) {
140
196
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 ();
143
200
}
144
201
145
202
if (bson_has_field (& test , "writeConcern" )) {
146
203
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);
148
224
}
149
225
150
- _mongoc_read_write_opts_cleanup (& read_write_opts );
226
+ mongoc_write_concern_destroy (wc );
227
+ mongoc_read_concern_destroy (rc );
151
228
}
152
229
}
153
230
@@ -161,6 +238,7 @@ test_read_write_concern_install (TestSuite *suite)
161
238
realpath (JSON_DIR "/read_write_concern/connection-string" , resolved ));
162
239
install_json_test_suite (suite , resolved , & test_rw_concern_uri );
163
240
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 );
165
243
install_json_test_suite (suite , resolved , & test_rw_concern_document );
166
244
}
0 commit comments