Commit | Line | Data |
---|---|---|
a61a0724 | 1 | const { expect } = require('expect') |
325f50bc | 2 | const { DynamicThreadPool } = require('../../../lib/index') |
85a3f8a7 | 3 | const TestUtils = require('../../test-utils') |
506c2a14 | 4 | const min = 1 |
c719859c | 5 | const max = 3 |
325f50bc S |
6 | const pool = new DynamicThreadPool( |
7 | min, | |
8 | max, | |
76b1e974 | 9 | './tests/worker-files/thread/testWorker.js', |
325f50bc | 10 | { |
e5177d86 | 11 | errorHandler: e => console.error(e) |
325f50bc S |
12 | } |
13 | ) | |
506c2a14 | 14 | |
a35560ba | 15 | describe('Dynamic thread pool test suite', () => { |
506c2a14 | 16 | it('Verify that the function is executed in a worker thread', async () => { |
17 | const result = await pool.execute({ test: 'test' }) | |
18 | expect(result).toBeDefined() | |
19 | expect(result).toBeFalsy() | |
20 | }) | |
21 | ||
22 | it('Verify that new workers are created when required, max size is not exceeded and that after a while new workers will die', async () => { | |
23 | const promises = [] | |
7c0ba920 JB |
24 | let poolBusy = 0 |
25 | pool.emitter.on('busy', () => poolBusy++) | |
cf9aa6c3 | 26 | for (let i = 0; i < max * 2; i++) { |
506c2a14 | 27 | promises.push(pool.execute({ test: 'test' })) |
28 | } | |
29 | expect(pool.workers.length).toBe(max) | |
14916bf9 JB |
30 | // The `busy` event is triggered when the number of submitted tasks at once reach the max number of workers in the dynamic pool. |
31 | // So in total numberOfWorkers + 1 times for a loop submitting up to numberOfWorkers * 2 tasks to the dynamic pool. | |
8620fb25 | 32 | expect(poolBusy).toBe(max + 1) |
bdacc2d2 JB |
33 | const numberOfExitEvents = await TestUtils.waitExits(pool, max - min) |
34 | expect(numberOfExitEvents).toBe(max - min) | |
506c2a14 | 35 | }) |
36 | ||
bcf04003 | 37 | it('Verify scale thread up and down is working', async () => { |
38 | expect(pool.workers.length).toBe(min) | |
39 | for (let i = 0; i < max * 10; i++) { | |
40 | pool.execute({ test: 'test' }) | |
41 | } | |
42 | expect(pool.workers.length).toBe(max) | |
85a3f8a7 | 43 | await TestUtils.waitExits(pool, max - min) |
bcf04003 | 44 | expect(pool.workers.length).toBe(min) |
45 | for (let i = 0; i < max * 10; i++) { | |
46 | pool.execute({ test: 'test' }) | |
47 | } | |
48 | expect(pool.workers.length).toBe(max) | |
85a3f8a7 | 49 | await TestUtils.waitExits(pool, max - min) |
bcf04003 | 50 | expect(pool.workers.length).toBe(min) |
51 | }) | |
c01733f1 | 52 | |
506c2a14 | 53 | it('Shutdown test', async () => { |
cf597bc5 | 54 | const exitPromise = TestUtils.waitExits(pool, min) |
1f9a5a44 | 55 | await pool.destroy() |
cf597bc5 JB |
56 | const numberOfExitEvents = await exitPromise |
57 | expect(numberOfExitEvents).toBe(min) | |
506c2a14 | 58 | }) |
59 | ||
8d3782fa JB |
60 | it('Validation of inputs test', () => { |
61 | expect(() => new DynamicThreadPool(min)).toThrowError( | |
85a3f8a7 APA |
62 | new Error('Please specify a file with a worker implementation') |
63 | ) | |
506c2a14 | 64 | }) |
65 | ||
66 | it('Should work even without opts in input', async () => { | |
325f50bc S |
67 | const pool1 = new DynamicThreadPool( |
68 | 1, | |
69 | 1, | |
76b1e974 | 70 | './tests/worker-files/thread/testWorker.js' |
325f50bc | 71 | ) |
506c2a14 | 72 | const res = await pool1.execute({ test: 'test' }) |
8620fb25 | 73 | expect(res).toBeDefined() |
506c2a14 | 74 | expect(res).toBeFalsy() |
0e2503fc JB |
75 | // We need to clean up the resources after our test |
76 | await pool1.destroy() | |
506c2a14 | 77 | }) |
c01733f1 | 78 | |
4c35177b | 79 | it('Verify scale thread up and down is working when long running task is used:hard', async () => { |
c01733f1 | 80 | const longRunningPool = new DynamicThreadPool( |
81 | min, | |
82 | max, | |
85a3f8a7 | 83 | './tests/worker-files/thread/longRunningWorkerHardBehavior.js', |
4c35177b | 84 | { |
85 | errorHandler: e => console.error(e), | |
292ad316 JB |
86 | onlineHandler: () => console.log('long running worker is online'), |
87 | exitHandler: () => console.log('long running worker exited') | |
4c35177b | 88 | } |
89 | ) | |
90 | expect(longRunningPool.workers.length).toBe(min) | |
91 | for (let i = 0; i < max * 10; i++) { | |
92 | longRunningPool.execute({ test: 'test' }) | |
93 | } | |
94 | expect(longRunningPool.workers.length).toBe(max) | |
85a3f8a7 | 95 | await TestUtils.waitExits(longRunningPool, max - min) |
4c35177b | 96 | expect(longRunningPool.workers.length).toBe(min) |
0e2503fc JB |
97 | // We need to clean up the resources after our test |
98 | await longRunningPool.destroy() | |
4c35177b | 99 | }) |
100 | ||
101 | it('Verify scale thread up and down is working when long running task is used:soft', async () => { | |
102 | const longRunningPool = new DynamicThreadPool( | |
103 | min, | |
104 | max, | |
85a3f8a7 | 105 | './tests/worker-files/thread/longRunningWorkerSoftBehavior.js', |
c01733f1 | 106 | { |
107 | errorHandler: e => console.error(e), | |
292ad316 JB |
108 | onlineHandler: () => console.log('long running worker is online'), |
109 | exitHandler: () => console.log('long running worker exited') | |
c01733f1 | 110 | } |
111 | ) | |
112 | expect(longRunningPool.workers.length).toBe(min) | |
113 | for (let i = 0; i < max * 10; i++) { | |
114 | longRunningPool.execute({ test: 'test' }) | |
115 | } | |
116 | expect(longRunningPool.workers.length).toBe(max) | |
85a3f8a7 | 117 | await TestUtils.sleep(1500) |
c01733f1 | 118 | // Here we expect the workers to be at the max size since that the task is still running |
119 | expect(longRunningPool.workers.length).toBe(max) | |
0e2503fc JB |
120 | // We need to clean up the resources after our test |
121 | await longRunningPool.destroy() | |
c01733f1 | 122 | }) |
8d3782fa JB |
123 | |
124 | it('Verify that a pool with zero worker can be instantiated', async () => { | |
125 | const pool = new DynamicThreadPool( | |
126 | 0, | |
127 | max, | |
128 | './tests/worker-files/thread/testWorker.js' | |
129 | ) | |
130 | expect(pool).toBeInstanceOf(DynamicThreadPool) | |
131 | // We need to clean up the resources after our test | |
132 | await pool.destroy() | |
133 | }) | |
506c2a14 | 134 | }) |