Skip to content

Commit 3b070ab

Browse files
add yet more tests
1 parent 25fc6c3 commit 3b070ab

File tree

2 files changed

+205
-0
lines changed

2 files changed

+205
-0
lines changed

test/basic-atomic-concurrency-test.js

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
'use strict'
2+
3+
const Promise = require('bluebird')
4+
const domain = require('domain')
5+
const test = require('tap').test
6+
7+
const db = require('../db-session.js')
8+
9+
const LOGS = []
10+
11+
const runOperations = db.transaction(function runOperations (inner) {
12+
return Promise.all(Array.from(Array(4)).map((_, idx) => {
13+
return idx % 2 === 0 ? inner(idx) : db.getConnection().then(connPair => {
14+
LOGS.push(`load ${idx}`)
15+
return Promise.delay(5).then(() => {
16+
LOGS.push(`release ${idx}`)
17+
connPair.release()
18+
})
19+
})
20+
}))
21+
})
22+
23+
function runSubOperation (rootIdx) {
24+
return Promise.all(Array.from(Array(4)).map((_, idx) => {
25+
return Promise.delay(5).then(() => {
26+
return db.getConnection().then(connPair => {
27+
LOGS.push(`load ${rootIdx} ${idx}`)
28+
return Promise.delay(5).then(() => {
29+
LOGS.push(`release ${rootIdx} ${idx}`)
30+
connPair.release()
31+
})
32+
})
33+
})
34+
}))
35+
}
36+
37+
const txRunSubOperation = db.transaction(runSubOperation)
38+
const atomicRunSubOperation = db.atomic(runSubOperation)
39+
40+
test('test nested transaction order', assert => {
41+
LOGS.length = 0
42+
const domain1 = domain.create()
43+
db.install(domain1, innerGetConnection, {maxConcurrency: 0})
44+
domain1.run(() => {
45+
return runOperations(txRunSubOperation)
46+
}).then(() => {
47+
assert.equal(process.domain, undefined)
48+
domain1.exit()
49+
}).then(() => {
50+
assert.equal(LOGS.join('\n'), `
51+
BEGIN
52+
load 1
53+
release 1
54+
load 3
55+
release 3
56+
load 0 0
57+
release 0 0
58+
load 0 1
59+
release 0 1
60+
load 0 2
61+
release 0 2
62+
load 0 3
63+
release 0 3
64+
load 2 0
65+
release 2 0
66+
load 2 1
67+
release 2 1
68+
load 2 2
69+
release 2 2
70+
load 2 3
71+
release 2 3
72+
COMMIT
73+
release
74+
`.trim())
75+
assert.equal(process.domain, undefined)
76+
}).then(() => assert.end())
77+
.catch(assert.end)
78+
})
79+
80+
test('test nested atomic transaction order', assert => {
81+
LOGS.length = 0
82+
const domain1 = domain.create()
83+
db.install(domain1, innerGetConnection, {maxConcurrency: 0})
84+
domain1.run(() => {
85+
return runOperations(atomicRunSubOperation)
86+
}).then(() => {
87+
assert.equal(process.domain, undefined)
88+
domain1.exit()
89+
}).then(() => {
90+
assert.equal(LOGS.join('\n').replace(/_[\d_]+$/gm, '_TS'), `
91+
BEGIN
92+
SAVEPOINT save_0_runSubOperation_TS
93+
load 0 0
94+
release 0 0
95+
load 0 1
96+
release 0 1
97+
load 0 2
98+
release 0 2
99+
load 0 3
100+
release 0 3
101+
RELEASE SAVEPOINT save_0_runSubOperation_TS
102+
load 1
103+
release 1
104+
SAVEPOINT save_1_runSubOperation_TS
105+
load 2 0
106+
release 2 0
107+
load 2 1
108+
release 2 1
109+
load 2 2
110+
release 2 2
111+
load 2 3
112+
release 2 3
113+
RELEASE SAVEPOINT save_1_runSubOperation_TS
114+
load 3
115+
release 3
116+
COMMIT
117+
release
118+
`.trim())
119+
assert.equal(process.domain, undefined)
120+
}).then(() => assert.end())
121+
.catch(assert.end)
122+
})
123+
124+
function innerGetConnection () {
125+
return {
126+
connection: {query (sql, ready) {
127+
LOGS.push(sql)
128+
return ready()
129+
}},
130+
release () {
131+
LOGS.push(`release`)
132+
}
133+
}
134+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
'use strict'
2+
3+
const Promise = require('bluebird')
4+
const domain = require('domain')
5+
const test = require('tap').test
6+
7+
const db = require('../db-session.js')
8+
9+
const LOGS = []
10+
11+
const runOperations = db.transaction(function runOperations () {
12+
return Promise.all(Array.from(Array(8)).map((_, idx) => {
13+
return db.getConnection().then(connPair => {
14+
LOGS.push(`load ${idx}`)
15+
return Promise.delay(5).then(() => {
16+
LOGS.push(`release ${idx}`)
17+
connPair.release()
18+
})
19+
})
20+
}))
21+
})
22+
23+
test('test root session concurrency=0', assert => {
24+
// compare to ./basic-session-concurrency-test.js, concurrency=1 —
25+
// operations should load and release in sequence, and be bookended
26+
// by "BEGIN" / "END"
27+
const domain1 = domain.create()
28+
db.install(domain1, innerGetConnection, {maxConcurrency: 0})
29+
domain1.run(() => {
30+
return runOperations()
31+
}).then(() => {
32+
assert.equal(process.domain, undefined)
33+
domain1.exit()
34+
}).then(() => {
35+
assert.equal(LOGS.join('\n'), `
36+
BEGIN
37+
load 0
38+
release 0
39+
load 1
40+
release 1
41+
load 2
42+
release 2
43+
load 3
44+
release 3
45+
load 4
46+
release 4
47+
load 5
48+
release 5
49+
load 6
50+
release 6
51+
load 7
52+
release 7
53+
COMMIT
54+
release
55+
`.trim())
56+
assert.equal(process.domain, undefined)
57+
}).then(() => assert.end())
58+
.catch(assert.end)
59+
})
60+
61+
function innerGetConnection () {
62+
return {
63+
connection: {query (sql, ready) {
64+
LOGS.push(sql)
65+
return ready()
66+
}},
67+
release () {
68+
LOGS.push(`release`)
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)