+ it('Verify that worker pool tasks usage are initialized', async () => {
+ const pool = new FixedClusterPool(
+ numberOfWorkers,
+ './tests/worker-files/cluster/testWorker.js'
+ )
+ for (const value of pool.workers.values()) {
+ expect(value.tasksUsage).toBeDefined()
+ expect(value.tasksUsage.run).toBe(0)
+ expect(value.tasksUsage.running).toBe(0)
+ expect(value.tasksUsage.runTime).toBe(0)
+ expect(value.tasksUsage.avgRunTime).toBe(0)
+ }
+ await pool.destroy()
+ })
+
+ it('Verify that worker pool tasks usage are computed', async () => {
+ const pool = new FixedClusterPool(
+ numberOfWorkers,
+ './tests/worker-files/cluster/testWorker.js'
+ )
+ const promises = []
+ for (let i = 0; i < numberOfWorkers * 2; i++) {
+ promises.push(pool.execute())
+ }
+ for (const value of pool.workers.values()) {
+ expect(value.tasksUsage).toBeDefined()
+ expect(value.tasksUsage.run).toBe(0)
+ expect(value.tasksUsage.running).toBe(numberOfWorkers * 2)
+ expect(value.tasksUsage.runTime).toBe(0)
+ expect(value.tasksUsage.avgRunTime).toBe(0)
+ }
+ await Promise.all(promises)
+ for (const value of pool.workers.values()) {
+ expect(value.tasksUsage).toBeDefined()
+ expect(value.tasksUsage.run).toBe(numberOfWorkers * 2)
+ expect(value.tasksUsage.running).toBe(0)
+ expect(value.tasksUsage.runTime).toBeGreaterThanOrEqual(0)
+ expect(value.tasksUsage.avgRunTime).toBeGreaterThanOrEqual(0)
+ }
+ await pool.destroy()
+ })
+
+ it('Verify that worker pool tasks usage are reset at worker choice strategy change', async () => {
+ const pool = new DynamicThreadPool(
+ numberOfWorkers,
+ numberOfWorkers,
+ './tests/worker-files/thread/testWorker.js'
+ )
+ const promises = []
+ for (let i = 0; i < numberOfWorkers * 2; i++) {
+ promises.push(pool.execute())
+ }
+ await Promise.all(promises)
+ for (const value of pool.workers.values()) {
+ expect(value.tasksUsage).toBeDefined()
+ expect(value.tasksUsage.run).toBe(numberOfWorkers * 2)
+ expect(value.tasksUsage.running).toBe(0)
+ expect(value.tasksUsage.runTime).toBeGreaterThanOrEqual(0)
+ expect(value.tasksUsage.avgRunTime).toBeGreaterThanOrEqual(0)
+ }
+ pool.setWorkerChoiceStrategy(WorkerChoiceStrategies.FAIR_SHARE)
+ for (const value of pool.workers.values()) {
+ expect(value.tasksUsage).toBeDefined()
+ expect(value.tasksUsage.run).toBe(0)
+ expect(value.tasksUsage.running).toBe(0)
+ expect(value.tasksUsage.runTime).toBe(0)
+ expect(value.tasksUsage.avgRunTime).toBe(0)
+ }
+ await pool.destroy()
+ })
+
+ it("Verify that pool event emitter 'busy' event can register a callback", async () => {
+ const pool = new FixedThreadPool(
+ numberOfWorkers,
+ './tests/worker-files/thread/testWorker.js'
+ )
+ const promises = []
+ let poolBusy = 0
+ pool.emitter.on('busy', () => poolBusy++)
+ for (let i = 0; i < numberOfWorkers * 2; i++) {
+ promises.push(pool.execute())
+ }
+ await Promise.all(promises)
+ // The `busy` event is triggered when the number of submitted tasks at once reach the number of fixed pool workers.
+ // So in total numberOfWorkers + 1 times for a loop submitting up to numberOfWorkers * 2 tasks to the fixed pool.
+ expect(poolBusy).toBe(numberOfWorkers + 1)
+ await pool.destroy()