| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | /* 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()          })        })      }    })  })})
 |