mirror of
https://github.com/IT4Change/gradido.git
synced 2026-04-06 01:25:28 +00:00
fix logic of semaphore test
This commit is contained in:
parent
38f7ab87a5
commit
f34324a399
@ -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)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user