perf: use optimized circular buffer implementation to store measurements history
[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', () => {
f12182ad 39 const circularBuffer = new CircularBuffer(MeasurementHistorySize)
bfc75cca 40 const measurementStatistics = {
f12182ad 41 history: circularBuffer
bfc75cca
JB
42 }
43 updateMeasurementStatistics(
44 measurementStatistics,
45 { aggregate: true, average: false, median: false },
46 0.01
47 )
48 expect(measurementStatistics).toStrictEqual({
49 aggregate: 0.01,
50 maximum: 0.01,
51 minimum: 0.01,
f12182ad 52 history: circularBuffer
bfc75cca
JB
53 })
54 updateMeasurementStatistics(
55 measurementStatistics,
56 { aggregate: true, average: false, median: false },
57 0.02
58 )
59 expect(measurementStatistics).toStrictEqual({
60 aggregate: 0.03,
61 maximum: 0.02,
62 minimum: 0.01,
f12182ad 63 history: circularBuffer
bfc75cca
JB
64 })
65 updateMeasurementStatistics(
66 measurementStatistics,
67 { aggregate: true, average: true, median: false },
68 0.001
69 )
70 expect(measurementStatistics).toStrictEqual({
71 aggregate: 0.031,
72 maximum: 0.02,
73 minimum: 0.001,
74 average: 0.001,
f12182ad 75 history: circularBuffer
bfc75cca
JB
76 })
77 updateMeasurementStatistics(
78 measurementStatistics,
79 { aggregate: true, average: true, median: false },
80 0.003
81 )
82 expect(measurementStatistics).toStrictEqual({
83 aggregate: 0.034,
84 maximum: 0.02,
85 minimum: 0.001,
86 average: 0.002,
f12182ad 87 history: circularBuffer
bfc75cca
JB
88 })
89 updateMeasurementStatistics(
90 measurementStatistics,
91 { aggregate: true, average: false, median: true },
92 0.006
93 )
94 expect(measurementStatistics).toStrictEqual({
95 aggregate: 0.04,
96 maximum: 0.02,
97 minimum: 0.001,
98 median: 0.003,
f12182ad 99 history: circularBuffer
bfc75cca
JB
100 })
101 updateMeasurementStatistics(
102 measurementStatistics,
103 { aggregate: true, average: true, median: false },
104 0.01
105 )
106 expect(measurementStatistics).toStrictEqual({
107 aggregate: 0.05,
108 maximum: 0.02,
109 minimum: 0.001,
110 average: 0.005,
f12182ad 111 history: circularBuffer
bfc75cca
JB
112 })
113 })
c3719753
JB
114
115 it('Verify createWorker() behavior', () => {
116 expect(
117 createWorker(
118 WorkerTypes.thread,
c63a35a0
JB
119 './tests/worker-files/thread/testWorker.mjs',
120 {}
c3719753
JB
121 )
122 ).toBeInstanceOf(ThreadWorker)
123 expect(
124 createWorker(
125 WorkerTypes.cluster,
c63a35a0
JB
126 './tests/worker-files/cluster/testWorker.mjs',
127 {}
c3719753
JB
128 )
129 ).toBeInstanceOf(ClusterWorker)
130 })
e9ed6eee
JB
131
132 it('Verify getWorkerType() behavior', () => {
133 expect(
134 getWorkerType(
135 new ThreadWorker('./tests/worker-files/thread/testWorker.mjs')
136 )
137 ).toBe(WorkerTypes.thread)
138 expect(getWorkerType(cluster.fork())).toBe(WorkerTypes.cluster)
139 })
140
141 it('Verify getWorkerId() behavior', () => {
142 const threadWorker = new ThreadWorker(
143 './tests/worker-files/thread/testWorker.mjs'
144 )
145 const clusterWorker = cluster.fork()
146 expect(getWorkerId(threadWorker)).toBe(threadWorker.threadId)
147 expect(getWorkerId(clusterWorker)).toBe(clusterWorker.id)
148 })
bfc75cca 149})