Merge pull request #2366 from balena-os/using-infer-steps-lock-unit-test

Add unit test for usingInferStepsLock
This commit is contained in:
flowzone-app[bot] 2024-08-27 21:17:44 +00:00 committed by GitHub
commit 6577ded0cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 3 deletions

View File

@ -268,9 +268,11 @@ function emitAsync<T extends keyof DeviceStateEvents>(
const inferStepsLock = () =>
takeGlobalLockRW('inferSteps').disposer((release) => release());
function usingInferStepsLock<T extends () => any, U extends ReturnType<T>>(
fn: T,
): Bluebird<UnwrappedPromise<U>> {
// Exported for unit test
export function usingInferStepsLock<
T extends () => any,
U extends ReturnType<T>,
>(fn: T): Bluebird<UnwrappedPromise<U>> {
return Bluebird.using(inferStepsLock, () => fn());
}

View File

@ -0,0 +1,30 @@
import { expect } from 'chai';
import * as deviceState from '~/src/device-state';
describe('usingInferStepsLock', () => {
it('should not allow to start a function call without finishing the previous sequential call of the function', async () => {
const result: string[] = [];
const fn = async (id: number, str: string) => {
return deviceState.usingInferStepsLock(async () => {
if (id < 3 || id === 20) {
result.push(`Started ${id}, ${str} call`);
await fn(id + 1, 'first');
await fn(id + 1, 'second');
result.push(`Finished ${id}, ${str} call`);
}
});
};
await fn(1, 'master');
await fn(20, 'master');
expect(result).to.deep.equal([
'Started 1, master call',
'Started 2, first call',
'Finished 2, first call',
'Started 2, second call',
'Finished 2, second call',
'Finished 1, master call',
'Started 20, master call',
'Finished 20, master call',
]);
});
});