runOn:
    -
        minServerVersion: "4.0"
        topology: ["single", "replicaset"]
    -
        minServerVersion: "4.1.7"
        topology: ["sharded", "load-balanced"]

database_name: &database_name "retryable-reads-tests"
collection_name: &collection_name "coll"

data:
    - {_id: 1, x: 0}
    - {_id: 2, x: 1}
    - {_id: 3, x: 2}

tests:
    -
        description: "MapReduce succeeds with retry on"
        operations:
            - &operation_succeeds
                <<: &operation
                    name: mapReduce
                    object: collection
                    arguments:
                        map: { $code: "function inc() { return emit(0, this.x + 1) }" }
                        reduce: { $code:  "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }
                        out: { inline: 1 }
                result: [ {  "_id" : 0, "value" : 6 } ]
        expectations:
            - &command_started_event
                command_started_event:
                    command:
                        mapReduce: *collection_name
                        map: { $code: "function inc() { return emit(0, this.x + 1) }" }
                        reduce: { $code:  "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }
                        out: { inline: 1 }
                    database_name: *database_name
    -
        description: "MapReduce fails with retry on"
        failPoint: &failCommand_failPoint
            configureFailPoint: failCommand
            mode: { times: 1 }
            data:
                failCommands: [mapReduce]
                closeConnection: true
        operations:
            - &operation_fails
                <<: *operation
                error: true
        expectations:
             - *command_started_event
    -
        description: "MapReduce fails with retry off"
        clientOptions:
            retryReads: false
        failPoint: *failCommand_failPoint
        operations: [*operation_fails]
        expectations:
             - *command_started_event
