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 JB |
117 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
118 | WorkerChoiceStrategies.ROUND_ROBIN | |
119 | ) | |
95c83464 JB |
120 | expect( |
121 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
122 | WorkerChoiceStrategies.ROUND_ROBIN | |
123 | ) | |
124 | ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
125 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
126 | WorkerChoiceStrategies.ROUND_ROBIN | |
127 | ) | |
40ad1d27 JB |
128 | }) |
129 | ||
23ff945a | 130 | it('Verify that setWorkerChoiceStrategy() works with ROUND_ROBIN and dynamic pool', () => { |
40ad1d27 JB |
131 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( |
132 | dynamicPool | |
133 | ) | |
95c83464 JB |
134 | expect( |
135 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
136 | WorkerChoiceStrategies.ROUND_ROBIN | |
137 | ) | |
138 | ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
139 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
140 | WorkerChoiceStrategies.ROUND_ROBIN | |
141 | ) | |
40ad1d27 JB |
142 | workerChoiceStrategyContext.setWorkerChoiceStrategy( |
143 | WorkerChoiceStrategies.ROUND_ROBIN | |
144 | ) | |
95c83464 JB |
145 | expect( |
146 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
147 | WorkerChoiceStrategies.ROUND_ROBIN | |
148 | ) | |
149 | ).toBeInstanceOf(RoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
150 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
151 | WorkerChoiceStrategies.ROUND_ROBIN | |
152 | ) | |
40ad1d27 JB |
153 | }) |
154 | ||
737c6d97 | 155 | it('Verify that setWorkerChoiceStrategy() works with LESS_USED and fixed pool', () => { |
40ad1d27 JB |
156 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( |
157 | fixedPool | |
158 | ) | |
159 | workerChoiceStrategyContext.setWorkerChoiceStrategy( | |
737c6d97 | 160 | WorkerChoiceStrategies.LESS_USED |
40ad1d27 | 161 | ) |
95c83464 JB |
162 | expect( |
163 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
164 | WorkerChoiceStrategies.LESS_USED | |
165 | ) | |
166 | ).toBeInstanceOf(LessUsedWorkerChoiceStrategy) | |
b2b1d84e JB |
167 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
168 | WorkerChoiceStrategies.LESS_USED | |
169 | ) | |
40ad1d27 JB |
170 | }) |
171 | ||
737c6d97 | 172 | it('Verify that setWorkerChoiceStrategy() works with LESS_USED and dynamic pool', () => { |
40ad1d27 JB |
173 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( |
174 | dynamicPool | |
175 | ) | |
176 | workerChoiceStrategyContext.setWorkerChoiceStrategy( | |
737c6d97 | 177 | WorkerChoiceStrategies.LESS_USED |
40ad1d27 | 178 | ) |
95c83464 JB |
179 | expect( |
180 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
181 | WorkerChoiceStrategies.LESS_USED | |
182 | ) | |
183 | ).toBeInstanceOf(LessUsedWorkerChoiceStrategy) | |
b2b1d84e JB |
184 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
185 | WorkerChoiceStrategies.LESS_USED | |
186 | ) | |
168c526f JB |
187 | }) |
188 | ||
189 | it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and fixed pool', () => { | |
190 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
191 | fixedPool | |
192 | ) | |
193 | workerChoiceStrategyContext.setWorkerChoiceStrategy( | |
194 | WorkerChoiceStrategies.LESS_BUSY | |
195 | ) | |
95c83464 JB |
196 | expect( |
197 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
198 | WorkerChoiceStrategies.LESS_BUSY | |
199 | ) | |
200 | ).toBeInstanceOf(LessBusyWorkerChoiceStrategy) | |
b2b1d84e JB |
201 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
202 | WorkerChoiceStrategies.LESS_BUSY | |
203 | ) | |
168c526f JB |
204 | }) |
205 | ||
206 | it('Verify that setWorkerChoiceStrategy() works with LESS_BUSY and dynamic pool', () => { | |
207 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
208 | dynamicPool | |
209 | ) | |
210 | workerChoiceStrategyContext.setWorkerChoiceStrategy( | |
211 | WorkerChoiceStrategies.LESS_BUSY | |
212 | ) | |
95c83464 JB |
213 | expect( |
214 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
215 | WorkerChoiceStrategies.LESS_BUSY | |
216 | ) | |
217 | ).toBeInstanceOf(LessBusyWorkerChoiceStrategy) | |
b2b1d84e JB |
218 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
219 | WorkerChoiceStrategies.LESS_BUSY | |
220 | ) | |
40ad1d27 | 221 | }) |
23ff945a JB |
222 | |
223 | it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and fixed pool', () => { | |
224 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
225 | fixedPool | |
226 | ) | |
227 | workerChoiceStrategyContext.setWorkerChoiceStrategy( | |
228 | WorkerChoiceStrategies.FAIR_SHARE | |
229 | ) | |
95c83464 JB |
230 | expect( |
231 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
232 | WorkerChoiceStrategies.FAIR_SHARE | |
233 | ) | |
234 | ).toBeInstanceOf(FairShareWorkerChoiceStrategy) | |
b2b1d84e JB |
235 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
236 | WorkerChoiceStrategies.FAIR_SHARE | |
237 | ) | |
23ff945a JB |
238 | }) |
239 | ||
240 | it('Verify that setWorkerChoiceStrategy() works with FAIR_SHARE and dynamic pool', () => { | |
241 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
242 | dynamicPool | |
243 | ) | |
244 | workerChoiceStrategyContext.setWorkerChoiceStrategy( | |
245 | WorkerChoiceStrategies.FAIR_SHARE | |
246 | ) | |
95c83464 JB |
247 | expect( |
248 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
249 | WorkerChoiceStrategies.FAIR_SHARE | |
250 | ) | |
251 | ).toBeInstanceOf(FairShareWorkerChoiceStrategy) | |
b2b1d84e JB |
252 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
253 | WorkerChoiceStrategies.FAIR_SHARE | |
254 | ) | |
23ff945a JB |
255 | }) |
256 | ||
c15273f2 JB |
257 | it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and fixed pool', () => { |
258 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
259 | fixedPool | |
260 | ) | |
261 | workerChoiceStrategyContext.setWorkerChoiceStrategy( | |
262 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
263 | ) | |
95c83464 JB |
264 | expect( |
265 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
266 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
267 | ) | |
268 | ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
269 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
270 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
271 | ) | |
c15273f2 | 272 | }) |
23ff945a | 273 | |
c15273f2 JB |
274 | it('Verify that setWorkerChoiceStrategy() works with WEIGHTED_ROUND_ROBIN and dynamic pool', () => { |
275 | const workerChoiceStrategyContext = new WorkerChoiceStrategyContext( | |
276 | dynamicPool | |
277 | ) | |
278 | workerChoiceStrategyContext.setWorkerChoiceStrategy( | |
279 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
280 | ) | |
95c83464 JB |
281 | expect( |
282 | workerChoiceStrategyContext.workerChoiceStrategies.get( | |
283 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
284 | ) | |
285 | ).toBeInstanceOf(WeightedRoundRobinWorkerChoiceStrategy) | |
b2b1d84e JB |
286 | expect(workerChoiceStrategyContext.workerChoiceStrategyType).toBe( |
287 | WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN | |
288 | ) | |
c15273f2 | 289 | }) |
40ad1d27 | 290 | }) |