PYTHON-3123 Convert sessions spec tests to unified test format (#888)

Create implicit session _before_ starting a retryable read.
This commit is contained in:
Shane Harvey 2022-02-25 10:36:05 -08:00 committed by GitHub
parent f8f34b0438
commit a3f0f91588
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 1251 additions and 926 deletions

View File

@ -1720,9 +1720,9 @@ class Collection(common.BaseObject, Generic[_DocumentType]):
# MongoDB < 4.9
cmd = SON([("count", self.__name)])
cmd.update(kwargs)
return self._count_cmd(None, sock_info, read_preference, cmd, collation=None)
return self._count_cmd(session, sock_info, read_preference, cmd, collation=None)
return self.__database.client._retryable_read(_cmd, self.read_preference, None)
return self._retryable_non_cursor_read(_cmd, None)
def count_documents(
self,
@ -1807,9 +1807,13 @@ class Collection(common.BaseObject, Generic[_DocumentType]):
return 0
return result["n"]
return self.__database.client._retryable_read(
_cmd, self._read_preference_for(session), session
)
return self._retryable_non_cursor_read(_cmd, session)
def _retryable_non_cursor_read(self, func, session):
"""Non-cursor read helper to handle implicit session creation."""
client = self.__database.client
with client._tmp_session(session) as s:
return client._retryable_read(func, self._read_preference_for(s), s)
def create_indexes(
self,
@ -2157,30 +2161,31 @@ class Collection(common.BaseObject, Generic[_DocumentType]):
codec_options=codec_options, read_preference=ReadPreference.PRIMARY
)
read_pref = (session and session._txn_read_preference()) or ReadPreference.PRIMARY
explicit_session = session is not None
def _cmd(session, server, sock_info, read_preference):
cmd = SON([("listIndexes", self.__name), ("cursor", {})])
if comment is not None:
cmd["comment"] = comment
with self.__database.client._tmp_session(session, False) as s:
try:
cursor = self._command(
sock_info, cmd, read_preference, codec_options, session=s
)["cursor"]
except OperationFailure as exc:
# Ignore NamespaceNotFound errors to match the behavior
# of reading from *.system.indexes.
if exc.code != 26:
raise
cursor = {"id": 0, "firstBatch": []}
try:
cursor = self._command(
sock_info, cmd, read_preference, codec_options, session=session
)["cursor"]
except OperationFailure as exc:
# Ignore NamespaceNotFound errors to match the behavior
# of reading from *.system.indexes.
if exc.code != 26:
raise
cursor = {"id": 0, "firstBatch": []}
cmd_cursor = CommandCursor(
coll, cursor, sock_info.address, session=s, explicit_session=session is not None
coll, cursor, sock_info.address, session=session, explicit_session=explicit_session
)
cmd_cursor._maybe_pin_connection(sock_info)
return cmd_cursor
return self.__database.client._retryable_read(_cmd, read_pref, session)
with self.__database.client._tmp_session(session, False) as s:
return self.__database.client._retryable_read(_cmd, read_pref, s)
def index_information(
self,
@ -2701,9 +2706,7 @@ class Collection(common.BaseObject, Generic[_DocumentType]):
user_fields={"values": 1},
)["values"]
return self.__database.client._retryable_read(
_cmd, self._read_preference_for(session), session
)
return self._retryable_non_cursor_read(_cmd, session)
def _write_concern_for_cmd(self, cmd, session):
raw_wc = cmd.get("writeConcern")

View File

@ -0,0 +1,969 @@
{
"description": "driver-sessions-dirty-session-errors",
"schemaVersion": "1.0",
"runOnRequirements": [
{
"minServerVersion": "4.0",
"topologies": [
"replicaset"
]
},
{
"minServerVersion": "4.1.8",
"topologies": [
"sharded-replicaset"
]
}
],
"createEntities": [
{
"client": {
"id": "client0",
"useMultipleMongoses": false,
"observeEvents": [
"commandStartedEvent"
]
}
},
{
"database": {
"id": "database0",
"client": "client0",
"databaseName": "session-tests"
}
},
{
"collection": {
"id": "collection0",
"database": "database0",
"collectionName": "test"
}
},
{
"session": {
"id": "session0",
"client": "client0"
}
}
],
"initialData": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1
}
]
}
],
"tests": [
{
"description": "Dirty explicit session is discarded (insert)",
"operations": [
{
"name": "failPoint",
"object": "testRunner",
"arguments": {
"client": "client0",
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"insert"
],
"closeConnection": true
}
}
}
},
{
"name": "assertSessionNotDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "insertOne",
"object": "collection0",
"arguments": {
"session": "session0",
"document": {
"_id": 2
}
},
"expectResult": {
"$$unsetOrMatches": {
"insertedId": {
"$$unsetOrMatches": 2
}
}
}
},
{
"name": "assertSessionDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "insertOne",
"object": "collection0",
"arguments": {
"session": "session0",
"document": {
"_id": 3
}
},
"expectResult": {
"$$unsetOrMatches": {
"insertedId": {
"$$unsetOrMatches": 3
}
}
}
},
{
"name": "assertSessionDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "endSession",
"object": "session0"
},
{
"name": "find",
"object": "collection0",
"arguments": {
"filter": {
"_id": -1
}
},
"expectResult": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner",
"arguments": {
"client": "client0"
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"lsid": {
"$$sessionLsid": "session0"
},
"txnNumber": 1
},
"commandName": "insert",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"lsid": {
"$$sessionLsid": "session0"
},
"txnNumber": 1
},
"commandName": "insert",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"insert": "test",
"documents": [
{
"_id": 3
}
],
"ordered": true,
"lsid": {
"$$sessionLsid": "session0"
},
"txnNumber": 2
},
"commandName": "insert",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"find": "test",
"filter": {
"_id": -1
},
"lsid": {
"$$type": "object"
}
},
"commandName": "find",
"databaseName": "session-tests"
}
}
]
}
],
"outcome": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1
},
{
"_id": 2
},
{
"_id": 3
}
]
}
]
},
{
"description": "Dirty explicit session is discarded (findAndModify)",
"operations": [
{
"name": "failPoint",
"object": "testRunner",
"arguments": {
"client": "client0",
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"findAndModify"
],
"closeConnection": true
}
}
}
},
{
"name": "assertSessionNotDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "findOneAndUpdate",
"object": "collection0",
"arguments": {
"session": "session0",
"filter": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"returnDocument": "Before"
},
"expectResult": {
"_id": 1
}
},
{
"name": "assertSessionDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "endSession",
"object": "session0"
},
{
"name": "find",
"object": "collection0",
"arguments": {
"filter": {
"_id": -1
}
},
"expectResult": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner",
"arguments": {
"client": "client0"
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"findAndModify": "test",
"query": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"new": false,
"lsid": {
"$$sessionLsid": "session0"
},
"txnNumber": 1,
"readConcern": {
"$$exists": false
},
"writeConcern": {
"$$exists": false
}
},
"commandName": "findAndModify",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"findAndModify": "test",
"query": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"new": false,
"lsid": {
"$$sessionLsid": "session0"
},
"txnNumber": 1,
"readConcern": {
"$$exists": false
},
"writeConcern": {
"$$exists": false
}
},
"commandName": "findAndModify",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"find": "test",
"filter": {
"_id": -1
},
"lsid": {
"$$type": "object"
}
},
"commandName": "find",
"databaseName": "session-tests"
}
}
]
}
],
"outcome": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1,
"x": 1
}
]
}
]
},
{
"description": "Dirty implicit session is discarded (insert)",
"operations": [
{
"name": "failPoint",
"object": "testRunner",
"arguments": {
"client": "client0",
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"insert"
],
"closeConnection": true
}
}
}
},
{
"name": "insertOne",
"object": "collection0",
"arguments": {
"session": "session0",
"document": {
"_id": 2
}
},
"expectResult": {
"$$unsetOrMatches": {
"insertedId": {
"$$unsetOrMatches": 2
}
}
}
},
{
"name": "find",
"object": "collection0",
"arguments": {
"filter": {
"_id": -1
}
},
"expectResult": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner",
"arguments": {
"client": "client0"
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"lsid": {
"$$type": "object"
},
"txnNumber": 1
},
"commandName": "insert",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"lsid": {
"$$type": "object"
},
"txnNumber": 1
},
"commandName": "insert",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"find": "test",
"filter": {
"_id": -1
},
"lsid": {
"$$type": "object"
}
},
"commandName": "find",
"databaseName": "session-tests"
}
}
]
}
],
"outcome": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1
},
{
"_id": 2
}
]
}
]
},
{
"description": "Dirty implicit session is discarded (findAndModify)",
"operations": [
{
"name": "failPoint",
"object": "testRunner",
"arguments": {
"client": "client0",
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"findAndModify"
],
"closeConnection": true
}
}
}
},
{
"name": "findOneAndUpdate",
"object": "collection0",
"arguments": {
"filter": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"returnDocument": "Before"
},
"expectResult": {
"_id": 1
}
},
{
"name": "find",
"object": "collection0",
"arguments": {
"filter": {
"_id": -1
}
},
"expectResult": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner",
"arguments": {
"client": "client0"
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"findAndModify": "test",
"query": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"new": false,
"lsid": {
"$$type": "object"
},
"txnNumber": 1,
"readConcern": {
"$$exists": false
},
"writeConcern": {
"$$exists": false
}
},
"commandName": "findAndModify",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"findAndModify": "test",
"query": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"new": false,
"lsid": {
"$$type": "object"
},
"txnNumber": 1,
"readConcern": {
"$$exists": false
},
"writeConcern": {
"$$exists": false
}
},
"commandName": "findAndModify",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"find": "test",
"filter": {
"_id": -1
},
"lsid": {
"$$type": "object"
}
},
"commandName": "find",
"databaseName": "session-tests"
}
}
]
}
],
"outcome": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1,
"x": 1
}
]
}
]
},
{
"description": "Dirty implicit session is discarded (read returning cursor)",
"operations": [
{
"name": "failPoint",
"object": "testRunner",
"arguments": {
"client": "client0",
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"aggregate"
],
"closeConnection": true
}
}
}
},
{
"name": "aggregate",
"object": "collection0",
"arguments": {
"pipeline": [
{
"$project": {
"_id": 1
}
}
]
},
"expectResult": [
{
"_id": 1
}
]
},
{
"name": "find",
"object": "collection0",
"arguments": {
"filter": {
"_id": -1
}
},
"expectResult": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner",
"arguments": {
"client": "client0"
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"aggregate": "test",
"pipeline": [
{
"$project": {
"_id": 1
}
}
],
"lsid": {
"$$type": "object"
}
},
"commandName": "aggregate",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"aggregate": "test",
"pipeline": [
{
"$project": {
"_id": 1
}
}
],
"lsid": {
"$$type": "object"
}
},
"commandName": "aggregate",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"find": "test",
"filter": {
"_id": -1
},
"lsid": {
"$$type": "object"
}
},
"commandName": "find",
"databaseName": "session-tests"
}
}
]
}
],
"outcome": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1
}
]
}
]
},
{
"description": "Dirty implicit session is discarded (read not returning cursor)",
"operations": [
{
"name": "failPoint",
"object": "testRunner",
"arguments": {
"client": "client0",
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"aggregate"
],
"closeConnection": true
}
}
}
},
{
"name": "countDocuments",
"object": "collection0",
"arguments": {
"filter": {}
},
"expectResult": 1
},
{
"name": "find",
"object": "collection0",
"arguments": {
"filter": {
"_id": -1
}
},
"expectResult": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner",
"arguments": {
"client": "client0"
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"aggregate": "test",
"pipeline": [
{
"$match": {}
},
{
"$group": {
"_id": 1,
"n": {
"$sum": 1
}
}
}
],
"lsid": {
"$$type": "object"
}
},
"commandName": "aggregate",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"aggregate": "test",
"pipeline": [
{
"$match": {}
},
{
"$group": {
"_id": 1,
"n": {
"$sum": 1
}
}
}
],
"lsid": {
"$$type": "object"
}
},
"commandName": "aggregate",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"find": "test",
"filter": {
"_id": -1
},
"lsid": {
"$$type": "object"
}
},
"commandName": "find",
"databaseName": "session-tests"
}
}
]
}
],
"outcome": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1
}
]
}
]
}
]
}

View File

@ -0,0 +1,256 @@
{
"description": "driver-sessions-server-support",
"schemaVersion": "1.0",
"runOnRequirements": [
{
"minServerVersion": "3.6"
}
],
"createEntities": [
{
"client": {
"id": "client0",
"useMultipleMongoses": false,
"observeEvents": [
"commandStartedEvent"
]
}
},
{
"database": {
"id": "database0",
"client": "client0",
"databaseName": "session-tests"
}
},
{
"collection": {
"id": "collection0",
"database": "database0",
"collectionName": "test"
}
},
{
"session": {
"id": "session0",
"client": "client0"
}
}
],
"initialData": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1
}
]
}
],
"tests": [
{
"description": "Server supports explicit sessions",
"operations": [
{
"name": "assertSessionNotDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "insertOne",
"object": "collection0",
"arguments": {
"session": "session0",
"document": {
"_id": 2
}
},
"expectResult": {
"$$unsetOrMatches": {
"insertedId": {
"$$unsetOrMatches": 2
}
}
}
},
{
"name": "assertSessionNotDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "endSession",
"object": "session0"
},
{
"name": "find",
"object": "collection0",
"arguments": {
"filter": {
"_id": -1
}
},
"expectResult": []
},
{
"name": "assertSameLsidOnLastTwoCommands",
"object": "testRunner",
"arguments": {
"client": "client0"
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"lsid": {
"$$sessionLsid": "session0"
}
},
"commandName": "insert",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"find": "test",
"filter": {
"_id": -1
},
"lsid": {
"$$sessionLsid": "session0"
}
},
"commandName": "find",
"databaseName": "session-tests"
}
}
]
}
],
"outcome": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1
},
{
"_id": 2
}
]
}
]
},
{
"description": "Server supports implicit sessions",
"operations": [
{
"name": "insertOne",
"object": "collection0",
"arguments": {
"document": {
"_id": 2
}
},
"expectResult": {
"$$unsetOrMatches": {
"insertedId": {
"$$unsetOrMatches": 2
}
}
}
},
{
"name": "find",
"object": "collection0",
"arguments": {
"filter": {
"_id": -1
}
},
"expectResult": []
},
{
"name": "assertSameLsidOnLastTwoCommands",
"object": "testRunner",
"arguments": {
"client": "client0"
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"lsid": {
"$$type": "object"
}
},
"commandName": "insert",
"databaseName": "session-tests"
}
},
{
"commandStartedEvent": {
"command": {
"find": "test",
"filter": {
"_id": -1
},
"lsid": {
"$$type": "object"
}
},
"commandName": "find",
"databaseName": "session-tests"
}
}
]
}
],
"outcome": [
{
"collectionName": "test",
"databaseName": "session-tests",
"documents": [
{
"_id": 1
},
{
"_id": 2
}
]
}
]
}
]
}

View File

@ -1,671 +0,0 @@
{
"runOn": [
{
"minServerVersion": "4.0",
"topology": [
"replicaset"
]
},
{
"minServerVersion": "4.1.8",
"topology": [
"sharded"
]
}
],
"database_name": "session-tests",
"collection_name": "test",
"data": [
{
"_id": 1
}
],
"tests": [
{
"description": "Dirty explicit session is discarded",
"clientOptions": {
"retryWrites": true
},
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"insert"
],
"closeConnection": true
}
},
"operations": [
{
"name": "assertSessionNotDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "insertOne",
"object": "collection",
"arguments": {
"session": "session0",
"document": {
"_id": 2
}
},
"result": {
"insertedId": 2
}
},
{
"name": "assertSessionDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "insertOne",
"object": "collection",
"arguments": {
"session": "session0",
"document": {
"_id": 3
}
},
"result": {
"insertedId": 3
}
},
{
"name": "assertSessionDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "endSession",
"object": "session0"
},
{
"name": "find",
"object": "collection",
"arguments": {
"filter": {
"_id": -1
}
},
"result": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner"
}
],
"expectations": [
{
"command_started_event": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"lsid": "session0",
"txnNumber": {
"$numberLong": "1"
}
},
"command_name": "insert",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"lsid": "session0",
"txnNumber": {
"$numberLong": "1"
}
},
"command_name": "insert",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"insert": "test",
"documents": [
{
"_id": 3
}
],
"ordered": true,
"lsid": "session0",
"txnNumber": {
"$numberLong": "2"
}
},
"command_name": "insert",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"find": "test",
"filter": {
"_id": -1
}
},
"command_name": "find",
"database_name": "session-tests"
}
}
],
"outcome": {
"collection": {
"data": [
{
"_id": 1
},
{
"_id": 2
},
{
"_id": 3
}
]
}
}
},
{
"description": "Dirty explicit session is discarded (non-bulk write)",
"clientOptions": {
"retryWrites": true
},
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"findAndModify"
],
"closeConnection": true
}
},
"operations": [
{
"name": "assertSessionNotDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "findOneAndUpdate",
"object": "collection",
"arguments": {
"session": "session0",
"filter": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"returnDocument": "Before"
},
"result": {
"_id": 1
}
},
{
"name": "assertSessionDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "endSession",
"object": "session0"
},
{
"name": "find",
"object": "collection",
"arguments": {
"filter": {
"_id": -1
}
},
"result": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner"
}
],
"expectations": [
{
"command_started_event": {
"command": {
"findAndModify": "test",
"query": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"new": false,
"lsid": "session0",
"txnNumber": {
"$numberLong": "1"
},
"readConcern": null,
"writeConcern": null
},
"command_name": "findAndModify",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"findAndModify": "test",
"query": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"new": false,
"lsid": "session0",
"txnNumber": {
"$numberLong": "1"
},
"readConcern": null,
"writeConcern": null
},
"command_name": "findAndModify",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"find": "test",
"filter": {
"_id": -1
}
},
"command_name": "find",
"database_name": "session-tests"
}
}
],
"outcome": {
"collection": {
"data": [
{
"_id": 1,
"x": 1
}
]
}
}
},
{
"description": "Dirty implicit session is discarded (write)",
"clientOptions": {
"retryWrites": true
},
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"insert"
],
"closeConnection": true
}
},
"operations": [
{
"name": "insertOne",
"object": "collection",
"arguments": {
"document": {
"_id": 2
}
},
"result": {
"insertedId": 2
}
},
{
"name": "find",
"object": "collection",
"arguments": {
"filter": {
"_id": -1
}
},
"result": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner"
}
],
"expectations": [
{
"command_started_event": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"txnNumber": {
"$numberLong": "1"
}
},
"command_name": "insert",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"txnNumber": {
"$numberLong": "1"
}
},
"command_name": "insert",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"find": "test",
"filter": {
"_id": -1
}
},
"command_name": "find",
"database_name": "session-tests"
}
}
],
"outcome": {
"collection": {
"data": [
{
"_id": 1
},
{
"_id": 2
}
]
}
}
},
{
"description": "Dirty implicit session is discarded (non-bulk write)",
"clientOptions": {
"retryWrites": true
},
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"findAndModify"
],
"closeConnection": true
}
},
"operations": [
{
"name": "findOneAndUpdate",
"object": "collection",
"arguments": {
"filter": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"returnDocument": "Before"
},
"result": {
"_id": 1
}
},
{
"name": "find",
"object": "collection",
"arguments": {
"filter": {
"_id": -1
}
},
"result": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner"
}
],
"expectations": [
{
"command_started_event": {
"command": {
"findAndModify": "test",
"query": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"new": false,
"txnNumber": {
"$numberLong": "1"
},
"readConcern": null,
"writeConcern": null
},
"command_name": "findAndModify",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"findAndModify": "test",
"query": {
"_id": 1
},
"update": {
"$inc": {
"x": 1
}
},
"new": false,
"txnNumber": {
"$numberLong": "1"
},
"readConcern": null,
"writeConcern": null
},
"command_name": "findAndModify",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"find": "test",
"filter": {
"_id": -1
}
},
"command_name": "find",
"database_name": "session-tests"
}
}
],
"outcome": {
"collection": {
"data": [
{
"_id": 1,
"x": 1
}
]
}
}
},
{
"description": "Dirty implicit session is discarded (read)",
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 2
},
"data": {
"failCommands": [
"aggregate"
],
"closeConnection": true
}
},
"operations": [
{
"name": "aggregate",
"object": "collection",
"arguments": {
"pipeline": [
{
"$project": {
"_id": 1
}
}
]
},
"error": true
},
{
"name": "find",
"object": "collection",
"arguments": {
"filter": {
"_id": -1
}
},
"result": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner"
}
],
"outcome": {
"collection": {
"data": [
{
"_id": 1
}
]
}
}
},
{
"description": "Dirty implicit session is discarded (non-cursor returning read)",
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 2
},
"data": {
"failCommands": [
"aggregate"
],
"closeConnection": true
}
},
"operations": [
{
"name": "countDocuments",
"object": "collection",
"arguments": {
"filter": {}
},
"error": true
},
{
"name": "find",
"object": "collection",
"arguments": {
"filter": {
"_id": -1
}
},
"result": []
},
{
"name": "assertDifferentLsidOnLastTwoCommands",
"object": "testRunner"
}
],
"outcome": {
"collection": {
"data": [
{
"_id": 1
}
]
}
}
}
]
}

View File

@ -1,181 +0,0 @@
{
"runOn": [
{
"minServerVersion": "3.6.0"
}
],
"database_name": "session-tests",
"collection_name": "test",
"data": [
{
"_id": 1
}
],
"tests": [
{
"description": "Server supports explicit sessions",
"operations": [
{
"name": "assertSessionNotDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "insertOne",
"object": "collection",
"arguments": {
"session": "session0",
"document": {
"_id": 2
}
},
"result": {
"insertedId": 2
}
},
{
"name": "assertSessionNotDirty",
"object": "testRunner",
"arguments": {
"session": "session0"
}
},
{
"name": "endSession",
"object": "session0"
},
{
"name": "find",
"object": "collection",
"arguments": {
"filter": {
"_id": -1
}
},
"result": []
},
{
"name": "assertSameLsidOnLastTwoCommands",
"object": "testRunner"
}
],
"expectations": [
{
"command_started_event": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true,
"lsid": "session0"
},
"command_name": "insert",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"find": "test",
"filter": {
"_id": -1
},
"lsid": "session0"
},
"command_name": "find",
"database_name": "session-tests"
}
}
],
"outcome": {
"collection": {
"data": [
{
"_id": 1
},
{
"_id": 2
}
]
}
}
},
{
"description": "Server supports implicit sessions",
"operations": [
{
"name": "insertOne",
"object": "collection",
"arguments": {
"document": {
"_id": 2
}
},
"result": {
"insertedId": 2
}
},
{
"name": "find",
"object": "collection",
"arguments": {
"filter": {
"_id": -1
}
},
"result": []
},
{
"name": "assertSameLsidOnLastTwoCommands",
"object": "testRunner"
}
],
"expectations": [
{
"command_started_event": {
"command": {
"insert": "test",
"documents": [
{
"_id": 2
}
],
"ordered": true
},
"command_name": "insert",
"database_name": "session-tests"
}
},
{
"command_started_event": {
"command": {
"find": "test",
"filter": {
"_id": -1
}
},
"command_name": "find",
"database_name": "session-tests"
}
}
],
"outcome": {
"collection": {
"data": [
{
"_id": 1
},
{
"_id": 2
}
]
}
}
}
]
}

View File

@ -15,7 +15,6 @@
"""Test the client_session module."""
import copy
import os
import sys
import time
from io import BytesIO
@ -26,8 +25,7 @@ from pymongo.mongo_client import MongoClient
sys.path[0:0] = [""]
from test import IntegrationTest, SkipTest, client_context, unittest
from test.utils import EventListener, TestCreator, rs_or_single_client, wait_until
from test.utils_spec_runner import SpecRunner
from test.utils import EventListener, rs_or_single_client, wait_until
from bson import DBRef
from gridfs import GridFS, GridFSBucket
@ -1095,54 +1093,5 @@ class TestClusterTime(IntegrationTest):
)
class TestSpec(SpecRunner):
RUN_ON_SERVERLESS = True
# Location of JSON test specifications.
TEST_PATH = os.path.join(os.path.dirname(os.path.realpath(__file__)), "sessions", "legacy")
def last_two_command_events(self):
"""Return the last two command started events."""
started_events = self.listener.results["started"][-2:]
self.assertEqual(2, len(started_events))
return started_events
def assert_same_lsid_on_last_two_commands(self):
"""Run the assertSameLsidOnLastTwoCommands test operation."""
event1, event2 = self.last_two_command_events()
self.assertEqual(event1.command["lsid"], event2.command["lsid"])
def assert_different_lsid_on_last_two_commands(self):
"""Run the assertDifferentLsidOnLastTwoCommands test operation."""
event1, event2 = self.last_two_command_events()
self.assertNotEqual(event1.command["lsid"], event2.command["lsid"])
def assert_session_dirty(self, session):
"""Run the assertSessionDirty test operation.
Assert that the given session is dirty.
"""
self.assertIsNotNone(session._server_session)
self.assertTrue(session._server_session.dirty)
def assert_session_not_dirty(self, session):
"""Run the assertSessionNotDirty test operation.
Assert that the given session is not dirty.
"""
self.assertIsNotNone(session._server_session)
self.assertFalse(session._server_session.dirty)
def create_test(scenario_def, test, name):
@client_context.require_test_commands
def run_scenario(self):
self.run_scenario(scenario_def, test)
return run_scenario
test_creator = TestCreator(create_test, TestSpec, TestSpec.TEST_PATH)
test_creator.create_tests()
if __name__ == "__main__":
unittest.main()

View File

@ -23,7 +23,7 @@ from test import unittest
from test.unified_format import generate_test_classes
# Location of JSON test specifications.
TEST_PATH = os.path.join(os.path.dirname(os.path.realpath(__file__)), "sessions", "unified")
TEST_PATH = os.path.join(os.path.dirname(os.path.realpath(__file__)), "sessions")
# Generate unified tests.
globals().update(generate_test_classes(TEST_PATH, module=__name__))