From 4fe621ef76f705e9030fb12e26f0130125db9d43 Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 30 Mar 2023 16:54:37 +0200 Subject: [PATCH] fix(utils): leaky bucket slow refill test (#2907) * fix(utils): leaky bucket slow refill test * fix the fix * remove left comments * Update packages/utils/tests/bucket.spec.ts Co-authored-by: Jonathan Ho --------- Co-authored-by: Jonathan Ho --- packages/utils/tests/bucket.spec.ts | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/utils/tests/bucket.spec.ts b/packages/utils/tests/bucket.spec.ts index 13ee5d7de..4a97bf185 100644 --- a/packages/utils/tests/bucket.spec.ts +++ b/packages/utils/tests/bucket.spec.ts @@ -3,6 +3,14 @@ import { afterEach, beforeEach, describe, it } from 'mocha' import sinon from 'sinon' import { LeakyBucket } from '../src/bucket.js' +async function promiseState(p: Promise): Promise { + const t = {} + return await Promise.race([p, t]).then( + (v) => (v === t ? 'pending' : 'fulfilled'), + () => 'rejected', + ) +} + describe('bucket.ts', () => { let clock: sinon.SinonFakeTimers @@ -143,8 +151,21 @@ describe('bucket.ts', () => { refillAmount: 1, }) - await bucket.acquire() - await bucket.acquire() + const acquired1 = bucket.acquire() + const acquired2 = bucket.acquire() + + // js event loop + await (async () => {})() + + expect(await promiseState(acquired1)).to.equal('fulfilled') + expect(await promiseState(acquired2)).to.equal('pending') + + await clock.tickAsync(499) + expect(await promiseState(acquired2)).to.equal('pending') + + await clock.tickAsync(1) + expect(await promiseState(acquired2)).to.equal('fulfilled') + expect(bucket.remaining).equals(0) expect(bucket.used).equals(1) })