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 {
}
}
+ afterEach(() => {
+ sinon.restore()
+ })
+
it('Verify worker options default values', () => {
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)
})
)
})
+ 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(() => {})
const fn2 = () => {
return 2
}
- const worker = new ThreadWorker({ fn1, fn2 })
+ 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)
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', () => {
+ const fn1 = () => {
+ return 1
+ }
+ const fn2 = () => {
+ return 2
+ }
+ const worker = new ClusterWorker({ fn1, fn2 })
+ expect(worker.listTaskFunctions()).toStrictEqual(['default', 'fn1', 'fn2'])
})
it('Verify that setDefaultTaskFunction() works', () => {