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

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

data: []

tests:
  -
    # Session state will be ABORTED when callback returns to withTransaction
    description: withTransaction succeeds if callback aborts
    useMultipleMongoses: true
    operations:
      -
        name: withTransaction
        object: session0
        arguments:
          callback:
            operations:
              -
                name: insertOne
                object: collection
                arguments:
                  session: session0
                  document: { _id: 1 }
                result:
                  insertedId: 1
              -
                name: abortTransaction
                object: session0
    expectations:
      -
        command_started_event:
          command:
            insert: *collection_name
            documents:
              - { _id: 1 }
            ordered: true
            lsid: session0
            txnNumber: { $numberLong: "1" }
            startTransaction: true
            autocommit: false
            # omitted fields
            readConcern: ~
            writeConcern: ~
          command_name: insert
          database_name: *database_name
      -
        command_started_event:
          command:
            abortTransaction: 1
            lsid: session0
            txnNumber: { $numberLong: "1" }
            autocommit: false
            # omitted fields
            readConcern: ~
            startTransaction: ~
            writeConcern: ~
          command_name: abortTransaction
          database_name: admin
    outcome:
      collection:
        data: []
  -
    # Session state will be ABORTED when callback returns to withTransaction
    description: withTransaction succeeds if callback aborts with no ops
    useMultipleMongoses: true
    operations:
      -
        name: withTransaction
        object: session0
        arguments:
          callback:
            operations:
              -
                name: abortTransaction
                object: session0
    expectations: []
    outcome:
      collection:
        data: []
  -
    # Session state will be NO_TXN when callback returns to withTransaction
    description: withTransaction still succeeds if callback aborts and runs extra op
    useMultipleMongoses: true
    operations:
      -
        name: withTransaction
        object: session0
        arguments:
          callback:
            operations:
              -
                name: insertOne
                object: collection
                arguments:
                  session: session0
                  document: { _id: 1 }
                result:
                  insertedId: 1
              -
                name: abortTransaction
                object: session0
              -
                name: insertOne
                object: collection
                arguments:
                  session: session0
                  document: { _id: 2 }
                result:
                  insertedId: 2
    expectations:
      -
        command_started_event:
          command:
            insert: *collection_name
            documents:
              - { _id: 1 }
            ordered: true
            lsid: session0
            txnNumber: { $numberLong: "1" }
            startTransaction: true
            autocommit: false
            # omitted fields
            readConcern: ~
            writeConcern: ~
          command_name: insert
          database_name: *database_name
      -
        command_started_event:
          command:
            abortTransaction: 1
            lsid: session0
            txnNumber: { $numberLong: "1" }
            autocommit: false
            # omitted fields
            readConcern: ~
            startTransaction: ~
            writeConcern: ~
          command_name: abortTransaction
          database_name: admin
      -
        command_started_event:
          command:
            # This test is agnostic about retryWrites, so we do not assert the
            # txnNumber.  If retryWrites=true, the txnNumber will be incremented
            # from the value used in the previous transaction; otherwise, the
            # field will not be present at all. 
            insert: *collection_name
            documents:
              - { _id: 2 }
            ordered: true
            lsid: session0
            # omitted fields
            autocommit: ~
            readConcern: ~
            startTransaction: ~
            writeConcern: ~
          command_name: insert
          database_name: *database_name
    outcome:
      collection:
        data:
          - { _id: 2 }
