104 lines
2.4 KiB
JavaScript
104 lines
2.4 KiB
JavaScript
'use strict'
|
|
|
|
// This test is complicated. It must simulate a server sending an unsolicited,
|
|
// or a mismatched, message in order to force the client's internal message
|
|
// tracker to try and find a corresponding sent message that does not exist.
|
|
// In order to do that, we need to set a high test timeout and wait for the
|
|
// error message to be logged.
|
|
|
|
const tap = require('tap')
|
|
const ldapjs = require('../')
|
|
const { SearchResultEntry } = require('@ldapjs/messages')
|
|
const server = ldapjs.createServer()
|
|
const SUFFIX = ''
|
|
|
|
tap.timeout = 10000
|
|
|
|
server.bind(SUFFIX, (res, done) => {
|
|
res.end()
|
|
return done()
|
|
})
|
|
|
|
server.search(SUFFIX, (req, res, done) => {
|
|
const result = new SearchResultEntry({
|
|
objectName: `dc=${req.scopeName}`
|
|
})
|
|
|
|
// Respond to the search request with a matched response.
|
|
res.send(result)
|
|
res.end()
|
|
|
|
// After a short delay, send ANOTHER response to the client that will not
|
|
// be matched by the client's internal tracker.
|
|
setTimeout(
|
|
() => {
|
|
res.send(result)
|
|
res.end()
|
|
done()
|
|
},
|
|
100
|
|
)
|
|
})
|
|
|
|
tap.beforeEach(t => {
|
|
return new Promise((resolve, reject) => {
|
|
server.listen(0, '127.0.0.1', (err) => {
|
|
if (err) return reject(err)
|
|
|
|
t.context.logMessages = []
|
|
t.context.logger = {
|
|
child () { return this },
|
|
debug () {},
|
|
error (...args) {
|
|
t.context.logMessages.push(args)
|
|
},
|
|
trace () {}
|
|
}
|
|
|
|
t.context.url = server.url
|
|
t.context.client = ldapjs.createClient({
|
|
url: [server.url],
|
|
timeout: 5,
|
|
log: t.context.logger
|
|
})
|
|
|
|
resolve()
|
|
})
|
|
})
|
|
})
|
|
|
|
tap.afterEach(t => {
|
|
return new Promise((resolve, reject) => {
|
|
t.context.client.destroy()
|
|
server.close((err) => {
|
|
if (err) return reject(err)
|
|
resolve()
|
|
})
|
|
})
|
|
})
|
|
|
|
tap.test('handle null messages', t => {
|
|
const { client, logMessages } = t.context
|
|
|
|
// There's no way to get an error from the client when it has received an
|
|
// unmatched response from the server. So we need to poll our logger instance
|
|
// and detect when the corresponding error message has been logged.
|
|
const timer = setInterval(
|
|
() => {
|
|
if (logMessages.length > 0) {
|
|
t.equal(
|
|
logMessages.some(msg => msg[1] === 'unmatched server message received'),
|
|
true
|
|
)
|
|
clearInterval(timer)
|
|
t.end()
|
|
}
|
|
},
|
|
100
|
|
)
|
|
|
|
client.search('dc=test', (error) => {
|
|
t.error(error)
|
|
})
|
|
})
|