Skip to content

Commit d47cf90

Browse files
committed
CDRIVER-696: Add test for Useful errors from server selection
1 parent a038ca0 commit d47cf90

File tree

5 files changed

+133
-37
lines changed

5 files changed

+133
-37
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ set(test-libmongoc-sources
279279
${SOURCE_DIR}/tests/test-mongoc-rpc.c
280280
${SOURCE_DIR}/tests/test-mongoc-sdam.c
281281
${SOURCE_DIR}/tests/test-mongoc-server-selection.c
282+
${SOURCE_DIR}/tests/test-mongoc-server-selection-errors.c
282283
${SOURCE_DIR}/tests/test-mongoc-set.c
283284
${SOURCE_DIR}/tests/test-mongoc-socket.c
284285
${SOURCE_DIR}/tests/test-mongoc-stream.c

tests/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ test_libmongoc_SOURCES = \
114114
tests/test-mongoc-socket.c \
115115
tests/test-mongoc-sdam.c \
116116
tests/test-mongoc-server-selection.c \
117+
tests/test-mongoc-server-selection-errors.c \
117118
tests/test-mongoc-set.c \
118119
tests/test-mongoc-stream.c \
119120
tests/test-mongoc-thread.c \

tests/test-libmongoc.c

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -26,44 +26,45 @@
2626
#include "test-libmongoc.h"
2727

2828

29-
extern void test_array_install (TestSuite *suite);
30-
extern void test_async_install (TestSuite *suite);
31-
extern void test_buffer_install (TestSuite *suite);
32-
extern void test_bulk_install (TestSuite *suite);
33-
extern void test_client_install (TestSuite *suite);
34-
extern void test_client_pool_install (TestSuite *suite);
35-
extern void test_cluster_install (TestSuite *suite);
36-
extern void test_collection_install (TestSuite *suite);
37-
extern void test_cursor_install (TestSuite *suite);
38-
extern void test_database_install (TestSuite *suite);
39-
extern void test_exhaust_install (TestSuite *suite);
40-
extern void test_gridfs_file_page_install (TestSuite *suite);
41-
extern void test_gridfs_install (TestSuite *suite);
42-
extern void test_list_install (TestSuite *suite);
43-
extern void test_log_install (TestSuite *suite);
44-
extern void test_matcher_install (TestSuite *suite);
45-
extern void test_queue_install (TestSuite *suite);
46-
extern void test_read_prefs_install (TestSuite *suite);
47-
extern void test_rpc_install (TestSuite *suite);
48-
extern void test_sdam_install (TestSuite *suite);
49-
extern void test_sasl_install (TestSuite *suite);
50-
extern void test_server_selection_install (TestSuite *suite);
51-
extern void test_set_install (TestSuite *suite);
52-
extern void test_socket_install (TestSuite *suite);
53-
extern void test_stream_install (TestSuite *suite);
54-
extern void test_thread_install (TestSuite *suite);
55-
extern void test_topology_install (TestSuite *suite);
56-
extern void test_topology_reconcile_install (TestSuite *suite);
57-
extern void test_topology_scanner_install (TestSuite *suite);
58-
extern void test_uri_install (TestSuite *suite);
59-
extern void test_usleep_install (TestSuite *suite);
60-
extern void test_version_install (TestSuite *suite);
61-
extern void test_write_command_install (TestSuite *suite);
62-
extern void test_write_concern_install (TestSuite *suite);
29+
extern void test_array_install (TestSuite *suite);
30+
extern void test_async_install (TestSuite *suite);
31+
extern void test_buffer_install (TestSuite *suite);
32+
extern void test_bulk_install (TestSuite *suite);
33+
extern void test_client_install (TestSuite *suite);
34+
extern void test_client_pool_install (TestSuite *suite);
35+
extern void test_cluster_install (TestSuite *suite);
36+
extern void test_collection_install (TestSuite *suite);
37+
extern void test_cursor_install (TestSuite *suite);
38+
extern void test_database_install (TestSuite *suite);
39+
extern void test_exhaust_install (TestSuite *suite);
40+
extern void test_gridfs_file_page_install (TestSuite *suite);
41+
extern void test_gridfs_install (TestSuite *suite);
42+
extern void test_list_install (TestSuite *suite);
43+
extern void test_log_install (TestSuite *suite);
44+
extern void test_matcher_install (TestSuite *suite);
45+
extern void test_queue_install (TestSuite *suite);
46+
extern void test_read_prefs_install (TestSuite *suite);
47+
extern void test_rpc_install (TestSuite *suite);
48+
extern void test_sdam_install (TestSuite *suite);
49+
extern void test_sasl_install (TestSuite *suite);
50+
extern void test_server_selection_install (TestSuite *suite);
51+
extern void test_server_selection_errors_install (TestSuite *suite);
52+
extern void test_set_install (TestSuite *suite);
53+
extern void test_socket_install (TestSuite *suite);
54+
extern void test_stream_install (TestSuite *suite);
55+
extern void test_thread_install (TestSuite *suite);
56+
extern void test_topology_install (TestSuite *suite);
57+
extern void test_topology_reconcile_install (TestSuite *suite);
58+
extern void test_topology_scanner_install (TestSuite *suite);
59+
extern void test_uri_install (TestSuite *suite);
60+
extern void test_usleep_install (TestSuite *suite);
61+
extern void test_version_install (TestSuite *suite);
62+
extern void test_write_command_install (TestSuite *suite);
63+
extern void test_write_concern_install (TestSuite *suite);
6364
#ifdef MONGOC_ENABLE_SSL
64-
extern void test_x509_install (TestSuite *suite);
65-
extern void test_stream_tls_install (TestSuite *suite);
66-
extern void test_stream_tls_error_install (TestSuite *suite);
65+
extern void test_x509_install (TestSuite *suite);
66+
extern void test_stream_tls_install (TestSuite *suite);
67+
extern void test_stream_tls_error_install (TestSuite *suite);
6768
#endif
6869

6970

@@ -857,6 +858,22 @@ test_framework_is_mongos (void)
857858
return is_mongos;
858859
}
859860

861+
bool
862+
test_framework_is_replset (void)
863+
{
864+
bson_t reply;
865+
bson_iter_t iter;
866+
bool is_replset;
867+
868+
call_ismaster (&reply);
869+
870+
is_replset = (bson_iter_init_find (&iter, &reply, "hosts") && BSON_ITER_HOLDS_DOCUMENT (&iter));
871+
872+
bson_destroy (&reply);
873+
874+
return is_replset;
875+
}
876+
860877

861878
bool
862879
test_framework_max_wire_version_at_least (int version)
@@ -923,6 +940,7 @@ main (int argc,
923940
test_topology_reconcile_install (&suite);
924941
test_sdam_install (&suite);
925942
test_server_selection_install (&suite);
943+
test_server_selection_errors_install (&suite);
926944
test_set_install (&suite);
927945
test_stream_install (&suite);
928946
test_thread_install (&suite);

tests/test-libmongoc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ mongoc_uri_t *test_framework_get_uri (void);
3737
mongoc_client_t *test_framework_client_new (void);
3838
mongoc_client_pool_t *test_framework_client_pool_new (void);
3939
bool test_framework_is_mongos (void);
40+
bool test_framework_is_replset (void);
4041
bool test_framework_max_wire_version_at_least (int version);
4142

4243
typedef struct _debug_stream_stats_t {
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include <mongoc.h>
2+
3+
#include "TestSuite.h"
4+
#include "test-conveniences.h"
5+
#include "test-libmongoc.h"
6+
7+
int skip_if_single (void)
8+
{
9+
return (test_framework_is_mongos () || test_framework_is_replset());
10+
}
11+
12+
static void
13+
server_selection_error_dns (const char *uri, const char *errmsg, bool assert_as)
14+
{
15+
16+
mongoc_client_t *client;
17+
mongoc_collection_t *collection;
18+
bson_error_t error;
19+
bson_t *command;
20+
bson_t reply;
21+
bool success;
22+
23+
client = mongoc_client_new (uri);
24+
25+
collection = mongoc_client_get_collection (client, "test", "test");
26+
27+
command = tmp_bson("{'ping': 1}");
28+
success = mongoc_collection_command_simple (collection, command, NULL, &reply, &error);
29+
ASSERT_OR_PRINT(success == assert_as, error);
30+
31+
if (!success && errmsg) {
32+
ASSERT_CMPSTR(error.message, errmsg);
33+
}
34+
35+
bson_destroy (&reply);
36+
mongoc_collection_destroy (collection);
37+
mongoc_client_destroy (client);
38+
}
39+
40+
static void
41+
test_server_selection_error_dns_single (void)
42+
{
43+
server_selection_error_dns (
44+
"mongodb://non-existing-localhost:27017/",
45+
"No suitable servers found (`serverselectiontryonce` set): [Failed to resolve 'non-existing-localhost']",
46+
false
47+
);
48+
}
49+
50+
static void
51+
test_server_selection_error_dns_multi_fail (void)
52+
{
53+
server_selection_error_dns (
54+
"mongodb://non-existing-localhost:27017,other-non-existing-localhost:27017/",
55+
"No suitable servers found (`serverselectiontryonce` set): [Failed to resolve 'non-existing-localhost'] [Failed to resolve 'other-non-existing-localhost']",
56+
false
57+
);
58+
}
59+
static void
60+
test_server_selection_error_dns_multi_success (void *context)
61+
{
62+
server_selection_error_dns (
63+
"mongodb://non-existing-localhost:27017,localhost:27017,other-non-existing-localhost:27017/",
64+
"",
65+
true
66+
);
67+
}
68+
69+
void
70+
test_server_selection_errors_install (TestSuite *suite)
71+
{
72+
TestSuite_Add (suite, "/server_selection/errors/dns/single", test_server_selection_error_dns_single);
73+
TestSuite_Add (suite, "/server_selection/errors/dns/multi/fail", test_server_selection_error_dns_multi_fail);
74+
TestSuite_AddFull (suite, "/server_selection/errors/dns/multi/success", test_server_selection_error_dns_multi_success, NULL, NULL, skip_if_single);
75+
}

0 commit comments

Comments
 (0)