bson/testdata/run-command/runCursorCommand.yml
2025-03-17 20:58:26 +01:00

392 lines
12 KiB
YAML

description: runCursorCommand
schemaVersion: '1.9'
createEntities:
- client:
id: &client client
useMultipleMongoses: false
observeEvents: [commandStartedEvent, connectionReadyEvent, connectionCheckedOutEvent, connectionCheckedInEvent]
- session:
id: &session session
client: *client
- database:
id: &db db
client: *client
databaseName: *db
- collection:
id: &collection collection
database: *db
collectionName: *collection
initialData:
- collectionName: collection
databaseName: *db
documents: &documents
- { _id: 1, x: 11 }
- { _id: 2, x: 22 }
- { _id: 3, x: 33 }
- { _id: 4, x: 44 }
- { _id: 5, x: 55 }
tests:
# This is what this API was invented to do.
- description: successfully executes checkMetadataConsistency cursor creating command
runOnRequirements:
- minServerVersion: '7.0'
topologies: [sharded]
operations:
- name: runCursorCommand
object: *db
arguments:
commandName: checkMetadataConsistency
command: { checkMetadataConsistency: 1 }
expectEvents:
- client: *client
eventType: command
events:
- commandStartedEvent:
command:
checkMetadataConsistency: 1
$db: *db
lsid: { $$exists: true }
commandName: checkMetadataConsistency
- description: errors if the command response is not a cursor
operations:
- name: createCommandCursor
object: *db
arguments:
commandName: ping
command: { ping: 1 }
expectError:
isClientError: true
# Driver Sessions
- description: creates an implicit session that is reused across getMores
operations:
- name: runCursorCommand
object: *db
arguments:
commandName: find
command: { find: *collection, batchSize: 2 }
expectResult: *documents
- name: assertSameLsidOnLastTwoCommands
object: testRunner
arguments:
client: *client
expectEvents:
- client: *client
eventType: command
events:
- commandStartedEvent:
command:
find: *collection
batchSize: 2
$db: *db
lsid: { $$exists: true }
commandName: find
- commandStartedEvent:
command:
getMore: { $$type: [int, long] }
collection: *collection
$db: *db
lsid: { $$exists: true }
commandName: getMore
- description: accepts an explicit session that is reused across getMores
operations:
- name: runCursorCommand
object: *db
arguments:
commandName: find
session: *session
command: { find: *collection, batchSize: 2 }
expectResult: *documents
- name: assertSameLsidOnLastTwoCommands
object: testRunner
arguments:
client: *client
expectEvents:
- client: *client
eventType: command
events:
- commandStartedEvent:
command:
find: *collection
batchSize: 2
$db: *db
lsid: { $$sessionLsid: *session }
commandName: find
- commandStartedEvent:
command:
getMore: { $$type: [int, long] }
collection: *collection
$db: *db
lsid: { $$sessionLsid: *session }
commandName: getMore
# Load Balancers
- description: returns pinned connections to the pool when the cursor is exhausted
runOnRequirements:
- topologies: [ load-balanced ]
operations:
- name: createCommandCursor
object: *db
arguments:
commandName: find
batchSize: 2
session: *session
command: { find: *collection, batchSize: 2 }
saveResultAsEntity: &cursor cursor
- name: assertNumberConnectionsCheckedOut
object: testRunner
arguments:
client: *client
connections: 1
- name: iterateUntilDocumentOrError
object: *cursor
expectResult: { _id: 1, x: 11 }
- name: iterateUntilDocumentOrError
object: *cursor
expectResult: { _id: 2, x: 22 }
- name: iterateUntilDocumentOrError
object: *cursor
expectResult: { _id: 3, x: 33 }
- name: iterateUntilDocumentOrError
object: *cursor
expectResult: { _id: 4, x: 44 }
- name: iterateUntilDocumentOrError
object: *cursor
expectResult: { _id: 5, x: 55 }
- name: assertNumberConnectionsCheckedOut
object: testRunner
arguments:
client: *client
connections: 0
expectEvents:
- client: *client
eventType: command
events:
- commandStartedEvent:
command:
find: *collection
batchSize: 2
$db: *db
lsid: { $$sessionLsid: *session }
commandName: find # 2 documents
- commandStartedEvent:
command:
getMore: { $$type: [int, long] }
collection: *collection
$db: *db
lsid: { $$sessionLsid: *session }
commandName: getMore # 2 documents
- commandStartedEvent:
command:
getMore: { $$type: [int, long] }
collection: *collection
$db: *db
lsid: { $$sessionLsid: *session }
commandName: getMore # 1 document
# Total documents: 5
- client: *client
eventType: cmap
events:
- connectionReadyEvent: {}
- connectionCheckedOutEvent: {}
- connectionCheckedInEvent: {}
- description: returns pinned connections to the pool when the cursor is closed
runOnRequirements:
- topologies: [ load-balanced ]
operations:
- name: createCommandCursor
object: *db
arguments:
commandName: find
command: { find: *collection, batchSize: 2 }
saveResultAsEntity: *cursor
- name: assertNumberConnectionsCheckedOut
object: testRunner
arguments:
client: *client
connections: 1
- name: close
object: *cursor
- name: assertNumberConnectionsCheckedOut
object: testRunner
arguments:
client: *client
connections: 0
# Iterating the Cursor / Executing GetMores
- description: supports configuring getMore batchSize
operations:
- name: runCursorCommand
object: *db
arguments:
commandName: find
batchSize: 5
command: { find: *collection, batchSize: 1 }
expectResult: *documents
expectEvents:
- client: *client
eventType: command
events:
- commandStartedEvent:
command:
find: *collection
batchSize: 1
$db: *db
lsid: { $$exists: true }
commandName: find
- commandStartedEvent:
command:
getMore: { $$type: [int, long] }
collection: *collection
batchSize: 5
$db: *db
lsid: { $$exists: true }
commandName: getMore
- description: supports configuring getMore maxTimeMS
operations:
- name: runCursorCommand
object: *db
arguments:
commandName: find
maxTimeMS: 300
command: { find: *collection, maxTimeMS: 200, batchSize: 1 }
ignoreResultAndError: true
expectEvents:
- client: *client
eventType: command
# The getMore should receive an error here because we do not have the right kind of cursor
# So drivers should run a killCursors, but neither the error nor the killCursors command is relevant to this test
ignoreExtraEvents: true
events:
- commandStartedEvent:
command:
find: *collection
maxTimeMS: 200
batchSize: 1
$db: *db
lsid: { $$exists: true }
commandName: find
- commandStartedEvent:
command:
getMore: { $$type: [int, long] }
collection: *collection
$db: *db
maxTimeMS: 300
lsid: { $$exists: true }
commandName: getMore
- description: supports configuring getMore comment
runOnRequirements:
- minServerVersion: '4.4'
operations:
- name: runCursorCommand
object: *db
arguments:
commandName: find
comment: { hello: 'getMore' }
command: { find: *collection, batchSize: 1, comment: { hello: 'find' } }
expectResult: *documents
expectEvents:
- client: *client
eventType: command
events:
- commandStartedEvent:
command:
find: *collection
batchSize: 1
comment: { hello: 'find' }
$db: *db
lsid: { $$exists: true }
commandName: find
- commandStartedEvent:
command:
getMore: { $$type: [int, long] }
collection: *collection
comment: { hello: 'getMore' }
$db: *db
lsid: { $$exists: true }
commandName: getMore
# Tailable cursor
- description: does not close the cursor when receiving an empty batch
runOnRequirements:
- serverless: forbid
operations:
- name: dropCollection
object: *db
arguments:
collection: &cappedCollection cappedCollection
- name: createCollection
object: *db
arguments:
collection: *cappedCollection
capped: true
size: 4096
max: 3
saveResultAsEntity: *cappedCollection
- name: insertMany
object: *cappedCollection
arguments:
documents:
- { _id: 1, x: 11 }
- { _id: 2, x: 22 }
- name: createCommandCursor
object: *db
arguments:
cursorType: tailable
commandName: find
batchSize: 2
command: { find: *cappedCollection, tailable: true }
saveResultAsEntity: &cursor cursor
- name: iterateOnce
object: *cursor
- name: iterateOnce
object: *cursor
- name: iterateOnce
object: *cursor
- name: close
object: *cursor
expectEvents:
- client: *client
eventType: command
events:
- commandStartedEvent:
command:
drop: *cappedCollection
commandName: drop
- commandStartedEvent:
command:
create: *cappedCollection
commandName: create
- commandStartedEvent:
command:
insert: *cappedCollection
commandName: insert
- commandStartedEvent:
command:
find: *cappedCollection
$db: *db
lsid: { $$exists: true }
commandName: find
- commandStartedEvent:
command:
getMore: { $$type: [int, long] }
collection: *cappedCollection
$db: *db
lsid: { $$exists: true }
commandName: getMore
- commandStartedEvent:
command:
killCursors: *cappedCollection
cursors: { $$type: array }
commandName: killCursors