test: add more IWRR worker choice strategies testing
[poolifier.git] / tests / pools / selection-strategies / worker-choice-strategy-context.test.js
index a8f187eee6098fab5bb6c8ede3ec5cff434da3d3..92b776f95f092387ee48851c0cbca6e51364ea6d 100644 (file)
@@ -4,7 +4,7 @@ const {
   FixedThreadPool,
   DynamicThreadPool,
   WorkerChoiceStrategies
-} = require('../../../lib/index')
+} = require('../../../lib')
 const {
   WorkerChoiceStrategyContext
 } = require('../../../lib/pools/selection-strategies/worker-choice-strategy-context')
@@ -12,17 +12,20 @@ const {
   RoundRobinWorkerChoiceStrategy
 } = require('../../../lib/pools/selection-strategies/round-robin-worker-choice-strategy')
 const {
-  LessUsedWorkerChoiceStrategy
-} = require('../../../lib/pools/selection-strategies/less-used-worker-choice-strategy')
+  LeastUsedWorkerChoiceStrategy
+} = require('../../../lib/pools/selection-strategies/least-used-worker-choice-strategy')
 const {
-  LessBusyWorkerChoiceStrategy
-} = require('../../../lib/pools/selection-strategies/less-busy-worker-choice-strategy')
+  LeastBusyWorkerChoiceStrategy
+} = require('../../../lib/pools/selection-strategies/least-busy-worker-choice-strategy')
 const {
   FairShareWorkerChoiceStrategy
 } = require('../../../lib/pools/selection-strategies/fair-share-worker-choice-strategy')
 const {
   WeightedRoundRobinWorkerChoiceStrategy
 } = require('../../../lib/pools/selection-strategies/weighted-round-robin-worker-choice-strategy')
+const {
+  InterleavedWeightedRoundRobinWorkerChoiceStrategy
+} = require('../../../lib/pools/selection-strategies/interleaved-weighted-round-robin-worker-choice-strategy')
 
 describe('Worker choice strategy context test suite', () => {
   const min = 1
@@ -69,22 +72,57 @@ describe('Worker choice strategy context test suite', () => {
         choose: sinon.stub().returns(0)
       }
     )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
       WorkerChoiceStrategies.ROUND_ROBIN
     )
     workerChoiceStrategyContext.workerChoiceStrategies.set(
-      workerChoiceStrategyContext.workerChoiceStrategyType,
+      workerChoiceStrategyContext.workerChoiceStrategy,
       WorkerChoiceStrategyStub
     )
     const chosenWorkerKey = workerChoiceStrategyContext.execute()
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        workerChoiceStrategyContext.workerChoiceStrategyType
+        workerChoiceStrategyContext.workerChoiceStrategy
       ).choose.calledOnce
     ).toBe(true)
     expect(chosenWorkerKey).toBe(0)
   })
 
+  it('Verify that execute() throws error if null or undefined is returned', () => {
+    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      fixedPool
+    )
+    const WorkerChoiceStrategyUndefinedStub = sinon.createStubInstance(
+      RoundRobinWorkerChoiceStrategy,
+      {
+        choose: sinon.stub().returns(undefined)
+      }
+    )
+    const WorkerChoiceStrategyNullStub = sinon.createStubInstance(
+      RoundRobinWorkerChoiceStrategy,
+      {
+        choose: sinon.stub().returns(null)
+      }
+    )
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      WorkerChoiceStrategies.ROUND_ROBIN
+    )
+    workerChoiceStrategyContext.workerChoiceStrategies.set(
+      workerChoiceStrategyContext.workerChoiceStrategy,
+      WorkerChoiceStrategyUndefinedStub
+    )
+    expect(() => workerChoiceStrategyContext.execute()).toThrowError(
+      new Error('Worker node key chosen is null or undefined')
+    )
+    workerChoiceStrategyContext.workerChoiceStrategies.set(
+      workerChoiceStrategyContext.workerChoiceStrategy,
+      WorkerChoiceStrategyNullStub
+    )
+    expect(() => workerChoiceStrategyContext.execute()).toThrowError(
+      new Error('Worker node key chosen is null or undefined')
+    )
+  })
+
   it('Verify that execute() return the worker chosen by the strategy with dynamic pool', () => {
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       dynamicPool
@@ -95,255 +133,343 @@ describe('Worker choice strategy context test suite', () => {
         choose: sinon.stub().returns(0)
       }
     )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
       WorkerChoiceStrategies.ROUND_ROBIN
     )
     workerChoiceStrategyContext.workerChoiceStrategies.set(
-      workerChoiceStrategyContext.workerChoiceStrategyType,
+      workerChoiceStrategyContext.workerChoiceStrategy,
       WorkerChoiceStrategyStub
     )
     const chosenWorkerKey = workerChoiceStrategyContext.execute()
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        workerChoiceStrategyContext.workerChoiceStrategyType
+        workerChoiceStrategyContext.workerChoiceStrategy
       ).choose.calledOnce
     ).toBe(true)
     expect(chosenWorkerKey).toBe(0)
   })
 
   it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and fixed pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       fixedPool
     )
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.ROUND_ROBIN
-      ).isDynamicPool
-    ).toBe(false)
-    expect(
-      workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.ROUND_ROBIN
+        workerChoiceStrategy
       )
     ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.ROUND_ROBIN
-    )
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.ROUND_ROBIN
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.ROUND_ROBIN
+        workerChoiceStrategy
       )
     ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.ROUND_ROBIN
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
   it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       dynamicPool
     )
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.ROUND_ROBIN
-      ).isDynamicPool
-    ).toBe(true)
-    expect(
-      workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.ROUND_ROBIN
+        workerChoiceStrategy
       )
     ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.ROUND_ROBIN
-    )
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.ROUND_ROBIN
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.ROUND_ROBIN
+        workerChoiceStrategy
       )
     ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.ROUND_ROBIN
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
-  it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => {
+  it('Verify that setWorkerChoiceStrategy() works with LEAST_USED and fixed pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.LEAST_USED
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       fixedPool
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.LESS_USED
-      ).isDynamicPool
-    ).toBe(false)
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.LESS_USED
-    )
-    expect(
-      workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.LESS_USED
+        workerChoiceStrategy
       )
-    ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.LESS_USED
+    ).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
-  it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => {
+  it('Verify that setWorkerChoiceStrategy() works with LEAST_USED and dynamic pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.LEAST_USED
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       dynamicPool
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.LESS_USED
-      ).isDynamicPool
-    ).toBe(true)
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.LESS_USED
-    )
-    expect(
-      workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.LESS_USED
+        workerChoiceStrategy
       )
-    ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.LESS_USED
+    ).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
-  it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => {
+  it('Verify that setWorkerChoiceStrategy() works with LEAST_BUSY and fixed pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.LEAST_BUSY
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       fixedPool
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.LESS_BUSY
-      ).isDynamicPool
-    ).toBe(false)
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.LESS_BUSY
-    )
-    expect(
-      workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.LESS_BUSY
+        workerChoiceStrategy
       )
-    ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.LESS_BUSY
+    ).toBeInstanceOf(LeastBusyWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
-  it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => {
+  it('Verify that setWorkerChoiceStrategy() works with LEAST_BUSY and dynamic pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.LEAST_BUSY
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       dynamicPool
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.LESS_BUSY
-      ).isDynamicPool
-    ).toBe(true)
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.LESS_BUSY
-    )
-    expect(
-      workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.LESS_BUSY
+        workerChoiceStrategy
       )
-    ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.LESS_BUSY
+    ).toBeInstanceOf(LeastBusyWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
   it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       fixedPool
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.FAIR_SHARE
-      ).isDynamicPool
-    ).toBe(false)
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.FAIR_SHARE
-    )
-    expect(
-      workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.FAIR_SHARE
+        workerChoiceStrategy
       )
     ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.FAIR_SHARE
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
   it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       dynamicPool
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.FAIR_SHARE
-      ).isDynamicPool
-    ).toBe(true)
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.FAIR_SHARE
-    )
-    expect(
-      workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.FAIR_SHARE
+        workerChoiceStrategy
       )
     ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.FAIR_SHARE
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
   it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       fixedPool
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
-      ).isDynamicPool
-    ).toBe(false)
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
+    )
+  })
+
+  it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      dynamicPool
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+        workerChoiceStrategy
       )
     ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
-  it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
+  it('Verify that setWorkerChoiceStrategy() works with INTERLEAVED_WEIGHTED_ROUND_ROBIN and fixed pool', () => {
+    const workerChoiceStrategy =
+      WorkerChoiceStrategies.INTERLEAVED_WEIGHTED_ROUND_ROBIN
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
-      dynamicPool
+      fixedPool
     )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
-      ).isDynamicPool
-    ).toBe(true)
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(InterleavedWeightedRoundRobinWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
+  })
+
+  it('Verify that setWorkerChoiceStrategy() works with INTERLEAVED_WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
+    const workerChoiceStrategy =
+      WorkerChoiceStrategies.INTERLEAVED_WEIGHTED_ROUND_ROBIN
+    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      dynamicPool
+    )
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
     expect(
       workerChoiceStrategyContext.workerChoiceStrategies.get(
-        WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+        workerChoiceStrategy
       )
-    ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+    ).toBeInstanceOf(InterleavedWeightedRoundRobinWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
+    )
+  })
+
+  it('Verify that worker choice strategy options enable median runtime pool statistics', () => {
+    const wwrWorkerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+    let workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      fixedPool,
+      wwrWorkerChoiceStrategy,
+      {
+        medRunTime: true
+      }
+    )
+    expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
+      false
+    )
+    expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
+      true
+    )
+    workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      dynamicPool,
+      wwrWorkerChoiceStrategy,
+      {
+        medRunTime: true
+      }
+    )
+    expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
+      false
+    )
+    expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
+      true
+    )
+    const fsWorkerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE
+    workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      fixedPool,
+      fsWorkerChoiceStrategy,
+      {
+        medRunTime: true
+      }
+    )
+    expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
+      false
+    )
+    expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
+      true
+    )
+    workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      dynamicPool,
+      fsWorkerChoiceStrategy,
+      {
+        medRunTime: true
+      }
+    )
+    expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
+      false
+    )
+    expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
+      true
     )
   })
+
+  it('Verify that worker choice strategy options enable median wait time pool statistics', () => {
+    const wwrWorkerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+    let workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      fixedPool,
+      wwrWorkerChoiceStrategy,
+      {
+        medWaitTime: true
+      }
+    )
+    expect(
+      workerChoiceStrategyContext.getRequiredStatistics().avgWaitTime
+    ).toBe(false)
+    expect(
+      workerChoiceStrategyContext.getRequiredStatistics().medWaitTime
+    ).toBe(true)
+    workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      dynamicPool,
+      wwrWorkerChoiceStrategy,
+      {
+        medWaitTime: true
+      }
+    )
+    expect(
+      workerChoiceStrategyContext.getRequiredStatistics().avgWaitTime
+    ).toBe(false)
+    expect(
+      workerChoiceStrategyContext.getRequiredStatistics().medWaitTime
+    ).toBe(true)
+    const fsWorkerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE
+    workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      fixedPool,
+      fsWorkerChoiceStrategy,
+      {
+        medWaitTime: true
+      }
+    )
+    expect(
+      workerChoiceStrategyContext.getRequiredStatistics().avgWaitTime
+    ).toBe(false)
+    expect(
+      workerChoiceStrategyContext.getRequiredStatistics().medWaitTime
+    ).toBe(true)
+    workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      dynamicPool,
+      fsWorkerChoiceStrategy,
+      {
+        medWaitTime: true
+      }
+    )
+    expect(
+      workerChoiceStrategyContext.getRequiredStatistics().avgWaitTime
+    ).toBe(false)
+    expect(
+      workerChoiceStrategyContext.getRequiredStatistics().medWaitTime
+    ).toBe(true)
+  })
 })