import { promisify } from 'util'; import { expect } from 'chai'; import { describe } from 'mocha'; import { SimpleMutex } from './simple-mutex'; describe('Simple Mutex', () => { it('executes code after acquiring lock', () => { const mutex = new SimpleMutex(); return mutex.acquire().then(() => { const x = 1; expect(x).eq(1); }); }); it('correctly locks a resource', async () => { const mutex = new SimpleMutex(); let inUse = false; const useResource = () => { expect(inUse).to.be.false; inUse = true; return promisify(setTimeout)(1).then(() => { inUse = false; }); }; const acquireOne = mutex.acquire(); const acquireTwo = mutex.acquire(); const acquireThree = mutex.acquire(); void acquireOne.then(async (release) => { await useResource(); release(); }); void acquireTwo.then(async (release) => { await useResource(); release(); }); return acquireThree.then(async (release) => { await useResource(); release(); }); }); it('executes consumers in the right order', async () => { const mutex = new SimpleMutex(); let counter = 0; const useResource = (expectValue: number) => { counter++; expect(counter).to.equal(expectValue); return promisify(setTimeout)(1); }; const acquireOne = mutex.acquire(); const acquireTwo = mutex.acquire(); const acquireThree = mutex.acquire(); void acquireOne.then(async (release) => { await useResource(1); release(); }); void acquireTwo.then(async (release) => { await useResource(2); release(); }); return acquireThree.then(async (release) => { await useResource(3); release(); }); }); it('correctly informs if it is currently locked', async () => { const mutex = new SimpleMutex(); const release = await mutex.acquire(); expect(mutex.isLocked()).to.be.true; release(); expect(mutex.isLocked()).to.be.false; }); });