diff --git a/packages/core/test/lib/utils/promisebuffer.test.ts b/packages/core/test/lib/utils/promisebuffer.test.ts index 9c944ffd0c39..d1b4b9abc48d 100644 --- a/packages/core/test/lib/utils/promisebuffer.test.ts +++ b/packages/core/test/lib/utils/promisebuffer.test.ts @@ -1,8 +1,11 @@ -import { describe, expect, test, vi } from 'vitest'; +import { afterEach, describe, expect, test, vi } from 'vitest'; import { makePromiseBuffer } from '../../../src/utils/promisebuffer'; import { rejectedSyncPromise, resolvedSyncPromise } from '../../../src/utils/syncpromise'; describe('PromiseBuffer', () => { + afterEach(() => { + vi.useRealTimers(); + }); describe('add()', () => { test('enforces limit of promises', async () => { const buffer = makePromiseBuffer(5); @@ -105,20 +108,28 @@ describe('PromiseBuffer', () => { describe('drain()', () => { test('drains all promises without timeout', async () => { + vi.useFakeTimers(); + const buffer = makePromiseBuffer(); - const p1 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 1))); - const p2 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 1))); - const p3 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 1))); - const p4 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 1))); - const p5 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 1))); + const p1 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 10))); + const p2 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 10))); + const p3 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 10))); + const p4 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 10))); + const p5 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 10))); [p1, p2, p3, p4, p5].forEach(p => { void buffer.add(p); }); expect(buffer.$.length).toEqual(5); - const result = await buffer.drain(); + + const drainPromise = buffer.drain(); + + // Advance time to resolve all promises + await vi.advanceTimersByTimeAsync(10); + + const result = await drainPromise; expect(result).toEqual(true); expect(buffer.$.length).toEqual(0); @@ -130,13 +141,15 @@ describe('PromiseBuffer', () => { }); test('drains all promises with timeout', async () => { + vi.useFakeTimers(); + const buffer = makePromiseBuffer(); - const p1 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 2))); - const p2 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 4))); - const p3 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 6))); - const p4 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 8))); - const p5 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 10))); + const p1 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 20))); + const p2 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 40))); + const p3 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 60))); + const p4 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 80))); + const p5 = vi.fn(() => new Promise(resolve => setTimeout(resolve, 100))); [p1, p2, p3, p4, p5].forEach(p => { void buffer.add(p); @@ -149,15 +162,29 @@ describe('PromiseBuffer', () => { expect(p5).toHaveBeenCalled(); expect(buffer.$.length).toEqual(5); - const result = await buffer.drain(6); + + // Start draining with a 50ms timeout + const drainPromise = buffer.drain(50); + + // Advance time by 50ms - this will: + // - Resolve p1 (20ms) and p2 (40ms) + // - Trigger the drain timeout (50ms) + // - p3, p4, p5 are still pending + await vi.advanceTimersByTimeAsync(50); + + const result = await drainPromise; expect(result).toEqual(false); - // p5 & p4 are still in the buffer - // Leaving some wiggle room, possibly one or two items are still in the buffer - // to avoid flakiness - expect(buffer.$.length).toBeGreaterThanOrEqual(1); - // Now drain final item - const result2 = await buffer.drain(); + // p3, p4 & p5 are still in the buffer + expect(buffer.$.length).toEqual(3); + + // Now drain remaining items without timeout + const drainPromise2 = buffer.drain(); + + // Advance time to resolve remaining promises + await vi.advanceTimersByTimeAsync(100); + + const result2 = await drainPromise2; expect(result2).toEqual(true); expect(buffer.$.length).toEqual(0); });