1 import { Worker as ThreadWorker } from 'node:worker_threads'
2 import cluster, { Worker as ClusterWorker } from 'node:cluster'
3 import { expect } from 'expect'
6 DEFAULT_CIRCULAR_ARRAY_SIZE
7 } from '../../lib/circular-array.cjs'
9 DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS,
10 buildWorkerChoiceStrategyOptions,
12 getDefaultTasksQueueOptions,
13 getWorkerChoiceStrategyRetries,
16 updateMeasurementStatistics
17 } from '../../lib/pools/utils.cjs'
22 } from '../../lib/index.cjs'
24 describe('Pool utils test suite', () => {
25 it('Verify DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS values', () => {
26 expect(DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS).toStrictEqual({
33 it('Verify getDefaultTasksQueueOptions() behavior', () => {
35 expect(getDefaultTasksQueueOptions(poolMaxSize)).toStrictEqual({
37 size: Math.pow(poolMaxSize, 2),
39 tasksStealingOnBackPressure: true,
40 tasksFinishedTimeout: 2000
44 it('Verify getWorkerChoiceStrategyRetries() behavior', async () => {
45 const numberOfThreads = 4
46 const pool = new FixedThreadPool(
48 './tests/worker-files/thread/testWorker.mjs'
50 expect(getWorkerChoiceStrategyRetries(pool)).toBe(pool.info.maxSize * 2)
51 const workerChoiceStrategyOptions = {
52 runTime: { median: true },
53 waitTime: { median: true },
54 elu: { median: true },
61 getWorkerChoiceStrategyRetries(pool, workerChoiceStrategyOptions)
64 Object.keys(workerChoiceStrategyOptions.weights).length
69 it('Verify buildWorkerChoiceStrategyOptions() behavior', async () => {
70 const numberOfWorkers = 4
71 const pool = new FixedClusterPool(
73 './tests/worker-files/cluster/testWorker.cjs'
75 expect(buildWorkerChoiceStrategyOptions(pool)).toStrictEqual({
76 runTime: { median: false },
77 waitTime: { median: false },
78 elu: { median: false },
79 weights: expect.objectContaining({
80 0: expect.any(Number),
81 [pool.info.maxSize - 1]: expect.any(Number)
84 const workerChoiceStrategyOptions = {
85 runTime: { median: true },
86 waitTime: { median: true },
87 elu: { median: true },
94 buildWorkerChoiceStrategyOptions(pool, workerChoiceStrategyOptions)
95 ).toStrictEqual(workerChoiceStrategyOptions)
99 it('Verify updateMeasurementStatistics() behavior', () => {
100 const measurementStatistics = {
101 history: new CircularArray()
103 updateMeasurementStatistics(
104 measurementStatistics,
105 { aggregate: true, average: false, median: false },
108 expect(measurementStatistics).toStrictEqual({
112 history: new CircularArray()
114 updateMeasurementStatistics(
115 measurementStatistics,
116 { aggregate: true, average: false, median: false },
119 expect(measurementStatistics).toStrictEqual({
123 history: new CircularArray()
125 updateMeasurementStatistics(
126 measurementStatistics,
127 { aggregate: true, average: true, median: false },
130 expect(measurementStatistics).toStrictEqual({
135 history: new CircularArray(DEFAULT_CIRCULAR_ARRAY_SIZE, 0.001)
137 updateMeasurementStatistics(
138 measurementStatistics,
139 { aggregate: true, average: true, median: false },
142 expect(measurementStatistics).toStrictEqual({
147 history: new CircularArray(DEFAULT_CIRCULAR_ARRAY_SIZE, 0.001, 0.003)
149 updateMeasurementStatistics(
150 measurementStatistics,
151 { aggregate: true, average: false, median: true },
154 expect(measurementStatistics).toStrictEqual({
159 history: new CircularArray(
160 DEFAULT_CIRCULAR_ARRAY_SIZE,
166 updateMeasurementStatistics(
167 measurementStatistics,
168 { aggregate: true, average: true, median: false },
171 expect(measurementStatistics).toStrictEqual({
176 history: new CircularArray(
177 DEFAULT_CIRCULAR_ARRAY_SIZE,
186 it('Verify createWorker() behavior', () => {
190 './tests/worker-files/thread/testWorker.mjs',
193 ).toBeInstanceOf(ThreadWorker)
197 './tests/worker-files/cluster/testWorker.mjs',
200 ).toBeInstanceOf(ClusterWorker)
203 it('Verify getWorkerType() behavior', () => {
206 new ThreadWorker('./tests/worker-files/thread/testWorker.mjs')
208 ).toBe(WorkerTypes.thread)
209 expect(getWorkerType(cluster.fork())).toBe(WorkerTypes.cluster)
212 it('Verify getWorkerId() behavior', () => {
213 const threadWorker = new ThreadWorker(
214 './tests/worker-files/thread/testWorker.mjs'
216 const clusterWorker = cluster.fork()
217 expect(getWorkerId(threadWorker)).toBe(threadWorker.threadId)
218 expect(getWorkerId(clusterWorker)).toBe(clusterWorker.id)