1 import cluster, { Worker as ClusterWorker } from 'node:cluster'
2 import { Worker as ThreadWorker } from 'node:worker_threads'
4 import { expect } from 'expect'
8 DEFAULT_CIRCULAR_ARRAY_SIZE
9 } from '../../lib/circular-array.cjs'
14 } from '../../lib/index.cjs'
16 buildWorkerChoiceStrategyOptions,
18 DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS,
19 getDefaultTasksQueueOptions,
20 getWorkerChoiceStrategyRetries,
23 updateMeasurementStatistics
24 } from '../../lib/pools/utils.cjs'
26 describe('Pool utils test suite', () => {
27 it('Verify DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS values', () => {
28 expect(DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS).toStrictEqual({
35 it('Verify getDefaultTasksQueueOptions() behavior', () => {
37 expect(getDefaultTasksQueueOptions(poolMaxSize)).toStrictEqual({
39 size: Math.pow(poolMaxSize, 2),
41 tasksStealingOnBackPressure: true,
42 tasksFinishedTimeout: 2000
46 it('Verify getWorkerChoiceStrategyRetries() behavior', async () => {
47 const numberOfThreads = 4
48 const pool = new FixedThreadPool(
50 './tests/worker-files/thread/testWorker.mjs'
52 expect(getWorkerChoiceStrategyRetries(pool)).toBe(pool.info.maxSize * 2)
53 const workerChoiceStrategyOptions = {
54 runTime: { median: true },
55 waitTime: { median: true },
56 elu: { median: true },
63 getWorkerChoiceStrategyRetries(pool, workerChoiceStrategyOptions)
66 Object.keys(workerChoiceStrategyOptions.weights).length
71 it('Verify buildWorkerChoiceStrategyOptions() behavior', async () => {
72 const numberOfWorkers = 4
73 const pool = new FixedClusterPool(
75 './tests/worker-files/cluster/testWorker.cjs'
77 expect(buildWorkerChoiceStrategyOptions(pool)).toStrictEqual({
78 runTime: { median: false },
79 waitTime: { median: false },
80 elu: { median: false },
81 weights: expect.objectContaining({
82 0: expect.any(Number),
83 [pool.info.maxSize - 1]: expect.any(Number)
86 const workerChoiceStrategyOptions = {
87 runTime: { median: true },
88 waitTime: { median: true },
89 elu: { median: true },
96 buildWorkerChoiceStrategyOptions(pool, workerChoiceStrategyOptions)
97 ).toStrictEqual(workerChoiceStrategyOptions)
101 it('Verify updateMeasurementStatistics() behavior', () => {
102 const measurementStatistics = {
103 history: new CircularArray()
105 updateMeasurementStatistics(
106 measurementStatistics,
107 { aggregate: true, average: false, median: false },
110 expect(measurementStatistics).toStrictEqual({
114 history: new CircularArray()
116 updateMeasurementStatistics(
117 measurementStatistics,
118 { aggregate: true, average: false, median: false },
121 expect(measurementStatistics).toStrictEqual({
125 history: new CircularArray()
127 updateMeasurementStatistics(
128 measurementStatistics,
129 { aggregate: true, average: true, median: false },
132 expect(measurementStatistics).toStrictEqual({
137 history: new CircularArray(DEFAULT_CIRCULAR_ARRAY_SIZE, 0.001)
139 updateMeasurementStatistics(
140 measurementStatistics,
141 { aggregate: true, average: true, median: false },
144 expect(measurementStatistics).toStrictEqual({
149 history: new CircularArray(DEFAULT_CIRCULAR_ARRAY_SIZE, 0.001, 0.003)
151 updateMeasurementStatistics(
152 measurementStatistics,
153 { aggregate: true, average: false, median: true },
156 expect(measurementStatistics).toStrictEqual({
161 history: new CircularArray(
162 DEFAULT_CIRCULAR_ARRAY_SIZE,
168 updateMeasurementStatistics(
169 measurementStatistics,
170 { aggregate: true, average: true, median: false },
173 expect(measurementStatistics).toStrictEqual({
178 history: new CircularArray(
179 DEFAULT_CIRCULAR_ARRAY_SIZE,
188 it('Verify createWorker() behavior', () => {
192 './tests/worker-files/thread/testWorker.mjs',
195 ).toBeInstanceOf(ThreadWorker)
199 './tests/worker-files/cluster/testWorker.mjs',
202 ).toBeInstanceOf(ClusterWorker)
205 it('Verify getWorkerType() behavior', () => {
208 new ThreadWorker('./tests/worker-files/thread/testWorker.mjs')
210 ).toBe(WorkerTypes.thread)
211 expect(getWorkerType(cluster.fork())).toBe(WorkerTypes.cluster)
214 it('Verify getWorkerId() behavior', () => {
215 const threadWorker = new ThreadWorker(
216 './tests/worker-files/thread/testWorker.mjs'
218 const clusterWorker = cluster.fork()
219 expect(getWorkerId(threadWorker)).toBe(threadWorker.threadId)
220 expect(getWorkerId(clusterWorker)).toBe(clusterWorker.id)