fix logic of semaphore test

This commit is contained in:
einhornimmond 2025-12-03 13:03:50 +01:00
parent 38f7ab87a5
commit f34324a399
2 changed files with 21 additions and 36 deletions

View File

@ -40,12 +40,10 @@ let testEnv: {
con: DataSource con: DataSource
db: AppDatabase db: AppDatabase
} }
let mutex: Mutex
beforeAll(async () => { beforeAll(async () => {
testEnv = await testEnvironment() testEnv = await testEnvironment()
mutate = testEnv.mutate mutate = testEnv.mutate
con = testEnv.con con = testEnv.con
mutex = new Mutex(testEnv.db.getRedisClient(), 'TRANSACTIONS_LOCK')
await cleanDB() await cleanDB()
}) })
@ -55,52 +53,38 @@ afterAll(async () => {
await testEnv.db.getRedisClient().quit() await testEnv.db.getRedisClient().quit()
}) })
type RunOrder = { [key: number]: { start: number, end: number } } type WorkData = { start: number, end: number }
async function fakeWork(runOrder: RunOrder, index: number) { async function fakeWork(workData: WorkData[], index: number) {
// const releaseLock = await TRANSACTIONS_LOCK.acquire() // const releaseLock = await TRANSACTIONS_LOCK.acquire()
// create a new mutex for every function call, like in production code
const mutex = new Mutex(testEnv.db.getRedisClient(), 'TRANSACTIONS_LOCK')
await mutex.acquire() await mutex.acquire()
const startDate = new Date() const startDate = new Date()
await new Promise((resolve) => setTimeout(resolve, Math.random() * 50)) await new Promise((resolve) => setTimeout(resolve, Math.random() * 50))
const endDate = new Date() const endDate = new Date()
runOrder[index] = { start: startDate.getTime(), end: endDate.getTime() } workData[index] = { start: startDate.getTime(), end: endDate.getTime() }
// releaseLock() // releaseLock()
await mutex.release() await mutex.release()
} }
describe('semaphore', () => { describe('semaphore', () => {
it("didn't should run in parallel", async () => { it("didn't should run in parallel", async () => {
const runOrder: RunOrder = {} const workData: WorkData[] = []
/*
await Promise.all([ const promises: Promise<void>[] = []
fakeWork(runOrder, 1), for(let i = 0; i < 20; i++) {
fakeWork(runOrder, 2), promises.push(fakeWork(workData, i))
fakeWork(runOrder, 3), }
fakeWork(runOrder, 4), await Promise.all(promises)
fakeWork(runOrder, 5), workData.sort((a, b) => a.start - b.start)
]) workData.forEach((work, index) => {
*/ expect(work.start).toBeLessThan(work.end)
// force sequential execution if(index < workData.length - 1) {
await fakeWork(runOrder, 1) expect(work.start).toBeLessThan(workData[index + 1].start)
await fakeWork(runOrder, 2) expect(work.end).toBeLessThanOrEqual(workData[index + 1].start)
await fakeWork(runOrder, 3) }
await fakeWork(runOrder, 4) })
await fakeWork(runOrder, 5)
// console.log('runOrder=', runOrder)
expect(runOrder[1].start).toBeLessThan(runOrder[1].end)
expect(runOrder[1].start).toBeLessThan(runOrder[2].start)
expect(runOrder[2].start).toBeLessThan(runOrder[2].end)
expect(runOrder[2].start).toBeLessThan(runOrder[3].start)
expect(runOrder[3].start).toBeLessThan(runOrder[3].end)
expect(runOrder[3].start).toBeLessThan(runOrder[4].start)
expect(runOrder[4].start).toBeLessThan(runOrder[4].end)
expect(runOrder[4].start).toBeLessThan(runOrder[5].start)
expect(runOrder[5].start).toBeLessThan(runOrder[5].end)
expect(runOrder[1].end).toBeLessThan(runOrder[2].end)
expect(runOrder[2].end).toBeLessThan(runOrder[3].end)
expect(runOrder[3].end).toBeLessThan(runOrder[4].end)
expect(runOrder[4].end).toBeLessThan(runOrder[5].end)
}) })
}) })

View File

@ -1,5 +1,6 @@
{ {
"lockfileVersion": 1, "lockfileVersion": 1,
"configVersion": 0,
"workspaces": { "workspaces": {
"": { "": {
"name": "gradido", "name": "gradido",