perf: optimize circular buffer for numbers
[poolifier.git] / tests / pools / utils.test.mjs
CommitLineData
e9ed6eee 1import cluster, { Worker as ClusterWorker } from 'node:cluster'
ded253e2
JB
2import { Worker as ThreadWorker } from 'node:worker_threads'
3
a074ffee 4import { expect } from 'expect'
ded253e2 5
f12182ad 6import { CircularBuffer } from '../../lib/circular-buffer.cjs'
bcfb06ce 7import { WorkerTypes } from '../../lib/index.cjs'
c3719753
JB
8import {
9 createWorker,
ded253e2 10 DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS,
32b141fd 11 getDefaultTasksQueueOptions,
e9ed6eee
JB
12 getWorkerId,
13 getWorkerType,
c3719753 14 updateMeasurementStatistics
d35e5717 15} from '../../lib/pools/utils.cjs'
f12182ad 16import { MeasurementHistorySize } from '../../lib/pools/worker.cjs'
bfc75cca
JB
17
18describe('Pool utils test suite', () => {
e9ed6eee
JB
19 it('Verify DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS values', () => {
20 expect(DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS).toStrictEqual({
21 aggregate: false,
22 average: false,
23 median: false
24 })
25 })
26
32b141fd
JB
27 it('Verify getDefaultTasksQueueOptions() behavior', () => {
28 const poolMaxSize = 4
29 expect(getDefaultTasksQueueOptions(poolMaxSize)).toStrictEqual({
30 concurrency: 1,
31 size: Math.pow(poolMaxSize, 2),
32 taskStealing: true,
2eee7220 33 tasksStealingOnBackPressure: false,
568d0075 34 tasksFinishedTimeout: 2000
32b141fd
JB
35 })
36 })
37
bfc75cca 38 it('Verify updateMeasurementStatistics() behavior', () => {
0cd1f28c 39 // const circularBuffer = new CircularBuffer(MeasurementHistorySize)
bfc75cca 40 const measurementStatistics = {
0cd1f28c 41 history: new CircularBuffer(MeasurementHistorySize)
bfc75cca
JB
42 }
43 updateMeasurementStatistics(
44 measurementStatistics,
45 { aggregate: true, average: false, median: false },
46 0.01
47 )
0cd1f28c 48 expect(measurementStatistics).toMatchObject({
bfc75cca
JB
49 aggregate: 0.01,
50 maximum: 0.01,
0cd1f28c 51 minimum: 0.01
bfc75cca
JB
52 })
53 updateMeasurementStatistics(
54 measurementStatistics,
55 { aggregate: true, average: false, median: false },
56 0.02
57 )
0cd1f28c 58 expect(measurementStatistics).toMatchObject({
bfc75cca
JB
59 aggregate: 0.03,
60 maximum: 0.02,
0cd1f28c 61 minimum: 0.01
bfc75cca
JB
62 })
63 updateMeasurementStatistics(
64 measurementStatistics,
65 { aggregate: true, average: true, median: false },
66 0.001
67 )
0cd1f28c 68 expect(measurementStatistics).toMatchObject({
bfc75cca
JB
69 aggregate: 0.031,
70 maximum: 0.02,
71 minimum: 0.001,
0cd1f28c 72 average: 0.0010000000474974513
bfc75cca
JB
73 })
74 updateMeasurementStatistics(
75 measurementStatistics,
76 { aggregate: true, average: true, median: false },
77 0.003
78 )
0cd1f28c 79 expect(measurementStatistics).toMatchObject({
bfc75cca
JB
80 aggregate: 0.034,
81 maximum: 0.02,
82 minimum: 0.001,
0cd1f28c 83 average: 0.0020000000367872417
bfc75cca
JB
84 })
85 updateMeasurementStatistics(
86 measurementStatistics,
87 { aggregate: true, average: false, median: true },
88 0.006
89 )
0cd1f28c 90 expect(measurementStatistics).toMatchObject({
bfc75cca
JB
91 aggregate: 0.04,
92 maximum: 0.02,
93 minimum: 0.001,
0cd1f28c 94 median: 0.003000000026077032
bfc75cca
JB
95 })
96 updateMeasurementStatistics(
97 measurementStatistics,
98 { aggregate: true, average: true, median: false },
99 0.01
100 )
0cd1f28c 101 expect(measurementStatistics).toMatchObject({
bfc75cca
JB
102 aggregate: 0.05,
103 maximum: 0.02,
104 minimum: 0.001,
0cd1f28c 105 average: 0.004999999975552782
bfc75cca
JB
106 })
107 })
c3719753
JB
108
109 it('Verify createWorker() behavior', () => {
110 expect(
111 createWorker(
112 WorkerTypes.thread,
c63a35a0
JB
113 './tests/worker-files/thread/testWorker.mjs',
114 {}
c3719753
JB
115 )
116 ).toBeInstanceOf(ThreadWorker)
117 expect(
118 createWorker(
119 WorkerTypes.cluster,
c63a35a0
JB
120 './tests/worker-files/cluster/testWorker.mjs',
121 {}
c3719753
JB
122 )
123 ).toBeInstanceOf(ClusterWorker)
124 })
e9ed6eee
JB
125
126 it('Verify getWorkerType() behavior', () => {
127 expect(
128 getWorkerType(
129 new ThreadWorker('./tests/worker-files/thread/testWorker.mjs')
130 )
131 ).toBe(WorkerTypes.thread)
132 expect(getWorkerType(cluster.fork())).toBe(WorkerTypes.cluster)
133 })
134
135 it('Verify getWorkerId() behavior', () => {
136 const threadWorker = new ThreadWorker(
137 './tests/worker-files/thread/testWorker.mjs'
138 )
139 const clusterWorker = cluster.fork()
140 expect(getWorkerId(threadWorker)).toBe(threadWorker.threadId)
141 expect(getWorkerId(clusterWorker)).toBe(clusterWorker.id)
142 })
bfc75cca 143})