build(deps-dev): bump rollup
[poolifier.git] / tests / worker / abstract-worker.test.js
index e9da7a874de95d1739be54216ed1a540a3aff9d3..68665bc442fd540c9daaba0163340825ed347c29 100644 (file)
@@ -1,5 +1,7 @@
 const { expect } = require('expect')
+const sinon = require('sinon')
 const { ClusterWorker, KillBehaviors, ThreadWorker } = require('../../lib')
+const { EMPTY_FUNCTION } = require('../../lib/utils')
 
 describe('Abstract worker test suite', () => {
   class StubWorkerWithMainWorker extends ThreadWorker {
@@ -13,17 +15,23 @@ describe('Abstract worker test suite', () => {
     const worker = new ThreadWorker(() => {})
     expect(worker.opts.maxInactiveTime).toStrictEqual(60000)
     expect(worker.opts.killBehavior).toBe(KillBehaviors.SOFT)
+    expect(worker.opts.killHandler).toStrictEqual(EMPTY_FUNCTION)
     expect(worker.opts.async).toBe(undefined)
   })
 
   it('Verify that worker options are set at worker creation', () => {
+    const killHandler = () => {
+      console.info('Worker received kill message')
+    }
     const worker = new ClusterWorker(() => {}, {
       maxInactiveTime: 6000,
-      async: true,
-      killBehavior: KillBehaviors.HARD
+      killBehavior: KillBehaviors.HARD,
+      killHandler,
+      async: true
     })
     expect(worker.opts.maxInactiveTime).toStrictEqual(6000)
     expect(worker.opts.killBehavior).toBe(KillBehaviors.HARD)
+    expect(worker.opts.killHandler).toStrictEqual(killHandler)
     expect(worker.opts.async).toBe(undefined)
   })
 
@@ -119,6 +127,30 @@ describe('Abstract worker test suite', () => {
     )
   })
 
+  it('Verify that sync kill handler is called when worker is killed', () => {
+    const worker = new ClusterWorker(() => {}, {
+      killHandler: sinon.stub().returns()
+    })
+    worker.isMain = false
+    worker.getMainWorker = sinon.stub().returns({
+      id: 1,
+      send: sinon.stub().returns()
+    })
+    worker.handleKillMessage()
+    expect(worker.getMainWorker().send.calledOnce).toBe(true)
+    expect(worker.opts.killHandler.calledOnce).toBe(true)
+  })
+
+  it('Verify that async kill handler is called when worker is killed', () => {
+    const killHandlerStub = sinon.stub().returns()
+    const worker = new ClusterWorker(() => {}, {
+      killHandler: async () => Promise.resolve(killHandlerStub())
+    })
+    worker.isMain = false
+    worker.handleKillMessage()
+    expect(killHandlerStub.calledOnce).toBe(true)
+  })
+
   it('Verify that handleError() method works properly', () => {
     const error = new Error('Error as an error')
     const worker = new ClusterWorker(() => {})
@@ -194,6 +226,10 @@ describe('Abstract worker test suite', () => {
       return 2
     }
     const worker = new ClusterWorker({ fn1, fn2 })
+    worker.getMainWorker = sinon.stub().returns({
+      id: 1,
+      send: sinon.stub().returns()
+    })
     expect(worker.taskFunctions.get('default')).toBeInstanceOf(Function)
     expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function)
     expect(worker.taskFunctions.get('fn2')).toBeInstanceOf(Function)
@@ -216,6 +252,7 @@ describe('Abstract worker test suite', () => {
     expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function)
     expect(worker.taskFunctions.get('fn2')).toBeUndefined()
     expect(worker.taskFunctions.size).toBe(2)
+    expect(worker.getMainWorker().send.calledOnce).toBe(true)
   })
 
   it('Verify that listTaskFunctions() works', () => {