test: add tasks queuing tests
[poolifier.git] / tests / pools / selection-strategies / worker-choice-strategy-context.test.js
index a93104d225f3e9c27ff8d252719619d20654bf0a..23d954c9f13159940e542c8774a3d22feefeaaad 100644 (file)
@@ -50,6 +50,15 @@ describe('Worker choice strategy context test suite', () => {
     await dynamicPool.destroy()
   })
 
+  it('Verify that constructor() initializes the context with all the available worker choice strategies', () => {
+    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+      fixedPool
+    )
+    expect(workerChoiceStrategyContext.workerChoiceStrategies.size).toBe(
+      Object.keys(WorkerChoiceStrategies).length
+    )
+  })
+
   it('Verify that execute() return the worker chosen by the strategy with fixed pool', () => {
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       fixedPool
@@ -60,10 +69,18 @@ describe('Worker choice strategy context test suite', () => {
         choose: sinon.stub().returns(0)
       }
     )
-    workerChoiceStrategyContext.workerChoiceStrategy = WorkerChoiceStrategyStub
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      WorkerChoiceStrategies.ROUND_ROBIN
+    )
+    workerChoiceStrategyContext.workerChoiceStrategies.set(
+      workerChoiceStrategyContext.workerChoiceStrategy,
+      WorkerChoiceStrategyStub
+    )
     const chosenWorkerKey = workerChoiceStrategyContext.execute()
     expect(
-      workerChoiceStrategyContext.workerChoiceStrategy.choose.calledOnce
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategyContext.workerChoiceStrategy
+      ).choose.calledOnce
     ).toBe(true)
     expect(chosenWorkerKey).toBe(0)
   })
@@ -78,261 +95,245 @@ describe('Worker choice strategy context test suite', () => {
         choose: sinon.stub().returns(0)
       }
     )
-    workerChoiceStrategyContext.workerChoiceStrategy = WorkerChoiceStrategyStub
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      WorkerChoiceStrategies.ROUND_ROBIN
+    )
+    workerChoiceStrategyContext.workerChoiceStrategies.set(
+      workerChoiceStrategyContext.workerChoiceStrategy,
+      WorkerChoiceStrategyStub
+    )
     const chosenWorkerKey = workerChoiceStrategyContext.execute()
     expect(
-      workerChoiceStrategyContext.workerChoiceStrategy.choose.calledOnce
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        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.workerChoiceStrategy).toBeInstanceOf(
-      RoundRobinWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.ROUND_ROBIN
-    )
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      fixedPool,
-      WorkerChoiceStrategies.ROUND_ROBIN
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      RoundRobinWorkerChoiceStrategy
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(false)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.ROUND_ROBIN
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
+    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.workerChoiceStrategy).toBeInstanceOf(
-      RoundRobinWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.ROUND_ROBIN
-    )
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      dynamicPool,
-      WorkerChoiceStrategies.ROUND_ROBIN
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      RoundRobinWorkerChoiceStrategy
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(true)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.ROUND_ROBIN
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
   it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.LESS_USED
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       fixedPool
     )
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      fixedPool,
-      WorkerChoiceStrategies.LESS_USED
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      LessUsedWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.LESS_USED
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(false)
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
   it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.LESS_USED
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       dynamicPool
     )
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      dynamicPool,
-      WorkerChoiceStrategies.LESS_USED
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      LessUsedWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.LESS_USED
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(true)
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
   it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.LESS_BUSY
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       fixedPool
     )
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      fixedPool,
-      WorkerChoiceStrategies.LESS_BUSY
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      LessBusyWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.LESS_BUSY
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(false)
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 
   it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => {
+    const workerChoiceStrategy = WorkerChoiceStrategies.LESS_BUSY
     const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
       dynamicPool
     )
-    workerChoiceStrategyContext.setWorkerChoiceStrategy(
-      dynamicPool,
-      WorkerChoiceStrategies.LESS_BUSY
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      LessBusyWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.LESS_BUSY
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(true)
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
+    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(
-      fixedPool,
-      WorkerChoiceStrategies.FAIR_SHARE
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      FairShareWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.FAIR_SHARE
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(false)
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
+    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(
-      dynamicPool,
-      WorkerChoiceStrategies.FAIR_SHARE
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      FairShareWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.FAIR_SHARE
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(true)
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      )
+    ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
+    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(
-      fixedPool,
-      WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      WeightedRoundRobinWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(false)
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        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(
-      dynamicPool,
-      WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBeInstanceOf(
-      WeightedRoundRobinWorkerChoiceStrategy
-    )
-    expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
-      WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
-    )
-  })
-
-  it('Verify that getWorkerChoiceStrategy() default return ROUND_ROBIN strategy', () => {
-    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
-      fixedPool
-    )
-    const strategy =
-      workerChoiceStrategyContext.getWorkerChoiceStrategy(fixedPool)
-    expect(strategy).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
-  })
-
-  it('Verify that getWorkerChoiceStrategy() can return ROUND_ROBIN strategy', () => {
-    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
-      fixedPool
-    )
-    const strategy = workerChoiceStrategyContext.getWorkerChoiceStrategy(
-      fixedPool,
-      WorkerChoiceStrategies.ROUND_ROBIN
-    )
-    expect(strategy).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
-  })
-
-  it('Verify that getWorkerChoiceStrategy() can return LESS_USED strategy', () => {
-    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
-      fixedPool
-    )
-    const strategy = workerChoiceStrategyContext.getWorkerChoiceStrategy(
-      fixedPool,
-      WorkerChoiceStrategies.LESS_USED
-    )
-    expect(strategy).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
-  })
-
-  it('Verify that getWorkerChoiceStrategy() can return LESS_BUSY strategy', () => {
-    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
-      fixedPool
-    )
-    const strategy = workerChoiceStrategyContext.getWorkerChoiceStrategy(
-      fixedPool,
-      WorkerChoiceStrategies.LESS_BUSY
-    )
-    expect(strategy).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
-  })
-
-  it('Verify that getWorkerChoiceStrategy() can return FAIR_SHARE strategy', () => {
-    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
-      fixedPool
-    )
-    const strategy = workerChoiceStrategyContext.getWorkerChoiceStrategy(
-      fixedPool,
-      WorkerChoiceStrategies.FAIR_SHARE
-    )
-    expect(strategy).toBeInstanceOf(FairShareWorkerChoiceStrategy)
-  })
-
-  it('Verify that getWorkerChoiceStrategy() can return WEIGHTED_ROUND_ROBIN strategy', () => {
-    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
-      fixedPool
-    )
-    const strategy = workerChoiceStrategyContext.getWorkerChoiceStrategy(
-      fixedPool,
-      WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
-    )
-    expect(strategy).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
-  })
-
-  it('Verify that getWorkerChoiceStrategy() throw error on unknown strategy', () => {
-    const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
-      fixedPool
-    )
-    expect(() => {
-      workerChoiceStrategyContext.getWorkerChoiceStrategy(
-        fixedPool,
-        'UNKNOWN_STRATEGY'
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
+      ).isDynamicPool
+    ).toBe(true)
+    workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
+    expect(
+      workerChoiceStrategyContext.workerChoiceStrategies.get(
+        workerChoiceStrategy
       )
-    }).toThrowError(
-      new Error("Worker choice strategy 'UNKNOWN_STRATEGY' not found")
+    ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
+    expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+      workerChoiceStrategy
     )
   })
 })