perf: pre-instantiate worker choice strategies
[poolifier.git] / tests / pools / selection-strategies / worker-choice-strategy-context.test.js
CommitLineData
40ad1d27
JB
1const { expect } = require('expect')
2const sinon = require('sinon')
3const {
4 FixedThreadPool,
5 DynamicThreadPool,
6 WorkerChoiceStrategies
7} = require('../../../lib/index')
23ff945a
JB
8const {
9 WorkerChoiceStrategyContext
10} = require('../../../lib/pools/selection-strategies/worker-choice-strategy-context')
40ad1d27
JB
11const {
12 RoundRobinWorkerChoiceStrategy
13} = require('../../../lib/pools/selection-strategies/round-robin-worker-choice-strategy')
14const {
737c6d97
JB
15 LessUsedWorkerChoiceStrategy
16} = require('../../../lib/pools/selection-strategies/less-used-worker-choice-strategy')
168c526f
JB
17const {
18 LessBusyWorkerChoiceStrategy
19} = require('../../../lib/pools/selection-strategies/less-busy-worker-choice-strategy')
40ad1d27 20const {
23ff945a
JB
21 FairShareWorkerChoiceStrategy
22} = require('../../../lib/pools/selection-strategies/fair-share-worker-choice-strategy')
c15273f2
JB
23const {
24 WeightedRoundRobinWorkerChoiceStrategy
fa6f1296 25} = require('../../../lib/pools/selection-strategies/weighted-round-robin-worker-choice-strategy')
40ad1d27
JB
26
27describe('Worker choice strategy context test suite', () => {
c15273f2
JB
28 const min = 1
29 const max = 3
40ad1d27 30 let fixedPool, dynamicPool
c15273f2
JB
31
32 before(() => {
33 fixedPool = new FixedThreadPool(
34 max,
35 './tests/worker-files/thread/testWorker.js'
36 )
37 dynamicPool = new DynamicThreadPool(
38 min,
39 max,
40 './tests/worker-files/thread/testWorker.js'
41 )
40ad1d27
JB
42 })
43
44 afterEach(() => {
45 sinon.restore()
46 })
47
fd7ebd49
JB
48 after(async () => {
49 await fixedPool.destroy()
50 await dynamicPool.destroy()
c15273f2
JB
51 })
52
40ad1d27
JB
53 it('Verify that execute() return the worker chosen by the strategy with fixed pool', () => {
54 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
55 fixedPool
56 )
57 const WorkerChoiceStrategyStub = sinon.createStubInstance(
58 RoundRobinWorkerChoiceStrategy,
59 {
c923ce56 60 choose: sinon.stub().returns(0)
40ad1d27
JB
61 }
62 )
95c83464
JB
63 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
64 WorkerChoiceStrategies.ROUND_ROBIN
65 )
66 workerChoiceStrategyContext.workerChoiceStrategies.set(
67 workerChoiceStrategyContext.workerChoiceStrategyType,
68 WorkerChoiceStrategyStub
69 )
c923ce56 70 const chosenWorkerKey = workerChoiceStrategyContext.execute()
40ad1d27 71 expect(
95c83464
JB
72 workerChoiceStrategyContext.workerChoiceStrategies.get(
73 workerChoiceStrategyContext.workerChoiceStrategyType
74 ).choose.calledOnce
40ad1d27 75 ).toBe(true)
c923ce56 76 expect(chosenWorkerKey).toBe(0)
40ad1d27
JB
77 })
78
79 it('Verify that execute() return the worker chosen by the strategy with dynamic pool', () => {
80 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
81 dynamicPool
82 )
83 const WorkerChoiceStrategyStub = sinon.createStubInstance(
84 RoundRobinWorkerChoiceStrategy,
85 {
c923ce56 86 choose: sinon.stub().returns(0)
40ad1d27
JB
87 }
88 )
95c83464
JB
89 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
90 WorkerChoiceStrategies.ROUND_ROBIN
91 )
92 workerChoiceStrategyContext.workerChoiceStrategies.set(
93 workerChoiceStrategyContext.workerChoiceStrategyType,
94 WorkerChoiceStrategyStub
95 )
c923ce56 96 const chosenWorkerKey = workerChoiceStrategyContext.execute()
40ad1d27 97 expect(
95c83464
JB
98 workerChoiceStrategyContext.workerChoiceStrategies.get(
99 workerChoiceStrategyContext.workerChoiceStrategyType
100 ).choose.calledOnce
40ad1d27 101 ).toBe(true)
c923ce56 102 expect(chosenWorkerKey).toBe(0)
40ad1d27
JB
103 })
104
105 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and fixed pool', () => {
106 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
107 fixedPool
108 )
95c83464
JB
109 expect(
110 workerChoiceStrategyContext.workerChoiceStrategies.get(
111 WorkerChoiceStrategies.ROUND_ROBIN
112 )
113 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
114 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
115 WorkerChoiceStrategies.ROUND_ROBIN
116 )
40ad1d27 117 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 118 fixedPool,
40ad1d27
JB
119 WorkerChoiceStrategies.ROUND_ROBIN
120 )
95c83464
JB
121 expect(
122 workerChoiceStrategyContext.workerChoiceStrategies.get(
123 WorkerChoiceStrategies.ROUND_ROBIN
124 )
125 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
126 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
127 WorkerChoiceStrategies.ROUND_ROBIN
128 )
40ad1d27
JB
129 })
130
23ff945a 131 it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => {
40ad1d27
JB
132 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
133 dynamicPool
134 )
95c83464
JB
135 expect(
136 workerChoiceStrategyContext.workerChoiceStrategies.get(
137 WorkerChoiceStrategies.ROUND_ROBIN
138 )
139 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
140 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
141 WorkerChoiceStrategies.ROUND_ROBIN
142 )
40ad1d27 143 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 144 dynamicPool,
40ad1d27
JB
145 WorkerChoiceStrategies.ROUND_ROBIN
146 )
95c83464
JB
147 expect(
148 workerChoiceStrategyContext.workerChoiceStrategies.get(
149 WorkerChoiceStrategies.ROUND_ROBIN
150 )
151 ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
152 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
153 WorkerChoiceStrategies.ROUND_ROBIN
154 )
40ad1d27
JB
155 })
156
737c6d97 157 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => {
40ad1d27
JB
158 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
159 fixedPool
160 )
161 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 162 fixedPool,
737c6d97 163 WorkerChoiceStrategies.LESS_USED
40ad1d27 164 )
95c83464
JB
165 expect(
166 workerChoiceStrategyContext.workerChoiceStrategies.get(
167 WorkerChoiceStrategies.LESS_USED
168 )
169 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
b2b1d84e
JB
170 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
171 WorkerChoiceStrategies.LESS_USED
172 )
40ad1d27
JB
173 })
174
737c6d97 175 it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => {
40ad1d27
JB
176 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
177 dynamicPool
178 )
179 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 180 dynamicPool,
737c6d97 181 WorkerChoiceStrategies.LESS_USED
40ad1d27 182 )
95c83464
JB
183 expect(
184 workerChoiceStrategyContext.workerChoiceStrategies.get(
185 WorkerChoiceStrategies.LESS_USED
186 )
187 ).toBeInstanceOf(LessUsedWorkerChoiceStrategy)
b2b1d84e
JB
188 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
189 WorkerChoiceStrategies.LESS_USED
190 )
168c526f
JB
191 })
192
193 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => {
194 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
195 fixedPool
196 )
197 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 198 fixedPool,
168c526f
JB
199 WorkerChoiceStrategies.LESS_BUSY
200 )
95c83464
JB
201 expect(
202 workerChoiceStrategyContext.workerChoiceStrategies.get(
203 WorkerChoiceStrategies.LESS_BUSY
204 )
205 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
b2b1d84e
JB
206 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
207 WorkerChoiceStrategies.LESS_BUSY
208 )
168c526f
JB
209 })
210
211 it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => {
212 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
213 dynamicPool
214 )
215 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 216 dynamicPool,
168c526f
JB
217 WorkerChoiceStrategies.LESS_BUSY
218 )
95c83464
JB
219 expect(
220 workerChoiceStrategyContext.workerChoiceStrategies.get(
221 WorkerChoiceStrategies.LESS_BUSY
222 )
223 ).toBeInstanceOf(LessBusyWorkerChoiceStrategy)
b2b1d84e
JB
224 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
225 WorkerChoiceStrategies.LESS_BUSY
226 )
40ad1d27 227 })
23ff945a
JB
228
229 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => {
230 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
231 fixedPool
232 )
233 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 234 fixedPool,
23ff945a
JB
235 WorkerChoiceStrategies.FAIR_SHARE
236 )
95c83464
JB
237 expect(
238 workerChoiceStrategyContext.workerChoiceStrategies.get(
239 WorkerChoiceStrategies.FAIR_SHARE
240 )
241 ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
b2b1d84e
JB
242 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
243 WorkerChoiceStrategies.FAIR_SHARE
244 )
23ff945a
JB
245 })
246
247 it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => {
248 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
249 dynamicPool
250 )
251 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 252 dynamicPool,
23ff945a
JB
253 WorkerChoiceStrategies.FAIR_SHARE
254 )
95c83464
JB
255 expect(
256 workerChoiceStrategyContext.workerChoiceStrategies.get(
257 WorkerChoiceStrategies.FAIR_SHARE
258 )
259 ).toBeInstanceOf(FairShareWorkerChoiceStrategy)
b2b1d84e
JB
260 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
261 WorkerChoiceStrategies.FAIR_SHARE
262 )
23ff945a
JB
263 })
264
c15273f2
JB
265 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => {
266 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
267 fixedPool
268 )
269 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 270 fixedPool,
c15273f2
JB
271 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
272 )
95c83464
JB
273 expect(
274 workerChoiceStrategyContext.workerChoiceStrategies.get(
275 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
276 )
277 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
278 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
279 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
280 )
c15273f2 281 })
23ff945a 282
c15273f2
JB
283 it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => {
284 const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
285 dynamicPool
286 )
287 workerChoiceStrategyContext.setWorkerChoiceStrategy(
3300e7bc 288 dynamicPool,
c15273f2
JB
289 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
290 )
95c83464
JB
291 expect(
292 workerChoiceStrategyContext.workerChoiceStrategies.get(
293 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
294 )
295 ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy)
b2b1d84e
JB
296 expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe(
297 WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN
298 )
c15273f2 299 })
40ad1d27 300})