FixedThreadPool,
DynamicThreadPool,
WorkerChoiceStrategies
-} = require('../../../lib/index')
+} = require('../../../lib')
const {
WorkerChoiceStrategyContext
} = require('../../../lib/pools/selection-strategies/worker-choice-strategy-context')
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
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
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
+ workerChoiceStrategy
)
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
- expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
- WorkerChoiceStrategies.ROUND_ROBIN
- )
- workerChoiceStrategyContext.setWorkerChoiceStrategy(
- fixedPool,
- 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
+ workerChoiceStrategy
)
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
- expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
- WorkerChoiceStrategies.ROUND_ROBIN
- )
- workerChoiceStrategyContext.setWorkerChoiceStrategy(
- dynamicPool,
- 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', () => {
+ const workerChoiceStrategy = WorkerChoiceStrategies.LESS_USED
const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
fixedPool
)
- workerChoiceStrategyContext.setWorkerChoiceStrategy(
- fixedPool,
- WorkerChoiceStrategies.LESS_USED
- )
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
- WorkerChoiceStrategies.LESS_USED
+ workerChoiceStrategy
)
).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
- expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
- WorkerChoiceStrategies.LESS_USED
+ 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
- )
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
- WorkerChoiceStrategies.LESS_USED
+ workerChoiceStrategy
)
).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
- expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
- WorkerChoiceStrategies.LESS_USED
+ 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
- )
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
- WorkerChoiceStrategies.LESS_BUSY
+ workerChoiceStrategy
)
).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
- expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
- WorkerChoiceStrategies.LESS_BUSY
+ 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
- )
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
- WorkerChoiceStrategies.LESS_BUSY
+ workerChoiceStrategy
)
).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
- expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
- WorkerChoiceStrategies.LESS_BUSY
+ 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
- )
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
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(
- dynamicPool,
- WorkerChoiceStrategies.FAIR_SHARE
- )
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
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(
- fixedPool,
- WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
- )
+ 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', () => {
+ const workerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
dynamicPool
)
- workerChoiceStrategyContext.setWorkerChoiceStrategy(
- dynamicPool,
- WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
- )
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
- WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+ 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
+ expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+ workerChoiceStrategy
)
- 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(
+ it('Verify that worker choice strategy options enable median run time pool statistics', () => {
+ const wwrWorkerChoiceStrategy = WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+ let workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
fixedPool,
- WorkerChoiceStrategies.ROUND_ROBIN
+ wwrWorkerChoiceStrategy,
+ {
+ medRunTime: true
+ }
)
- expect(strategy).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
- })
-
- it('Verify that getWorkerChoiceStrategy() can return LESS_USED strategy', () => {
- const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
- fixedPool
+ expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
+ false
)
- const strategy = workerChoiceStrategyContext.getWorkerChoiceStrategy(
- fixedPool,
- WorkerChoiceStrategies.LESS_USED
+ expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
+ true
)
- expect(strategy).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
- })
-
- it('Verify that getWorkerChoiceStrategy() can return LESS_BUSY strategy', () => {
- const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
- fixedPool
+ workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+ dynamicPool,
+ wwrWorkerChoiceStrategy,
+ {
+ medRunTime: true
+ }
)
- const strategy = workerChoiceStrategyContext.getWorkerChoiceStrategy(
- fixedPool,
- WorkerChoiceStrategies.LESS_BUSY
+ expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
+ false
)
- expect(strategy).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
- })
-
- it('Verify that getWorkerChoiceStrategy() can return FAIR_SHARE strategy', () => {
- const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
- fixedPool
+ expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
+ true
)
- const strategy = workerChoiceStrategyContext.getWorkerChoiceStrategy(
+ const fsWorkerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE
+ workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
fixedPool,
- WorkerChoiceStrategies.FAIR_SHARE
+ fsWorkerChoiceStrategy,
+ {
+ medRunTime: true
+ }
)
- expect(strategy).toBeInstanceOf(FairShareWorkerChoiceStrategy)
- })
-
- it('Verify that getWorkerChoiceStrategy() can return WEIGHTED_ROUND_ROBIN strategy', () => {
- const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
- fixedPool
+ expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
+ false
)
- const strategy = workerChoiceStrategyContext.getWorkerChoiceStrategy(
- fixedPool,
- WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+ expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
+ true
)
- expect(strategy).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
- })
-
- it('Verify that getWorkerChoiceStrategy() throw error on unknown strategy', () => {
- const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
- fixedPool
+ workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+ dynamicPool,
+ fsWorkerChoiceStrategy,
+ {
+ medRunTime: true
+ }
)
- expect(() => {
- workerChoiceStrategyContext.getWorkerChoiceStrategy(
- fixedPool,
- 'UNKNOWN_STRATEGY'
- )
- }).toThrowError(
- new Error("Worker choice strategy 'UNKNOWN_STRATEGY' not found")
+ expect(workerChoiceStrategyContext.getRequiredStatistics().avgRunTime).toBe(
+ false
+ )
+ expect(workerChoiceStrategyContext.getRequiredStatistics().medRunTime).toBe(
+ true
)
})
})