Skip to content

Commit 20ff94f

Browse files
committed
CXX-1399 Test passing bad session to additional member functions
1 parent 2ce2818 commit 20ff94f

File tree

1 file changed

+73
-5
lines changed

1 file changed

+73
-5
lines changed

src/mongocxx/test/client_session.cpp

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,77 @@ TEST_CASE("session", "[session]") {
153153
using Catch::Matchers::Contains;
154154

155155
// "Session argument is for the right client" test from Driver Sessions Spec.
156+
// Passing a session from client "c" should fail with client "c2" and related objects.
156157
client c2{uri{}};
157-
158-
REQUIRE_THROWS_MATCHES(c2["db"]["collection"].insert_one(s, {}),
159-
logic_error,
160-
mongocxx_exception_matcher{"Invalid sessionId"});
158+
auto db2 = c2["db"];
159+
auto collection2 = db2["collection"];
160+
161+
#define REQUIRE_THROWS_INVALID_SESSION(_expr) \
162+
REQUIRE_THROWS_MATCHES((_expr), \
163+
mongocxx::exception, \
164+
mongocxx_exception_matcher{"Invalid sessionId"})
165+
166+
REQUIRE_THROWS_INVALID_SESSION(collection2.count(s, {}));
167+
REQUIRE_THROWS_INVALID_SESSION(collection2.create_index(s, make_document(kvp("a", 1))));
168+
REQUIRE_THROWS_INVALID_SESSION(collection2.distinct(s, "a", {}));
169+
REQUIRE_THROWS_INVALID_SESSION(collection2.drop(s));
170+
REQUIRE_THROWS_INVALID_SESSION(collection2.find_one(s, {}));
171+
REQUIRE_THROWS_INVALID_SESSION(collection2.rename(s, "foo", true));
172+
REQUIRE_THROWS_INVALID_SESSION(db2.create_collection(s, "foo"));
173+
REQUIRE_THROWS_INVALID_SESSION(db2.run_command(s, {}));
174+
175+
// Test iterators.
176+
auto cursor = c2.list_databases(s);
177+
REQUIRE_THROWS_INVALID_SESSION(cursor.begin());
178+
cursor = collection2.aggregate(s, {});
179+
REQUIRE_THROWS_INVALID_SESSION(cursor.begin());
180+
cursor = collection2.list_indexes(s);
181+
REQUIRE_THROWS_INVALID_SESSION(cursor.begin());
182+
cursor = db2.list_collections(s);
183+
REQUIRE_THROWS_INVALID_SESSION(cursor.begin());
184+
cursor = collection2.find(s, {});
185+
REQUIRE_THROWS_INVALID_SESSION(cursor.begin());
186+
auto stream = collection2.watch(s);
187+
REQUIRE_THROWS_INVALID_SESSION(stream.begin());
188+
auto indexes2 = collection2.indexes();
189+
cursor = indexes2.list(s);
190+
REQUIRE_THROWS_INVALID_SESSION(cursor.begin());
191+
192+
// Test CRUD member functions.
193+
std::vector<model::write> writes;
194+
std::vector<bsoncxx::document::view> docs;
195+
auto bulk = collection2.create_bulk_write(s);
196+
197+
REQUIRE_THROWS_INVALID_SESSION(bulk.execute());
198+
REQUIRE_THROWS_INVALID_SESSION(collection2.bulk_write(s, writes));
199+
REQUIRE_THROWS_INVALID_SESSION(collection2.delete_many(s, {}));
200+
REQUIRE_THROWS_INVALID_SESSION(collection2.delete_one(s, {}));
201+
REQUIRE_THROWS_INVALID_SESSION(collection2.find_one_and_delete(s, {}));
202+
REQUIRE_THROWS_INVALID_SESSION(collection2.find_one_and_replace(s, {}, {}));
203+
REQUIRE_THROWS_INVALID_SESSION(collection2.find_one_and_update(s, {}, {}));
204+
REQUIRE_THROWS_INVALID_SESSION(collection2.insert_many(s, docs));
205+
REQUIRE_THROWS_INVALID_SESSION(collection2.insert_one(s, {}));
206+
REQUIRE_THROWS_INVALID_SESSION(collection2.replace_one(s, {}, {}));
207+
REQUIRE_THROWS_INVALID_SESSION(collection2.update_many(s, {}, {}));
208+
REQUIRE_THROWS_INVALID_SESSION(collection2.update_one(s, {}, {}));
209+
REQUIRE_THROWS_INVALID_SESSION(collection2.write(s, model::insert_one{{}}));
210+
211+
// Test index_view member functions.
212+
std::vector<index_model> models;
213+
214+
REQUIRE_THROWS_INVALID_SESSION(indexes2.create_one(s, make_document(kvp("a", 1))));
215+
REQUIRE_THROWS_INVALID_SESSION(indexes2.create_many(s, models));
216+
REQUIRE_THROWS_INVALID_SESSION(indexes2.drop_one(s, "foo"));
217+
REQUIRE_THROWS_INVALID_SESSION(indexes2.drop_all(s));
218+
219+
// Test gridfs::bucket.
220+
auto bucket2 = db2.gridfs_bucket();
221+
auto one = bsoncxx::types::value{bsoncxx::types::b_int32{1}};
222+
223+
REQUIRE_THROWS_INVALID_SESSION(bucket2.open_upload_stream(s, "file"));
224+
REQUIRE_THROWS_INVALID_SESSION(bucket2.open_download_stream(s, one));
225+
226+
#undef REQUIRE_THROWS_INVALID_SESSION
161227
}
162228
}
163229

@@ -574,7 +640,9 @@ TEST_CASE("lsid", "[session]") {
574640
}
575641

576642
auto f = [&s, &collection](bool use_session) {
577-
auto stream = use_session ? collection.watch(s) : collection.watch();
643+
options::change_stream opts;
644+
opts.max_await_time(std::chrono::milliseconds(1));
645+
auto stream = use_session ? collection.watch(s, opts) : collection.watch(opts);
578646
for (auto&& event : stream) {
579647
}
580648
};

0 commit comments

Comments
 (0)