Skip to content

Commit a4d9067

Browse files
authored
CXX-2705 throw an exception upon unsuccessful pool creation (#987)
1 parent 16777df commit a4d9067

File tree

4 files changed

+32
-16
lines changed

4 files changed

+32
-16
lines changed

src/mongocxx/pool.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@
3333
namespace mongocxx {
3434
MONGOCXX_INLINE_NAMESPACE_BEGIN
3535

36+
// Attempts to create a new client pool using the uri. Throws an exception upon error.
37+
static mongoc_client_pool_t* construct_client_pool(mongoc_uri_t* uri) {
38+
bson_error_t error;
39+
auto pool = libmongoc::client_pool_new_with_error(uri, &error);
40+
if (!pool) {
41+
// If constructing a client pool failed, throw an exception from the bson_error_t.
42+
throw_exception<operation_exception>(error);
43+
}
44+
45+
return pool;
46+
}
47+
3648
void pool::_release(client* client) {
3749
libmongoc::client_pool_push(_impl->client_pool_t, client->_get_impl().client_t);
3850
// prevent client destructor from destroying the underlying mongoc_client_t
@@ -43,7 +55,7 @@ void pool::_release(client* client) {
4355
pool::~pool() = default;
4456

4557
pool::pool(const uri& uri, const options::pool& options)
46-
: _impl{stdx::make_unique<impl>(libmongoc::client_pool_new(uri._impl->uri_t))} {
58+
: _impl{stdx::make_unique<impl>(construct_client_pool(uri._impl->uri_t))} {
4759
#if defined(MONGOCXX_ENABLE_SSL) && defined(MONGOC_ENABLE_SSL)
4860
if (options.client_opts().tls_opts()) {
4961
if (!uri.tls())

src/mongocxx/private/libmongoc_symbols.hh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ MONGOCXX_LIBMONGOC_SYMBOL(client_new_from_uri)
178178
MONGOCXX_LIBMONGOC_SYMBOL(client_pool_enable_auto_encryption)
179179
MONGOCXX_LIBMONGOC_SYMBOL(client_pool_destroy)
180180
MONGOCXX_LIBMONGOC_SYMBOL(client_pool_new)
181+
MONGOCXX_LIBMONGOC_SYMBOL(client_pool_new_with_error)
181182
MONGOCXX_LIBMONGOC_SYMBOL(client_pool_pop)
182183
MONGOCXX_LIBMONGOC_SYMBOL(client_pool_push)
183184
MONGOCXX_LIBMONGOC_SYMBOL(client_pool_set_apm_callbacks)

src/mongocxx/test/pool.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "helpers.hpp"
1919
#include <bsoncxx/test_util/catch.hh>
2020
#include <mongocxx/client.hpp>
21+
#include <mongocxx/exception/operation_exception.hpp>
2122
#include <mongocxx/instance.hpp>
2223
#include <mongocxx/options/tls.hpp>
2324
#include <mongocxx/pool.hpp>
@@ -34,17 +35,18 @@ TEST_CASE("a pool is created with the correct MongoDB URI", "[pool]") {
3435
instance::current();
3536

3637
bool destroy_called = false;
37-
client_pool_destroy->interpose([&](::mongoc_client_pool_t*) { destroy_called = true; });
38+
client_pool_destroy->visit([&](::mongoc_client_pool_t*) { destroy_called = true; });
3839

3940
std::string expected_uri("mongodb://mongodb.example.com:9999");
4041
uri mongodb_uri{expected_uri};
4142

4243
std::string actual_uri{};
4344
bool new_called = false;
4445

45-
client_pool_new->interpose([&](const mongoc_uri_t* uri) {
46+
client_pool_new_with_error->visit([&](const mongoc_uri_t* uri, bson_error_t* error) {
4647
new_called = true;
4748
actual_uri = mongoc_uri_get_string(uri);
49+
error->code = 0;
4850
return nullptr;
4951
});
5052

@@ -87,11 +89,10 @@ TEST_CASE(
8789

8890
::mongoc_ssl_opt_t interposed = {};
8991

90-
client_pool_set_ssl_opts->interpose(
91-
[&](::mongoc_client_pool_t*, const ::mongoc_ssl_opt_t* opts) {
92-
set_tls_opts_called = true;
93-
interposed = *opts;
94-
});
92+
client_pool_set_ssl_opts->visit([&](::mongoc_client_pool_t*, const ::mongoc_ssl_opt_t* opts) {
93+
set_tls_opts_called = true;
94+
interposed = *opts;
95+
});
9596

9697
pool p{uri{"mongodb://mongodb.example.com:9999/?tls=true"},
9798
options::client().tls_opts(tls_opts)};
@@ -112,13 +113,13 @@ TEST_CASE("calling acquire on a pool returns an entry that manages its client",
112113
instance::current();
113114

114115
bool pop_called = false;
115-
client_pool_pop->interpose([&](::mongoc_client_pool_t*) {
116+
client_pool_pop->visit([&](::mongoc_client_pool_t*) {
116117
pop_called = true;
117118
return nullptr;
118119
});
119120

120121
bool push_called = false;
121-
client_pool_push->interpose(
122+
client_pool_push->visit(
122123
[&](::mongoc_client_pool_t*, ::mongoc_client_t*) { push_called = true; });
123124

124125
SECTION("entry releases its client at end of scope") {
@@ -167,4 +168,11 @@ TEST_CASE(
167168
REQUIRE(!client);
168169
}
169170
}
171+
172+
TEST_CASE("a pool is created with an invalid connection string", "[pool]") {
173+
instance::current();
174+
std::string uristr = "mongodb+srv://foo.bar.baz";
175+
176+
REQUIRE_THROWS_AS(pool{mongocxx::uri(uristr)}, operation_exception);
177+
}
170178
} // namespace

src/third_party/catch/include/helpers.hpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,11 @@ MONGOCXX_INLINE_NAMESPACE_END
5656
}
5757

5858
#define MOCK_POOL_NOSSL \
59-
auto client_pool_new = libmongoc::client_pool_new.create_instance(); \
60-
client_pool_new->interpose([](const mongoc_uri_t*) { return nullptr; }).forever(); \
59+
auto client_pool_new_with_error = libmongoc::client_pool_new_with_error.create_instance(); \
6160
auto client_pool_destroy = libmongoc::client_pool_destroy.create_instance(); \
62-
client_pool_destroy->interpose([&](::mongoc_client_pool_t*) {}).forever(); \
6361
auto client_pool_pop = libmongoc::client_pool_pop.create_instance(); \
64-
client_pool_pop->interpose([](::mongoc_client_pool_t*) { return nullptr; }).forever(); \
6562
auto client_pool_push = libmongoc::client_pool_push.create_instance(); \
66-
client_pool_push->interpose([](::mongoc_client_pool_t*, ::mongoc_client_t*) {}).forever(); \
6763
auto client_pool_try_pop = libmongoc::client_pool_try_pop.create_instance(); \
68-
client_pool_try_pop->interpose([](::mongoc_client_pool_t*) { return nullptr; }).forever();
6964

7065
#if defined(MONGOCXX_ENABLE_SSL) && defined(MONGOC_ENABLE_SSL)
7166
#define MOCK_POOL \

0 commit comments

Comments
 (0)