Skip to content

Commit 77c8ed6

Browse files
More stress tests
1 parent 16c447e commit 77c8ed6

File tree

2 files changed

+122
-22
lines changed

2 files changed

+122
-22
lines changed

test/database.test.ts

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -371,26 +371,4 @@ describe('database', () => {
371371
})
372372
})
373373
})
374-
375-
describe('stress testing', () => {
376-
it(
377-
'20x sql async with random selects',
378-
async () => {
379-
const numQueries = 20
380-
const startTime = Date.now()
381-
// database.verbose()
382-
const table = 'people'
383-
for (let i = 0; i < numQueries; i++) {
384-
const results = await database.sql`SELECT * FROM ${table} ORDER BY RANDOM() LIMIT 12`
385-
expect(results).toHaveLength(12)
386-
expect(Object.keys(results[0])).toEqual(['id', 'name', 'age', 'hobby'])
387-
}
388-
389-
const queryMs = (Date.now() - startTime) / numQueries
390-
console.log(`${numQueries}x template selects, ${queryMs.toFixed(0)}ms per query`)
391-
expect(queryMs).toBeLessThan(2000)
392-
},
393-
LONG_TIMEOUT
394-
)
395-
})
396374
})

test/stress.test.ts

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/**
2+
* stress.test.ts - opens lots of connections and queries
3+
*/
4+
5+
import { Database } from '../src/database'
6+
import { CHINOOK_DATABASE_URL } from './connection.test'
7+
import { getTestingDatabase } from './database.test'
8+
9+
const EXTRA_LONG_TIMEOUT = 60 * 60 * 1000 // 1 hour
10+
11+
describe('stress testing', () => {
12+
it(
13+
'should open lots of simple connections in sequence',
14+
async () => {
15+
let numConnectios = 500,
16+
i = 1
17+
try {
18+
const startTime = Date.now()
19+
for (let i = 1; i <= numConnectios; i++) {
20+
const connection = new Database(CHINOOK_DATABASE_URL)
21+
const results = await connection.sql`SELECT ${i} as 'connection_id'`
22+
expect(results[0]['connection_id']).toBe(i)
23+
connection.close()
24+
if (i % 25 === 0) {
25+
const connectionMs = (Date.now() - startTime) / i
26+
console.log(`${i}x open and close, ${connectionMs.toFixed(0)}ms per connection`)
27+
expect(connectionMs).toBeLessThan(2000)
28+
}
29+
}
30+
} catch (error) {
31+
console.error(`Error on connection ${i}: ${error}`)
32+
expect(error).toBeNull()
33+
}
34+
},
35+
EXTRA_LONG_TIMEOUT
36+
)
37+
38+
it(
39+
'should open lots of read and write connections in sequence',
40+
async () => {
41+
let numConnectios = 20,
42+
i = 1
43+
try {
44+
const startTime = Date.now()
45+
for (let i = 1; i <= numConnectios; i++) {
46+
const connection = getTestingDatabase()
47+
const results = await connection.sql`SELECT * FROM people ORDER BY RANDOM() LIMIT 12`
48+
expect(results).toHaveLength(12)
49+
connection.close()
50+
if (i % 25 === 0) {
51+
const connectionMs = (Date.now() - startTime) / i
52+
console.log(`${i}x open, read, write and close, ${connectionMs.toFixed(0)}ms per connection`)
53+
expect(connectionMs).toBeLessThan(2000)
54+
}
55+
}
56+
} catch (error) {
57+
console.error(`Error on connection ${i}: ${error}`)
58+
expect(error).toBeNull()
59+
}
60+
},
61+
EXTRA_LONG_TIMEOUT
62+
)
63+
64+
it(
65+
'should open lots of simple connections simultaneously',
66+
async () => {
67+
const startTime = Date.now()
68+
const numConnections = 500
69+
const connections: Database[] = []
70+
71+
try {
72+
for (let i = 0; i < numConnections; i++) {
73+
connections.push(
74+
new Database(CHINOOK_DATABASE_URL, error => {
75+
if (error) {
76+
console.error(`Error on connection ${i}: ${error}`)
77+
}
78+
expect(error).toBeNull()
79+
})
80+
)
81+
}
82+
for (let i = 0; i < numConnections; i++) {
83+
const connection = connections[i]
84+
expect(connection).not.toBeNull()
85+
const results = await connection.sql`SELECT ${i} as 'connection_id'`
86+
expect(results[0]['connection_id']).toBe(i)
87+
}
88+
for (let i = 0; i < numConnections; i++) {
89+
connections[i].close()
90+
}
91+
92+
const connectionMs = (Date.now() - startTime) / numConnections
93+
console.log(`${numConnections}x open simultaneously, ${connectionMs.toFixed(0)}ms per connection`)
94+
expect(connectionMs).toBeLessThan(2000)
95+
} catch (error) {
96+
console.error(`Error opening connection ${connections.length}: ${error}`)
97+
expect(error).toBeNull()
98+
}
99+
},
100+
EXTRA_LONG_TIMEOUT
101+
)
102+
103+
it(
104+
'should do lots of async database.sql selects in sequence',
105+
async () => {
106+
const numQueries = 20
107+
const startTime = Date.now()
108+
const database = new Database(CHINOOK_DATABASE_URL)
109+
const table = 'tracks'
110+
for (let i = 0; i < numQueries; i++) {
111+
const results = await database.sql`SELECT * FROM ${table} ORDER BY RANDOM() LIMIT 12`
112+
expect(results).toHaveLength(12)
113+
expect(Object.keys(results[0])).toEqual(['id', 'name', 'age', 'hobby'])
114+
}
115+
116+
const queryMs = (Date.now() - startTime) / numQueries
117+
console.log(`${numQueries}x database.sql selects, ${queryMs.toFixed(0)}ms per query`)
118+
expect(queryMs).toBeLessThan(2000)
119+
},
120+
EXTRA_LONG_TIMEOUT
121+
)
122+
})

0 commit comments

Comments
 (0)