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 | ) | |
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 | }) |