@@ -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