build(deps-dev): bump mocha from 10.4.0 to 10.5.0
[poolifier.git] / tests / pools / selection-strategies / selection-strategies.test.mjs
index 345c2af8bc6f349d88198e1e92000a81390929d2..e8df7e1a5c35baa931595bb49493f5ba28e4fd5c 100644 (file)
@@ -2,13 +2,13 @@ import { randomInt } from 'node:crypto'
 
 import { expect } from 'expect'
 
-import { CircularArray } from '../../../lib/circular-array.cjs'
+import { CircularBuffer } from '../../../lib/circular-buffer.cjs'
 import {
   DynamicClusterPool,
   DynamicThreadPool,
   FixedClusterPool,
   FixedThreadPool,
-  WorkerChoiceStrategies
+  WorkerChoiceStrategies,
 } from '../../../lib/index.cjs'
 
 describe('Selection strategies test suite', () => {
@@ -112,7 +112,7 @@ describe('Selection strategies test suite', () => {
         expect(
           pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
             workerChoiceStrategy
-          ).workerNodeVirtualTaskRunTime
+          ).workerNodeVirtualTaskExecutionTime
         ).toBe(0)
       } else if (
         workerChoiceStrategy ===
@@ -121,7 +121,7 @@ describe('Selection strategies test suite', () => {
         expect(
           pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
             workerChoiceStrategy
-          ).workerNodeVirtualTaskRunTime
+          ).workerNodeVirtualTaskExecutionTime
         ).toBe(0)
         expect(
           pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
@@ -159,7 +159,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -170,7 +170,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -189,18 +189,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       waitTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -215,18 +215,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       waitTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -255,22 +255,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         waitTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
     }
     expect(
@@ -311,22 +311,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         waitTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -434,7 +434,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -445,7 +445,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -464,18 +464,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       waitTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -490,18 +490,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       waitTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -529,22 +529,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         waitTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -588,22 +588,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         waitTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -633,7 +633,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -644,7 +644,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -663,18 +663,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: true,
         average: false,
-        median: false
+        median: false,
       },
       waitTime: {
         aggregate: true,
         average: false,
-        median: false
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -689,18 +689,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: true,
         average: false,
-        median: false
+        median: false,
       },
       waitTime: {
         aggregate: true,
         average: false,
-        median: false
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -728,22 +728,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
         }),
         waitTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
         }),
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -797,22 +797,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
         }),
         waitTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
         }),
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -852,7 +852,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -863,7 +863,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -882,18 +882,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       waitTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       elu: {
         aggregate: true,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -908,18 +908,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       waitTime: {
         aggregate: false,
         average: false,
-        median: false
+        median: false,
       },
       elu: {
         aggregate: true,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -947,22 +947,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         waitTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         elu: expect.objectContaining({
           idle: expect.objectContaining({
-            history: expect.any(CircularArray)
+            history: expect.any(CircularBuffer),
           }),
           active: expect.objectContaining({
-            history: expect.any(CircularArray)
-          })
-        })
+            history: expect.any(CircularBuffer),
+          }),
+        }),
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -1022,22 +1022,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         waitTime: {
-          history: new CircularArray()
+          history: expect.any(CircularBuffer),
         },
         elu: expect.objectContaining({
           idle: expect.objectContaining({
-            history: expect.any(CircularArray)
+            history: expect.any(CircularBuffer),
           }),
           active: expect.objectContaining({
-            history: expect.any(CircularArray)
-          })
-        })
+            history: expect.any(CircularBuffer),
+          }),
+        }),
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -1083,7 +1083,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -1094,7 +1094,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -1113,18 +1113,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: true,
         average: true,
-        median: false
+        median: false,
       },
       waitTime: {
-        aggregate: false,
-        average: false,
-        median: false
+        aggregate: true,
+        average: true,
+        median: false,
       },
       elu: {
         aggregate: true,
         average: true,
-        median: false
-      }
+        median: false,
+      },
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -1139,18 +1139,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: true,
         average: true,
-        median: false
+        median: false,
       },
       waitTime: {
-        aggregate: false,
-        average: false,
-        median: false
+        aggregate: true,
+        average: true,
+        median: false,
       },
       elu: {
         aggregate: true,
         average: true,
-        median: false
-      }
+        median: false,
+      },
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -1178,22 +1178,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
+        }),
+        waitTime: expect.objectContaining({
+          history: expect.any(CircularBuffer),
         }),
-        waitTime: {
-          history: new CircularArray()
-        },
         elu: expect.objectContaining({
           idle: expect.objectContaining({
-            history: expect.any(CircularArray)
+            history: expect.any(CircularBuffer),
           }),
           active: expect.objectContaining({
-            history: expect.any(CircularArray)
-          })
-        })
+            history: expect.any(CircularBuffer),
+          }),
+        }),
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -1209,6 +1209,16 @@ describe('Selection strategies test suite', () => {
       } else {
         expect(workerNode.usage.runTime.average).toBeGreaterThan(0)
       }
+      if (workerNode.usage.waitTime.aggregate == null) {
+        expect(workerNode.usage.waitTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.average == null) {
+        expect(workerNode.usage.waitTime.average).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.average).toBeGreaterThan(0)
+      }
       if (workerNode.usage.elu.active.aggregate == null) {
         expect(workerNode.usage.elu.active.aggregate).toBeUndefined()
       } else {
@@ -1264,22 +1274,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
+        }),
+        waitTime: expect.objectContaining({
+          history: expect.any(CircularBuffer),
         }),
-        waitTime: {
-          history: new CircularArray()
-        },
         elu: expect.objectContaining({
           idle: expect.objectContaining({
-            history: expect.any(CircularArray)
+            history: expect.any(CircularBuffer),
           }),
           active: expect.objectContaining({
-            history: expect.any(CircularArray)
-          })
-        })
+            history: expect.any(CircularBuffer),
+          }),
+        }),
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -1295,6 +1305,16 @@ describe('Selection strategies test suite', () => {
       } else {
         expect(workerNode.usage.runTime.average).toBeGreaterThan(0)
       }
+      if (workerNode.usage.waitTime.aggregate == null) {
+        expect(workerNode.usage.waitTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.average == null) {
+        expect(workerNode.usage.waitTime.average).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.average).toBeGreaterThan(0)
+      }
       if (workerNode.usage.elu.active.aggregate == null) {
         expect(workerNode.usage.elu.active.aggregate).toBeUndefined()
       } else {
@@ -1335,8 +1355,8 @@ describe('Selection strategies test suite', () => {
       {
         workerChoiceStrategy: WorkerChoiceStrategies.FAIR_SHARE,
         workerChoiceStrategyOptions: {
-          runTime: { median: true }
-        }
+          runTime: { median: true },
+        },
       }
     )
     // TODO: Create a better test to cover `FairShareChoiceStrategy#choose`
@@ -1355,22 +1375,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
+        }),
+        waitTime: expect.objectContaining({
+          history: expect.any(CircularBuffer),
         }),
-        waitTime: {
-          history: new CircularArray()
-        },
         elu: expect.objectContaining({
           idle: expect.objectContaining({
-            history: expect.any(CircularArray)
+            history: expect.any(CircularBuffer),
           }),
           active: expect.objectContaining({
-            history: expect.any(CircularArray)
-          })
-        })
+            history: expect.any(CircularBuffer),
+          }),
+        }),
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -1386,6 +1406,16 @@ describe('Selection strategies test suite', () => {
       } else {
         expect(workerNode.usage.runTime.median).toBeGreaterThan(0)
       }
+      if (workerNode.usage.waitTime.aggregate == null) {
+        expect(workerNode.usage.waitTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.median == null) {
+        expect(workerNode.usage.waitTime.median).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.median).toBeGreaterThan(0)
+      }
       if (workerNode.usage.elu.active.aggregate == null) {
         expect(workerNode.usage.elu.active.aggregate).toBeUndefined()
       } else {
@@ -1426,7 +1456,7 @@ describe('Selection strategies test suite', () => {
     )
     for (const workerNode of pool.workerNodes) {
       workerNode.strategyData = {
-        virtualTaskEndTimestamp: performance.now()
+        virtualTaskEndTimestamp: performance.now(),
       }
     }
     pool.setWorkerChoiceStrategy(workerChoiceStrategy)
@@ -1441,7 +1471,7 @@ describe('Selection strategies test suite', () => {
     )
     for (const workerNode of pool.workerNodes) {
       workerNode.strategyData = {
-        virtualTaskEndTimestamp: performance.now()
+        virtualTaskEndTimestamp: performance.now(),
       }
     }
     pool.setWorkerChoiceStrategy(workerChoiceStrategy)
@@ -1461,7 +1491,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -1472,7 +1502,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -1491,18 +1521,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: true,
         average: true,
-        median: false
+        median: false,
       },
       waitTime: {
-        aggregate: false,
-        average: false,
-        median: false
+        aggregate: true,
+        average: true,
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -1517,18 +1547,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: true,
         average: true,
-        median: false
+        median: false,
       },
       waitTime: {
-        aggregate: false,
-        average: false,
-        median: false
+        aggregate: true,
+        average: true,
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -1556,22 +1586,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
+        }),
+        waitTime: expect.objectContaining({
+          history: expect.any(CircularBuffer),
         }),
-        waitTime: {
-          history: new CircularArray()
-        },
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -1587,6 +1617,16 @@ describe('Selection strategies test suite', () => {
       } else {
         expect(workerNode.usage.runTime.average).toBeGreaterThan(0)
       }
+      if (workerNode.usage.waitTime.aggregate == null) {
+        expect(workerNode.usage.waitTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.average == null) {
+        expect(workerNode.usage.waitTime.average).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.average).toBeGreaterThan(0)
+      }
     }
     expect(
       pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
@@ -1601,7 +1641,7 @@ describe('Selection strategies test suite', () => {
     expect(
       pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
         pool.workerChoiceStrategiesContext.defaultWorkerChoiceStrategy
-      ).workerNodeVirtualTaskRunTime
+      ).workerNodeVirtualTaskExecutionTime
     ).toBeGreaterThanOrEqual(0)
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -1630,22 +1670,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
+        }),
+        waitTime: expect.objectContaining({
+          history: expect.any(CircularBuffer),
         }),
-        waitTime: {
-          history: new CircularArray()
-        },
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -1661,6 +1701,16 @@ describe('Selection strategies test suite', () => {
       } else {
         expect(workerNode.usage.runTime.average).toBeGreaterThan(0)
       }
+      if (workerNode.usage.waitTime.aggregate == null) {
+        expect(workerNode.usage.waitTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.average == null) {
+        expect(workerNode.usage.waitTime.average).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.average).toBeGreaterThan(0)
+      }
     }
     expect(
       pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
@@ -1675,7 +1725,7 @@ describe('Selection strategies test suite', () => {
     expect(
       pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
         pool.workerChoiceStrategiesContext.defaultWorkerChoiceStrategy
-      ).workerNodeVirtualTaskRunTime
+      ).workerNodeVirtualTaskExecutionTime
     ).toBeGreaterThanOrEqual(0)
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -1689,8 +1739,8 @@ describe('Selection strategies test suite', () => {
       {
         workerChoiceStrategy: WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN,
         workerChoiceStrategyOptions: {
-          runTime: { median: true }
-        }
+          runTime: { median: true },
+        },
       }
     )
     // TODO: Create a better test to cover `WeightedRoundRobinWorkerChoiceStrategy#choose`
@@ -1709,22 +1759,22 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
+        }),
+        waitTime: expect.objectContaining({
+          history: expect.any(CircularBuffer),
         }),
-        waitTime: {
-          history: new CircularArray()
-        },
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
@@ -1740,6 +1790,16 @@ describe('Selection strategies test suite', () => {
       } else {
         expect(workerNode.usage.runTime.median).toBeGreaterThan(0)
       }
+      if (workerNode.usage.waitTime.aggregate == null) {
+        expect(workerNode.usage.waitTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.median == null) {
+        expect(workerNode.usage.waitTime.median).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.median).toBeGreaterThan(0)
+      }
     }
     expect(
       pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
@@ -1754,7 +1814,7 @@ describe('Selection strategies test suite', () => {
     expect(
       pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
         pool.workerChoiceStrategiesContext.defaultWorkerChoiceStrategy
-      ).workerNodeVirtualTaskRunTime
+      ).workerNodeVirtualTaskExecutionTime
     ).toBeGreaterThanOrEqual(0)
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -1838,7 +1898,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -1849,7 +1909,7 @@ describe('Selection strategies test suite', () => {
     )
     expect(pool.workerChoiceStrategiesContext.getPolicy()).toStrictEqual({
       dynamicWorkerUsage: false,
-      dynamicWorkerReady: true
+      dynamicWorkerReady: true,
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -1869,18 +1929,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: true,
         average: true,
-        median: false
+        median: false,
       },
       waitTime: {
-        aggregate: false,
-        average: false,
-        median: false
+        aggregate: true,
+        average: true,
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     await pool.destroy()
     pool = new DynamicThreadPool(
@@ -1895,18 +1955,18 @@ describe('Selection strategies test suite', () => {
       runTime: {
         aggregate: true,
         average: true,
-        median: false
+        median: false,
       },
       waitTime: {
-        aggregate: false,
-        average: false,
-        median: false
+        aggregate: true,
+        average: true,
+        median: false,
       },
       elu: {
         aggregate: false,
         average: false,
-        median: false
-      }
+        median: false,
+      },
     })
     // We need to clean up the resources after our test
     await pool.destroy()
@@ -1918,7 +1978,7 @@ describe('Selection strategies test suite', () => {
       './tests/worker-files/thread/testWorker.mjs',
       {
         workerChoiceStrategy:
-          WorkerChoiceStrategies.INTERLEAVED_WEIGHTED_ROUND_ROBIN
+          WorkerChoiceStrategies.INTERLEAVED_WEIGHTED_ROUND_ROBIN,
       }
     )
     // TODO: Create a better test to cover `InterleavedWeightedRoundRobinWorkerChoiceStrategy#choose`
@@ -1937,27 +1997,47 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
+        }),
+        waitTime: expect.objectContaining({
+          history: expect.any(CircularBuffer),
         }),
-        waitTime: {
-          history: new CircularArray()
-        },
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
         max * maxMultiplier
       )
+      if (workerNode.usage.runTime.aggregate == null) {
+        expect(workerNode.usage.runTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.runTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.runTime.average == null) {
+        expect(workerNode.usage.runTime.average).toBeUndefined()
+      } else {
+        expect(workerNode.usage.runTime.average).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.aggregate == null) {
+        expect(workerNode.usage.waitTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.average == null) {
+        expect(workerNode.usage.waitTime.average).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.average).toBeGreaterThan(0)
+      }
     }
     expect(
       pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(
@@ -2002,7 +2082,7 @@ describe('Selection strategies test suite', () => {
       './tests/worker-files/thread/testWorker.mjs',
       {
         workerChoiceStrategy:
-          WorkerChoiceStrategies.INTERLEAVED_WEIGHTED_ROUND_ROBIN
+          WorkerChoiceStrategies.INTERLEAVED_WEIGHTED_ROUND_ROBIN,
       }
     )
     // TODO: Create a better test to cover `InterleavedWeightedRoundRobinWorkerChoiceStrategy#choose`
@@ -2021,27 +2101,47 @@ describe('Selection strategies test suite', () => {
           maxQueued: 0,
           sequentiallyStolen: 0,
           stolen: 0,
-          failed: 0
+          failed: 0,
         },
         runTime: expect.objectContaining({
-          history: expect.any(CircularArray)
+          history: expect.any(CircularBuffer),
+        }),
+        waitTime: expect.objectContaining({
+          history: expect.any(CircularBuffer),
         }),
-        waitTime: {
-          history: new CircularArray()
-        },
         elu: {
           idle: {
-            history: new CircularArray()
+            history: expect.any(CircularBuffer),
           },
           active: {
-            history: new CircularArray()
-          }
-        }
+            history: expect.any(CircularBuffer),
+          },
+        },
       })
       expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0)
       expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual(
         max * maxMultiplier
       )
+      if (workerNode.usage.runTime.aggregate == null) {
+        expect(workerNode.usage.runTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.runTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.runTime.average == null) {
+        expect(workerNode.usage.runTime.average).toBeUndefined()
+      } else {
+        expect(workerNode.usage.runTime.average).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.aggregate == null) {
+        expect(workerNode.usage.waitTime.aggregate).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0)
+      }
+      if (workerNode.usage.waitTime.average == null) {
+        expect(workerNode.usage.waitTime.average).toBeUndefined()
+      } else {
+        expect(workerNode.usage.waitTime.average).toBeGreaterThan(0)
+      }
     }
     expect(
       pool.workerChoiceStrategiesContext.workerChoiceStrategies.get(