FixedThreadPool,
DynamicThreadPool,
WorkerChoiceStrategies
-} = require('../../../lib/index')
+} = require('../../../lib')
const {
WorkerChoiceStrategyContext
} = require('../../../lib/pools/selection-strategies/worker-choice-strategy-context')
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 {
+ LeastEluWorkerChoiceStrategy
+} = require('../../../lib/pools/selection-strategies/least-elu-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
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
})
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.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.ROUND_ROBIN
- )
- workerChoiceStrategyContext.setWorkerChoiceStrategy(
- WorkerChoiceStrategies.ROUND_ROBIN
+ workerChoiceStrategy
)
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
- WorkerChoiceStrategies.ROUND_ROBIN
+ workerChoiceStrategy
)
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.ROUND_ROBIN
+ 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.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.ROUND_ROBIN
- )
- workerChoiceStrategyContext.setWorkerChoiceStrategy(
- WorkerChoiceStrategies.ROUND_ROBIN
+ workerChoiceStrategy
)
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
- WorkerChoiceStrategies.ROUND_ROBIN
+ workerChoiceStrategy
)
).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.ROUND_ROBIN
+ 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)
+ ).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.LESS_USED
+ 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)
+ ).toBeInstanceOf(LeastUsedWorkerChoiceStrategy)
expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.LESS_USED
+ 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
+ workerChoiceStrategy
+ )
+ ).toBeInstanceOf(LeastBusyWorkerChoiceStrategy)
+ expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+ workerChoiceStrategy
+ )
+ })
+
+ 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
+ workerChoiceStrategy
)
- ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
+ ).toBeInstanceOf(LeastBusyWorkerChoiceStrategy)
expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.LESS_BUSY
+ workerChoiceStrategy
)
})
- it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => {
+ it('Verify that setWorkerChoiceStrategy() works with LEAST_ELU and fixed pool', () => {
+ const workerChoiceStrategy = WorkerChoiceStrategies.LEAST_ELU
const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
- dynamicPool
+ fixedPool
)
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
- WorkerChoiceStrategies.LESS_BUSY
- ).isDynamicPool
- ).toBe(true)
- workerChoiceStrategyContext.setWorkerChoiceStrategy(
- WorkerChoiceStrategies.LESS_BUSY
+ workerChoiceStrategy
+ )
+ ).toBeInstanceOf(LeastEluWorkerChoiceStrategy)
+ expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
+ workerChoiceStrategy
+ )
+ })
+
+ it('Verify that setWorkerChoiceStrategy() works with LEAST_ELU and dynamic pool', () => {
+ const workerChoiceStrategy = WorkerChoiceStrategies.LEAST_ELU
+ const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+ dynamicPool
)
+ workerChoiceStrategyContext.setWorkerChoiceStrategy(workerChoiceStrategy)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
- WorkerChoiceStrategies.LESS_BUSY
+ workerChoiceStrategy
)
- ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
+ ).toBeInstanceOf(LeastEluWorkerChoiceStrategy)
expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.LESS_BUSY
+ 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.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.FAIR_SHARE
+ 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.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.FAIR_SHARE
+ 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.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+ 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)
+ ).toBeInstanceOf(InterleavedWeightedRoundRobinWorkerChoiceStrategy)
expect(workerChoiceStrategyContext.workerChoiceStrategy).toBe(
- WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
+ 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,
+ {
+ runTime: { median: true }
+ }
+ )
+ expect(
+ workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime
+ .average
+ ).toBe(false)
+ expect(
+ workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime.median
+ ).toBe(true)
+ workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+ dynamicPool,
+ wwrWorkerChoiceStrategy,
+ {
+ runTime: { median: true }
+ }
)
+ expect(
+ workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime
+ .average
+ ).toBe(false)
+ expect(
+ workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime.median
+ ).toBe(true)
+ const fsWorkerChoiceStrategy = WorkerChoiceStrategies.FAIR_SHARE
+ workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+ fixedPool,
+ fsWorkerChoiceStrategy,
+ {
+ runTime: { median: true }
+ }
+ )
+ expect(
+ workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime
+ .average
+ ).toBe(false)
+ expect(
+ workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime.median
+ ).toBe(true)
+ workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
+ dynamicPool,
+ fsWorkerChoiceStrategy,
+ {
+ runTime: { median: true }
+ }
+ )
+ expect(
+ workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime
+ .average
+ ).toBe(false)
+ expect(
+ workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime.median
+ ).toBe(true)
})
})