You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.6 KiB
110 lines
2.6 KiB
/* eslint-env mocha */ |
|
|
|
var assert = require('assert') |
|
var net = require('net') |
|
var streamPair = require('stream-pair') |
|
|
|
var thing = require('../') |
|
|
|
describe('Handle Thing', function () { |
|
var handle |
|
var pair |
|
var socket; |
|
|
|
[ 'normal', 'lazy' ].forEach(function (mode) { |
|
describe(mode, function () { |
|
beforeEach(function () { |
|
pair = streamPair.create() |
|
handle = thing.create(mode === 'normal' ? pair.other : null) |
|
socket = new net.Socket({ |
|
handle: handle, |
|
readable: true, |
|
writable: true |
|
}) |
|
|
|
if (mode === 'lazy') { |
|
setTimeout(function () { |
|
handle.setStream(pair.other) |
|
}, 50) |
|
} |
|
}) |
|
|
|
afterEach(function () { |
|
assert(handle._stream) |
|
}) |
|
|
|
it('should write data to Socket', function (done) { |
|
pair.write('hello') |
|
pair.write(' world') |
|
pair.end('... ok') |
|
|
|
var chunks = '' |
|
socket.on('data', function (chunk) { |
|
chunks += chunk |
|
}) |
|
socket.on('end', function () { |
|
assert.strictEqual(chunks, 'hello world... ok') |
|
|
|
// allowHalfOpen is `false`, so the `end` should be followed by `close` |
|
socket.once('close', function () { |
|
done() |
|
}) |
|
}) |
|
}) |
|
|
|
it('should read data from Socket', function (done) { |
|
socket.write('hello') |
|
socket.write(' world') |
|
socket.end('... ok') |
|
|
|
var chunks = '' |
|
pair.on('data', function (chunk) { |
|
chunks += chunk |
|
}) |
|
pair.on('end', function () { |
|
assert.strictEqual(chunks, 'hello world... ok') |
|
|
|
done() |
|
}) |
|
}) |
|
|
|
it('should invoke `close` callback', function (done) { |
|
handle._options.close = function (callback) { |
|
done() |
|
process.nextTick(callback) |
|
} |
|
|
|
pair.end('hello') |
|
socket.resume() |
|
}) |
|
|
|
it('should kill pending requests', function (done) { |
|
handle._options.close = function () { |
|
setTimeout(done, 75) |
|
} |
|
|
|
socket.write('hello') |
|
socket.destroy() |
|
}) |
|
|
|
if (mode === 'normal') { |
|
it('should invoke `getPeerName` callback', function () { |
|
handle._options.getPeerName = function () { |
|
return { address: 'ohai' } |
|
} |
|
|
|
assert.strictEqual(socket.remoteAddress, 'ohai') |
|
}) |
|
|
|
it('should emit ECONNRESET at `close` event', function (done) { |
|
pair.other.emit('close') |
|
|
|
socket.on('error', function (err) { |
|
assert(/ECONNRESET/.test(err.message)) |
|
done() |
|
}) |
|
}) |
|
} |
|
}) |
|
}) |
|
})
|
|
|