RenaiApp/src/main/modules/mutex/simple-mutex.spec.ts

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;
});
});