Commit | Line | Data |
---|---|---|
40ad1d27 JB |
1 | const { expect } = require('expect') |
2 | const sinon = require('sinon') | |
3 | const { | |
4 | FixedThreadPool, | |
5 | DynamicThreadPool, | |
6 | WorkerChoiceStrategies | |
7 | } = require('../../../lib/index') | |
23ff945a JB |
8 | const { |
9 | WorkerChoiceStrategyContext | |
10 | } = require('../../../lib/pools/selection-strategies/worker-choice-strategy-context') | |
40ad1d27 JB |
11 | const { |
12 | RoundRobinWorkerChoiceStrategy | |
13 | } = require('../../../lib/pools/selection-strategies/round-robin-worker-choice-strategy') | |
14 | const { | |
737c6d97 JB |
15 | LessUsedWorkerChoiceStrategy |
16 | } = require('../../../lib/pools/selection-strategies/less-used-worker-choice-strategy') | |
168c526f JB |
17 | const { |
18 | LessBusyWorkerChoiceStrategy | |
19 | } = require('../../../lib/pools/selection-strategies/less-busy-worker-choice-strategy') | |
40ad1d27 | 20 | const { |
23ff945a JB |
21 | FairShareWorkerChoiceStrategy |
22 | } = require('../../../lib/pools/selection-strategies/fair-share-worker-choice-strategy') | |
c15273f2 JB |
23 | const { |
24 | WeightedRoundRobinWorkerChoiceStrategy | |
fa6f1296 | 25 | } = require('../../../lib/pools/selection-strategies/weighted-round-robin-worker-choice-strategy') |
40ad1d27 JB |
26 | |
27 | describe('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 | ) | |
283855e1 JB |
109 | expect( |
110 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
111 | WorkerChoiceStrategies.ROUND_ROBIN | |
112 | ).isDynamicPool | |
113 | ).toBe(false) | |
95c83464 JB |
114 | expect( |
115 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
116 | WorkerChoiceStrategies.ROUND_ROBIN | |
117 | ) | |
118 | ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
119 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
120 | WorkerChoiceStrategies.ROUND_ROBIN | |
121 | ) | |
40ad1d27 JB |
122 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
123 | WorkerChoiceStrategies.ROUND_ROBIN | |
124 | ) | |
95c83464 JB |
125 | expect( |
126 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
127 | WorkerChoiceStrategies.ROUND_ROBIN | |
128 | ) | |
129 | ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
130 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
131 | WorkerChoiceStrategies.ROUND_ROBIN | |
132 | ) | |
40ad1d27 JB |
133 | }) |
134 | ||
23ff945a | 135 | it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => { |
40ad1d27 JB |
136 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( |
137 | dynamicPool | |
138 | ) | |
283855e1 JB |
139 | expect( |
140 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
141 | WorkerChoiceStrategies.ROUND_ROBIN | |
142 | ).isDynamicPool | |
143 | ).toBe(true) | |
95c83464 JB |
144 | expect( |
145 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
146 | WorkerChoiceStrategies.ROUND_ROBIN | |
147 | ) | |
148 | ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
149 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
150 | WorkerChoiceStrategies.ROUND_ROBIN | |
151 | ) | |
40ad1d27 JB |
152 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
153 | WorkerChoiceStrategies.ROUND_ROBIN | |
154 | ) | |
95c83464 JB |
155 | expect( |
156 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
157 | WorkerChoiceStrategies.ROUND_ROBIN | |
158 | ) | |
159 | ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
160 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
161 | WorkerChoiceStrategies.ROUND_ROBIN | |
162 | ) | |
40ad1d27 JB |
163 | }) |
164 | ||
737c6d97 | 165 | it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => { |
40ad1d27 JB |
166 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( |
167 | fixedPool | |
168 | ) | |
283855e1 JB |
169 | expect( |
170 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
171 | WorkerChoiceStrategies.LESS_USED | |
172 | ).isDynamicPool | |
173 | ).toBe(false) | |
40ad1d27 | 174 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
737c6d97 | 175 | WorkerChoiceStrategies.LESS_USED |
40ad1d27 | 176 | ) |
95c83464 JB |
177 | expect( |
178 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
179 | WorkerChoiceStrategies.LESS_USED | |
180 | ) | |
181 | ).toBeInstanceOf(LessUsedWorkerChoiceStrategy) | |
b2b1d84e JB |
182 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
183 | WorkerChoiceStrategies.LESS_USED | |
184 | ) | |
40ad1d27 JB |
185 | }) |
186 | ||
737c6d97 | 187 | it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => { |
40ad1d27 JB |
188 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( |
189 | dynamicPool | |
190 | ) | |
283855e1 JB |
191 | expect( |
192 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
193 | WorkerChoiceStrategies.LESS_USED | |
194 | ).isDynamicPool | |
195 | ).toBe(true) | |
40ad1d27 | 196 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
737c6d97 | 197 | WorkerChoiceStrategies.LESS_USED |
40ad1d27 | 198 | ) |
95c83464 JB |
199 | expect( |
200 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
201 | WorkerChoiceStrategies.LESS_USED | |
202 | ) | |
203 | ).toBeInstanceOf(LessUsedWorkerChoiceStrategy) | |
b2b1d84e JB |
204 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
205 | WorkerChoiceStrategies.LESS_USED | |
206 | ) | |
168c526f JB |
207 | }) |
208 | ||
209 | it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => { | |
210 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
211 | fixedPool | |
212 | ) | |
283855e1 JB |
213 | expect( |
214 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
215 | WorkerChoiceStrategies.LESS_BUSY | |
216 | ).isDynamicPool | |
217 | ).toBe(false) | |
168c526f JB |
218 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
219 | WorkerChoiceStrategies.LESS_BUSY | |
220 | ) | |
95c83464 JB |
221 | expect( |
222 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
223 | WorkerChoiceStrategies.LESS_BUSY | |
224 | ) | |
225 | ).toBeInstanceOf(LessBusyWorkerChoiceStrategy) | |
b2b1d84e JB |
226 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
227 | WorkerChoiceStrategies.LESS_BUSY | |
228 | ) | |
168c526f JB |
229 | }) |
230 | ||
231 | it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => { | |
232 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
233 | dynamicPool | |
234 | ) | |
283855e1 JB |
235 | expect( |
236 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
237 | WorkerChoiceStrategies.LESS_BUSY | |
238 | ).isDynamicPool | |
239 | ).toBe(true) | |
168c526f JB |
240 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
241 | WorkerChoiceStrategies.LESS_BUSY | |
242 | ) | |
95c83464 JB |
243 | expect( |
244 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
245 | WorkerChoiceStrategies.LESS_BUSY | |
246 | ) | |
247 | ).toBeInstanceOf(LessBusyWorkerChoiceStrategy) | |
b2b1d84e JB |
248 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
249 | WorkerChoiceStrategies.LESS_BUSY | |
250 | ) | |
40ad1d27 | 251 | }) |
23ff945a JB |
252 | |
253 | it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => { | |
254 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
255 | fixedPool | |
256 | ) | |
283855e1 JB |
257 | expect( |
258 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
259 | WorkerChoiceStrategies.FAIR_SHARE | |
260 | ).isDynamicPool | |
261 | ).toBe(false) | |
23ff945a JB |
262 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
263 | WorkerChoiceStrategies.FAIR_SHARE | |
264 | ) | |
95c83464 JB |
265 | expect( |
266 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
267 | WorkerChoiceStrategies.FAIR_SHARE | |
268 | ) | |
269 | ).toBeInstanceOf(FairShareWorkerChoiceStrategy) | |
b2b1d84e JB |
270 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
271 | WorkerChoiceStrategies.FAIR_SHARE | |
272 | ) | |
23ff945a JB |
273 | }) |
274 | ||
275 | it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => { | |
276 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
277 | dynamicPool | |
278 | ) | |
283855e1 JB |
279 | expect( |
280 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
281 | WorkerChoiceStrategies.FAIR_SHARE | |
282 | ).isDynamicPool | |
283 | ).toBe(true) | |
23ff945a JB |
284 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
285 | WorkerChoiceStrategies.FAIR_SHARE | |
286 | ) | |
95c83464 JB |
287 | expect( |
288 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
289 | WorkerChoiceStrategies.FAIR_SHARE | |
290 | ) | |
291 | ).toBeInstanceOf(FairShareWorkerChoiceStrategy) | |
b2b1d84e JB |
292 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
293 | WorkerChoiceStrategies.FAIR_SHARE | |
294 | ) | |
23ff945a JB |
295 | }) |
296 | ||
c15273f2 JB |
297 | it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => { |
298 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
299 | fixedPool | |
300 | ) | |
283855e1 JB |
301 | expect( |
302 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
303 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
304 | ).isDynamicPool | |
305 | ).toBe(false) | |
c15273f2 JB |
306 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
307 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
308 | ) | |
95c83464 JB |
309 | expect( |
310 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
311 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
312 | ) | |
313 | ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
314 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
315 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
316 | ) | |
c15273f2 | 317 | }) |
23ff945a | 318 | |
c15273f2 JB |
319 | it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => { |
320 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
321 | dynamicPool | |
322 | ) | |
283855e1 JB |
323 | expect( |
324 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
325 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
326 | ).isDynamicPool | |
327 | ).toBe(true) | |
c15273f2 JB |
328 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
329 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
330 | ) | |
95c83464 JB |
331 | expect( |
332 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
333 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
334 | ) | |
335 | ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
336 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
337 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
338 | ) | |
c15273f2 | 339 | }) |
40ad1d27 | 340 | }) |