@@ -174,11 +174,6 @@ test_mongoc_handshake_data_append_success (void)
174
174
const char * driver_version = "version abc" ;
175
175
const char * platform = "./configure -nottoomanyflags" ;
176
176
177
- char big_string [HANDSHAKE_MAX_SIZE ];
178
-
179
- memset (big_string , 'a' , HANDSHAKE_MAX_SIZE - 1 );
180
- big_string [HANDSHAKE_MAX_SIZE - 1 ] = '\0' ;
181
-
182
177
_reset_handshake ();
183
178
/* Make sure setting the handshake works */
184
179
ASSERT (
@@ -187,7 +182,6 @@ test_mongoc_handshake_data_append_success (void)
187
182
server = mock_server_new ();
188
183
mock_server_run (server );
189
184
uri = mongoc_uri_copy (mock_server_get_uri (server ));
190
- mongoc_uri_set_option_as_int32 (uri , MONGOC_URI_HEARTBEATFREQUENCYMS , 500 );
191
185
mongoc_uri_set_option_as_utf8 (uri , MONGOC_URI_APPNAME , "testapp" );
192
186
pool = test_framework_client_pool_new_from_uri (uri , NULL );
193
187
@@ -276,6 +270,116 @@ test_mongoc_handshake_data_append_success (void)
276
270
}
277
271
278
272
273
+ static void
274
+ test_mongoc_handshake_data_append_null_args (void )
275
+ {
276
+ mock_server_t * server ;
277
+ mongoc_uri_t * uri ;
278
+ mongoc_client_t * client ;
279
+ mongoc_client_pool_t * pool ;
280
+ request_t * request ;
281
+ const bson_t * request_doc ;
282
+ bson_iter_t iter ;
283
+ bson_iter_t md_iter ;
284
+ bson_iter_t inner_iter ;
285
+ const char * val ;
286
+
287
+ _reset_handshake ();
288
+ /* Make sure setting the handshake works */
289
+ ASSERT (mongoc_handshake_data_append (NULL , NULL , NULL ));
290
+
291
+ server = mock_server_new ();
292
+ mock_server_run (server );
293
+ uri = mongoc_uri_copy (mock_server_get_uri (server ));
294
+ mongoc_uri_set_option_as_utf8 (uri , MONGOC_URI_APPNAME , "testapp" );
295
+ pool = test_framework_client_pool_new_from_uri (uri , NULL );
296
+
297
+ /* Force topology scanner to start */
298
+ client = mongoc_client_pool_pop (pool );
299
+
300
+ request = mock_server_receives_legacy_hello (server , NULL );
301
+ ASSERT (request );
302
+ request_doc = request_get_doc (request , 0 );
303
+ ASSERT (request_doc );
304
+ ASSERT (bson_has_field (request_doc , HANDSHAKE_FIELD ));
305
+
306
+ ASSERT (bson_iter_init_find (& iter , request_doc , HANDSHAKE_FIELD ));
307
+ ASSERT (bson_iter_recurse (& iter , & md_iter ));
308
+
309
+ ASSERT (bson_iter_find (& md_iter , "application" ));
310
+ ASSERT (BSON_ITER_HOLDS_DOCUMENT (& md_iter ));
311
+ ASSERT (bson_iter_recurse (& md_iter , & inner_iter ));
312
+ ASSERT (bson_iter_find (& inner_iter , "name" ));
313
+ val = bson_iter_utf8 (& inner_iter , NULL );
314
+ ASSERT (val );
315
+ ASSERT_CMPSTR (val , "testapp" );
316
+
317
+ /* Make sure driver.name and driver.version and platform are all right */
318
+ ASSERT (bson_iter_find (& md_iter , "driver" ));
319
+ ASSERT (BSON_ITER_HOLDS_DOCUMENT (& md_iter ));
320
+ ASSERT (bson_iter_recurse (& md_iter , & inner_iter ));
321
+ ASSERT (bson_iter_find (& inner_iter , "name" ));
322
+ ASSERT (BSON_ITER_HOLDS_UTF8 (& inner_iter ));
323
+ val = bson_iter_utf8 (& inner_iter , NULL );
324
+ ASSERT (val );
325
+ ASSERT (strstr (val , " / " ) == NULL ); /* No append delimiter */
326
+
327
+ ASSERT (bson_iter_find (& inner_iter , "version" ));
328
+ ASSERT (BSON_ITER_HOLDS_UTF8 (& inner_iter ));
329
+ val = bson_iter_utf8 (& inner_iter , NULL );
330
+ ASSERT (val );
331
+ ASSERT (strstr (val , " / " ) == NULL ); /* No append delimiter */
332
+
333
+ /* Check os type not empty */
334
+ ASSERT (bson_iter_find (& md_iter , "os" ));
335
+ ASSERT (BSON_ITER_HOLDS_DOCUMENT (& md_iter ));
336
+ ASSERT (bson_iter_recurse (& md_iter , & inner_iter ));
337
+
338
+ ASSERT (bson_iter_find (& inner_iter , "type" ));
339
+ ASSERT (BSON_ITER_HOLDS_UTF8 (& inner_iter ));
340
+ val = bson_iter_utf8 (& inner_iter , NULL );
341
+ ASSERT (val );
342
+ ASSERT (strlen (val ) > 0 );
343
+
344
+ /* Check os version valid */
345
+ ASSERT (bson_iter_find (& inner_iter , "version" ));
346
+ ASSERT (BSON_ITER_HOLDS_UTF8 (& inner_iter ));
347
+ val = bson_iter_utf8 (& inner_iter , NULL );
348
+ _check_os_version_valid (val );
349
+
350
+ /* Check os arch is valid */
351
+ ASSERT (bson_iter_find (& inner_iter , "architecture" ));
352
+ ASSERT (BSON_ITER_HOLDS_UTF8 (& inner_iter ));
353
+ val = bson_iter_utf8 (& inner_iter , NULL );
354
+ ASSERT (val );
355
+ _check_arch_string_valid (val );
356
+
357
+ /* Not checking os_name, as the spec says it can be NULL. */
358
+
359
+ /* Check platform field ok */
360
+ ASSERT (bson_iter_find (& md_iter , "platform" ));
361
+ ASSERT (BSON_ITER_HOLDS_UTF8 (& md_iter ));
362
+ val = bson_iter_utf8 (& md_iter , NULL );
363
+ ASSERT (val );
364
+ /* standard val are < 100, may be truncated on some platform */
365
+ if (strlen (val ) < 250 ) {
366
+ /* `printf("%s", NULL)` -> "(null)" with libstdc++, libc++, and STL */
367
+ ASSERT (strstr (val , "null" ) == NULL );
368
+ }
369
+
370
+ mock_server_replies_simple (request , "{'ok': 1, 'isWritablePrimary': true}" );
371
+ request_destroy (request );
372
+
373
+ /* Cleanup */
374
+ mongoc_client_pool_push (pool , client );
375
+ mongoc_client_pool_destroy (pool );
376
+ mongoc_uri_destroy (uri );
377
+ mock_server_destroy (server );
378
+
379
+ _reset_handshake ();
380
+ }
381
+
382
+
279
383
static void
280
384
_test_platform (bool platform_oversized )
281
385
{
@@ -818,7 +922,6 @@ test_mongoc_handshake_race_condition (void)
818
922
BSON_ASSERT (!COMMON_PREFIX (thread_create ) (
819
923
& threads [j ], & handshake_append_worker , NULL ));
820
924
}
821
-
822
925
for (j = 0 ; j < 4 ; ++ j ) {
823
926
COMMON_PREFIX (thread_join ) (threads [j ]);
824
927
}
@@ -843,6 +946,9 @@ test_handshake_install (TestSuite *suite)
843
946
TestSuite_AddMockServerTest (suite ,
844
947
"/MongoDB/handshake/success" ,
845
948
test_mongoc_handshake_data_append_success );
949
+ TestSuite_AddMockServerTest (suite ,
950
+ "/MongoDB/handshake/null_args" ,
951
+ test_mongoc_handshake_data_append_null_args );
846
952
TestSuite_Add (suite ,
847
953
"/MongoDB/handshake/big_platform" ,
848
954
test_mongoc_handshake_big_platform );
0 commit comments