test: refactor pool tests
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 19 Sep 2023 21:27:47 +0000 (23:27 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 19 Sep 2023 21:27:47 +0000 (23:27 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/pools/abstract-pool.ts
src/pools/utils.ts
src/utils.ts
tests/pools/abstract-pool.test.js [moved from tests/pools/abstract/abstract-pool.test.js with 99% similarity]
tests/pools/utils.test.js [new file with mode: 0644]
tests/pools/worker-node.test.js [moved from tests/pools/abstract/worker-node.test.js with 96% similarity]
tests/utils.test.js

index ce59c992f81a08d52ba2e42c2f1b1443c9979b72..52f9c0e3fc25aeb6a2169cf49243cfacb03d2153 100644 (file)
@@ -16,8 +16,7 @@ import {
   max,
   median,
   min,
-  round,
-  updateMeasurementStatistics
+  round
 } from '../utils'
 import { KillBehaviors } from '../worker/worker-options'
 import type { TaskFunction } from '../worker/task-functions'
@@ -51,7 +50,8 @@ import { WorkerNode } from './worker-node'
 import {
   checkFilePath,
   checkValidTasksQueueOptions,
-  checkValidWorkerChoiceStrategy
+  checkValidWorkerChoiceStrategy,
+  updateMeasurementStatistics
 } from './utils'
 
 /**
index e534ead2363947b40096c2734517a1d7c1ea3550..e08b31aa838537c1ceee37f284ff39ac53960308 100644 (file)
@@ -1,11 +1,12 @@
 import { existsSync } from 'node:fs'
-import { isPlainObject } from '../utils'
+import { average, isPlainObject, max, median, min } from '../utils'
 import {
+  type MeasurementStatisticsRequirements,
   WorkerChoiceStrategies,
   type WorkerChoiceStrategy
 } from './selection-strategies/selection-strategies-types'
 import type { TasksQueueOptions } from './pool'
-import type { IWorker } from './worker'
+import type { IWorker, MeasurementStatistics } from './worker'
 
 export const checkFilePath = (filePath: string): void => {
   if (
@@ -91,6 +92,7 @@ export const checkValidTasksQueueOptions = (
     )
   }
 }
+
 export const checkWorkerNodeArguments = <Worker extends IWorker>(
   worker: Worker,
   tasksQueueBackPressureSize: number
@@ -114,3 +116,47 @@ export const checkWorkerNodeArguments = <Worker extends IWorker>(
     )
   }
 }
+
+/**
+ * Updates the given measurement statistics.
+ *
+ * @param measurementStatistics - The measurement statistics to update.
+ * @param measurementRequirements - The measurement statistics requirements.
+ * @param measurementValue - The measurement value.
+ * @param numberOfMeasurements - The number of measurements.
+ * @internal
+ */
+export const updateMeasurementStatistics = (
+  measurementStatistics: MeasurementStatistics,
+  measurementRequirements: MeasurementStatisticsRequirements,
+  measurementValue: number
+): void => {
+  if (measurementRequirements.aggregate) {
+    measurementStatistics.aggregate =
+      (measurementStatistics.aggregate ?? 0) + measurementValue
+    measurementStatistics.minimum = min(
+      measurementValue,
+      measurementStatistics.minimum ?? Infinity
+    )
+    measurementStatistics.maximum = max(
+      measurementValue,
+      measurementStatistics.maximum ?? -Infinity
+    )
+    if (
+      (measurementRequirements.average || measurementRequirements.median) &&
+      measurementValue != null
+    ) {
+      measurementStatistics.history.push(measurementValue)
+      if (measurementRequirements.average) {
+        measurementStatistics.average = average(measurementStatistics.history)
+      } else if (measurementStatistics.average != null) {
+        delete measurementStatistics.average
+      }
+      if (measurementRequirements.median) {
+        measurementStatistics.median = median(measurementStatistics.history)
+      } else if (measurementStatistics.median != null) {
+        delete measurementStatistics.median
+      }
+    }
+  }
+}
index 400a92b14a7f42e8518878af1744623c8f6c2290..d7ce5a210f2dea09290fd90a5f4eb64fcb2162d5 100644 (file)
@@ -7,12 +7,7 @@ import type {
   WorkerChoiceStrategyOptions
 } from './pools/selection-strategies/selection-strategies-types'
 import type { KillBehavior } from './worker/worker-options'
-import {
-  type IWorker,
-  type MeasurementStatistics,
-  type WorkerType,
-  WorkerTypes
-} from './pools/worker'
+import { type IWorker, type WorkerType, WorkerTypes } from './pools/worker'
 
 /**
  * Default task name.
@@ -224,50 +219,6 @@ export const isAsyncFunction = (
   return typeof fn === 'function' && fn.constructor.name === 'AsyncFunction'
 }
 
-/**
- * Updates the given measurement statistics.
- *
- * @param measurementStatistics - The measurement statistics to update.
- * @param measurementRequirements - The measurement statistics requirements.
- * @param measurementValue - The measurement value.
- * @param numberOfMeasurements - The number of measurements.
- * @internal
- */
-export const updateMeasurementStatistics = (
-  measurementStatistics: MeasurementStatistics,
-  measurementRequirements: MeasurementStatisticsRequirements,
-  measurementValue: number
-): void => {
-  if (measurementRequirements.aggregate) {
-    measurementStatistics.aggregate =
-      (measurementStatistics.aggregate ?? 0) + measurementValue
-    measurementStatistics.minimum = min(
-      measurementValue,
-      measurementStatistics.minimum ?? Infinity
-    )
-    measurementStatistics.maximum = max(
-      measurementValue,
-      measurementStatistics.maximum ?? -Infinity
-    )
-    if (
-      (measurementRequirements.average || measurementRequirements.median) &&
-      measurementValue != null
-    ) {
-      measurementStatistics.history.push(measurementValue)
-      if (measurementRequirements.average) {
-        measurementStatistics.average = average(measurementStatistics.history)
-      } else if (measurementStatistics.average != null) {
-        delete measurementStatistics.average
-      }
-      if (measurementRequirements.median) {
-        measurementStatistics.median = median(measurementStatistics.history)
-      } else if (measurementStatistics.median != null) {
-        delete measurementStatistics.median
-      }
-    }
-  }
-}
-
 /**
  * Generates a cryptographically secure random number in the [0,1[ range
  *
similarity index 99%
rename from tests/pools/abstract/abstract-pool.test.js
rename to tests/pools/abstract-pool.test.js
index f6a54d5b4473894f42778dbb6ea3abc8536a9f02..3860a0eb95fc4f50de2ea9ff28813860faafd9b6 100644 (file)
@@ -10,13 +10,13 @@ const {
   PoolTypes,
   WorkerChoiceStrategies,
   WorkerTypes
-} = require('../../../lib')
-const { CircularArray } = require('../../../lib/circular-array')
-const { Deque } = require('../../../lib/deque')
-const { DEFAULT_TASK_NAME } = require('../../../lib/utils')
-const { version } = require('../../../package.json')
-const { waitPoolEvents } = require('../../test-utils')
-const { WorkerNode } = require('../../../lib/pools/worker-node')
+} = require('../../lib')
+const { CircularArray } = require('../../lib/circular-array')
+const { Deque } = require('../../lib/deque')
+const { DEFAULT_TASK_NAME } = require('../../lib/utils')
+const { version } = require('../../package.json')
+const { waitPoolEvents } = require('../test-utils')
+const { WorkerNode } = require('../../lib/pools/worker-node')
 
 describe('Abstract pool test suite', () => {
   const numberOfWorkers = 2
diff --git a/tests/pools/utils.test.js b/tests/pools/utils.test.js
new file mode 100644 (file)
index 0000000..23ef2e2
--- /dev/null
@@ -0,0 +1,95 @@
+const { expect } = require('expect')
+const {
+  DEFAULT_CIRCULAR_ARRAY_SIZE,
+  CircularArray
+} = require('../../lib/circular-array')
+const { updateMeasurementStatistics } = require('../../lib/pools/utils')
+
+describe('Pool utils test suite', () => {
+  it('Verify updateMeasurementStatistics() behavior', () => {
+    const measurementStatistics = {
+      history: new CircularArray()
+    }
+    updateMeasurementStatistics(
+      measurementStatistics,
+      { aggregate: true, average: false, median: false },
+      0.01
+    )
+    expect(measurementStatistics).toStrictEqual({
+      aggregate: 0.01,
+      maximum: 0.01,
+      minimum: 0.01,
+      history: new CircularArray()
+    })
+    updateMeasurementStatistics(
+      measurementStatistics,
+      { aggregate: true, average: false, median: false },
+      0.02
+    )
+    expect(measurementStatistics).toStrictEqual({
+      aggregate: 0.03,
+      maximum: 0.02,
+      minimum: 0.01,
+      history: new CircularArray()
+    })
+    updateMeasurementStatistics(
+      measurementStatistics,
+      { aggregate: true, average: true, median: false },
+      0.001
+    )
+    expect(measurementStatistics).toStrictEqual({
+      aggregate: 0.031,
+      maximum: 0.02,
+      minimum: 0.001,
+      average: 0.001,
+      history: new CircularArray(DEFAULT_CIRCULAR_ARRAY_SIZE, 0.001)
+    })
+    updateMeasurementStatistics(
+      measurementStatistics,
+      { aggregate: true, average: true, median: false },
+      0.003
+    )
+    expect(measurementStatistics).toStrictEqual({
+      aggregate: 0.034,
+      maximum: 0.02,
+      minimum: 0.001,
+      average: 0.002,
+      history: new CircularArray(DEFAULT_CIRCULAR_ARRAY_SIZE, 0.001, 0.003)
+    })
+    updateMeasurementStatistics(
+      measurementStatistics,
+      { aggregate: true, average: false, median: true },
+      0.006
+    )
+    expect(measurementStatistics).toStrictEqual({
+      aggregate: 0.04,
+      maximum: 0.02,
+      minimum: 0.001,
+      median: 0.003,
+      history: new CircularArray(
+        DEFAULT_CIRCULAR_ARRAY_SIZE,
+        0.001,
+        0.003,
+        0.006
+      )
+    })
+    updateMeasurementStatistics(
+      measurementStatistics,
+      { aggregate: true, average: true, median: false },
+      0.01
+    )
+    expect(measurementStatistics).toStrictEqual({
+      aggregate: 0.05,
+      maximum: 0.02,
+      minimum: 0.001,
+      average: 0.005,
+      history: new CircularArray(
+        DEFAULT_CIRCULAR_ARRAY_SIZE,
+        0.001,
+        0.003,
+        0.006,
+        0.01
+      )
+    })
+  })
+})
similarity index 96%
rename from tests/pools/abstract/worker-node.test.js
rename to tests/pools/worker-node.test.js
index ee469eda7b39692f4a5a26e9ba3782453c66c981..bfbd5d8d148667576472d1d02efddd7121374685 100644 (file)
@@ -1,11 +1,11 @@
 const { MessageChannel, Worker } = require('node:worker_threads')
 const cluster = require('node:cluster')
 const { expect } = require('expect')
-const { WorkerNode } = require('../../../lib/pools/worker-node')
-const { WorkerTypes } = require('../../../lib')
-const { CircularArray } = require('../../../lib/circular-array')
-const { Deque } = require('../../../lib/deque')
-const { DEFAULT_TASK_NAME } = require('../../../lib/utils')
+const { WorkerNode } = require('../../lib/pools/worker-node')
+const { WorkerTypes } = require('../../lib')
+const { CircularArray } = require('../../lib/circular-array')
+const { Deque } = require('../../lib/deque')
+const { DEFAULT_TASK_NAME } = require('../../lib/utils')
 
 describe('Worker node test suite', () => {
   const threadWorker = new Worker('./tests/worker-files/thread/testWorker.js')
index 5041f1028a49fcf598922aa307e481b94a8745a8..061c1648d4f2217583f6b0a9370802578fb222a6 100644 (file)
@@ -3,10 +3,6 @@ const { Worker } = require('node:worker_threads')
 const cluster = require('node:cluster')
 const os = require('node:os')
 const { expect } = require('expect')
-const {
-  CircularArray,
-  DEFAULT_CIRCULAR_ARRAY_SIZE
-} = require('../lib/circular-array')
 const {
   DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS,
   DEFAULT_TASK_NAME,
@@ -25,8 +21,7 @@ const {
   min,
   round,
   secureRandom,
-  sleep,
-  updateMeasurementStatistics
+  sleep
 } = require('../lib/utils')
 const { KillBehaviors, WorkerTypes } = require('../lib')
 
@@ -220,93 +215,6 @@ describe('Utils test suite', () => {
     expect(isAsyncFunction(async function named () {})).toBe(true)
   })
 
-  it('Verify updateMeasurementStatistics() behavior', () => {
-    const measurementStatistics = {
-      history: new CircularArray()
-    }
-    updateMeasurementStatistics(
-      measurementStatistics,
-      { aggregate: true, average: false, median: false },
-      0.01
-    )
-    expect(measurementStatistics).toStrictEqual({
-      aggregate: 0.01,
-      maximum: 0.01,
-      minimum: 0.01,
-      history: new CircularArray()
-    })
-    updateMeasurementStatistics(
-      measurementStatistics,
-      { aggregate: true, average: false, median: false },
-      0.02
-    )
-    expect(measurementStatistics).toStrictEqual({
-      aggregate: 0.03,
-      maximum: 0.02,
-      minimum: 0.01,
-      history: new CircularArray()
-    })
-    updateMeasurementStatistics(
-      measurementStatistics,
-      { aggregate: true, average: true, median: false },
-      0.001
-    )
-    expect(measurementStatistics).toStrictEqual({
-      aggregate: 0.031,
-      maximum: 0.02,
-      minimum: 0.001,
-      average: 0.001,
-      history: new CircularArray(DEFAULT_CIRCULAR_ARRAY_SIZE, 0.001)
-    })
-    updateMeasurementStatistics(
-      measurementStatistics,
-      { aggregate: true, average: true, median: false },
-      0.003
-    )
-    expect(measurementStatistics).toStrictEqual({
-      aggregate: 0.034,
-      maximum: 0.02,
-      minimum: 0.001,
-      average: 0.002,
-      history: new CircularArray(DEFAULT_CIRCULAR_ARRAY_SIZE, 0.001, 0.003)
-    })
-    updateMeasurementStatistics(
-      measurementStatistics,
-      { aggregate: true, average: false, median: true },
-      0.006
-    )
-    expect(measurementStatistics).toStrictEqual({
-      aggregate: 0.04,
-      maximum: 0.02,
-      minimum: 0.001,
-      median: 0.003,
-      history: new CircularArray(
-        DEFAULT_CIRCULAR_ARRAY_SIZE,
-        0.001,
-        0.003,
-        0.006
-      )
-    })
-    updateMeasurementStatistics(
-      measurementStatistics,
-      { aggregate: true, average: true, median: false },
-      0.01
-    )
-    expect(measurementStatistics).toStrictEqual({
-      aggregate: 0.05,
-      maximum: 0.02,
-      minimum: 0.001,
-      average: 0.005,
-      history: new CircularArray(
-        DEFAULT_CIRCULAR_ARRAY_SIZE,
-        0.001,
-        0.003,
-        0.006,
-        0.01
-      )
-    })
-  })
-
   it('Verify secureRandom() behavior', () => {
     const randomNumber = secureRandom()
     expect(typeof randomNumber === 'number').toBe(true)