|
2 | 2 |
|
3 | 3 | import Spark, { calculateDelayBeforeNextTask, newStats } from '../lib/spark.js'
|
4 | 4 | import { test } from 'zinnia:test'
|
5 |
| -import { assertInstanceOf, assertEquals, assertArrayIncludes } from 'zinnia:assert' |
| 5 | +import { assertInstanceOf, assertEquals, assertArrayIncludes, assertNotEquals, assertLessOrEqual, assertGreaterOrEqual } from 'zinnia:assert' |
6 | 6 | import { SPARK_VERSION } from '../lib/constants.js'
|
7 | 7 |
|
8 | 8 | const KNOWN_CID = 'bafkreih25dih6ug3xtj73vswccw423b56ilrwmnos4cbwhrceudopdp5sq'
|
@@ -363,3 +363,60 @@ test('calculateDelayBeforeNextTask() handles one task per round', () => {
|
363 | 363 | })
|
364 | 364 | assertEquals(delay, 60_000)
|
365 | 365 | })
|
| 366 | + |
| 367 | +test('calculateDelayBeforeNextTask() introduces random jitter', () => { |
| 368 | + const getDelay = () => calculateDelayBeforeNextTask({ |
| 369 | + lastTaskDurationInMs: 3_000, |
| 370 | + |
| 371 | + // one task every 10 seconds (on average) |
| 372 | + roundLengthInMs: 60_000, |
| 373 | + maxTasksPerRound: 6, |
| 374 | + |
| 375 | + // jitter up to 1 second |
| 376 | + maxJitterInMs: 1_000 |
| 377 | + }) |
| 378 | + |
| 379 | + const delay1 = getDelay() |
| 380 | + const delay2 = getDelay() |
| 381 | + |
| 382 | + assertGreaterOrEqual(delay1, 7_000) |
| 383 | + assertLessOrEqual(delay1, 7_000 + 1_000) |
| 384 | + |
| 385 | + assertNotEquals( |
| 386 | + delay1, |
| 387 | + delay2, |
| 388 | + `Expected delay values to be different because of jitter. Actual value: ${delay1}` |
| 389 | + ) |
| 390 | + assertLessOrEqual( |
| 391 | + Math.abs(delay1 - delay2), |
| 392 | + 1_000, |
| 393 | + `expected delay values to be within 1 second of each other. Actual values: ${delay1} <> ${delay2}` |
| 394 | + ) |
| 395 | +}) |
| 396 | + |
| 397 | +test('calculateDelayBeforeNextTask() introduces random jitter for zero tasks in round', () => { |
| 398 | + const getDelay = () => calculateDelayBeforeNextTask({ |
| 399 | + maxTasksPerRound: 0, |
| 400 | + |
| 401 | + // jitter up to 1 second |
| 402 | + maxJitterInMs: 1_000, |
| 403 | + |
| 404 | + // the values below are not important |
| 405 | + roundLengthInMs: 12345, |
| 406 | + lastTaskDurationInMs: 12 |
| 407 | + }) |
| 408 | + |
| 409 | + const delay1 = getDelay() |
| 410 | + const delay2 = getDelay() |
| 411 | + |
| 412 | + assertNotEquals( |
| 413 | + delay1, |
| 414 | + delay2, |
| 415 | + `Expected delay values to be different because of jitter. Actual value: ${delay1}` |
| 416 | + ) |
| 417 | + assertLessOrEqual( |
| 418 | + Math.abs(delay1 - delay2), |
| 419 | + 1_000, |
| 420 | + `expected delay values to be within 1 second of each other. Actual values: ${delay1} <> ${delay2}` |
| 421 | + ) |
| 422 | +}) |
0 commit comments