mirror of
https://github.com/brianc/node-postgres.git
synced 2025-12-08 20:16:25 +00:00
* Remove stream-tester * Use random port for network-partition tests * Use random port for connection timeout test * Bump CI version
89 lines
2.5 KiB
JavaScript
89 lines
2.5 KiB
JavaScript
'use strict'
|
|
const net = require('net')
|
|
const buffers = require('../../test-buffers')
|
|
const helper = require('./test-helper')
|
|
|
|
const suite = new helper.Suite()
|
|
|
|
const options = {
|
|
host: 'localhost',
|
|
port: Math.floor(Math.random() * 2000) + 2000,
|
|
connectionTimeoutMillis: 2000,
|
|
user: 'not',
|
|
database: 'existing',
|
|
}
|
|
|
|
const serverWithConnectionTimeout = (port, timeout, callback) => {
|
|
const sockets = new Set()
|
|
|
|
const server = net.createServer((socket) => {
|
|
sockets.add(socket)
|
|
socket.once('end', () => sockets.delete(socket))
|
|
|
|
socket.on('data', (data) => {
|
|
// deny request for SSL
|
|
if (data.length === 8) {
|
|
socket.write(Buffer.from('N', 'utf8'))
|
|
// consider all authentication requests as good
|
|
} else if (!data[0]) {
|
|
socket.write(buffers.authenticationOk())
|
|
// send ReadyForQuery `timeout` ms after authentication
|
|
setTimeout(() => socket.write(buffers.readyForQuery()), timeout).unref()
|
|
// respond with our canned response
|
|
} else {
|
|
socket.write(buffers.readyForQuery())
|
|
}
|
|
})
|
|
})
|
|
|
|
let closing = false
|
|
const closeServer = (done) => {
|
|
if (closing) return
|
|
closing = true
|
|
|
|
server.close(done)
|
|
for (const socket of sockets) {
|
|
socket.destroy()
|
|
}
|
|
}
|
|
|
|
server.listen(port, options.host, () => callback(closeServer))
|
|
}
|
|
|
|
suite.test('successful connection', (done) => {
|
|
serverWithConnectionTimeout(options.port, 0, (closeServer) => {
|
|
const timeoutId = setTimeout(() => {
|
|
throw new Error('Client should have connected successfully but it did not.')
|
|
}, 3000)
|
|
|
|
const client = new helper.Client(options)
|
|
client
|
|
.connect()
|
|
.then(() => client.end())
|
|
.then(() => closeServer(done))
|
|
.catch((err) => closeServer(() => done(err)))
|
|
.then(() => clearTimeout(timeoutId))
|
|
})
|
|
})
|
|
|
|
suite.test('expired connection timeout', (done) => {
|
|
const opts = { ...options, port: options.port + 1 }
|
|
serverWithConnectionTimeout(opts.port, opts.connectionTimeoutMillis * 2, (closeServer) => {
|
|
const timeoutId = setTimeout(() => {
|
|
throw new Error('Client should have emitted an error but it did not.')
|
|
}, 3000)
|
|
|
|
const client = new helper.Client(opts)
|
|
client
|
|
.connect()
|
|
.then(() => client.end())
|
|
.then(() => closeServer(() => done(new Error('Connection timeout should have expired but it did not.'))))
|
|
.catch((err) => {
|
|
assert(err instanceof Error)
|
|
assert(/timeout expired\s*/.test(err.message))
|
|
closeServer(done)
|
|
})
|
|
.then(() => clearTimeout(timeoutId))
|
|
})
|
|
})
|