version: 1
style: unit
description: must issue Connections to threads in the order that the threads entered the queue
poolOptions:
  maxPoolSize: 1
  waitQueueTimeoutMS: 5000
operations:
    # Check out sole connection in pool
  - name: checkOut
    label: conn0
    # Create 4 threads, have them all queue up for connections
    # Note: this might become non-deterministic depending on how you
    # implement your test runner. The goal is for each thread to
    # have started and begun checkOut before the next thread starts.
    # The sleep operations should make this more consistent.
  - name: start
    target: thread1
  - name: checkOut
    thread: thread1
    label: conn1
  - name: waitForEvent
    event: ConnectionCheckOutStarted
    count: 2
    # Give thread1 some time to actually enter the wait queue since the
    # ConnectionCheckOutStarted event is publish beforehand.
  - name: wait
    ms: 100
  - name: start
    target: thread2
  - name: checkOut
    thread: thread2
    label: conn2
  - name: waitForEvent
    event: ConnectionCheckOutStarted
    count: 3
    # Give thread2 some time to actually enter the wait queue since the
    # ConnectionCheckOutStarted event is publish beforehand.
  - name: wait
    ms: 100
  - name: start
    target: thread3
  - name: checkOut
    thread: thread3
    label: conn3
  - name: waitForEvent
    event: ConnectionCheckOutStarted
    count: 4
    # Give thread3 some time to actually enter the wait queue since the
    # ConnectionCheckOutStarted event is publish beforehand.
  - name: wait
    ms: 100
  - name: start
    target: thread4
  - name: checkOut
    thread: thread4
    label: conn4
  - name: waitForEvent
    event: ConnectionCheckOutStarted
    count: 5
    # Give thread4 some time to actually enter the wait queue since the
    # ConnectionCheckOutStarted event is publish beforehand.
  - name: wait
    ms: 100
    # From main thread, keep checking in connection and then wait for appropriate thread
    # Test will timeout if threads are not enqueued in proper order
  - name: checkIn
    connection: conn0
  - name: waitForThread
    target: thread1
  - name: checkIn
    connection: conn1
  - name: waitForThread
    target: thread2
  - name: checkIn
    connection: conn2
  - name: waitForThread
    target: thread3
  - name: checkIn
    connection: conn3
  - name: waitForThread
    target: thread4
events:
  - type: ConnectionCheckOutStarted
    address: 42
  - type: ConnectionCheckedOut
    connectionId: 42
    address: 42
  - type: ConnectionCheckOutStarted
    address: 42
  - type: ConnectionCheckOutStarted
    address: 42
  - type: ConnectionCheckOutStarted
    address: 42
  - type: ConnectionCheckOutStarted
    address: 42
  - type: ConnectionCheckedIn
    connectionId: 42
    address: 42
  - type: ConnectionCheckedOut
    connectionId: 42
    address: 42
  - type: ConnectionCheckedIn
    connectionId: 42
    address: 42
  - type: ConnectionCheckedOut
    connectionId: 42
    address: 42
  - type: ConnectionCheckedIn
    connectionId: 42
    address: 42
  - type: ConnectionCheckedOut
    connectionId: 42
    address: 42
  - type: ConnectionCheckedIn
    connectionId: 42
    address: 42
  - type: ConnectionCheckedOut
    connectionId: 42
    address: 42
ignore:
  - ConnectionCreated
  - ConnectionReady
  - ConnectionClosed
  - ConnectionPoolCreated
