Skip to content

test_runner: mock setInterval uses wrong interval after first time #50381

@mika-fischer

Description

@mika-fischer

Version

main

Platform

Linux s7 5.15.0-69-generic #76-Ubuntu SMP Fri Mar 17 17:19:29 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Subsystem

test

What steps will reproduce the bug?

When a mocked setInterval timer is triggered, the timers runAt time is updated for the next time it should run here. However , the increment is actually always 1, since the boolean flag isInterval is stored in the timer here

Pull request incoming.

test("setInterval uses the wrong interval", async (t) => {
  t.mock.timers.enable({ apis: ["setInterval"] });
  const fn = t.mock.fn();

  setInterval(fn, 1000);

  assert.strictEqual(fn.mock.callCount(), 0);

  t.mock.timers.tick(1000);

  assert.strictEqual(fn.mock.callCount(), 1);

  for (let i = 0; i < 999; ++i) {
    t.mock.timers.tick(1);
  }

  assert.strictEqual(fn.mock.callCount(), 1);
});

fails with:

❯ ~/src/libs/node/node index.mjs
﹣ aborting setTimeout clears wrong timer (2.795504ms) # SKIP
﹣ aborting setTimeout after timer is already triggered clear wrong timer (0.20311ms) # SKIP
✖ setInterval uses the wrong interval (24.795796ms)
  AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
  
  1000 !== 1
  
      at TestContext.<anonymous> (file:///home/mfischer/src/tests/node-mock-timers/index.mjs:72:10)
      at Test.runInAsyncScope (node:async_hooks:206:9)
      at Test.run (node:internal/test_runner/test:631:25)
      at Test.processPendingSubtests (node:internal/test_runner/test:374:18)
      at Test.postRun (node:internal/test_runner/test:715:19)
      at Test.run (node:internal/test_runner/test:673:12)
      at async Test.processPendingSubtests (node:internal/test_runner/test:374:7) {
    generatedMessage: true,
    code: 'ERR_ASSERTION',
    actual: 1000,
    expected: 1,
    operator: 'strictEqual'
  }

How often does it reproduce? Is there a required condition?

Always

What is the expected behavior? Why is that the expected behavior?

setInterval should use the correct interval

What do you see instead?

setInverval always uses interval 1 after first time

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    test_runnerIssues and PRs related to the test runner subsystem.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions