Merge branch 'master' into add-worker-test
[poolifier.git] / tests / pools / cluster / dynamic.test.js
1 const expect = require('expect')
2 const { DynamicClusterPool } = require('../../../lib/index')
3 const min = 1
4 const max = 3
5 const pool = new DynamicClusterPool(
6 min,
7 max,
8 './tests/worker-files/cluster/testWorker.js',
9 {
10 errorHandler: e => console.error(e),
11 onlineHandler: () => console.log('worker is online')
12 }
13 )
14
15 describe('Dynamic cluster pool test suite ', () => {
16 it('Verify that the function is executed in a worker cluster', 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 = []
24 let closedWorkers = 0
25 let fullPool = 0
26 pool.emitter.on('FullPool', () => fullPool++)
27 for (let i = 0; i < max * 2; i++) {
28 promises.push(pool.execute({ test: 'test' }))
29 }
30 expect(pool.workers.length).toBeLessThanOrEqual(max)
31 expect(pool.workers.length).toBeGreaterThan(min)
32 pool.workers.forEach(w => {
33 w.on('exit', () => {
34 closedWorkers++
35 })
36 })
37 expect(fullPool > 1).toBeTruthy()
38 await new Promise(resolve => setTimeout(resolve, 5000))
39 expect(closedWorkers).toBe(max - min)
40 })
41
42 it('Verify scale worker up and down is working', async () => {
43 expect(pool.workers.length).toBe(min)
44 for (let i = 0; i < max * 10; i++) {
45 pool.execute({ test: 'test' })
46 }
47 expect(pool.workers.length).toBeGreaterThan(min)
48 await new Promise(resolve => setTimeout(resolve, 3000))
49 expect(pool.workers.length).toBe(min)
50 for (let i = 0; i < max * 10; i++) {
51 pool.execute({ test: 'test' })
52 }
53 expect(pool.workers.length).toBeGreaterThan(min)
54 await new Promise(resolve => setTimeout(resolve, 2000))
55 expect(pool.workers.length).toBe(min)
56 })
57 it('Shutdown test', async () => {
58 let closedWorkers = 0
59 pool.workers.forEach(w => {
60 w.on('exit', () => {
61 closedWorkers++
62 })
63 })
64 pool.destroy()
65 await new Promise(resolve => setTimeout(resolve, 1000))
66 expect(closedWorkers).toBe(min)
67 })
68
69 it('Validations test', () => {
70 let error
71 try {
72 const pool1 = new DynamicClusterPool()
73 console.log(pool1)
74 } catch (e) {
75 error = e
76 }
77 expect(error).toBeTruthy()
78 expect(error.message).toBeTruthy()
79 })
80
81 it('Should work even without opts in input', async () => {
82 const pool1 = new DynamicClusterPool(
83 1,
84 1,
85 './tests/worker-files/cluster/testWorker.js'
86 )
87 const res = await pool1.execute({ test: 'test' })
88 expect(res).toBeFalsy()
89 })
90 })