Skip to content

Commit 10a5c5a

Browse files
authored
test(NODE-5938): sync retryable writes spec tests (mongodb#3996)
1 parent 55203ef commit 10a5c5a

File tree

7 files changed

+93
-84
lines changed

7 files changed

+93
-84
lines changed

test/spec/retryable-writes/unified/bulkWrite-serverErrors.json

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@
33
"schemaVersion": "1.0",
44
"runOnRequirements": [
55
{
6-
"minServerVersion": "3.6",
6+
"minServerVersion": "4.0",
77
"topologies": [
88
"replicaset"
99
]
10+
},
11+
{
12+
"minServerVersion": "4.1.7",
13+
"topologies": [
14+
"sharded"
15+
]
1016
}
1117
],
1218
"createEntities": [
@@ -55,16 +61,7 @@
5561
"description": "BulkWrite succeeds after retryable writeConcernError in first batch",
5662
"runOnRequirements": [
5763
{
58-
"minServerVersion": "4.0",
59-
"topologies": [
60-
"replicaset"
61-
]
62-
},
63-
{
64-
"minServerVersion": "4.1.7",
65-
"topologies": [
66-
"sharded-replicaset"
67-
]
64+
"minServerVersion": "4.3.1"
6865
}
6966
],
7067
"operations": [

test/spec/retryable-writes/unified/bulkWrite-serverErrors.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ description: "retryable-writes bulkWrite serverErrors"
33
schemaVersion: "1.0"
44

55
runOnRequirements:
6-
- minServerVersion: "3.6"
6+
- minServerVersion: "4.0"
77
topologies: [ replicaset ]
8+
- minServerVersion: "4.1.7"
9+
topologies: [ sharded ]
810

911
createEntities:
1012
- client:
@@ -30,10 +32,7 @@ initialData:
3032
tests:
3133
- description: "BulkWrite succeeds after retryable writeConcernError in first batch"
3234
runOnRequirements:
33-
- minServerVersion: "4.0"
34-
topologies: [ replicaset ]
35-
- minServerVersion: "4.1.7"
36-
topologies: [ sharded-replicaset ]
35+
- minServerVersion: "4.3.1" # failCommand errorLabels option
3736
operations:
3837
- name: failPoint
3938
object: testRunner

test/spec/retryable-writes/unified/insertOne-serverErrors.json

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@
33
"schemaVersion": "1.0",
44
"runOnRequirements": [
55
{
6-
"minServerVersion": "3.6",
6+
"minServerVersion": "4.0",
77
"topologies": [
88
"replicaset"
99
]
10+
},
11+
{
12+
"minServerVersion": "4.1.7",
13+
"topologies": [
14+
"sharded"
15+
]
1016
}
1117
],
1218
"createEntities": [
@@ -55,16 +61,7 @@
5561
"description": "InsertOne succeeds after retryable writeConcernError",
5662
"runOnRequirements": [
5763
{
58-
"minServerVersion": "4.0",
59-
"topologies": [
60-
"replicaset"
61-
]
62-
},
63-
{
64-
"minServerVersion": "4.1.7",
65-
"topologies": [
66-
"sharded-replicaset"
67-
]
64+
"minServerVersion": "4.3.1"
6865
}
6966
],
7067
"operations": [

test/spec/retryable-writes/unified/insertOne-serverErrors.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ description: "retryable-writes insertOne serverErrors"
33
schemaVersion: "1.0"
44

55
runOnRequirements:
6-
- minServerVersion: "3.6"
6+
- minServerVersion: "4.0"
77
topologies: [ replicaset ]
8+
- minServerVersion: "4.1.7"
9+
topologies: [ sharded ]
810

911
createEntities:
1012
- client:
@@ -30,10 +32,7 @@ initialData:
3032
tests:
3133
- description: "InsertOne succeeds after retryable writeConcernError"
3234
runOnRequirements:
33-
- minServerVersion: "4.0"
34-
topologies: [ replicaset ]
35-
- minServerVersion: "4.1.7"
36-
topologies: [ sharded-replicaset ]
35+
- minServerVersion: "4.3.1" # failCommand errorLabels option
3736
operations:
3837
- name: failPoint
3938
object: testRunner

test/spec/unified-test-format/valid-pass/poc-retryable-writes.json

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
{
22
"description": "poc-retryable-writes",
33
"schemaVersion": "1.0",
4-
"runOnRequirements": [
5-
{
6-
"minServerVersion": "3.6",
7-
"topologies": [
8-
"replicaset"
9-
]
10-
}
11-
],
124
"createEntities": [
135
{
146
"client": {
@@ -79,6 +71,14 @@
7971
"tests": [
8072
{
8173
"description": "FindOneAndUpdate is committed on first attempt",
74+
"runOnRequirements": [
75+
{
76+
"minServerVersion": "3.6",
77+
"topologies": [
78+
"replicaset"
79+
]
80+
}
81+
],
8282
"operations": [
8383
{
8484
"name": "failPoint",
@@ -132,6 +132,14 @@
132132
},
133133
{
134134
"description": "FindOneAndUpdate is not committed on first attempt",
135+
"runOnRequirements": [
136+
{
137+
"minServerVersion": "3.6",
138+
"topologies": [
139+
"replicaset"
140+
]
141+
}
142+
],
135143
"operations": [
136144
{
137145
"name": "failPoint",
@@ -188,6 +196,14 @@
188196
},
189197
{
190198
"description": "FindOneAndUpdate is never committed",
199+
"runOnRequirements": [
200+
{
201+
"minServerVersion": "3.6",
202+
"topologies": [
203+
"replicaset"
204+
]
205+
}
206+
],
191207
"operations": [
192208
{
193209
"name": "failPoint",
@@ -245,15 +261,10 @@
245261
"description": "InsertMany succeeds after PrimarySteppedDown",
246262
"runOnRequirements": [
247263
{
248-
"minServerVersion": "4.0",
249-
"topologies": [
250-
"replicaset"
251-
]
252-
},
253-
{
254-
"minServerVersion": "4.1.7",
264+
"minServerVersion": "4.3.1",
255265
"topologies": [
256-
"sharded-replicaset"
266+
"replicaset",
267+
"sharded"
257268
]
258269
}
259270
],
@@ -345,7 +356,7 @@
345356
{
346357
"minServerVersion": "4.1.7",
347358
"topologies": [
348-
"sharded-replicaset"
359+
"sharded"
349360
]
350361
}
351362
],
@@ -406,15 +417,10 @@
406417
"description": "InsertOne fails after multiple retryable writeConcernErrors",
407418
"runOnRequirements": [
408419
{
409-
"minServerVersion": "4.0",
410-
"topologies": [
411-
"replicaset"
412-
]
413-
},
414-
{
415-
"minServerVersion": "4.1.7",
420+
"minServerVersion": "4.3.1",
416421
"topologies": [
417-
"sharded-replicaset"
422+
"replicaset",
423+
"sharded"
418424
]
419425
}
420426
],
@@ -433,6 +439,9 @@
433439
"failCommands": [
434440
"insert"
435441
],
442+
"errorLabels": [
443+
"RetryableWriteError"
444+
],
436445
"writeConcernError": {
437446
"code": 91,
438447
"errmsg": "Replication is being shut down"

test/spec/unified-test-format/valid-pass/poc-retryable-writes.yml

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@ description: "poc-retryable-writes"
22

33
schemaVersion: "1.0"
44

5-
runOnRequirements:
6-
- minServerVersion: "3.6"
7-
topologies: [ replicaset ]
8-
95
createEntities:
106
- client:
117
id: &client0 client0
@@ -42,6 +38,9 @@ initialData:
4238

4339
tests:
4440
- description: "FindOneAndUpdate is committed on first attempt"
41+
runOnRequirements: &onPrimaryTransactionalWrite_requirements
42+
- minServerVersion: "3.6"
43+
topologies: [ replicaset ]
4544
operations:
4645
- name: failPoint
4746
object: testRunner
@@ -65,6 +64,7 @@ tests:
6564
- { _id: 2, x: 22 }
6665

6766
- description: "FindOneAndUpdate is not committed on first attempt"
67+
runOnRequirements: *onPrimaryTransactionalWrite_requirements
6868
operations:
6969
- name: failPoint
7070
object: testRunner
@@ -89,6 +89,7 @@ tests:
8989
- { _id: 2, x: 22 }
9090

9191
- description: "FindOneAndUpdate is never committed"
92+
runOnRequirements: *onPrimaryTransactionalWrite_requirements
9293
operations:
9394
- name: failPoint
9495
object: testRunner
@@ -113,13 +114,9 @@ tests:
113114
- { _id: 2, x: 22 }
114115

115116
- description: "InsertMany succeeds after PrimarySteppedDown"
116-
runOnRequirements: &failCommand_requirements
117-
- minServerVersion: "4.0"
118-
topologies: [ replicaset ]
119-
- minServerVersion: "4.1.7"
120-
# Original test uses "sharded", but retryable writes requires a sharded
121-
# cluster backed by replica sets
122-
topologies: [ sharded-replicaset ]
117+
runOnRequirements:
118+
- minServerVersion: "4.3.1" # failCommand errorLabels option
119+
topologies: [ replicaset, sharded ]
123120
operations:
124121
- name: failPoint
125122
object: testRunner
@@ -131,7 +128,7 @@ tests:
131128
data:
132129
failCommands: [ insert ]
133130
errorCode: 189 # PrimarySteppedDown
134-
errorLabels: [ RetryableWriteError ]
131+
errorLabels: [ RetryableWriteError ]
135132
- name: insertMany
136133
object: *collection0
137134
arguments:
@@ -153,7 +150,11 @@ tests:
153150
- { _id: 4, x: 44 }
154151

155152
- description: "InsertOne fails after connection failure when retryWrites option is false"
156-
runOnRequirements: *failCommand_requirements
153+
runOnRequirements: # failCommand
154+
- minServerVersion: "4.0"
155+
topologies: [ replicaset ]
156+
- minServerVersion: "4.1.7"
157+
topologies: [ sharded ]
157158
operations:
158159
- name: failPoint
159160
object: testRunner
@@ -181,7 +182,9 @@ tests:
181182
- { _id: 2, x: 22 }
182183

183184
- description: "InsertOne fails after multiple retryable writeConcernErrors"
184-
runOnRequirements: *failCommand_requirements
185+
runOnRequirements:
186+
- minServerVersion: "4.3.1" # failCommand errorLabels option
187+
topologies: [ replicaset, sharded ]
185188
operations:
186189
- name: failPoint
187190
object: testRunner
@@ -192,6 +195,7 @@ tests:
192195
mode: { times: 2 }
193196
data:
194197
failCommands: [ insert ]
198+
errorLabels: [ RetryableWriteError ]
195199
writeConcernError:
196200
code: 91 # ShutdownInProgress
197201
errmsg: "Replication is being shut down"

test/tools/unified-spec-runner/unified-utils.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,6 @@ export async function topologySatisfies(
4141

4242
let skipReason;
4343

44-
if (r.minServerVersion) {
45-
const minVersion = patchVersion(r.minServerVersion);
46-
ok &&= semverGte(config.version, minVersion);
47-
if (!ok && skipReason == null) {
48-
skipReason = `requires mongodb version greater than ${minVersion}`;
49-
}
50-
}
51-
if (r.maxServerVersion) {
52-
const maxVersion = patchVersion(r.maxServerVersion);
53-
ok &&= semverLte(config.version, maxVersion);
54-
if (!ok && skipReason == null) skipReason = `requires mongodb version less than ${maxVersion}`;
55-
}
56-
5744
if (r.topologies) {
5845
const topologyType = {
5946
Single: 'single',
@@ -82,6 +69,19 @@ export async function topologySatisfies(
8269
}
8370
}
8471

72+
if (r.minServerVersion) {
73+
const minVersion = patchVersion(r.minServerVersion);
74+
ok &&= semverGte(config.version, minVersion);
75+
if (!ok && skipReason == null) {
76+
skipReason = `requires mongodb version greater than ${minVersion}`;
77+
}
78+
}
79+
if (r.maxServerVersion) {
80+
const maxVersion = patchVersion(r.maxServerVersion);
81+
ok &&= semverLte(config.version, maxVersion);
82+
if (!ok && skipReason == null) skipReason = `requires mongodb version less than ${maxVersion}`;
83+
}
84+
8585
if (r.serverParameters) {
8686
if (!config.parameters) throw new Error('Configuration does not have server parameters');
8787
for (const [name, value] of Object.entries(r.serverParameters)) {
@@ -146,12 +146,16 @@ export async function topologySatisfies(
146146
}
147147

148148
export async function isAnyRequirementSatisfied(ctx, requirements, client) {
149+
const skipTarget = ctx.currentTest || ctx.test;
150+
const skipReasons = [];
149151
for (const requirement of requirements) {
150152
const met = await topologySatisfies(ctx, requirement, client);
151153
if (met) {
152154
return true;
153155
}
156+
skipReasons.push(skipTarget.skipReason);
154157
}
158+
skipTarget.skipReason = skipReasons.join(' OR ');
155159
return false;
156160
}
157161

0 commit comments

Comments
 (0)