Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test_runner: check if timeout was cleared by own callback #51673

Merged

Conversation

Benricheson101
Copy link
Contributor

Fixes calling clearTimeout in a mocked setTimeout callback resulting in two timeouts being removed from the execution queue (the current timeout and the next one in the queue). This happens because clearTimeout removes the timeout at execution queue position 1, followed by the call in tick() to #executionQueue.shift() removing the next item in the queue.

I fixed this by checking if the first item in the execution queue has the same ID as the one that is being executed before calling #executionQueue.shift(). If the IDs aren't the same, it means it was already removed by a call to clearTimeout in the callback.

test('should not affect other timers when clearing timeout inside own callback', (t) => {
  t.mock.timers.enable({ apis: ['setTimeout'] });
  const f = t.mock.fn();

  const timer = setTimeout(() => {
    f();

    // Clearing the already-expired timeout should do nothing.
    // This call to clearTimeout removes the current timeout from the execution queue
    clearTimeout(timer);
  }, 50);

  // Once the above callback runs, the call to `#executionQueue.shift()` removes this timeout from the queue
  setTimeout(f, 50);
  setTimeout(f, 50);

  t.mock.timers.runAll();
  assert.strictEqual(f.mock.callCount(), 3); // AssertionError 2 !== 3
});

@nodejs-github-bot
Copy link
Collaborator

Review requested:

  • @nodejs/test_runner

@nodejs-github-bot nodejs-github-bot added needs-ci PRs that need a full CI run. test_runner Issues and PRs related to the test runner subsystem. labels Feb 6, 2024
@benjamingr
Copy link
Member

Nice catch!

@MoLow MoLow added request-ci Add this label to start a Jenkins CI on a PR. author ready PRs that have at least one approval, no pending requests for changes, and a CI started. labels Feb 11, 2024
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Feb 14, 2024
@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@MoLow MoLow added the commit-queue Add this label to land a pull request using GitHub Actions. label Feb 18, 2024
@nodejs-github-bot nodejs-github-bot removed the commit-queue Add this label to land a pull request using GitHub Actions. label Feb 18, 2024
@nodejs-github-bot nodejs-github-bot merged commit 17187dd into nodejs:main Feb 18, 2024
65 checks passed
@nodejs-github-bot
Copy link
Collaborator

Landed in 17187dd

targos pushed a commit that referenced this pull request Feb 19, 2024
PR-URL: #51673
Reviewed-By: Benjamin Gruenbaum <[email protected]>
Reviewed-By: Marco Ippolito <[email protected]>
Reviewed-By: Moshe Atlow <[email protected]>
@marco-ippolito marco-ippolito mentioned this pull request Mar 1, 2024
rdw-msft pushed a commit to rdw-msft/node that referenced this pull request Mar 20, 2024
PR-URL: nodejs#51673
Reviewed-By: Benjamin Gruenbaum <[email protected]>
Reviewed-By: Marco Ippolito <[email protected]>
Reviewed-By: Moshe Atlow <[email protected]>
richardlau pushed a commit that referenced this pull request Mar 25, 2024
PR-URL: #51673
Reviewed-By: Benjamin Gruenbaum <[email protected]>
Reviewed-By: Marco Ippolito <[email protected]>
Reviewed-By: Moshe Atlow <[email protected]>
richardlau pushed a commit that referenced this pull request Mar 25, 2024
PR-URL: #51673
Reviewed-By: Benjamin Gruenbaum <[email protected]>
Reviewed-By: Marco Ippolito <[email protected]>
Reviewed-By: Moshe Atlow <[email protected]>
@richardlau richardlau mentioned this pull request Mar 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
author ready PRs that have at least one approval, no pending requests for changes, and a CI started. needs-ci PRs that need a full CI run. test_runner Issues and PRs related to the test runner subsystem.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants