1 const { expect
} = require('expect')
7 } = require('../../../lib')
8 const { CircularArray
} = require('../../../lib/circular-array')
10 describe('Selection strategies test suite', () => {
14 it('Verify that WorkerChoiceStrategies enumeration provides string values', () => {
15 expect(WorkerChoiceStrategies
.ROUND_ROBIN
).toBe('ROUND_ROBIN')
16 expect(WorkerChoiceStrategies
.LEAST_USED
).toBe('LEAST_USED')
17 expect(WorkerChoiceStrategies
.LEAST_BUSY
).toBe('LEAST_BUSY')
18 expect(WorkerChoiceStrategies
.LEAST_ELU
).toBe('LEAST_ELU')
19 expect(WorkerChoiceStrategies
.FAIR_SHARE
).toBe('FAIR_SHARE')
20 expect(WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
).toBe(
21 'WEIGHTED_ROUND_ROBIN'
23 expect(WorkerChoiceStrategies
.INTERLEAVED_WEIGHTED_ROUND_ROBIN
).toBe(
24 'INTERLEAVED_WEIGHTED_ROUND_ROBIN'
28 it('Verify ROUND_ROBIN strategy is the default at pool creation', async () => {
29 const pool
= new DynamicThreadPool(
32 './tests/worker-files/thread/testWorker.js'
34 expect(pool
.opts
.workerChoiceStrategy
).toBe(
35 WorkerChoiceStrategies
.ROUND_ROBIN
37 // We need to clean up the resources after our test
41 it('Verify available strategies are taken at pool creation', async () => {
42 for (const workerChoiceStrategy
of Object
.values(WorkerChoiceStrategies
)) {
43 const pool
= new FixedThreadPool(
45 './tests/worker-files/thread/testWorker.js',
46 { workerChoiceStrategy
}
48 expect(pool
.opts
.workerChoiceStrategy
).toBe(workerChoiceStrategy
)
49 expect(pool
.workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
56 it('Verify available strategies can be set after pool creation', async () => {
57 for (const workerChoiceStrategy
of Object
.values(WorkerChoiceStrategies
)) {
58 const pool
= new DynamicThreadPool(
61 './tests/worker-files/thread/testWorker.js'
63 pool
.setWorkerChoiceStrategy(workerChoiceStrategy
)
64 expect(pool
.opts
.workerChoiceStrategy
).toBe(workerChoiceStrategy
)
65 expect(pool
.workerChoiceStrategyContext
.workerChoiceStrategy
).toBe(
72 it('Verify available strategies default internals at pool creation', async () => {
73 const pool
= new FixedThreadPool(
75 './tests/worker-files/thread/testWorker.js'
77 for (const workerChoiceStrategy
of Object
.values(WorkerChoiceStrategies
)) {
78 if (workerChoiceStrategy
=== WorkerChoiceStrategies
.ROUND_ROBIN
) {
80 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
84 } else if (workerChoiceStrategy
=== WorkerChoiceStrategies
.FAIR_SHARE
) {
86 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
88 ).workersVirtualTaskEndTimestamp
89 ).toBeInstanceOf(Array
)
91 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
93 ).workersVirtualTaskEndTimestamp
.length
96 workerChoiceStrategy
=== WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
99 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
104 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
106 ).defaultWorkerWeight
109 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
111 ).workerVirtualTaskRunTime
118 it('Verify ROUND_ROBIN strategy default policy', async () => {
119 const workerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
120 let pool
= new FixedThreadPool(
122 './tests/worker-files/thread/testWorker.js',
123 { workerChoiceStrategy
}
125 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
126 dynamicWorkerUsage
: true,
127 dynamicWorkerReady
: true
130 pool
= new DynamicThreadPool(
133 './tests/worker-files/thread/testWorker.js',
134 { workerChoiceStrategy
}
136 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
137 dynamicWorkerUsage
: true,
138 dynamicWorkerReady
: true
140 // We need to clean up the resources after our test
144 it('Verify ROUND_ROBIN strategy default tasks statistics requirements', async () => {
145 const workerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
146 let pool
= new FixedThreadPool(
148 './tests/worker-files/thread/testWorker.js',
149 { workerChoiceStrategy
}
152 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
171 pool
= new DynamicThreadPool(
174 './tests/worker-files/thread/testWorker.js',
175 { workerChoiceStrategy
}
178 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
196 // We need to clean up the resources after our test
200 it('Verify ROUND_ROBIN strategy can be run in a fixed pool', async () => {
201 const pool
= new FixedThreadPool(
203 './tests/worker-files/thread/testWorker.js',
204 { workerChoiceStrategy
: WorkerChoiceStrategies
.ROUND_ROBIN
}
206 // TODO: Create a better test to cover `RoundRobinWorkerChoiceStrategy#choose`
207 const promises
= new Set()
208 const maxMultiplier
= 2
209 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
210 promises
.add(pool
.execute())
212 await Promise
.all(promises
)
213 for (const workerNode
of pool
.workerNodes
) {
214 expect(workerNode
.usage
).toStrictEqual({
216 executed
: maxMultiplier
,
223 history
: expect
.any(CircularArray
)
226 history
: expect
.any(CircularArray
)
230 history
: expect
.any(CircularArray
)
233 history
: expect
.any(CircularArray
)
239 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
240 WorkerChoiceStrategies
.ROUND_ROBIN
243 // We need to clean up the resources after our test
247 it('Verify ROUND_ROBIN strategy can be run in a dynamic pool', async () => {
248 const pool
= new DynamicThreadPool(
251 './tests/worker-files/thread/testWorker.js',
252 { workerChoiceStrategy
: WorkerChoiceStrategies
.ROUND_ROBIN
}
254 // TODO: Create a better test to cover `RoundRobinWorkerChoiceStrategy#choose`
255 const promises
= new Set()
256 const maxMultiplier
= 2
257 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
258 promises
.add(pool
.execute())
260 await Promise
.all(promises
)
261 for (const workerNode
of pool
.workerNodes
) {
262 expect(workerNode
.usage
).toStrictEqual({
264 executed
: maxMultiplier
,
271 history
: expect
.any(CircularArray
)
274 history
: expect
.any(CircularArray
)
278 history
: expect
.any(CircularArray
)
281 history
: expect
.any(CircularArray
)
287 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
288 WorkerChoiceStrategies
.ROUND_ROBIN
291 // We need to clean up the resources after our test
295 it('Verify ROUND_ROBIN strategy runtime behavior', async () => {
296 const workerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
297 let pool
= new FixedClusterPool(
299 './tests/worker-files/cluster/testWorker.js',
300 { workerChoiceStrategy
}
302 let results
= new Set()
303 for (let i
= 0; i
< max
; i
++) {
304 results
.add(pool
.workerNodes
[pool
.chooseWorkerNode()].worker
.id
)
306 expect(results
.size
).toBe(max
)
308 pool
= new FixedThreadPool(
310 './tests/worker-files/thread/testWorker.js',
311 { workerChoiceStrategy
}
314 for (let i
= 0; i
< max
; i
++) {
315 results
.add(pool
.workerNodes
[pool
.chooseWorkerNode()].worker
.threadId
)
317 expect(results
.size
).toBe(max
)
321 it('Verify ROUND_ROBIN strategy internals are resets after setting it', async () => {
322 const workerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
323 let pool
= new FixedThreadPool(
325 './tests/worker-files/thread/testWorker.js',
326 { workerChoiceStrategy
: WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
}
329 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
333 pool
.setWorkerChoiceStrategy(workerChoiceStrategy
)
335 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
336 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
340 pool
= new DynamicThreadPool(
343 './tests/worker-files/thread/testWorker.js',
344 { workerChoiceStrategy
: WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
}
347 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
351 pool
.setWorkerChoiceStrategy(workerChoiceStrategy
)
353 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
354 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
357 // We need to clean up the resources after our test
361 it('Verify LEAST_USED strategy default policy', async () => {
362 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_USED
363 let pool
= new FixedThreadPool(
365 './tests/worker-files/thread/testWorker.js',
366 { workerChoiceStrategy
}
368 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
369 dynamicWorkerUsage
: false,
370 dynamicWorkerReady
: true
373 pool
= new DynamicThreadPool(
376 './tests/worker-files/thread/testWorker.js',
377 { workerChoiceStrategy
}
379 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
380 dynamicWorkerUsage
: false,
381 dynamicWorkerReady
: true
383 // We need to clean up the resources after our test
387 it('Verify LEAST_USED strategy default tasks statistics requirements', async () => {
388 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_USED
389 let pool
= new FixedThreadPool(
391 './tests/worker-files/thread/testWorker.js',
392 { workerChoiceStrategy
}
395 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
414 pool
= new DynamicThreadPool(
417 './tests/worker-files/thread/testWorker.js',
418 { workerChoiceStrategy
}
421 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
439 // We need to clean up the resources after our test
443 it('Verify LEAST_USED strategy can be run in a fixed pool', async () => {
444 const pool
= new FixedThreadPool(
446 './tests/worker-files/thread/testWorker.js',
447 { workerChoiceStrategy
: WorkerChoiceStrategies
.LEAST_USED
}
449 // TODO: Create a better test to cover `LeastUsedWorkerChoiceStrategy#choose`
450 const promises
= new Set()
451 const maxMultiplier
= 2
452 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
453 promises
.add(pool
.execute())
455 await Promise
.all(promises
)
456 for (const workerNode
of pool
.workerNodes
) {
457 expect(workerNode
.usage
).toStrictEqual({
459 executed
: expect
.any(Number
),
466 history
: expect
.any(CircularArray
)
469 history
: expect
.any(CircularArray
)
473 history
: expect
.any(CircularArray
)
476 history
: expect
.any(CircularArray
)
480 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
481 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
485 // We need to clean up the resources after our test
489 it('Verify LEAST_USED strategy can be run in a dynamic pool', async () => {
490 const pool
= new DynamicThreadPool(
493 './tests/worker-files/thread/testWorker.js',
494 { workerChoiceStrategy
: WorkerChoiceStrategies
.LEAST_USED
}
496 // TODO: Create a better test to cover `LeastUsedWorkerChoiceStrategy#choose`
497 const promises
= new Set()
498 const maxMultiplier
= 2
499 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
500 promises
.add(pool
.execute())
502 await Promise
.all(promises
)
503 for (const workerNode
of pool
.workerNodes
) {
504 expect(workerNode
.usage
).toStrictEqual({
506 executed
: expect
.any(Number
),
513 history
: expect
.any(CircularArray
)
516 history
: expect
.any(CircularArray
)
520 history
: expect
.any(CircularArray
)
523 history
: expect
.any(CircularArray
)
527 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
528 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
532 // We need to clean up the resources after our test
536 it('Verify LEAST_BUSY strategy default policy', async () => {
537 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_BUSY
538 let pool
= new FixedThreadPool(
540 './tests/worker-files/thread/testWorker.js',
541 { workerChoiceStrategy
}
543 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
544 dynamicWorkerUsage
: false,
545 dynamicWorkerReady
: true
548 pool
= new DynamicThreadPool(
551 './tests/worker-files/thread/testWorker.js',
552 { workerChoiceStrategy
}
554 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
555 dynamicWorkerUsage
: false,
556 dynamicWorkerReady
: true
558 // We need to clean up the resources after our test
562 it('Verify LEAST_BUSY strategy default tasks statistics requirements', async () => {
563 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_BUSY
564 let pool
= new FixedThreadPool(
566 './tests/worker-files/thread/testWorker.js',
567 { workerChoiceStrategy
}
570 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
589 pool
= new DynamicThreadPool(
592 './tests/worker-files/thread/testWorker.js',
593 { workerChoiceStrategy
}
596 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
614 // We need to clean up the resources after our test
618 it('Verify LEAST_BUSY strategy can be run in a fixed pool', async () => {
619 const pool
= new FixedThreadPool(
621 './tests/worker-files/thread/testWorker.js',
622 { workerChoiceStrategy
: WorkerChoiceStrategies
.LEAST_BUSY
}
624 // TODO: Create a better test to cover `LeastBusyWorkerChoiceStrategy#choose`
625 const promises
= new Set()
626 const maxMultiplier
= 2
627 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
628 promises
.add(pool
.execute())
630 await Promise
.all(promises
)
631 for (const workerNode
of pool
.workerNodes
) {
632 expect(workerNode
.usage
).toMatchObject({
634 executed
: expect
.any(Number
),
641 history
: expect
.any(CircularArray
)
644 history
: expect
.any(CircularArray
)
648 history
: expect
.any(CircularArray
)
651 history
: expect
.any(CircularArray
)
655 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
656 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
659 if (workerNode
.usage
.runTime
.aggregate
== null) {
660 expect(workerNode
.usage
.runTime
.aggregate
).toBeUndefined()
662 expect(workerNode
.usage
.runTime
.aggregate
).toBeGreaterThan(0)
664 if (workerNode
.usage
.waitTime
.aggregate
== null) {
665 expect(workerNode
.usage
.waitTime
.aggregate
).toBeUndefined()
667 expect(workerNode
.usage
.waitTime
.aggregate
).toBeGreaterThan(0)
670 // We need to clean up the resources after our test
674 it('Verify LEAST_BUSY strategy can be run in a dynamic pool', async () => {
675 const pool
= new DynamicThreadPool(
678 './tests/worker-files/thread/testWorker.js',
679 { workerChoiceStrategy
: WorkerChoiceStrategies
.LEAST_BUSY
}
681 // TODO: Create a better test to cover `LeastBusyWorkerChoiceStrategy#choose`
682 const promises
= new Set()
683 const maxMultiplier
= 2
684 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
685 promises
.add(pool
.execute())
687 await Promise
.all(promises
)
688 for (const workerNode
of pool
.workerNodes
) {
689 expect(workerNode
.usage
).toMatchObject({
691 executed
: expect
.any(Number
),
698 history
: expect
.any(CircularArray
)
701 history
: expect
.any(CircularArray
)
705 history
: expect
.any(CircularArray
)
708 history
: expect
.any(CircularArray
)
712 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
713 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
716 if (workerNode
.usage
.runTime
.aggregate
== null) {
717 expect(workerNode
.usage
.runTime
.aggregate
).toBeUndefined()
719 expect(workerNode
.usage
.runTime
.aggregate
).toBeGreaterThan(0)
721 if (workerNode
.usage
.waitTime
.aggregate
== null) {
722 expect(workerNode
.usage
.waitTime
.aggregate
).toBeUndefined()
724 expect(workerNode
.usage
.waitTime
.aggregate
).toBeGreaterThan(0)
727 // We need to clean up the resources after our test
731 it('Verify LEAST_ELU strategy default policy', async () => {
732 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_ELU
733 let pool
= new FixedThreadPool(
735 './tests/worker-files/thread/testWorker.js',
736 { workerChoiceStrategy
}
738 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
739 dynamicWorkerUsage
: false,
740 dynamicWorkerReady
: true
743 pool
= new DynamicThreadPool(
746 './tests/worker-files/thread/testWorker.js',
747 { workerChoiceStrategy
}
749 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
750 dynamicWorkerUsage
: false,
751 dynamicWorkerReady
: true
753 // We need to clean up the resources after our test
757 it('Verify LEAST_ELU strategy default tasks statistics requirements', async () => {
758 const workerChoiceStrategy
= WorkerChoiceStrategies
.LEAST_ELU
759 let pool
= new FixedThreadPool(
761 './tests/worker-files/thread/testWorker.js',
762 { workerChoiceStrategy
}
765 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
784 pool
= new DynamicThreadPool(
787 './tests/worker-files/thread/testWorker.js',
788 { workerChoiceStrategy
}
791 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
809 // We need to clean up the resources after our test
813 it('Verify LEAST_ELU strategy can be run in a fixed pool', async () => {
814 const pool
= new FixedThreadPool(
816 './tests/worker-files/thread/testWorker.js',
817 { workerChoiceStrategy
: WorkerChoiceStrategies
.LEAST_ELU
}
819 // TODO: Create a better test to cover `LeastEluWorkerChoiceStrategy#choose`
820 const promises
= new Set()
821 const maxMultiplier
= 2
822 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
823 promises
.add(pool
.execute())
825 await Promise
.all(promises
)
826 for (const workerNode
of pool
.workerNodes
) {
827 expect(workerNode
.usage
).toMatchObject({
829 executed
: expect
.any(Number
),
836 history
: expect
.any(CircularArray
)
839 history
: expect
.any(CircularArray
)
842 idle
: expect
.objectContaining({
843 history
: expect
.any(CircularArray
)
845 active
: expect
.objectContaining({
846 history
: expect
.any(CircularArray
)
850 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
851 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
854 if (workerNode
.usage
.elu
.utilization
== null) {
855 expect(workerNode
.usage
.elu
.utilization
).toBeUndefined()
857 expect(workerNode
.usage
.elu
.utilization
).toBeGreaterThanOrEqual(0)
858 expect(workerNode
.usage
.elu
.utilization
).toBeLessThanOrEqual(1)
861 // We need to clean up the resources after our test
865 it('Verify LEAST_ELU strategy can be run in a dynamic pool', async () => {
866 const pool
= new DynamicThreadPool(
869 './tests/worker-files/thread/testWorker.js',
870 { workerChoiceStrategy
: WorkerChoiceStrategies
.LEAST_ELU
}
872 // TODO: Create a better test to cover `LeastEluWorkerChoiceStrategy#choose`
873 const promises
= new Set()
874 const maxMultiplier
= 2
875 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
876 promises
.add(pool
.execute())
878 await Promise
.all(promises
)
879 for (const workerNode
of pool
.workerNodes
) {
880 expect(workerNode
.usage
).toMatchObject({
882 executed
: expect
.any(Number
),
889 history
: expect
.any(CircularArray
)
892 history
: expect
.any(CircularArray
)
895 idle
: expect
.objectContaining({
896 history
: expect
.any(CircularArray
)
898 active
: expect
.objectContaining({
899 history
: expect
.any(CircularArray
)
903 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
904 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
907 if (workerNode
.usage
.elu
.utilization
== null) {
908 expect(workerNode
.usage
.elu
.utilization
).toBeUndefined()
910 expect(workerNode
.usage
.elu
.utilization
).toBeGreaterThanOrEqual(0)
911 expect(workerNode
.usage
.elu
.utilization
).toBeLessThanOrEqual(1)
914 // We need to clean up the resources after our test
918 it('Verify FAIR_SHARE strategy default policy', async () => {
919 const workerChoiceStrategy
= WorkerChoiceStrategies
.FAIR_SHARE
920 let pool
= new FixedThreadPool(
922 './tests/worker-files/thread/testWorker.js',
923 { workerChoiceStrategy
}
925 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
926 dynamicWorkerUsage
: false,
927 dynamicWorkerReady
: true
930 pool
= new DynamicThreadPool(
933 './tests/worker-files/thread/testWorker.js',
934 { workerChoiceStrategy
}
936 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
937 dynamicWorkerUsage
: false,
938 dynamicWorkerReady
: true
940 // We need to clean up the resources after our test
944 it('Verify FAIR_SHARE strategy default tasks statistics requirements', async () => {
945 const workerChoiceStrategy
= WorkerChoiceStrategies
.FAIR_SHARE
946 let pool
= new FixedThreadPool(
948 './tests/worker-files/thread/testWorker.js',
949 { workerChoiceStrategy
}
952 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
971 pool
= new DynamicThreadPool(
974 './tests/worker-files/thread/testWorker.js',
975 { workerChoiceStrategy
}
978 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
996 // We need to clean up the resources after our test
1000 it('Verify FAIR_SHARE strategy can be run in a fixed pool', async () => {
1001 const pool
= new FixedThreadPool(
1003 './tests/worker-files/thread/testWorker.js',
1004 { workerChoiceStrategy
: WorkerChoiceStrategies
.FAIR_SHARE
}
1006 // TODO: Create a better test to cover `FairShareChoiceStrategy#choose`
1007 const promises
= new Set()
1008 const maxMultiplier
= 2
1009 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
1010 promises
.add(pool
.execute())
1012 await Promise
.all(promises
)
1013 for (const workerNode
of pool
.workerNodes
) {
1014 expect(workerNode
.usage
).toMatchObject({
1016 executed
: expect
.any(Number
),
1022 runTime
: expect
.objectContaining({
1023 history
: expect
.any(CircularArray
)
1026 history
: expect
.any(CircularArray
)
1029 idle
: expect
.objectContaining({
1030 history
: expect
.any(CircularArray
)
1032 active
: expect
.objectContaining({
1033 history
: expect
.any(CircularArray
)
1037 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
1038 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
1041 if (workerNode
.usage
.runTime
.aggregate
== null) {
1042 expect(workerNode
.usage
.runTime
.aggregate
).toBeUndefined()
1044 expect(workerNode
.usage
.runTime
.aggregate
).toBeGreaterThan(0)
1046 if (workerNode
.usage
.runTime
.average
== null) {
1047 expect(workerNode
.usage
.runTime
.average
).toBeUndefined()
1049 expect(workerNode
.usage
.runTime
.average
).toBeGreaterThan(0)
1051 if (workerNode
.usage
.elu
.utilization
== null) {
1052 expect(workerNode
.usage
.elu
.utilization
).toBeUndefined()
1054 expect(workerNode
.usage
.elu
.utilization
).toBeGreaterThanOrEqual(0)
1055 expect(workerNode
.usage
.elu
.utilization
).toBeLessThanOrEqual(1)
1059 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1060 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1061 ).workersVirtualTaskEndTimestamp
.length
1062 ).toBe(pool
.workerNodes
.length
)
1063 // We need to clean up the resources after our test
1064 await pool
.destroy()
1067 it('Verify FAIR_SHARE strategy can be run in a dynamic pool', async () => {
1068 const pool
= new DynamicThreadPool(
1071 './tests/worker-files/thread/testWorker.js',
1072 { workerChoiceStrategy
: WorkerChoiceStrategies
.FAIR_SHARE
}
1074 // TODO: Create a better test to cover `FairShareChoiceStrategy#choose`
1075 const promises
= new Set()
1076 const maxMultiplier
= 2
1077 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
1078 promises
.add(pool
.execute())
1080 await Promise
.all(promises
)
1081 for (const workerNode
of pool
.workerNodes
) {
1082 expect(workerNode
.usage
).toMatchObject({
1084 executed
: expect
.any(Number
),
1090 runTime
: expect
.objectContaining({
1091 history
: expect
.any(CircularArray
)
1094 history
: expect
.any(CircularArray
)
1097 idle
: expect
.objectContaining({
1098 history
: expect
.any(CircularArray
)
1100 active
: expect
.objectContaining({
1101 history
: expect
.any(CircularArray
)
1105 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
1106 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
1109 if (workerNode
.usage
.runTime
.aggregate
== null) {
1110 expect(workerNode
.usage
.runTime
.aggregate
).toBeUndefined()
1112 expect(workerNode
.usage
.runTime
.aggregate
).toBeGreaterThan(0)
1114 if (workerNode
.usage
.runTime
.average
== null) {
1115 expect(workerNode
.usage
.runTime
.average
).toBeUndefined()
1117 expect(workerNode
.usage
.runTime
.average
).toBeGreaterThan(0)
1119 if (workerNode
.usage
.elu
.utilization
== null) {
1120 expect(workerNode
.usage
.elu
.utilization
).toBeUndefined()
1122 expect(workerNode
.usage
.elu
.utilization
).toBeGreaterThanOrEqual(0)
1123 expect(workerNode
.usage
.elu
.utilization
).toBeLessThanOrEqual(1)
1127 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1128 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1129 ).workersVirtualTaskEndTimestamp
.length
1130 ).toBe(pool
.workerNodes
.length
)
1131 // We need to clean up the resources after our test
1132 await pool
.destroy()
1135 it('Verify FAIR_SHARE strategy can be run in a dynamic pool with median runtime statistic', async () => {
1136 const pool
= new DynamicThreadPool(
1139 './tests/worker-files/thread/testWorker.js',
1141 workerChoiceStrategy
: WorkerChoiceStrategies
.FAIR_SHARE
,
1142 workerChoiceStrategyOptions
: {
1143 runTime
: { median
: true }
1147 // TODO: Create a better test to cover `FairShareChoiceStrategy#choose`
1148 const promises
= new Set()
1149 const maxMultiplier
= 2
1150 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
1151 promises
.add(pool
.execute())
1153 await Promise
.all(promises
)
1154 for (const workerNode
of pool
.workerNodes
) {
1155 expect(workerNode
.usage
).toMatchObject({
1157 executed
: expect
.any(Number
),
1163 runTime
: expect
.objectContaining({
1164 history
: expect
.any(CircularArray
)
1167 history
: expect
.any(CircularArray
)
1170 idle
: expect
.objectContaining({
1171 history
: expect
.any(CircularArray
)
1173 active
: expect
.objectContaining({
1174 history
: expect
.any(CircularArray
)
1178 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
1179 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
1182 if (workerNode
.usage
.runTime
.aggregate
== null) {
1183 expect(workerNode
.usage
.runTime
.aggregate
).toBeUndefined()
1185 expect(workerNode
.usage
.runTime
.aggregate
).toBeGreaterThan(0)
1187 if (workerNode
.usage
.runTime
.median
== null) {
1188 expect(workerNode
.usage
.runTime
.median
).toBeUndefined()
1190 expect(workerNode
.usage
.runTime
.median
).toBeGreaterThan(0)
1192 if (workerNode
.usage
.elu
.utilization
== null) {
1193 expect(workerNode
.usage
.elu
.utilization
).toBeUndefined()
1195 expect(workerNode
.usage
.elu
.utilization
).toBeGreaterThanOrEqual(0)
1196 expect(workerNode
.usage
.elu
.utilization
).toBeLessThanOrEqual(1)
1200 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1201 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1202 ).workersVirtualTaskEndTimestamp
.length
1203 ).toBe(pool
.workerNodes
.length
)
1204 // We need to clean up the resources after our test
1205 await pool
.destroy()
1208 it('Verify FAIR_SHARE strategy internals are resets after setting it', async () => {
1209 const workerChoiceStrategy
= WorkerChoiceStrategies
.FAIR_SHARE
1210 let pool
= new FixedThreadPool(
1212 './tests/worker-files/thread/testWorker.js'
1215 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1216 workerChoiceStrategy
1217 ).workersVirtualTaskEndTimestamp
1218 ).toBeInstanceOf(Array
)
1220 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1221 workerChoiceStrategy
1222 ).workersVirtualTaskEndTimestamp
.length
1224 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1225 workerChoiceStrategy
1226 ).workersVirtualTaskEndTimestamp
[0] = performance
.now()
1228 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1229 workerChoiceStrategy
1230 ).workersVirtualTaskEndTimestamp
.length
1232 pool
.setWorkerChoiceStrategy(workerChoiceStrategy
)
1234 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1235 workerChoiceStrategy
1236 ).workersVirtualTaskEndTimestamp
1237 ).toBeInstanceOf(Array
)
1239 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1240 workerChoiceStrategy
1241 ).workersVirtualTaskEndTimestamp
.length
1243 await pool
.destroy()
1244 pool
= new DynamicThreadPool(
1247 './tests/worker-files/thread/testWorker.js'
1250 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1251 workerChoiceStrategy
1252 ).workersVirtualTaskEndTimestamp
1253 ).toBeInstanceOf(Array
)
1255 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1256 workerChoiceStrategy
1257 ).workersVirtualTaskEndTimestamp
.length
1259 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1260 workerChoiceStrategy
1261 ).workersVirtualTaskEndTimestamp
[0] = performance
.now()
1263 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1264 workerChoiceStrategy
1265 ).workersVirtualTaskEndTimestamp
.length
1267 pool
.setWorkerChoiceStrategy(workerChoiceStrategy
)
1269 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1270 workerChoiceStrategy
1271 ).workersVirtualTaskEndTimestamp
1272 ).toBeInstanceOf(Array
)
1274 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1275 workerChoiceStrategy
1276 ).workersVirtualTaskEndTimestamp
.length
1278 // We need to clean up the resources after our test
1279 await pool
.destroy()
1282 it('Verify WEIGHTED_ROUND_ROBIN strategy default policy', async () => {
1283 const workerChoiceStrategy
= WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
1284 let pool
= new FixedThreadPool(
1286 './tests/worker-files/thread/testWorker.js',
1287 { workerChoiceStrategy
}
1289 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
1290 dynamicWorkerUsage
: false,
1291 dynamicWorkerReady
: true
1293 await pool
.destroy()
1294 pool
= new DynamicThreadPool(
1297 './tests/worker-files/thread/testWorker.js',
1298 { workerChoiceStrategy
}
1300 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
1301 dynamicWorkerUsage
: false,
1302 dynamicWorkerReady
: true
1304 // We need to clean up the resources after our test
1305 await pool
.destroy()
1308 it('Verify WEIGHTED_ROUND_ROBIN strategy default tasks statistics requirements', async () => {
1309 const workerChoiceStrategy
= WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
1310 let pool
= new FixedThreadPool(
1312 './tests/worker-files/thread/testWorker.js',
1313 { workerChoiceStrategy
}
1316 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
1334 await pool
.destroy()
1335 pool
= new DynamicThreadPool(
1338 './tests/worker-files/thread/testWorker.js',
1339 { workerChoiceStrategy
}
1342 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
1360 // We need to clean up the resources after our test
1361 await pool
.destroy()
1364 it('Verify WEIGHTED_ROUND_ROBIN strategy can be run in a fixed pool', async () => {
1365 const pool
= new FixedThreadPool(
1367 './tests/worker-files/thread/testWorker.js',
1368 { workerChoiceStrategy
: WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
}
1370 // TODO: Create a better test to cover `WeightedRoundRobinWorkerChoiceStrategy#choose`
1371 const promises
= new Set()
1372 const maxMultiplier
= 2
1373 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
1374 promises
.add(pool
.execute())
1376 await Promise
.all(promises
)
1377 for (const workerNode
of pool
.workerNodes
) {
1378 expect(workerNode
.usage
).toStrictEqual({
1380 executed
: expect
.any(Number
),
1386 runTime
: expect
.objectContaining({
1387 history
: expect
.any(CircularArray
)
1390 history
: expect
.any(CircularArray
)
1394 history
: expect
.any(CircularArray
)
1397 history
: expect
.any(CircularArray
)
1401 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
1402 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
1405 if (workerNode
.usage
.runTime
.aggregate
== null) {
1406 expect(workerNode
.usage
.runTime
.aggregate
).toBeUndefined()
1408 expect(workerNode
.usage
.runTime
.aggregate
).toBeGreaterThan(0)
1410 if (workerNode
.usage
.runTime
.average
== null) {
1411 expect(workerNode
.usage
.runTime
.average
).toBeUndefined()
1413 expect(workerNode
.usage
.runTime
.average
).toBeGreaterThan(0)
1417 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1418 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1419 ).defaultWorkerWeight
1420 ).toBeGreaterThan(0)
1422 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1423 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1424 ).workerVirtualTaskRunTime
1425 ).toBeGreaterThanOrEqual(0)
1426 // We need to clean up the resources after our test
1427 await pool
.destroy()
1430 it('Verify WEIGHTED_ROUND_ROBIN strategy can be run in a dynamic pool', async () => {
1431 const pool
= new DynamicThreadPool(
1434 './tests/worker-files/thread/testWorker.js',
1435 { workerChoiceStrategy
: WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
}
1437 // TODO: Create a better test to cover `WeightedRoundRobinWorkerChoiceStrategy#choose`
1438 const promises
= new Set()
1439 const maxMultiplier
= 2
1440 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
1441 promises
.add(pool
.execute())
1443 await Promise
.all(promises
)
1444 for (const workerNode
of pool
.workerNodes
) {
1445 expect(workerNode
.usage
).toStrictEqual({
1447 executed
: expect
.any(Number
),
1453 runTime
: expect
.objectContaining({
1454 history
: expect
.any(CircularArray
)
1457 history
: expect
.any(CircularArray
)
1461 history
: expect
.any(CircularArray
)
1464 history
: expect
.any(CircularArray
)
1468 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
1469 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
1472 if (workerNode
.usage
.runTime
.aggregate
== null) {
1473 expect(workerNode
.usage
.runTime
.aggregate
).toBeUndefined()
1475 expect(workerNode
.usage
.runTime
.aggregate
).toBeGreaterThan(0)
1477 if (workerNode
.usage
.runTime
.average
== null) {
1478 expect(workerNode
.usage
.runTime
.average
).toBeUndefined()
1480 expect(workerNode
.usage
.runTime
.average
).toBeGreaterThan(0)
1484 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1485 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1486 ).defaultWorkerWeight
1487 ).toBeGreaterThan(0)
1489 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1490 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1491 ).workerVirtualTaskRunTime
1492 ).toBeGreaterThanOrEqual(0)
1493 // We need to clean up the resources after our test
1494 await pool
.destroy()
1497 it('Verify WEIGHTED_ROUND_ROBIN strategy can be run in a dynamic pool with median runtime statistic', async () => {
1498 const pool
= new DynamicThreadPool(
1501 './tests/worker-files/thread/testWorker.js',
1503 workerChoiceStrategy
: WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
,
1504 workerChoiceStrategyOptions
: {
1505 runTime
: { median
: true }
1509 // TODO: Create a better test to cover `WeightedRoundRobinWorkerChoiceStrategy#choose`
1510 const promises
= new Set()
1511 const maxMultiplier
= 2
1512 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
1513 promises
.add(pool
.execute())
1515 await Promise
.all(promises
)
1516 for (const workerNode
of pool
.workerNodes
) {
1517 expect(workerNode
.usage
).toStrictEqual({
1519 executed
: expect
.any(Number
),
1525 runTime
: expect
.objectContaining({
1526 history
: expect
.any(CircularArray
)
1529 history
: expect
.any(CircularArray
)
1533 history
: expect
.any(CircularArray
)
1536 history
: expect
.any(CircularArray
)
1540 expect(workerNode
.usage
.tasks
.executed
).toBeGreaterThanOrEqual(0)
1541 expect(workerNode
.usage
.tasks
.executed
).toBeLessThanOrEqual(
1544 if (workerNode
.usage
.runTime
.aggregate
== null) {
1545 expect(workerNode
.usage
.runTime
.aggregate
).toBeUndefined()
1547 expect(workerNode
.usage
.runTime
.aggregate
).toBeGreaterThan(0)
1549 if (workerNode
.usage
.runTime
.median
== null) {
1550 expect(workerNode
.usage
.runTime
.median
).toBeUndefined()
1552 expect(workerNode
.usage
.runTime
.median
).toBeGreaterThan(0)
1556 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1557 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1558 ).defaultWorkerWeight
1559 ).toBeGreaterThan(0)
1561 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1562 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1563 ).workerVirtualTaskRunTime
1564 ).toBeGreaterThanOrEqual(0)
1565 // We need to clean up the resources after our test
1566 await pool
.destroy()
1569 it('Verify WEIGHTED_ROUND_ROBIN strategy internals are resets after setting it', async () => {
1570 const workerChoiceStrategy
= WorkerChoiceStrategies
.WEIGHTED_ROUND_ROBIN
1571 let pool
= new FixedThreadPool(
1573 './tests/worker-files/thread/testWorker.js'
1576 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1577 workerChoiceStrategy
1581 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1582 workerChoiceStrategy
1583 ).defaultWorkerWeight
1586 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1587 workerChoiceStrategy
1588 ).workerVirtualTaskRunTime
1590 pool
.setWorkerChoiceStrategy(workerChoiceStrategy
)
1592 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1593 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1597 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1598 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1599 ).defaultWorkerWeight
1600 ).toBeGreaterThan(0)
1602 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1603 workerChoiceStrategy
1604 ).workerVirtualTaskRunTime
1606 await pool
.destroy()
1607 pool
= new DynamicThreadPool(
1610 './tests/worker-files/thread/testWorker.js'
1613 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1614 workerChoiceStrategy
1618 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1619 workerChoiceStrategy
1620 ).defaultWorkerWeight
1623 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1624 workerChoiceStrategy
1625 ).workerVirtualTaskRunTime
1627 pool
.setWorkerChoiceStrategy(workerChoiceStrategy
)
1629 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1630 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1634 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1635 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1636 ).defaultWorkerWeight
1637 ).toBeGreaterThan(0)
1639 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1640 workerChoiceStrategy
1641 ).workerVirtualTaskRunTime
1643 // We need to clean up the resources after our test
1644 await pool
.destroy()
1647 it('Verify INTERLEAVED_WEIGHTED_ROUND_ROBIN strategy default policy', async () => {
1648 const workerChoiceStrategy
=
1649 WorkerChoiceStrategies
.INTERLEAVED_WEIGHTED_ROUND_ROBIN
1650 let pool
= new FixedThreadPool(
1652 './tests/worker-files/thread/testWorker.js',
1653 { workerChoiceStrategy
}
1655 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
1656 dynamicWorkerUsage
: false,
1657 dynamicWorkerReady
: true
1659 await pool
.destroy()
1660 pool
= new DynamicThreadPool(
1663 './tests/worker-files/thread/testWorker.js',
1664 { workerChoiceStrategy
}
1666 expect(pool
.workerChoiceStrategyContext
.getStrategyPolicy()).toStrictEqual({
1667 dynamicWorkerUsage
: false,
1668 dynamicWorkerReady
: true
1670 // We need to clean up the resources after our test
1671 await pool
.destroy()
1674 it('Verify INTERLEAVED_WEIGHTED_ROUND_ROBIN strategy default tasks statistics requirements', async () => {
1675 const workerChoiceStrategy
=
1676 WorkerChoiceStrategies
.INTERLEAVED_WEIGHTED_ROUND_ROBIN
1677 let pool
= new FixedThreadPool(
1679 './tests/worker-files/thread/testWorker.js',
1680 { workerChoiceStrategy
}
1683 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
1701 await pool
.destroy()
1702 pool
= new DynamicThreadPool(
1705 './tests/worker-files/thread/testWorker.js',
1706 { workerChoiceStrategy
}
1709 pool
.workerChoiceStrategyContext
.getTaskStatisticsRequirements()
1727 // We need to clean up the resources after our test
1728 await pool
.destroy()
1731 it('Verify INTERLEAVED_WEIGHTED_ROUND_ROBIN strategy can be run in a fixed pool', async () => {
1732 const pool
= new FixedThreadPool(
1734 './tests/worker-files/thread/testWorker.js',
1736 workerChoiceStrategy
:
1737 WorkerChoiceStrategies
.INTERLEAVED_WEIGHTED_ROUND_ROBIN
1740 // TODO: Create a better test to cover `InterleavedWeightedRoundRobinWorkerChoiceStrategy#choose`
1741 const promises
= new Set()
1742 const maxMultiplier
= 2
1743 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
1744 promises
.add(pool
.execute())
1746 await Promise
.all(promises
)
1747 for (const workerNode
of pool
.workerNodes
) {
1748 expect(workerNode
.usage
).toStrictEqual({
1750 executed
: maxMultiplier
,
1757 history
: expect
.any(CircularArray
)
1760 history
: expect
.any(CircularArray
)
1764 history
: expect
.any(CircularArray
)
1767 history
: expect
.any(CircularArray
)
1773 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1774 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1775 ).defaultWorkerWeight
1776 ).toBeGreaterThan(0)
1778 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1779 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1783 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1784 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1788 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1789 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1792 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1793 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1794 ).defaultWorkerWeight
1796 // We need to clean up the resources after our test
1797 await pool
.destroy()
1800 it('Verify INTERLEAVED_WEIGHTED_ROUND_ROBIN strategy can be run in a dynamic pool', async () => {
1801 const pool
= new DynamicThreadPool(
1804 './tests/worker-files/thread/testWorker.js',
1806 workerChoiceStrategy
:
1807 WorkerChoiceStrategies
.INTERLEAVED_WEIGHTED_ROUND_ROBIN
1810 // TODO: Create a better test to cover `InterleavedWeightedRoundRobinWorkerChoiceStrategy#choose`
1811 const promises
= new Set()
1812 const maxMultiplier
= 2
1813 for (let i
= 0; i
< max
* maxMultiplier
; i
++) {
1814 promises
.add(pool
.execute())
1816 await Promise
.all(promises
)
1817 for (const workerNode
of pool
.workerNodes
) {
1818 expect(workerNode
.usage
).toStrictEqual({
1820 executed
: expect
.any(Number
),
1827 history
: expect
.any(CircularArray
)
1830 history
: expect
.any(CircularArray
)
1834 history
: expect
.any(CircularArray
)
1837 history
: expect
.any(CircularArray
)
1843 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1844 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1845 ).defaultWorkerWeight
1846 ).toBeGreaterThan(0)
1848 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1849 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1853 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1854 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1858 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1859 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1862 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1863 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1864 ).defaultWorkerWeight
1866 // We need to clean up the resources after our test
1867 await pool
.destroy()
1870 it('Verify INTERLEAVED_WEIGHTED_ROUND_ROBIN strategy internals are resets after setting it', async () => {
1871 const workerChoiceStrategy
=
1872 WorkerChoiceStrategies
.INTERLEAVED_WEIGHTED_ROUND_ROBIN
1873 let pool
= new FixedThreadPool(
1875 './tests/worker-files/thread/testWorker.js'
1878 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1879 workerChoiceStrategy
1883 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1884 workerChoiceStrategy
1888 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1889 workerChoiceStrategy
1890 ).defaultWorkerWeight
1893 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1894 workerChoiceStrategy
1897 pool
.setWorkerChoiceStrategy(workerChoiceStrategy
)
1899 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1900 workerChoiceStrategy
1904 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1905 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1909 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1910 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1911 ).defaultWorkerWeight
1912 ).toBeGreaterThan(0)
1914 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1915 workerChoiceStrategy
1918 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1919 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1920 ).defaultWorkerWeight
1922 await pool
.destroy()
1923 pool
= new DynamicThreadPool(
1926 './tests/worker-files/thread/testWorker.js'
1929 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1930 workerChoiceStrategy
1934 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1935 workerChoiceStrategy
1939 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1940 workerChoiceStrategy
1941 ).defaultWorkerWeight
1944 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1945 workerChoiceStrategy
1948 pool
.setWorkerChoiceStrategy(workerChoiceStrategy
)
1950 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1951 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1955 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1956 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1957 ).defaultWorkerWeight
1958 ).toBeGreaterThan(0)
1960 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1961 workerChoiceStrategy
1964 pool
.workerChoiceStrategyContext
.workerChoiceStrategies
.get(
1965 pool
.workerChoiceStrategyContext
.workerChoiceStrategy
1966 ).defaultWorkerWeight
1968 // We need to clean up the resources after our test
1969 await pool
.destroy()
1972 it('Verify unknown strategy throw error', () => {
1975 new DynamicThreadPool(
1978 './tests/worker-files/thread/testWorker.js',
1979 { workerChoiceStrategy
: 'UNKNOWN_STRATEGY' }
1981 ).toThrowError("Invalid worker choice strategy 'UNKNOWN_STRATEGY'")