lab icon indicating copy to clipboard operation
lab copied to clipboard

Supply AbortController signal to tests

Open kanongil opened this issue 2 years ago • 1 comments

Support plan

  • is this issue currently blocking your project? (yes/no): no
  • is this issue affecting a production system? (yes/no): no

Context

  • node version: 14+
  • module version: 24.3.2
  • environment (e.g. node, browser, native): node 14+
  • used with (e.g. hapi application, another framework, standalone, ...):
  • any other relevant information:

What problem are you trying to solve?

Simpler cleanup of failed (or time outed) tests.

Do you have a new or modified API suggestion to solve the problem?

Add an AbortController signal property to the flags parameter. This way a test can pass it on, eg.:

it('performs a fetch', async ({ signal }) => {

    const req = http.request('http://example.org', { signal });
    const [res] = await Events.onceee(req, 'response');           // Crashes since `onceee` does not exist.

    expect(res.statusCode).to.equal(200);
});

Without the signal, the code crashes before any event emitters are added, which obviously causes the test to fail. However, the request continues processing. If it errors at any point, it will cause a process uncaughtException, which will cause whatever subsequent test that is running to fail.

With the signal, which lab should trigger at the same time as calling onCleanup, it will be guaranteed to cause a process uncaughtException, but this time it should be an immediate AbortError which can be ignored, causing no further harm. This is on top of the obvious effect of aborting the no longer relevant request.

Note: This feature overlaps with the existing onCleanup flag. Any code using non-async onCleanup, can assign the logic as an event listener:

it('does something', async ({ signal }) => {

    signal.addEventListener('abort', () => {

        /* onCleanup logic goes here */
     });

     // or even simpler

    signal.onabort = () => {

        /* onCleanup logic goes here */
     };
});

kanongil avatar Oct 18 '21 20:10 kanongil

Thanks for the detailed explanation @kanongil.

Nargonath avatar Oct 18 '21 22:10 Nargonath