|
1 | 1 | import * as _ from 'lodash'; |
2 | 2 | import { PassThrough } from 'stream'; |
| 3 | +import * as net from 'net'; |
3 | 4 | import * as http from 'http'; |
| 5 | +import * as os from 'os'; |
4 | 6 | import * as zlib from 'zlib'; |
5 | 7 |
|
6 | 8 | import { |
@@ -325,6 +327,15 @@ describe("Response subscriptions", () => { |
325 | 327 | describe("Abort subscriptions", () => { |
326 | 328 | let server = getLocal(); |
327 | 329 |
|
| 330 | + // DEBUG: Test whether get-port's presence causes flaky abort test |
| 331 | + before(async function () { |
| 332 | + this.timeout(30000); |
| 333 | + const { default: getPort } = await import('get-port'); |
| 334 | + console.log('[DEBUG] Calling getPort() 50 times to simulate full suite usage...'); |
| 335 | + for (let i = 0; i < 50; i++) await getPort(); |
| 336 | + console.log('[DEBUG] Done. lockedPorts should now have 50 entries.'); |
| 337 | + }); |
| 338 | + |
328 | 339 | beforeEach(() => server.start()); |
329 | 340 | afterEach(() => server.stop()); |
330 | 341 |
|
@@ -560,28 +571,40 @@ describe("Abort subscriptions", () => { |
560 | 571 | }); |
561 | 572 |
|
562 | 573 | it("should be sent in place of response notifications, not in addition", async () => { |
| 574 | + const t0 = performance.now(); |
| 575 | + const ts = (label: string) => console.log(` [ABORT-DEBUG] ${label}: +${(performance.now() - t0).toFixed(1)}ms`); |
| 576 | + |
563 | 577 | let seenRequestPromise = getDeferred<CompletedRequest>(); |
564 | | - await server.on('request', (r) => seenRequestPromise.resolve(r)); |
| 578 | + await server.on('request', (r) => { ts('request event received'); seenRequestPromise.resolve(r); }); |
565 | 579 |
|
566 | 580 | let seenResponseInitiatedPromise = getDeferred<InitiatedResponse>(); |
567 | | - await server.on('response-initiated', (r) => seenResponseInitiatedPromise.resolve(r)); |
| 581 | + await server.on('response-initiated', (r) => { ts('UNEXPECTED response-initiated event!'); seenResponseInitiatedPromise.resolve(r); }); |
568 | 582 |
|
569 | 583 | let seenResponsePromise = getDeferred<CompletedResponse>(); |
570 | | - await server.on('response', (r) => seenResponsePromise.resolve(r)); |
| 584 | + await server.on('response', (r) => { ts('UNEXPECTED response event!'); seenResponsePromise.resolve(r); }); |
571 | 585 |
|
572 | | - await server.forPost('/mocked-endpoint').thenCallback((req) => delay(500).then(() => ({}))); |
| 586 | + await server.forPost('/mocked-endpoint').thenCallback((req) => { |
| 587 | + ts('callback started'); |
| 588 | + return delay(500).then(() => { |
| 589 | + ts('callback 500ms delay completed'); |
| 590 | + return {}; |
| 591 | + }); |
| 592 | + }); |
573 | 593 |
|
574 | 594 | let abortable = makeAbortableRequest(server, '/mocked-endpoint'); |
575 | 595 | nodeOnly(() => (abortable as http.ClientRequest).end('request body')); |
576 | 596 |
|
577 | 597 | await seenRequestPromise; |
| 598 | + ts('seenRequestPromise resolved, calling abort()'); |
578 | 599 | abortable.abort(); |
| 600 | + ts('abort() called'); |
579 | 601 |
|
580 | 602 | await expect(Promise.race([ |
581 | 603 | seenResponseInitiatedPromise, |
582 | 604 | seenResponsePromise, |
583 | 605 | delay(100).then(() => { throw new Error('timeout') }) |
584 | 606 | ])).to.be.rejectedWith('timeout'); |
| 607 | + ts('test passed (timeout won)'); |
585 | 608 | }); |
586 | 609 |
|
587 | 610 | it("should not trigger an ended response body event", async () => { |
|
0 commit comments