|
1 | 1 | use bson::{bson, doc, Bson};
|
2 | 2 |
|
3 | 3 | use crate::{
|
4 |
| - options::{AggregateOptions, UpdateOptions}, |
5 |
| - test::{util::drop_collection, CLIENT, LOCK}, |
| 4 | + event::command::CommandStartedEvent, |
| 5 | + options::{AggregateOptions, FindOptions, UpdateOptions}, |
| 6 | + test::{ |
| 7 | + util::{drop_collection, CommandEvent, EventClient}, |
| 8 | + CLIENT, |
| 9 | + LOCK, |
| 10 | + }, |
6 | 11 | };
|
7 | 12 |
|
8 | 13 | #[test]
|
@@ -144,3 +149,73 @@ fn aggregate_out() {
|
144 | 149 | .into_iter()
|
145 | 150 | .any(|name| name.as_str() == out_coll.name()));
|
146 | 151 | }
|
| 152 | + |
| 153 | +fn kill_cursors_sent(client: &EventClient) -> bool { |
| 154 | + client |
| 155 | + .command_events |
| 156 | + .read() |
| 157 | + .unwrap() |
| 158 | + .iter() |
| 159 | + .any(|event| match event { |
| 160 | + CommandEvent::CommandStartedEvent(CommandStartedEvent { command_name, .. }) => { |
| 161 | + command_name == "killCursors" |
| 162 | + } |
| 163 | + _ => false, |
| 164 | + }) |
| 165 | +} |
| 166 | + |
| 167 | +#[test] |
| 168 | +#[function_name::named] |
| 169 | +fn kill_cursors_on_drop() { |
| 170 | + let _guard = LOCK.run_concurrently(); |
| 171 | + |
| 172 | + let db = CLIENT.database(function_name!()); |
| 173 | + let coll = db.collection(function_name!()); |
| 174 | + |
| 175 | + drop_collection(&coll); |
| 176 | + |
| 177 | + coll.insert_many(vec![doc! { "x": 1 }, doc! { "x": 2 }], None) |
| 178 | + .unwrap(); |
| 179 | + |
| 180 | + let event_client = EventClient::new(); |
| 181 | + let coll = event_client |
| 182 | + .database(function_name!()) |
| 183 | + .collection(function_name!()); |
| 184 | + |
| 185 | + let cursor = coll |
| 186 | + .find(None, FindOptions::builder().batch_size(1).build()) |
| 187 | + .unwrap(); |
| 188 | + |
| 189 | + assert!(!kill_cursors_sent(&event_client)); |
| 190 | + |
| 191 | + std::mem::drop(cursor); |
| 192 | + |
| 193 | + assert!(kill_cursors_sent(&event_client)); |
| 194 | +} |
| 195 | + |
| 196 | +#[test] |
| 197 | +#[function_name::named] |
| 198 | +fn no_kill_cursors_on_exhausted() { |
| 199 | + let _guard = LOCK.run_concurrently(); |
| 200 | + |
| 201 | + let db = CLIENT.database(function_name!()); |
| 202 | + let coll = db.collection(function_name!()); |
| 203 | + |
| 204 | + drop_collection(&coll); |
| 205 | + |
| 206 | + coll.insert_many(vec![doc! { "x": 1 }, doc! { "x": 2 }], None) |
| 207 | + .unwrap(); |
| 208 | + |
| 209 | + let event_client = EventClient::new(); |
| 210 | + let coll = event_client |
| 211 | + .database(function_name!()) |
| 212 | + .collection(function_name!()); |
| 213 | + |
| 214 | + let cursor = coll.find(None, FindOptions::builder().build()).unwrap(); |
| 215 | + |
| 216 | + assert!(!kill_cursors_sent(&event_client)); |
| 217 | + |
| 218 | + std::mem::drop(cursor); |
| 219 | + |
| 220 | + assert!(!kill_cursors_sent(&event_client)); |
| 221 | +} |
0 commit comments