111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* 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()
 | 
						|
          })
 | 
						|
        })
 | 
						|
      }
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 |