Skip to content

Commit

Permalink
DRIVERS-1385: Test top-level errorLabel with writeConcernError (#1042)
Browse files Browse the repository at this point in the history
Add unified tests that add RetryableWriteError as a top-level
errorLabel of a writeConcernError, as is done by actual
MongoDB server.
  • Loading branch information
jyemin committed Jul 26, 2021
1 parent a73bf05 commit ab48c57
Show file tree
Hide file tree
Showing 63 changed files with 559 additions and 2 deletions.
9 changes: 7 additions & 2 deletions source/retryable-writes/tests/README.rst
Expand Up @@ -9,8 +9,13 @@ Retryable Write Tests
Introduction
============

The YAML and JSON files in this directory tree are platform-independent tests
that drivers can use to prove their conformance to the Retryable Writes spec.
Tests in this directory are platform-independent tests that drivers can use to
prove their conformance to the Retryable Writes specification.

Tests in the ``unified`` directory are implemented in the
`Unified Test Format <../../unified-test-format/unified-test-format.rst>`__.

Tests in the ``legacy`` directory should be executed as described below.

Several prose tests, which are not easily expressed in YAML, are also presented
in this file. Those tests will need to be manually implemented by each driver.
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
205 changes: 205 additions & 0 deletions source/retryable-writes/tests/unified/bulkWrite-serverErrors.json
@@ -0,0 +1,205 @@
{
"description": "retryable-writes bulkWrite serverErrors",
"schemaVersion": "1.0",
"runOnRequirements": [
{
"minServerVersion": "3.6",
"topologies": [
"replicaset"
]
}
],
"createEntities": [
{
"client": {
"id": "client0",
"useMultipleMongoses": false,
"observeEvents": [
"commandStartedEvent"
]
}
},
{
"database": {
"id": "database0",
"client": "client0",
"databaseName": "retryable-writes-tests"
}
},
{
"collection": {
"id": "collection0",
"database": "database0",
"collectionName": "coll"
}
}
],
"initialData": [
{
"collectionName": "coll",
"databaseName": "retryable-writes-tests",
"documents": [
{
"_id": 1,
"x": 11
},
{
"_id": 2,
"x": 22
}
]
}
],
"tests": [
{
"description": "BulkWrite succeeds after retryable writeConcernError in first batch",
"runOnRequirements": [
{
"minServerVersion": "4.0",
"topologies": [
"replicaset"
]
},
{
"minServerVersion": "4.1.7",
"topologies": [
"sharded-replicaset"
]
}
],
"operations": [
{
"name": "failPoint",
"object": "testRunner",
"arguments": {
"client": "client0",
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
"times": 1
},
"data": {
"failCommands": [
"insert"
],
"errorLabels": [
"RetryableWriteError"
],
"writeConcernError": {
"code": 91,
"errmsg": "Replication is being shut down"
}
}
}
}
},
{
"name": "bulkWrite",
"object": "collection0",
"arguments": {
"requests": [
{
"insertOne": {
"document": {
"_id": 3,
"x": 33
}
}
},
{
"deleteOne": {
"filter": {
"_id": 2
}
}
}
]
},
"expectResult": {
"deletedCount": 1,
"insertedCount": 1,
"matchedCount": 0,
"modifiedCount": 0,
"upsertedCount": 0,
"insertedIds": {
"$$unsetOrMatches": {
"0": 3
}
},
"upsertedIds": {}
}
}
],
"expectEvents": [
{
"client": "client0",
"events": [
{
"commandStartedEvent": {
"command": {
"insert": "coll",
"documents": [
{
"_id": 3,
"x": 33
}
]
},
"commandName": "insert",
"databaseName": "retryable-writes-tests"
}
},
{
"commandStartedEvent": {
"command": {
"insert": "coll",
"documents": [
{
"_id": 3,
"x": 33
}
]
},
"commandName": "insert",
"databaseName": "retryable-writes-tests"
}
},
{
"commandStartedEvent": {
"command": {
"delete": "coll",
"deletes": [
{
"q": {
"_id": 2
},
"limit": 1
}
]
},
"commandName": "delete",
"databaseName": "retryable-writes-tests"
}
}
]
}
],
"outcome": [
{
"collectionName": "coll",
"databaseName": "retryable-writes-tests",
"documents": [
{
"_id": 1,
"x": 11
},
{
"_id": 3,
"x": 33
}
]
}
]
}
]
}
96 changes: 96 additions & 0 deletions source/retryable-writes/tests/unified/bulkWrite-serverErrors.yml
@@ -0,0 +1,96 @@
description: "retryable-writes bulkWrite serverErrors"

schemaVersion: "1.0"

runOnRequirements:
- minServerVersion: "3.6"
topologies: [ replicaset ]

createEntities:
- client:
id: &client0 client0
useMultipleMongoses: false
observeEvents: [ commandStartedEvent ]
- database:
id: &database0 database0
client: *client0
databaseName: &databaseName retryable-writes-tests
- collection:
id: &collection0 collection0
database: *database0
collectionName: &collectionName coll

initialData:
- collectionName: *collectionName
databaseName: *databaseName
documents:
- { _id: 1, x: 11 }
- { _id: 2, x: 22 }

tests:
- description: "BulkWrite succeeds after retryable writeConcernError in first batch"
runOnRequirements:
- minServerVersion: "4.0"
topologies: [ replicaset ]
- minServerVersion: "4.1.7"
topologies: [ sharded-replicaset ]
operations:
- name: failPoint
object: testRunner
arguments:
client: *client0
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: [ insert ]
errorLabels: [RetryableWriteError] # top-level error labels
writeConcernError:
code: 91 # ShutdownInProgress
errmsg: "Replication is being shut down"
- name: bulkWrite
object: *collection0
arguments:
requests:
- insertOne:
document: { _id: 3, x: 33 }
- deleteOne:
filter: { _id: 2 }
expectResult:
deletedCount: 1
insertedCount: 1
matchedCount: 0
modifiedCount: 0
upsertedCount: 0
insertedIds: { $$unsetOrMatches: { 0: 3 } }
upsertedIds: { }
expectEvents:
- client: *client0
events:
- commandStartedEvent:
command:
insert: *collectionName
documents: [{ _id: 3, x: 33 }]
commandName: insert
databaseName: *databaseName
- commandStartedEvent:
command:
insert: *collectionName
documents: [{ _id: 3, x: 33 }]
commandName: insert
databaseName: *databaseName
- commandStartedEvent:
command:
delete: *collectionName
deletes:
-
q: { _id: 2 }
limit: 1
commandName: delete
databaseName: *databaseName
outcome:
- collectionName: *collectionName
databaseName: *databaseName
documents:
- { _id: 1, x: 11 }
- { _id: 3, x: 33 } # The write was still applied

0 comments on commit ab48c57

Please sign in to comment.