Merge pull request #716 from ldapjs/dependabot/npm_and_yarn/tap-15.0.1

This commit is contained in:
Tony Brix 2021-04-05 08:15:51 -05:00 committed by GitHub
commit 50ab06f50f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 430 additions and 422 deletions

4
.taprc
View File

@ -1,6 +1,4 @@
esm: false check-coverage: false
jsx: false
ts: false
files: files:
- 'test/**/*.test.js' - 'test/**/*.test.js'

View File

@ -37,7 +37,7 @@
"highlight.js": "^10.6.0", "highlight.js": "^10.6.0",
"husky": "^4.2.5", "husky": "^4.2.5",
"marked": "^2.0.0", "marked": "^2.0.0",
"tap": "14.11.0" "tap": "15.0.1"
}, },
"scripts": { "scripts": {
"test": "tap --no-cov", "test": "tap --no-cov",

View File

@ -154,11 +154,11 @@ test('apply - replace', function (t) {
// plain // plain
res = Change.apply(single, { cn: ['old'] }) res = Change.apply(single, { cn: ['old'] })
t.deepEqual(res.cn, ['new']) t.same(res.cn, ['new'])
// multiple // multiple
res = Change.apply(single, { cn: ['old', 'also'] }) res = Change.apply(single, { cn: ['old', 'also'] })
t.deepEqual(res.cn, ['new']) t.same(res.cn, ['new'])
// empty // empty
res = Change.apply(empty, { cn: ['existing'] }) res = Change.apply(empty, { cn: ['existing'] })
@ -167,7 +167,7 @@ test('apply - replace', function (t) {
// absent // absent
res = Change.apply(single, { dn: ['otherjunk'] }) res = Change.apply(single, { dn: ['otherjunk'] })
t.deepEqual(res.cn, ['new']) t.same(res.cn, ['new'])
// scalar formatting "success" // scalar formatting "success"
res = Change.apply(single, { cn: 'old' }, true) res = Change.apply(single, { cn: 'old' }, true)
@ -175,7 +175,7 @@ test('apply - replace', function (t) {
// scalar formatting "failure" // scalar formatting "failure"
res = Change.apply(twin, { cn: 'old' }, true) res = Change.apply(twin, { cn: 'old' }, true)
t.deepEqual(res.cn, ['new', 'two']) t.same(res.cn, ['new', 'two'])
t.end() t.end()
}) })
@ -192,15 +192,15 @@ test('apply - add', function (t) {
// plain // plain
res = Change.apply(single, { cn: ['old'] }) res = Change.apply(single, { cn: ['old'] })
t.deepEqual(res.cn, ['old', 'new']) t.same(res.cn, ['old', 'new'])
// multiple // multiple
res = Change.apply(single, { cn: ['old', 'also'] }) res = Change.apply(single, { cn: ['old', 'also'] })
t.deepEqual(res.cn, ['old', 'also', 'new']) t.same(res.cn, ['old', 'also', 'new'])
// absent // absent
res = Change.apply(single, { dn: ['otherjunk'] }) res = Change.apply(single, { dn: ['otherjunk'] })
t.deepEqual(res.cn, ['new']) t.same(res.cn, ['new'])
// scalar formatting "success" // scalar formatting "success"
res = Change.apply(single, { }, true) res = Change.apply(single, { }, true)
@ -208,11 +208,11 @@ test('apply - add', function (t) {
// scalar formatting "failure" // scalar formatting "failure"
res = Change.apply(single, { cn: 'old' }, true) res = Change.apply(single, { cn: 'old' }, true)
t.deepEqual(res.cn, ['old', 'new']) t.same(res.cn, ['old', 'new'])
// duplicate add // duplicate add
res = Change.apply(single, { cn: 'new' }) res = Change.apply(single, { cn: 'new' })
t.deepEqual(res.cn, ['new']) t.same(res.cn, ['new'])
t.end() t.end()
}) })
@ -229,7 +229,7 @@ test('apply - delete', function (t) {
// plain // plain
res = Change.apply(single, { cn: ['old', 'new'] }) res = Change.apply(single, { cn: ['old', 'new'] })
t.deepEqual(res.cn, ['new']) t.same(res.cn, ['new'])
// empty // empty
res = Change.apply(single, { cn: ['old'] }) res = Change.apply(single, { cn: ['old'] })
@ -242,7 +242,7 @@ test('apply - delete', function (t) {
// scalar formatting "failure" // scalar formatting "failure"
res = Change.apply(single, { cn: ['old', 'several', 'items'] }, true) res = Change.apply(single, { cn: ['old', 'several', 'items'] }, true)
t.deepEqual(res.cn, ['several', 'items']) t.same(res.cn, ['several', 'items'])
// absent // absent
res = Change.apply(single, { dn: ['otherjunk'] }) res = Change.apply(single, { dn: ['otherjunk'] })

View File

@ -14,320 +14,324 @@ const LDAP_CONNECT_TIMEOUT = process.env.LDAP_CONNECT_TIMEOUT || 0
const BIND_DN = 'cn=root' const BIND_DN = 'cn=root'
const BIND_PW = 'secret' const BIND_PW = 'secret'
tap.beforeEach((done, t) => { tap.beforeEach((t) => {
t.context.socketPath = getSock() return new Promise(resolve => {
t.context.server = ldap.createServer() t.context.socketPath = getSock()
t.context.server = ldap.createServer()
const server = t.context.server const server = t.context.server
server.bind(BIND_DN, function (req, res, next) { server.bind(BIND_DN, function (req, res, next) {
if (req.credentials !== BIND_PW) { return next(new ldap.InvalidCredentialsError('Invalid password')) } if (req.credentials !== BIND_PW) { return next(new ldap.InvalidCredentialsError('Invalid password')) }
res.end()
return next()
})
server.add(SUFFIX, function (req, res, next) {
res.end()
return next()
})
server.compare(SUFFIX, function (req, res, next) {
res.end(req.value === 'test')
return next()
})
server.del(SUFFIX, function (req, res, next) {
res.end()
return next()
})
// LDAP whoami
server.exop('1.3.6.1.4.1.4203.1.11.3', function (req, res, next) {
res.value = 'u:xxyyz@EXAMPLE.NET'
res.end()
return next()
})
server.modify(SUFFIX, function (req, res, next) {
res.end()
return next()
})
server.modifyDN(SUFFIX, function (req, res, next) {
res.end()
return next()
})
server.modifyDN('cn=issue-480', function (req, res, next) {
assert(req.newRdn.toString().length > 132)
res.end()
return next()
})
server.search('dc=slow', function (req, res, next) {
res.send({
dn: 'dc=slow',
attributes: {
you: 'wish',
this: 'was',
faster: '.'
}
})
setTimeout(function () {
res.end() res.end()
next() return next()
}, 250) })
})
server.search('dc=timeout', function () { server.add(SUFFIX, function (req, res, next) {
// Cause the client to timeout by not sending a response. res.end()
}) return next()
})
server.search(SUFFIX, function (req, res, next) { server.compare(SUFFIX, function (req, res, next) {
if (req.dn.equals('cn=ref,' + SUFFIX)) { res.end(req.value === 'test')
res.send(res.createSearchReference('ldap://localhost')) return next()
} else if (req.dn.equals('cn=bin,' + SUFFIX)) { })
res.send(res.createSearchEntry({
objectName: req.dn,
attributes: {
'foo;binary': 'wr0gKyDCvCA9IMK+',
gb18030: Buffer.from([0xB5, 0xE7, 0xCA, 0xD3, 0xBB, 0xFA]),
objectclass: 'binary'
}
}))
} else {
const e = res.createSearchEntry({
objectName: req.dn,
attributes: {
cn: ['unit', 'test'],
SN: 'testy'
}
})
res.send(e)
res.send(e)
}
res.end() server.del(SUFFIX, function (req, res, next) {
return next() res.end()
}) return next()
})
server.search('cn=sizelimit', function (req, res, next) { // LDAP whoami
const sizeLimit = 200 server.exop('1.3.6.1.4.1.4203.1.11.3', function (req, res, next) {
for (let i = 0; i < 1000; i++) { res.value = 'u:xxyyz@EXAMPLE.NET'
if (req.sizeLimit > 0 && i >= req.sizeLimit) { res.end()
break return next()
} else if (i > sizeLimit) { })
res.end(ldap.LDAP_SIZE_LIMIT_EXCEEDED)
return next() server.modify(SUFFIX, function (req, res, next) {
} res.end()
return next()
})
server.modifyDN(SUFFIX, function (req, res, next) {
res.end()
return next()
})
server.modifyDN('cn=issue-480', function (req, res, next) {
assert(req.newRdn.toString().length > 132)
res.end()
return next()
})
server.search('dc=slow', function (req, res, next) {
res.send({ res.send({
dn: util.format('o=%d, cn=sizelimit', i), dn: 'dc=slow',
attributes: { attributes: {
o: [i], you: 'wish',
objectclass: ['pagedResult'] this: 'was',
faster: '.'
} }
}) })
} setTimeout(function () {
res.end() res.end()
return next() next()
}) }, 250)
})
server.search('cn=paged', function (req, res, next) { server.search('dc=timeout', function () {
const min = 0 // Cause the client to timeout by not sending a response.
const max = 1000 })
function sendResults (start, end) { server.search(SUFFIX, function (req, res, next) {
start = (start < min) ? min : start if (req.dn.equals('cn=ref,' + SUFFIX)) {
end = (end > max || end < min) ? max : end res.send(res.createSearchReference('ldap://localhost'))
let i } else if (req.dn.equals('cn=bin,' + SUFFIX)) {
for (i = start; i < end; i++) { res.send(res.createSearchEntry({
objectName: req.dn,
attributes: {
'foo;binary': 'wr0gKyDCvCA9IMK+',
gb18030: Buffer.from([0xB5, 0xE7, 0xCA, 0xD3, 0xBB, 0xFA]),
objectclass: 'binary'
}
}))
} else {
const e = res.createSearchEntry({
objectName: req.dn,
attributes: {
cn: ['unit', 'test'],
SN: 'testy'
}
})
res.send(e)
res.send(e)
}
res.end()
return next()
})
server.search('cn=sizelimit', function (req, res, next) {
const sizeLimit = 200
for (let i = 0; i < 1000; i++) {
if (req.sizeLimit > 0 && i >= req.sizeLimit) {
break
} else if (i > sizeLimit) {
res.end(ldap.LDAP_SIZE_LIMIT_EXCEEDED)
return next()
}
res.send({ res.send({
dn: util.format('o=%d, cn=paged', i), dn: util.format('o=%d, cn=sizelimit', i),
attributes: { attributes: {
o: [i], o: [i],
objectclass: ['pagedResult'] objectclass: ['pagedResult']
} }
}) })
} }
return i
}
let cookie = null
let pageSize = 0
req.controls.forEach(function (control) {
if (control.type === ldap.PagedResultsControl.OID) {
pageSize = control.value.size
cookie = control.value.cookie
}
})
if (cookie && Buffer.isBuffer(cookie)) {
// Do simple paging
let first = min
if (cookie.length !== 0) {
first = parseInt(cookie.toString(), 10)
}
const last = sendResults(first, first + pageSize)
let resultCookie
if (last < max) {
resultCookie = Buffer.from(last.toString())
} else {
resultCookie = Buffer.from('')
}
res.controls.push(new ldap.PagedResultsControl({
value: {
size: pageSize, // correctness not required here
cookie: resultCookie
}
}))
res.end()
next()
} else {
// don't allow non-paged searches for this test endpoint
next(new ldap.UnwillingToPerformError())
}
})
server.search('cn=sssvlv', function (req, res, next) {
const min = 0
const max = 100
const results = []
let o = 'aa'
for (let i = min; i < max; i++) {
results.push({
dn: util.format('o=%s, cn=sssvlv', o),
attributes: {
o: [o],
objectclass: ['sssvlvResult']
}
})
o = ((parseInt(o, 36) + 1).toString(36)).replace(/0/g, 'a')
}
function sendResults (start, end, sortBy, sortDesc) {
start = (start < min) ? min : start
end = (end > max || end < min) ? max : end
const sorted = results.sort((a, b) => {
if (a.attributes[sortBy][0] < b.attributes[sortBy][0]) {
return sortDesc ? 1 : -1
} else if (a.attributes[sortBy][0] > b.attributes[sortBy][0]) {
return sortDesc ? -1 : 1
}
return 0
})
for (let i = start; i < end; i++) {
res.send(sorted[i])
}
}
let sortBy = null
let sortDesc = null
let afterCount = null
let targetOffset = null
req.controls.forEach(function (control) {
if (control.type === ldap.ServerSideSortingRequestControl.OID) {
sortBy = control.value[0].attributeType
sortDesc = control.value[0].reverseOrder
}
if (control.type === ldap.VirtualListViewRequestControl.OID) {
afterCount = control.value.afterCount
targetOffset = control.value.targetOffset
}
})
if (sortBy) {
if (afterCount && targetOffset) {
sendResults(targetOffset - 1, (targetOffset + afterCount), sortBy, sortDesc)
} else {
sendResults(min, max, sortBy, sortDesc)
}
res.end()
next()
} else {
next(new ldap.UnwillingToPerformError())
}
})
server.search('cn=pagederr', function (req, res, next) {
let cookie = null
req.controls.forEach(function (control) {
if (control.type === ldap.PagedResultsControl.OID) {
cookie = control.value.cookie
}
})
if (cookie && Buffer.isBuffer(cookie) && cookie.length === 0) {
// send first "page"
res.send({
dn: util.format('o=result, cn=pagederr'),
attributes: {
o: 'result',
objectclass: ['pagedResult']
}
})
res.controls.push(new ldap.PagedResultsControl({
value: {
size: 2,
cookie: Buffer.from('a')
}
}))
res.end() res.end()
return next() return next()
} else { })
// send error instead of second page
res.end(ldap.LDAP_SIZE_LIMIT_EXCEEDED)
return next()
}
})
server.search('dc=empty', function (req, res, next) { server.search('cn=paged', function (req, res, next) {
res.send({ const min = 0
dn: 'dc=empty', const max = 1000
attributes: {
member: [], function sendResults (start, end) {
'member;range=0-1': ['cn=user1, dc=empty', 'cn=user2, dc=empty'] start = (start < min) ? min : start
end = (end > max || end < min) ? max : end
let i
for (i = start; i < end; i++) {
res.send({
dn: util.format('o=%d, cn=paged', i),
attributes: {
o: [i],
objectclass: ['pagedResult']
}
})
}
return i
}
let cookie = null
let pageSize = 0
req.controls.forEach(function (control) {
if (control.type === ldap.PagedResultsControl.OID) {
pageSize = control.value.size
cookie = control.value.cookie
}
})
if (cookie && Buffer.isBuffer(cookie)) {
// Do simple paging
let first = min
if (cookie.length !== 0) {
first = parseInt(cookie.toString(), 10)
}
const last = sendResults(first, first + pageSize)
let resultCookie
if (last < max) {
resultCookie = Buffer.from(last.toString())
} else {
resultCookie = Buffer.from('')
}
res.controls.push(new ldap.PagedResultsControl({
value: {
size: pageSize, // correctness not required here
cookie: resultCookie
}
}))
res.end()
next()
} else {
// don't allow non-paged searches for this test endpoint
next(new ldap.UnwillingToPerformError())
}
})
server.search('cn=sssvlv', function (req, res, next) {
const min = 0
const max = 100
const results = []
let o = 'aa'
for (let i = min; i < max; i++) {
results.push({
dn: util.format('o=%s, cn=sssvlv', o),
attributes: {
o: [o],
objectclass: ['sssvlvResult']
}
})
o = ((parseInt(o, 36) + 1).toString(36)).replace(/0/g, 'a')
}
function sendResults (start, end, sortBy, sortDesc) {
start = (start < min) ? min : start
end = (end > max || end < min) ? max : end
const sorted = results.sort((a, b) => {
if (a.attributes[sortBy][0] < b.attributes[sortBy][0]) {
return sortDesc ? 1 : -1
} else if (a.attributes[sortBy][0] > b.attributes[sortBy][0]) {
return sortDesc ? -1 : 1
}
return 0
})
for (let i = start; i < end; i++) {
res.send(sorted[i])
}
}
let sortBy = null
let sortDesc = null
let afterCount = null
let targetOffset = null
req.controls.forEach(function (control) {
if (control.type === ldap.ServerSideSortingRequestControl.OID) {
sortBy = control.value[0].attributeType
sortDesc = control.value[0].reverseOrder
}
if (control.type === ldap.VirtualListViewRequestControl.OID) {
afterCount = control.value.afterCount
targetOffset = control.value.targetOffset
}
})
if (sortBy) {
if (afterCount && targetOffset) {
sendResults(targetOffset - 1, (targetOffset + afterCount), sortBy, sortDesc)
} else {
sendResults(min, max, sortBy, sortDesc)
}
res.end()
next()
} else {
next(new ldap.UnwillingToPerformError())
} }
}) })
res.end()
return next()
})
server.search('cn=busy', function (req, res, next) { server.search('cn=pagederr', function (req, res, next) {
next(new ldap.BusyError('too much to do')) let cookie = null
}) req.controls.forEach(function (control) {
if (control.type === ldap.PagedResultsControl.OID) {
cookie = control.value.cookie
}
})
if (cookie && Buffer.isBuffer(cookie) && cookie.length === 0) {
// send first "page"
res.send({
dn: util.format('o=result, cn=pagederr'),
attributes: {
o: 'result',
objectclass: ['pagedResult']
}
})
res.controls.push(new ldap.PagedResultsControl({
value: {
size: 2,
cookie: Buffer.from('a')
}
}))
res.end()
return next()
} else {
// send error instead of second page
res.end(ldap.LDAP_SIZE_LIMIT_EXCEEDED)
return next()
}
})
server.search('', function (req, res, next) { server.search('dc=empty', function (req, res, next) {
if (req.dn.toString() === '') {
res.send({ res.send({
dn: '', dn: 'dc=empty',
attributes: { attributes: {
objectclass: ['RootDSE', 'top'] member: [],
'member;range=0-1': ['cn=user1, dc=empty', 'cn=user2, dc=empty']
} }
}) })
res.end() res.end()
} else { return next()
// Turn away any other requests (since '' is the fallthrough route) })
res.errorMessage = 'No tree found for: ' + req.dn.toString()
res.end(ldap.LDAP_NO_SUCH_OBJECT) server.search('cn=busy', function (req, res, next) {
} next(new ldap.BusyError('too much to do'))
return next() })
})
server.search('', function (req, res, next) {
server.unbind(function (req, res, next) { if (req.dn.toString() === '') {
res.end() res.send({
return next() dn: '',
}) attributes: {
objectclass: ['RootDSE', 'top']
server.listen(t.context.socketPath, function () { }
const client = ldap.createClient({ })
connectTimeout: parseInt(LDAP_CONNECT_TIMEOUT, 10), res.end()
socketPath: t.context.socketPath } else {
// Turn away any other requests (since '' is the fallthrough route)
res.errorMessage = 'No tree found for: ' + req.dn.toString()
res.end(ldap.LDAP_NO_SUCH_OBJECT)
}
return next()
})
server.unbind(function (req, res, next) {
res.end()
return next()
})
server.listen(t.context.socketPath, function () {
const client = ldap.createClient({
connectTimeout: parseInt(LDAP_CONNECT_TIMEOUT, 10),
socketPath: t.context.socketPath
})
t.context.client = client
client.on('connect', () => resolve())
}) })
t.context.client = client
client.on('connect', () => done())
}) })
}) })
tap.afterEach((done, t) => { tap.afterEach((t) => {
t.context.client.unbind((err) => { return new Promise(resolve => {
t.error(err) t.context.client.unbind((err) => {
t.context.server.close(() => done()) t.error(err)
t.context.server.close(() => resolve())
})
}) })
}) })
@ -404,13 +408,13 @@ tap.test('createClient', t => {
// const socketPath = getSock() // const socketPath = getSock()
// const server = ldap.createServer() // const server = ldap.createServer()
// server.listen(socketPath, () => {}) // server.listen(socketPath, () => {})
// t.tearDown(() => { // t.teardown(() => {
// client.unbind(() => server.close()) // client.unbind(() => server.close())
// }) // })
// client = ldap.createClient({ socketPath, log: logger }) // client = ldap.createClient({ socketPath, log: logger })
// t.ok(logger.child) // t.ok(logger.child)
// t.true(typeof client.log.child === 'function') // t.ok(typeof client.log.child === 'function')
// }) // })
t.end() t.end()
@ -784,7 +788,7 @@ tap.test('search paged', { timeout: 10000 }, function (t) {
t2.end() t2.end()
}) })
t2.tearDown(() => { t2.teardown(() => {
res.removeListener('searchEntry', entryListener) res.removeListener('searchEntry', entryListener)
res.removeListener('page', pageListener) res.removeListener('page', pageListener)
}) })
@ -995,7 +999,7 @@ tap.test('search - sssvlv', { timeout: 10000 }, function (t) {
}) })
res.on('error', (err) => t2.error(err)) res.on('error', (err) => t2.error(err))
res.on('end', function () { res.on('end', function () {
t2.equals(count, 10) t2.equal(count, 10)
t2.end() t2.end()
}) })
}) })
@ -1037,7 +1041,7 @@ tap.test('search - sssvlv', { timeout: 10000 }, function (t) {
}) })
res.on('error', (err) => t2.error(err)) res.on('error', (err) => t2.error(err))
res.on('end', function () { res.on('end', function () {
t2.equals(count, 10) t2.equal(count, 10)
t2.end() t2.end()
}) })
}) })
@ -1519,10 +1523,10 @@ tap.test('connection refused', function (t) {
client.on('connectRefused', () => {}) client.on('connectRefused', () => {})
client.bind('cn=root', 'secret', function (err, res) { client.bind('cn=root', 'secret', function (err, res) {
t.true(err) t.ok(err)
t.type(err, Error) t.type(err, Error)
t.equals(err.code, 'ECONNREFUSED') t.equal(err.code, 'ECONNREFUSED')
t.false(res) t.notOk(res)
t.end() t.end()
}) })
}) })
@ -1547,11 +1551,11 @@ tap.test('connection timeout', function (t) {
}, 2000) }, 2000)
client.bind('cn=root', 'secret', function (err, res) { client.bind('cn=root', 'secret', function (err, res) {
t.true(err) t.ok(err)
t.type(err, Error) t.type(err, Error)
t.equals(err.message, 'connection timeout') t.equal(err.message, 'connection timeout')
done = true done = true
t.false(res) t.notOk(res)
t.end() t.end()
}) })
}) })
@ -1574,9 +1578,9 @@ tap.only('emitError', function (t) {
t.fail(err) t.fail(err)
}) })
client.on('connectTimeout', (err) => { client.on('connectTimeout', (err) => {
t.true(err) t.ok(err)
t.type(err, Error) t.type(err, Error)
t.equals(err.message, 'connection timeout') t.equal(err.message, 'connection timeout')
clearTimeout(timeout) clearTimeout(timeout)
t.end() t.end()
}) })
@ -1598,9 +1602,9 @@ tap.only('emitError', function (t) {
}, 2000) }, 2000)
client.on('error', (err) => { client.on('error', (err) => {
t.true(err) t.ok(err)
t.type(err, Error) t.type(err, Error)
t.equals(err.message, 'connectTimeout: connection timeout') t.equal(err.message, 'connectTimeout: connection timeout')
clearTimeout(timeout) clearTimeout(timeout)
t.end() t.end()
}) })
@ -1619,10 +1623,10 @@ tap.only('emitError', function (t) {
t.fail(err) t.fail(err)
}) })
client.on('connectRefused', (err) => { client.on('connectRefused', (err) => {
t.true(err) t.ok(err)
t.type(err, Error) t.type(err, Error)
t.equals(err.message, `connect ECONNREFUSED 0.0.0.0:${unusedPortNumber}`) t.equal(err.message, `connect ECONNREFUSED 0.0.0.0:${unusedPortNumber}`)
t.equals(err.code, 'ECONNREFUSED') t.equal(err.code, 'ECONNREFUSED')
t.end() t.end()
}) })
@ -1637,10 +1641,10 @@ tap.only('emitError', function (t) {
}) })
client.on('error', (err) => { client.on('error', (err) => {
t.true(err) t.ok(err)
t.type(err, Error) t.type(err, Error)
t.equals(err.message, `connectRefused: connect ECONNREFUSED 0.0.0.0:${unusedPortNumber}`) t.equal(err.message, `connectRefused: connect ECONNREFUSED 0.0.0.0:${unusedPortNumber}`)
t.equals(err.code, 'ECONNREFUSED') t.equal(err.code, 'ECONNREFUSED')
t.end() t.end()
}) })

View File

@ -22,7 +22,7 @@ test('new with args', function (t) {
t.equal(c.type, '1.2.840.113556.1.4.319') t.equal(c.type, '1.2.840.113556.1.4.319')
t.ok(c.criticality) t.ok(c.criticality)
t.equal(c.value.size, 1000) t.equal(c.value.size, 1000)
t.is(Buffer.compare(c.value.cookie, Buffer.from([1, 2, 3])), 0) t.equal(Buffer.compare(c.value.cookie, Buffer.from([1, 2, 3])), 0)
const writer = new BerWriter() const writer = new BerWriter()
c.toBer(writer) c.toBer(writer)
@ -32,7 +32,7 @@ test('new with args', function (t) {
t.equal(psc.type, '1.2.840.113556.1.4.319') t.equal(psc.type, '1.2.840.113556.1.4.319')
t.ok(psc.criticality) t.ok(psc.criticality)
t.equal(psc.value.size, 1000) t.equal(psc.value.size, 1000)
t.is(Buffer.compare(psc.value.cookie, Buffer.from([1, 2, 3])), 0) t.equal(Buffer.compare(psc.value.cookie, Buffer.from([1, 2, 3])), 0)
t.end() t.end()
}) })
@ -55,7 +55,7 @@ test('tober', function (t) {
t.equal(c.type, '1.2.840.113556.1.4.319') t.equal(c.type, '1.2.840.113556.1.4.319')
t.ok(c.criticality) t.ok(c.criticality)
t.equal(c.value.size, 20) t.equal(c.value.size, 20)
t.is(Buffer.compare(c.value.cookie, Buffer.alloc(0)), 0) t.equal(Buffer.compare(c.value.cookie, Buffer.alloc(0)), 0)
t.end() t.end()
}) })

View File

@ -171,15 +171,15 @@ test('format persists across clone', function (t) {
const OUT = 'UID="user", CN=foo+SN=bar, DC=test, DC=com' const OUT = 'UID="user", CN=foo+SN=bar, DC=test, DC=com'
_dn.setFormat({ keepQuote: true, upperName: true }) _dn.setFormat({ keepQuote: true, upperName: true })
const clone = _dn.clone() const clone = _dn.clone()
t.equals(_dn.toString(), OUT) t.equal(_dn.toString(), OUT)
t.equals(clone.toString(), OUT) t.equal(clone.toString(), OUT)
t.end() t.end()
}) })
test('initialization', function (t) { test('initialization', function (t) {
const dn1 = new dn.DN() const dn1 = new dn.DN()
t.ok(dn1) t.ok(dn1)
t.equals(dn1.toString(), '') t.equal(dn1.toString(), '')
t.ok(dn1.isEmpty(), 'DN with no initializer defaults to null DN') t.ok(dn1.isEmpty(), 'DN with no initializer defaults to null DN')
const data = [ const data = [
@ -188,7 +188,7 @@ test('initialization', function (t) {
] ]
const dn2 = new dn.DN(data) const dn2 = new dn.DN(data)
t.ok(dn2) t.ok(dn2)
t.equals(dn2.toString(), 'foo=bar, o=base') t.equal(dn2.toString(), 'foo=bar, o=base')
t.ok(!dn2.isEmpty()) t.ok(!dn2.isEmpty())
t.end() t.end()

View File

@ -14,62 +14,69 @@ function search (t, options, callback) {
found = true found = true
}) })
res.on('end', function () { res.on('end', function () {
t.true(found) t.ok(found)
if (callback) return callback() if (callback) return callback()
return t.end() return t.end()
}) })
}) })
} }
tap.beforeEach((done, t) => { tap.beforeEach((t) => {
const suffix = `dc=${uuid()}` return new Promise((resolve, reject) => {
const server = ldap.createServer() const suffix = `dc=${uuid()}`
const server = ldap.createServer()
t.context.server = server t.context.server = server
t.context.socketPath = getSock() t.context.socketPath = getSock()
t.context.suffix = suffix t.context.suffix = suffix
server.bind('cn=root', function (req, res, next) { server.bind('cn=root', function (req, res, next) {
res.end() res.end()
return next() return next()
}) })
server.search(suffix, function (req, res) { server.search(suffix, function (req, res) {
const entry = { const entry = {
dn: 'cn=foo, ' + suffix, dn: 'cn=foo, ' + suffix,
attributes: { attributes: {
objectclass: ['person', 'top'], objectclass: ['person', 'top'],
cn: 'Pogo Stick', cn: 'Pogo Stick',
sn: 'Stick', sn: 'Stick',
givenname: 'ogo', givenname: 'ogo',
mail: uuid() + '@pogostick.org' mail: uuid() + '@pogostick.org'
}
} }
}
if (req.filter.matches(entry.attributes)) { res.send(entry) } if (req.filter.matches(entry.attributes)) { res.send(entry) }
res.end() res.end()
})
server.listen(t.context.socketPath, function () {
t.context.client = ldap.createClient({
socketPath: t.context.socketPath
}) })
t.context.client.on('connectError', (err) => { server.listen(t.context.socketPath, function () {
t.context.server.close(() => done(err)) t.context.client = ldap.createClient({
}) socketPath: t.context.socketPath
t.context.client.on('connect', (socket) => { })
t.context.socket = socket
done() t.context.client.on('connectError', (err) => {
t.context.server.close(() => reject(err))
})
t.context.client.on('connect', (socket) => {
t.context.socket = socket
resolve()
})
}) })
}) })
}) })
tap.afterEach((done, t) => { tap.afterEach((t) => {
if (!t.context.client) return done() return new Promise((resolve, reject) => {
t.context.client.unbind(() => { if (!t.context.client) return resolve()
t.context.server.close(done) t.context.client.unbind(() => {
t.context.server.close((err) => {
if (err) return reject(err)
resolve()
})
})
}) })
}) })

View File

@ -8,40 +8,40 @@ test('comp > (ref in upper window) => true', async t => {
const ref = Math.floor(MAX_MSGID / 2) + 10 const ref = Math.floor(MAX_MSGID / 2) + 10
const comp = ref + 10 const comp = ref + 10
const result = geWindow(ref, comp) const result = geWindow(ref, comp)
t.is(result, true) t.equal(result, true)
}) })
test('comp < (ref in upper window) => false', async t => { test('comp < (ref in upper window) => false', async t => {
const ref = Math.floor(MAX_MSGID / 2) + 10 const ref = Math.floor(MAX_MSGID / 2) + 10
const comp = ref - 5 const comp = ref - 5
const result = geWindow(ref, comp) const result = geWindow(ref, comp)
t.is(result, false) t.equal(result, false)
}) })
test('comp > (ref in lower window) => true', async t => { test('comp > (ref in lower window) => true', async t => {
const ref = Math.floor(MAX_MSGID / 2) - 10 const ref = Math.floor(MAX_MSGID / 2) - 10
const comp = ref + 20 const comp = ref + 20
const result = geWindow(ref, comp) const result = geWindow(ref, comp)
t.is(result, true) t.equal(result, true)
}) })
test('comp < (ref in lower window) => false', async t => { test('comp < (ref in lower window) => false', async t => {
const ref = Math.floor(MAX_MSGID / 2) - 10 const ref = Math.floor(MAX_MSGID / 2) - 10
const comp = ref - 5 const comp = ref - 5
const result = geWindow(ref, comp) const result = geWindow(ref, comp)
t.is(result, false) t.equal(result, false)
}) })
test('(max === MAX_MSGID) && (comp > ref) => true', async t => { test('(max === MAX_MSGID) && (comp > ref) => true', async t => {
const ref = MAX_MSGID - Math.floor(MAX_MSGID / 2) const ref = MAX_MSGID - Math.floor(MAX_MSGID / 2)
const comp = ref + 1 const comp = ref + 1
const result = geWindow(ref, comp) const result = geWindow(ref, comp)
t.is(result, true) t.equal(result, true)
}) })
test('(max === MAX_MSGID) && (comp < ref) => false', async t => { test('(max === MAX_MSGID) && (comp < ref) => false', async t => {
const ref = MAX_MSGID - Math.floor(MAX_MSGID / 2) const ref = MAX_MSGID - Math.floor(MAX_MSGID / 2)
const comp = ref - 1 const comp = ref - 1
const result = geWindow(ref, comp) const result = geWindow(ref, comp)
t.is(result, false) t.equal(result, false)
}) })

View File

@ -7,15 +7,15 @@ const idGeneratorFactory = require('../../../../lib/client/message-tracker/id-ge
test('starts at 0', async t => { test('starts at 0', async t => {
const nextID = idGeneratorFactory() const nextID = idGeneratorFactory()
const currentID = nextID() const currentID = nextID()
t.is(currentID, 1) t.equal(currentID, 1)
}) })
test('handles wrapping around', async t => { test('handles wrapping around', async t => {
const nextID = idGeneratorFactory(MAX_MSGID - 2) const nextID = idGeneratorFactory(MAX_MSGID - 2)
let currentID = nextID() let currentID = nextID()
t.is(currentID, MAX_MSGID - 1) t.equal(currentID, MAX_MSGID - 1)
currentID = nextID() currentID = nextID()
t.is(currentID, 1) t.equal(currentID, 1)
}) })

View File

@ -76,13 +76,13 @@ tap.test('options', t => {
tap.test('.pending', t => { tap.test('.pending', t => {
t.test('returns 0 for no messages', async t => { t.test('returns 0 for no messages', async t => {
const tracker = messageTrackerFactory({ id: 'foo', parser: {} }) const tracker = messageTrackerFactory({ id: 'foo', parser: {} })
t.is(tracker.pending, 0) t.equal(tracker.pending, 0)
}) })
t.test('returns 1 for 1 message', async t => { t.test('returns 1 for 1 message', async t => {
const tracker = messageTrackerFactory({ id: 'foo', parser: {} }) const tracker = messageTrackerFactory({ id: 'foo', parser: {} })
tracker.track({}, () => {}) tracker.track({}, () => {})
t.is(tracker.pending, 1) t.equal(tracker.pending, 1)
}) })
t.end() t.end()
@ -92,14 +92,14 @@ tap.test('#abandon', t => {
t.test('returns false if message does not exist', async t => { t.test('returns false if message does not exist', async t => {
const tracker = messageTrackerFactory({ id: 'foo', parser: {} }) const tracker = messageTrackerFactory({ id: 'foo', parser: {} })
const result = tracker.abandon(1) const result = tracker.abandon(1)
t.is(result, false) t.equal(result, false)
}) })
t.test('returns true if message is abandoned', async t => { t.test('returns true if message is abandoned', async t => {
const tracker = messageTrackerFactory({ id: 'foo', parser: {} }) const tracker = messageTrackerFactory({ id: 'foo', parser: {} })
tracker.track({}, {}) tracker.track({}, {})
const result = tracker.abandon(1) const result = tracker.abandon(1)
t.is(result, true) t.equal(result, true)
}) })
t.end() t.end()
@ -110,7 +110,7 @@ tap.test('#fetch', t => {
const tracker = messageTrackerFactory({ id: 'foo', parser: {} }) const tracker = messageTrackerFactory({ id: 'foo', parser: {} })
tracker.track({}, handler) tracker.track({}, handler)
const fetched = tracker.fetch(1) const fetched = tracker.fetch(1)
t.is(fetched, handler) t.equal(fetched, handler)
function handler () {} function handler () {}
}) })
@ -121,7 +121,7 @@ tap.test('#fetch', t => {
tracker.track({ abandon: 'message' }, () => {}) tracker.track({ abandon: 'message' }, () => {})
tracker.abandon(1) tracker.abandon(1)
const fetched = tracker.fetch(1) const fetched = tracker.fetch(1)
t.is(fetched, handler) t.equal(fetched, handler)
function handler () {} function handler () {}
}) })
@ -129,7 +129,7 @@ tap.test('#fetch', t => {
t.test('returns null when message does not exist', async t => { t.test('returns null when message does not exist', async t => {
const tracker = messageTrackerFactory({ id: 'foo', parser: {} }) const tracker = messageTrackerFactory({ id: 'foo', parser: {} })
const fetched = tracker.fetch(1) const fetched = tracker.fetch(1)
t.is(fetched, null) t.equal(fetched, null)
}) })
t.end() t.end()
@ -146,13 +146,13 @@ tap.test('#purge', t => {
function cb (msgID, handler) { function cb (msgID, handler) {
if (count === 0) { if (count === 0) {
t.is(msgID, 1) t.equal(msgID, 1)
t.is(handler, handler1) t.equal(handler, handler1)
count += 1 count += 1
return return
} }
t.is(msgID, 2) t.equal(msgID, 2)
t.is(handler, handler2) t.equal(handler, handler2)
} }
function handler1 () {} function handler1 () {}
@ -167,7 +167,7 @@ tap.test('#remove', t => {
const tracker = messageTrackerFactory({ id: 'foo', parser: {} }) const tracker = messageTrackerFactory({ id: 'foo', parser: {} })
tracker.track({}, () => {}) tracker.track({}, () => {})
tracker.remove(1) tracker.remove(1)
t.is(tracker.pending, 0) t.equal(tracker.pending, 0)
}) })
// Not a great test. It exercises the desired code path, but we probably // Not a great test. It exercises the desired code path, but we probably
@ -178,7 +178,7 @@ tap.test('#remove', t => {
tracker.track({ abandon: 'message' }, () => {}) tracker.track({ abandon: 'message' }, () => {})
tracker.abandon(1) tracker.abandon(1)
tracker.remove(1) tracker.remove(1)
t.is(tracker.pending, 1) t.equal(tracker.pending, 1)
}) })
t.end() t.end()
@ -190,9 +190,9 @@ tap.test('#track', t => {
const msg = {} const msg = {}
tracker.track(msg, handler) tracker.track(msg, handler)
t.deepEqual(msg, { messageID: 1 }) t.same(msg, { messageID: 1 })
const cb = tracker.fetch(1) const cb = tracker.fetch(1)
t.is(cb, handler) t.equal(cb, handler)
function handler () {} function handler () {}
}) })

View File

@ -10,11 +10,11 @@ test('clears queue if only one message present', async t => {
abandoned.set(1, { age: 2, cb }) abandoned.set(1, { age: 2, cb })
purgeAbandoned(2, abandoned) purgeAbandoned(2, abandoned)
t.is(abandoned.size, 0) t.equal(abandoned.size, 0)
function cb (err) { function cb (err) {
t.is(err.name, 'AbandonedError') t.equal(err.name, 'AbandonedError')
t.is(err.message, 'client request abandoned') t.equal(err.message, 'client request abandoned')
} }
}) })
@ -25,11 +25,11 @@ test('clears queue if multiple messages present', async t => {
abandoned.set(2, { age: 3, cb }) abandoned.set(2, { age: 3, cb })
purgeAbandoned(4, abandoned) purgeAbandoned(4, abandoned)
t.is(abandoned.size, 0) t.equal(abandoned.size, 0)
function cb (err) { function cb (err) {
t.is(err.name, 'AbandonedError') t.equal(err.name, 'AbandonedError')
t.is(err.message, 'client request abandoned') t.equal(err.message, 'client request abandoned')
} }
}) })
@ -42,11 +42,11 @@ test('message id has wrappred around', async t => {
// that is triggering the purge was the "first" message in the new sequence // that is triggering the purge was the "first" message in the new sequence
// of message identifiers. // of message identifiers.
purgeAbandoned(1, abandoned) purgeAbandoned(1, abandoned)
t.is(abandoned.size, 0) t.equal(abandoned.size, 0)
function cb (err) { function cb (err) {
t.is(err.name, 'AbandonedError') t.equal(err.name, 'AbandonedError')
t.is(err.message, 'client request abandoned') t.equal(err.message, 'client request abandoned')
} }
}) })
@ -56,7 +56,7 @@ test('does not clear if window not met', async t => {
abandoned.set(1, { age: 2, cb }) abandoned.set(1, { age: 2, cb })
purgeAbandoned(1, abandoned) purgeAbandoned(1, abandoned)
t.is(abandoned.size, 1) t.equal(abandoned.size, 1)
function cb () { function cb () {
t.fail('should not be invoked') t.fail('should not be invoked')

View File

@ -6,13 +6,13 @@ const enqueue = require('../../../../lib/client/request-queue/enqueue')
test('rejects new requests if size is exceeded', async t => { test('rejects new requests if size is exceeded', async t => {
const q = { _queue: { length: 5 }, size: 5 } const q = { _queue: { length: 5 }, size: 5 }
const result = enqueue.call(q, 'foo', 'bar', {}, {}) const result = enqueue.call(q, 'foo', 'bar', {}, {})
t.false(result) t.notOk(result)
}) })
test('rejects new requests if queue is frozen', async t => { test('rejects new requests if queue is frozen', async t => {
const q = { _queue: { length: 0 }, size: 5, _frozen: true } const q = { _queue: { length: 0 }, size: 5, _frozen: true }
const result = enqueue.call(q, 'foo', 'bar', {}, {}) const result = enqueue.call(q, 'foo', 'bar', {}, {})
t.false(result) t.notOk(result)
}) })
test('adds a request and returns if no timeout', async t => { test('adds a request and returns if no timeout', async t => {
@ -20,7 +20,7 @@ test('adds a request and returns if no timeout', async t => {
_queue: { _queue: {
length: 0, length: 0,
add (obj) { add (obj) {
t.deepEqual(obj, { t.same(obj, {
message: 'foo', message: 'foo',
expect: 'bar', expect: 'bar',
emitter: 'baz', emitter: 'baz',
@ -32,7 +32,7 @@ test('adds a request and returns if no timeout', async t => {
timeout: 0 timeout: 0
} }
const result = enqueue.call(q, 'foo', 'bar', 'baz', 'bif') const result = enqueue.call(q, 'foo', 'bar', 'baz', 'bif')
t.true(result) t.ok(result)
}) })
test('adds a request and returns timer not set', async t => { test('adds a request and returns timer not set', async t => {
@ -40,7 +40,7 @@ test('adds a request and returns timer not set', async t => {
_queue: { _queue: {
length: 0, length: 0,
add (obj) { add (obj) {
t.deepEqual(obj, { t.same(obj, {
message: 'foo', message: 'foo',
expect: 'bar', expect: 'bar',
emitter: 'baz', emitter: 'baz',
@ -53,7 +53,7 @@ test('adds a request and returns timer not set', async t => {
_timer: null _timer: null
} }
const result = enqueue.call(q, 'foo', 'bar', 'baz', 'bif') const result = enqueue.call(q, 'foo', 'bar', 'baz', 'bif')
t.true(result) t.ok(result)
}) })
test('adds a request, returns true, and clears queue', t => { test('adds a request, returns true, and clears queue', t => {
@ -63,7 +63,7 @@ test('adds a request, returns true, and clears queue', t => {
_queue: { _queue: {
length: 0, length: 0,
add (obj) { add (obj) {
t.deepEqual(obj, { t.same(obj, {
message: 'foo', message: 'foo',
expect: 'bar', expect: 'bar',
emitter: 'baz', emitter: 'baz',
@ -78,5 +78,5 @@ test('adds a request, returns true, and clears queue', t => {
purge () { t.pass() } purge () { t.pass() }
} }
const result = enqueue.call(q, 'foo', 'bar', 'baz', 'bif') const result = enqueue.call(q, 'foo', 'bar', 'baz', 'bif')
t.true(result) t.ok(result)
}) })

View File

@ -17,7 +17,7 @@ test('clears timer', async t => {
} }
} }
flush.call(q) flush.call(q)
t.is(q._timer, null) t.equal(q._timer, null)
}) })
test('invokes callback with parameters', async t => { test('invokes callback with parameters', async t => {
@ -40,12 +40,12 @@ test('invokes callback with parameters', async t => {
} }
} }
flush.call(q, (message, expect, emitter, cb) => { flush.call(q, (message, expect, emitter, cb) => {
t.is(message, 'foo') t.equal(message, 'foo')
t.is(expect, 'bar') t.equal(expect, 'bar')
t.is(emitter, 'baz') t.equal(emitter, 'baz')
t.is(cb, theCB) t.equal(cb, theCB)
}) })
t.is(q._timer, null) t.equal(q._timer, null)
function theCB () {} function theCB () {}
}) })

View File

@ -9,8 +9,8 @@ test('flushes the queue with timeout errors', async t => {
flush (func) { flush (func) {
func('a', 'b', 'c', (err) => { func('a', 'b', 'c', (err) => {
t.ok(err) t.ok(err)
t.is(err.name, 'TimeoutError') t.equal(err.name, 'TimeoutError')
t.is(err.message, 'request queue timeout') t.equal(err.message, 'request queue timeout')
}) })
} }
} }

View File

@ -17,9 +17,9 @@ test('new with args', function (t) {
t.ok(req) t.ok(req)
t.equal(req.requestName, '1.2.3.4') t.equal(req.requestName, '1.2.3.4')
t.equal(req.requestValue, 'test') t.equal(req.requestValue, 'test')
t.is(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0)
t.equal(req.value, 'test') t.equal(req.value, 'test')
t.is(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0)
t.end() t.end()
}) })
@ -31,9 +31,9 @@ test('new with buffer args', function (t) {
t.ok(req) t.ok(req)
t.equal(req.requestName, '1.2.3.4') t.equal(req.requestName, '1.2.3.4')
t.equal(req.requestValue, req.requestValueBuffer) t.equal(req.requestValue, req.requestValueBuffer)
t.is(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0)
t.equal(req.value, req.valueBuffer) t.equal(req.value, req.valueBuffer)
t.is(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0)
t.end() t.end()
}) })
@ -46,9 +46,9 @@ test('new no args set args', function (t) {
req.value = 'test' req.value = 'test'
t.equal(req.requestValue, 'test') t.equal(req.requestValue, 'test')
t.is(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0)
t.equal(req.value, 'test') t.equal(req.value, 'test')
t.is(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0)
t.end() t.end()
}) })
@ -62,9 +62,9 @@ test('new no args set args buffer', function (t) {
req.value = Buffer.from('test', 'utf8') req.value = Buffer.from('test', 'utf8')
t.equal(req.requestValue, req.requestValueBuffer) t.equal(req.requestValue, req.requestValueBuffer)
t.is(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0)
t.equal(req.value, req.valueBuffer) t.equal(req.value, req.valueBuffer)
t.is(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0)
t.end() t.end()
}) })
@ -78,9 +78,9 @@ test('parse', function (t) {
t.ok(req._parse(new BerReader(ber.buffer))) t.ok(req._parse(new BerReader(ber.buffer)))
t.equal(req.requestName, '1.2.3.4') t.equal(req.requestName, '1.2.3.4')
t.equal(req.requestValue, 'test') t.equal(req.requestValue, 'test')
t.is(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.requestValueBuffer, Buffer.from('test', 'utf8')), 0)
t.equal(req.value, 'test') t.equal(req.value, 'test')
t.is(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0) t.equal(Buffer.compare(req.valueBuffer, Buffer.from('test', 'utf8')), 0)
t.end() t.end()
}) })

View File

@ -8,11 +8,10 @@ const ldap = require('../lib')
const SERVER_PORT = process.env.SERVER_PORT || 1389 const SERVER_PORT = process.env.SERVER_PORT || 1389
const SUFFIX = 'dc=test' const SUFFIX = 'dc=test'
tap.beforeEach(function (done, t) { tap.beforeEach(function (t) {
// We do not need a `.afterEach` to clean up the sock files because that // We do not need a `.afterEach` to clean up the sock files because that
// is done when the server is destroyed. // is done when the server is destroyed.
t.context.sock = getSock() t.context.sock = getSock()
done()
}) })
tap.test('basic create', function (t) { tap.test('basic create', function (t) {
@ -76,7 +75,7 @@ tap.test('listen on static port', function (t) {
server.listen(SERVER_PORT, '127.0.0.1', function () { server.listen(SERVER_PORT, '127.0.0.1', function () {
const addr = server.address() const addr = server.address()
t.equal(addr.port, parseInt(SERVER_PORT, 10)) t.equal(addr.port, parseInt(SERVER_PORT, 10))
t.equals(server.url, `ldap://127.0.0.1:${SERVER_PORT}`) t.equal(server.url, `ldap://127.0.0.1:${SERVER_PORT}`)
server.close(() => t.end()) server.close(() => t.end())
}) })
}) })