Skip to content

Commit 42c6b40

Browse files
committed
sqlite: add userVersion concurrency test
1 parent 38611a2 commit 42c6b40

File tree

4 files changed

+60
-5
lines changed

4 files changed

+60
-5
lines changed

package-lock.json

+16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
"uuid": ">=8 <10"
4646
},
4747
"devDependencies": {
48-
"prettier-plugin-jsdoc": "^1.3.0",
48+
"@types/node": "^22.10.7",
4949
"@typescript-eslint/eslint-plugin": "^7.16.0",
5050
"@typescript-eslint/parser": "^7.16.0",
5151
"@vitest/coverage-v8": "2.0.2",
@@ -60,6 +60,7 @@
6060
"fs-extra": "^11.2.0",
6161
"nps-utils": "^1.7.0",
6262
"prettier": "^3.3.3",
63+
"prettier-plugin-jsdoc": "^1.3.0",
6364
"tmp-promise": "3.0.3",
6465
"typescript": "^5.5.3",
6566
"vite": "^5.3.3",

src/DB/SQLite.test.js src/DB/SQLite.test.ts

+41-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import sysPath from 'path'
1+
import sysPath from 'node:path'
22
import tmp from 'tmp-promise'
33
import SQLite, {sql, valToSql} from './SQLite'
44

@@ -108,7 +108,7 @@ describe('SQLite', () => {
108108
await extraDb.exec('UPDATE t SET v=v+1 WHERE id=1')
109109
await extraDb.close()
110110
}
111-
const Ps = []
111+
const Ps: Promise<void>[] = []
112112
for (let i = 0; i < 10; i++) {
113113
Ps.push(openClose())
114114
}
@@ -319,13 +319,51 @@ describe('SQLite', () => {
319319
await expect(db.userVersion()).resolves.toBe(5)
320320
})
321321

322+
test.only('concurrent userVersion()', async () => {
323+
const dir = await tmp.dir({unsafeCleanup: true, prefix: 'sqlite-test-'})
324+
const {path} = dir
325+
const file = sysPath.join(path, 'db')
326+
const db1 = new SQLite({file})
327+
const db2 = new SQLite({file})
328+
try {
329+
const p1 = db1.userVersion()
330+
const p2 = db2.userVersion()
331+
expect(await Promise.all([p1, p2])).toEqual([0, 0])
332+
await db1.userVersion(5)
333+
expect(await Promise.all([db1.userVersion(), db2.userVersion()])).toEqual(
334+
[5, 5]
335+
)
336+
337+
let writer, waiter
338+
const writerP = new Promise(r => (writer = r))
339+
const waiterP = new Promise(r => (waiter = r))
340+
341+
const db1Done = db1.__withTransaction(async () => {
342+
await db1.userVersion(10)
343+
writer()
344+
await waiterP
345+
})
346+
347+
await writerP
348+
expect(await db1.userVersion()).toBe(10)
349+
expect(await db2.userVersion()).toBe(5)
350+
waiter!()
351+
await db1Done
352+
expect(await db2.userVersion()).toBe(10)
353+
} finally {
354+
await db1.close()
355+
await db2.close()
356+
await dir.cleanup()
357+
}
358+
})
359+
322360
test('.each()', async () => {
323361
const db = new SQLite()
324362
await db.exec(
325363
`CREATE TABLE foo(hi NUMBER); INSERT INTO foo VALUES (42),(43);`
326364
)
327365
for (let i = 0; i < 100; i++) await db.run('INSERT INTO FOO VALUES(?)', i)
328-
const arr = []
366+
const arr: number[] = []
329367
let flag = false
330368
await db.each(`SELECT * FROM foo`, ({hi}) => {
331369
// it should wait until db.each is done

tsconfig.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
// Available types
1212
"lib": ["ES2021"],
13-
"types": ["vite/client", "vitest/globals"],
13+
"types": ["vite/client", "vitest/globals", "node"],
1414

1515
// Module resolution
1616
"forceConsistentCasingInFileNames": true,

0 commit comments

Comments
 (0)