runOn:
    -
        minServerVersion: "4.0"
        topology: ["replicaset"]
    -
        minServerVersion: "4.1.8"
        topology: ["sharded"]

database_name: &database_name "transaction-tests"
collection_name: &collection_name "test"

data:
  - _id: 1
    count: 0

tests:
  - description: causal consistency
    clientOptions:
      retryWrites: false
    operations:
      # Update a document without a transaction.
      - &updateOne
        name: updateOne
        object: collection
        arguments:
          session: session0
          filter: {_id: 1}
          update:
            $inc: {count: 1}
        result:
          matchedCount: 1
          modifiedCount: 1
          upsertedCount: 0
      # Updating the same document inside a transaction.
      # Casual consistency ensures that the transaction snapshot is causally
      # after the first updateOne.
      - name: startTransaction
        object: session0
      - *updateOne
      - name: commitTransaction
        object: session0

    expectations:
      - command_started_event:
          command:
            update: *collection_name
            updates:
              - q: {_id: 1}
                u: {$inc: {count: 1}}
            ordered: true
            lsid: session0
            readConcern:
            txnNumber:
            startTransaction:
            autocommit:
            writeConcern:
          command_name: update
          database_name: *database_name
      - command_started_event:
          command:
            update: *collection_name
            updates:
              - q: {_id: 1}
                u: {$inc: {count: 1}}
            ordered: true
            readConcern:
              afterClusterTime: 42
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction: true
            autocommit: false
            writeConcern:
          command_name: update
          database_name: *database_name
      - command_started_event:
          command:
            commitTransaction: 1
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction:
            autocommit: false
            writeConcern:
          command_name: commitTransaction
          database_name: admin

    outcome:
      collection:
        data:
          - _id: 1
            count: 2

  - description: causal consistency disabled
    clientOptions:
      retryWrites: false
    sessionOptions:
      session0:
        causalConsistency: false

    operations:
      # Insert a document without a transaction.
      - name: insertOne
        object: collection
        arguments:
          session: session0
          document:
            _id: 2
        result:
          insertedId: 2
      - name: startTransaction
        object: session0
      - name: updateOne
        object: collection
        arguments:
          session: session0
          filter: {_id: 1}
          update:
            $inc: {count: 1}
        result:
          matchedCount: 1
          modifiedCount: 1
          upsertedCount: 0
      - name: commitTransaction
        object: session0

    expectations:
      - command_started_event:
          command:
            insert: *collection_name
            documents:
              - _id: 2
            ordered: true
            readConcern:
            lsid: session0
            txnNumber:
            autocommit:
            writeConcern:
          command_name: insert
          database_name: *database_name
      - command_started_event:
          command:
            update: *collection_name
            updates:
              - q: {_id: 1}
                u: {$inc: {count: 1}}
            ordered: true
            # No afterClusterTime
            readConcern:
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction: true
            autocommit: false
            writeConcern:
          command_name: update
          database_name: *database_name
      - command_started_event:
          command:
            commitTransaction: 1
            lsid: session0
            txnNumber:
              $numberLong: "1"
            startTransaction:
            autocommit: false
            writeConcern:
          command_name: commitTransaction
          database_name: admin

    outcome:
      collection:
        data:
          - _id: 1
            count: 1
          - _id: 2