version: 1
style: integration
description: waiting on maxConnecting is limited by WaitQueueTimeoutMS
runOn:
  -
    # required for blockConnection in fail point
    minServerVersion: "4.4.0"
failPoint:
  configureFailPoint: failCommand
  # high amount to ensure not interfered with by monitor checks.
  mode: { times: 50 }
  data:
    failCommands: ["isMaster","hello"]
    closeConnection: false
    blockConnection: true
    blockTimeMS: 750
poolOptions:
  maxPoolSize: 10
  # Drivers that limit connection establishment by waitQueueTimeoutMS may skip
  # this test. While waitQueueTimeoutMS is technically not supposed to limit establishment time,
  # it will soon be deprecated, so it is easier for those drivers to just skip this test.
  waitQueueTimeoutMS: 50
operations:
  - name: ready
  # start creating two connections simultaneously.
  - name: start
    target: thread1
  - name: checkOut
    thread: thread1
  - name: start
    target: thread2
  - name: checkOut
    thread: thread2
  # wait for other two threads to start establishing
  - name: waitForEvent
    event: ConnectionCreated
    count: 2
  # start a third thread that will be blocked waiting for
  # one of the other two to finish
  - name: start
    target: thread3
  - name: checkOut
    thread: thread3
  - name: waitForEvent
    event: ConnectionCheckOutFailed
    count: 1
  # rejoin thread3, should experience error
  - name: waitForThread
    target: thread3
error:
  type: WaitQueueTimeoutError
  message: Timed out while checking out a connection from connection pool
events:
  - type: ConnectionCheckOutStarted
    address: 42
  - type: ConnectionCheckOutStarted
    address: 42
  - type: ConnectionCheckOutStarted
    address: 42
  - type: ConnectionCheckOutFailed
    reason: timeout
    address: 42
ignore:
  - ConnectionCreated
  - ConnectionCheckedIn
  - ConnectionCheckedOut
  - ConnectionClosed
  - ConnectionPoolCreated
  - ConnectionPoolReady
