Commit | Line | Data |
---|---|---|
506c2a14 | 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 | |
15 | describe('Dynamic thread pool test suite ', () => { | |
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 = [] | |
b755d5be | 24 | let fullPool = 0 |
25 | pool.emitter.on('FullPool', () => fullPool++) | |
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) | |
b755d5be | 30 | expect(fullPool > 1).toBeTruthy() |
85a3f8a7 APA |
31 | const res = await TestUtils.waitExits(pool, max - min) |
32 | expect(res).toBe(max - min) | |
506c2a14 | 33 | }) |
34 | ||
bcf04003 | 35 | it('Verify scale thread up and down is working', async () => { |
36 | expect(pool.workers.length).toBe(min) | |
37 | for (let i = 0; i < max * 10; i++) { | |
38 | pool.execute({ test: 'test' }) | |
39 | } | |
40 | expect(pool.workers.length).toBe(max) | |
85a3f8a7 | 41 | await TestUtils.waitExits(pool, max - min) |
bcf04003 | 42 | expect(pool.workers.length).toBe(min) |
43 | for (let i = 0; i < max * 10; i++) { | |
44 | pool.execute({ test: 'test' }) | |
45 | } | |
46 | expect(pool.workers.length).toBe(max) | |
85a3f8a7 | 47 | await TestUtils.waitExits(pool, max - min) |
bcf04003 | 48 | expect(pool.workers.length).toBe(min) |
49 | }) | |
c01733f1 | 50 | |
506c2a14 | 51 | it('Shutdown test', async () => { |
52 | let closedThreads = 0 | |
53 | pool.workers.forEach(w => { | |
54 | w.on('exit', () => { | |
55 | closedThreads++ | |
56 | }) | |
57 | }) | |
1f9a5a44 | 58 | await pool.destroy() |
506c2a14 | 59 | expect(closedThreads).toBe(min) |
60 | }) | |
61 | ||
62 | it('Validations test', () => { | |
85a3f8a7 | 63 | expect(() => { |
506c2a14 | 64 | const pool1 = new DynamicThreadPool() |
85a3f8a7 APA |
65 | }).toThrowError( |
66 | new Error('Please specify a file with a worker implementation') | |
67 | ) | |
506c2a14 | 68 | }) |
69 | ||
70 | it('Should work even without opts in input', async () => { | |
325f50bc S |
71 | const pool1 = new DynamicThreadPool( |
72 | 1, | |
73 | 1, | |
76b1e974 | 74 | './tests/worker-files/thread/testWorker.js' |
325f50bc | 75 | ) |
506c2a14 | 76 | const res = await pool1.execute({ test: 'test' }) |
77 | expect(res).toBeFalsy() | |
78 | }) | |
c01733f1 | 79 | |
4c35177b | 80 | it('Verify scale thread up and down is working when long running task is used:hard', async () => { |
c01733f1 | 81 | const longRunningPool = new DynamicThreadPool( |
82 | min, | |
83 | max, | |
85a3f8a7 | 84 | './tests/worker-files/thread/longRunningWorkerHardBehavior.js', |
4c35177b | 85 | { |
86 | errorHandler: e => console.error(e), | |
87 | onlineHandler: () => console.log('worker is online') | |
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) |
97 | }) | |
98 | ||
99 | it('Verify scale thread up and down is working when long running task is used:soft', async () => { | |
100 | const longRunningPool = new DynamicThreadPool( | |
101 | min, | |
102 | max, | |
85a3f8a7 | 103 | './tests/worker-files/thread/longRunningWorkerSoftBehavior.js', |
c01733f1 | 104 | { |
105 | errorHandler: e => console.error(e), | |
106 | onlineHandler: () => console.log('worker is online') | |
107 | } | |
108 | ) | |
109 | expect(longRunningPool.workers.length).toBe(min) | |
110 | for (let i = 0; i < max * 10; i++) { | |
111 | longRunningPool.execute({ test: 'test' }) | |
112 | } | |
113 | expect(longRunningPool.workers.length).toBe(max) | |
85a3f8a7 | 114 | await TestUtils.sleep(1500) |
c01733f1 | 115 | // Here we expect the workers to be at the max size since that the task is still running |
116 | expect(longRunningPool.workers.length).toBe(max) | |
117 | }) | |
506c2a14 | 118 | }) |