description: "Parse logicalSessionTimeoutMinutes from replica set"

uri: "mongodb://a/?replicaSet=rs"

phases: [
    # An RSPrimary responds with a non-null logicalSessionTimeoutMinutes
    {
        responses: [
             ["a:27017", {
                ok: 1,
                helloOk: true,
                isWritablePrimary: true,
                hosts: ["a:27017", "b:27017", "c:27017", "d:27017", "e:27017"],
                setName: "rs",
                logicalSessionTimeoutMinutes: 3,
                minWireVersion: 0,
                maxWireVersion: 6
            }],
        ],
        outcome: {
            servers: {
                "a:27017": {
                    type: "RSPrimary",
                    setName: "rs"
                },
                "b:27017": {
                    type: "Unknown",
                },
                "c:27017": {
                    type: "Unknown",
                },
                "d:27017": {
                    type: "Unknown",
                },
                "e:27017": {
                    type: "Unknown",
                }

            },
            topologyType: "ReplicaSetWithPrimary",
            logicalSessionTimeoutMinutes: 3,
            setName: "rs",
        }
    },
    # An RSGhost responds without a logicalSessionTimeoutMinutes
    {
        responses: [
            ["d:27017", {
                ok: 1,
                helloOk: true,
                isWritablePrimary: false,
                isreplicaset: true,
                minWireVersion: 0,
                maxWireVersion: 6
            }],
        ],
        outcome: {
            servers: {
                "a:27017": {
                    type: "RSPrimary",
                    setName: "rs"
                },
                "b:27017": {
                    type: "Unknown",
                },
                "c:27017": {
                    type: "Unknown",
                },
                "d:27017": {
                    type: "RSGhost",
                },
                "e:27017": {
                    type: "Unknown",
                }

            },
            topologyType: "ReplicaSetWithPrimary",
            logicalSessionTimeoutMinutes: 3,
            setName: "rs",
        }
    },
    # An RSArbiter responds without a logicalSessionTimeoutMinutes
    {
        responses: [
           ["e:27017", {
                ok: 1,
                helloOk: true,
                isWritablePrimary: false,
                hosts: ["a:27017", "b:27017", "c:27017", "d:27017", "e:27017"],
                setName: "rs",
                arbiterOnly: true,
                minWireVersion: 0,
                maxWireVersion: 6
            }]
        ],
        outcome: {
            servers: {
                "a:27017": {
                    type: "RSPrimary",
                    setName: "rs"
                },
                "b:27017": {
                    type: "Unknown",
                },
                "c:27017": {
                    type: "Unknown",
                },
                "d:27017": {
                    type: "RSGhost",
                },
                "e:27017": {
                    type: "RSArbiter",
                    setName: "rs"
                }

            },
            topologyType: "ReplicaSetWithPrimary",
            logicalSessionTimeoutMinutes: 3,
            setName: "rs",
        }
    },
    # An RSSecondary responds with a lower logicalSessionTimeoutMinutes
    {
        responses: [
            ["b:27017", {
                ok: 1,
                helloOk: true,
                isWritablePrimary: false,
                secondary: true,
                hosts: ["a:27017", "b:27017", "c:27017", "d:27017", "e:27017"],
                setName: "rs",
                logicalSessionTimeoutMinutes: 2,
                minWireVersion: 0,
                maxWireVersion: 6
            }],
        ],
        outcome: {
            servers: {
                "a:27017": {
                    type: "RSPrimary",
                    setName: "rs"
                },
                "b:27017": {
                    type: "RSSecondary",
                    setName: "rs"
                },
                "c:27017": {
                    type: "Unknown",
                },
                "d:27017": {
                    type: "RSGhost",
                },
                "e:27017": {
                    type: "RSArbiter",
                    setName: "rs"
                }

            },
            topologyType: "ReplicaSetWithPrimary",
            logicalSessionTimeoutMinutes: 2,
            setName: "rs",
        }
    },
    # An RSOther responds with an even lower logicalSessionTimeoutMinutes, which is ignored
    {
        responses: [
            ["c:27017", {
                ok: 1,
                helloOk: true,
                isWritablePrimary: false,
                setName: "rs",
                hidden: true,
                logicalSessionTimeoutMinutes: 1,
                minWireVersion: 0,
                maxWireVersion: 6
            }],
        ],
        outcome: {
            servers: {
                "a:27017": {
                    type: "RSPrimary",
                    setName: "rs"
                },
                "b:27017": {
                    type: "RSSecondary",
                    setName: "rs"
                },
                "c:27017": {
                    type: "RSOther",
                    setName: "rs"
                },
                "d:27017": {
                    type: "RSGhost",
                },
                "e:27017": {
                    type: "RSArbiter",
                    setName: "rs"
              }
            },
            topologyType: "ReplicaSetWithPrimary",
            logicalSessionTimeoutMinutes: 2,
            setName: "rs",
        }
    },
    # Now the RSSecondary responds with no logicalSessionTimeoutMinutes
    {
        responses: [
            ["b:27017", {
                ok: 1,
                helloOk: true,
                isWritablePrimary: false,
                secondary: true,
                hosts: ["a:27017", "b:27017", "c:27017", "d:27017", "e:27017"],
                setName: "rs",
                logicalSessionTimeoutMinutes: null,
                minWireVersion: 0,
                maxWireVersion: 6
            }]
        ],

        # Sessions aren't supported now
        outcome: {
            servers: {
                "a:27017": {
                    type: "RSPrimary",
                    setName: "rs"
                },
                "b:27017": {
                    type: "RSSecondary",
                    setName: "rs"
                },
                "c:27017": {
                    type: "RSOther",
                    setName: "rs"
                },
                "d:27017": {
                    type: "RSGhost",
                },
                "e:27017": {
                    type: "RSArbiter",
                    setName: "rs"
                }
            },
            topologyType: "ReplicaSetWithPrimary",
            logicalSessionTimeoutMinutes: null,
            setName: "rs",
        }
    }
]
