1runOn:
2    -
3        minServerVersion: "4.0"
4        topology: ["replicaset"]
5    -
6        minServerVersion: "4.1.8"
7        topology: ["sharded"]
8
9database_name: &database_name "transaction-tests"
10collection_name: &collection_name "test"
11
12data:
13  - _id: 1
14  - _id: 2
15  - _id: 3
16
17tests:
18  - description: findOneAndUpdate
19
20    operations:
21      - name: startTransaction
22        object: session0
23      - name: findOneAndUpdate
24        object: collection
25        arguments:
26          session: session0
27          filter: {_id: 3}
28          update:
29            $inc: {x: 1}
30          returnDocument: Before
31        result: {_id: 3}
32      - name: findOneAndUpdate
33        object: collection
34        arguments:
35          session: session0
36          filter: {_id: 4}
37          update:
38            $inc: {x: 1}
39          upsert: true
40          returnDocument: After
41        result: {_id: 4, x: 1}
42      - name: commitTransaction
43        object: session0
44      - name: startTransaction
45        object: session0
46      # Test a second time to ensure txnNumber is incremented.
47      - name: findOneAndUpdate
48        object: collection
49        arguments:
50          session: session0
51          filter: {_id: 3}
52          update:
53            $inc: {x: 1}
54          returnDocument: Before
55        result: {_id: 3, x: 1}
56      - name: commitTransaction
57        object: session0
58      # Test a third time to ensure abort works.
59      - name: startTransaction
60        object: session0
61      - name: findOneAndUpdate
62        object: collection
63        arguments:
64          session: session0
65          filter: {_id: 3}
66          update:
67            $inc: {x: 1}
68          returnDocument: Before
69        result: {_id: 3, x: 2}
70      - name: abortTransaction
71        object: session0
72
73    expectations:
74      - command_started_event:
75          command:
76            findAndModify: *collection_name
77            query: {_id: 3}
78            update: {$inc: {x: 1}}
79            new: false
80            lsid: session0
81            txnNumber:
82              $numberLong: "1"
83            startTransaction: true
84            autocommit: false
85            readConcern:
86            writeConcern:
87          command_name: findAndModify
88          database_name: *database_name
89      - command_started_event:
90          command:
91            findAndModify: *collection_name
92            query: {_id: 4}
93            update: {$inc: {x: 1}}
94            new: true
95            upsert: true
96            lsid: session0
97            txnNumber:
98              $numberLong: "1"
99            startTransaction:
100            autocommit: false
101            readConcern:
102            writeConcern:
103          command_name: findAndModify
104          database_name: *database_name
105      - command_started_event:
106          command:
107            commitTransaction: 1
108            lsid: session0
109            txnNumber:
110              $numberLong: "1"
111            startTransaction:
112            autocommit: false
113            readConcern:
114            writeConcern:
115          command_name: commitTransaction
116          database_name: admin
117      - command_started_event:
118          command:
119            findAndModify: *collection_name
120            query: {_id: 3}
121            update: {$inc: {x: 1}}
122            new: false
123            lsid: session0
124            txnNumber:
125              $numberLong: "2"
126            startTransaction: true
127            autocommit: false
128            readConcern:
129              afterClusterTime: 42
130            writeConcern:
131          command_name: findAndModify
132          database_name: *database_name
133      - command_started_event:
134          command:
135            commitTransaction: 1
136            lsid: session0
137            txnNumber:
138              $numberLong: "2"
139            startTransaction:
140            autocommit: false
141            readConcern:
142            writeConcern:
143          command_name: commitTransaction
144          database_name: admin
145      - command_started_event:
146          command:
147            findAndModify: *collection_name
148            query: {_id: 3}
149            update: {$inc: {x: 1}}
150            new: false
151            lsid: session0
152            txnNumber:
153              $numberLong: "3"
154            startTransaction: true
155            autocommit: false
156            readConcern:
157              afterClusterTime: 42
158            writeConcern:
159          command_name: findAndModify
160          database_name: *database_name
161      - command_started_event:
162          command:
163            abortTransaction: 1
164            lsid: session0
165            txnNumber:
166              $numberLong: "3"
167            startTransaction:
168            autocommit: false
169            readConcern:
170            writeConcern:
171          command_name: abortTransaction
172          database_name: admin
173
174    outcome:
175      collection:
176        data:
177          - {_id: 1}
178          - {_id: 2}
179          - {_id: 3, x: 2}
180          - {_id: 4, x: 1}
181
182  - description: collection writeConcern ignored for findOneAndUpdate
183
184    operations:
185      - name: startTransaction
186        object: session0
187        arguments:
188          options:
189            writeConcern:
190              w: majority
191      - name: findOneAndUpdate
192        object: collection
193        collectionOptions:
194          writeConcern:
195            w: majority
196        arguments:
197          session: session0
198          filter: {_id: 3}
199          update:
200            $inc: {x: 1}
201          returnDocument: Before
202        result: {_id: 3}
203      - name: commitTransaction
204        object: session0
205
206    expectations:
207      - command_started_event:
208          command:
209            findAndModify: *collection_name
210            query: {_id: 3}
211            update:
212              $inc: {x: 1}
213            new: false
214            lsid: session0
215            txnNumber:
216              $numberLong: "1"
217            startTransaction: true
218            autocommit: false
219            readConcern:
220            writeConcern:
221          command_name: findAndModify
222          database_name: *database_name
223      - command_started_event:
224          command:
225            commitTransaction: 1
226            lsid: session0
227            txnNumber:
228              $numberLong: "1"
229            startTransaction:
230            autocommit: false
231            readConcern:
232            writeConcern:
233              w: majority
234          command_name: commitTransaction
235          database_name: admin
236
237