83 lines
2.0 KiB
TypeScript
83 lines
2.0 KiB
TypeScript
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;
|
|
});
|
|
});
|