[6a3a178] | 1 | /* eslint-env mocha */
|
---|
| 2 |
|
---|
| 3 | var assert = require('assert')
|
---|
| 4 | var net = require('net')
|
---|
| 5 | var streamPair = require('stream-pair')
|
---|
| 6 |
|
---|
| 7 | var thing = require('../')
|
---|
| 8 |
|
---|
| 9 | describe('Handle Thing', function () {
|
---|
| 10 | var handle
|
---|
| 11 | var pair
|
---|
| 12 | var socket;
|
---|
| 13 |
|
---|
| 14 | [ 'normal', 'lazy' ].forEach(function (mode) {
|
---|
| 15 | describe(mode, function () {
|
---|
| 16 | beforeEach(function () {
|
---|
| 17 | pair = streamPair.create()
|
---|
| 18 | handle = thing.create(mode === 'normal' ? pair.other : null)
|
---|
| 19 | socket = new net.Socket({
|
---|
| 20 | handle: handle,
|
---|
| 21 | readable: true,
|
---|
| 22 | writable: true
|
---|
| 23 | })
|
---|
| 24 |
|
---|
| 25 | if (mode === 'lazy') {
|
---|
| 26 | setTimeout(function () {
|
---|
| 27 | handle.setStream(pair.other)
|
---|
| 28 | }, 50)
|
---|
| 29 | }
|
---|
| 30 | })
|
---|
| 31 |
|
---|
| 32 | afterEach(function () {
|
---|
| 33 | assert(handle._stream)
|
---|
| 34 | })
|
---|
| 35 |
|
---|
| 36 | it('should write data to Socket', function (done) {
|
---|
| 37 | pair.write('hello')
|
---|
| 38 | pair.write(' world')
|
---|
| 39 | pair.end('... ok')
|
---|
| 40 |
|
---|
| 41 | var chunks = ''
|
---|
| 42 | socket.on('data', function (chunk) {
|
---|
| 43 | chunks += chunk
|
---|
| 44 | })
|
---|
| 45 | socket.on('end', function () {
|
---|
| 46 | assert.strictEqual(chunks, 'hello world... ok')
|
---|
| 47 |
|
---|
| 48 | // allowHalfOpen is `false`, so the `end` should be followed by `close`
|
---|
| 49 | socket.once('close', function () {
|
---|
| 50 | done()
|
---|
| 51 | })
|
---|
| 52 | })
|
---|
| 53 | })
|
---|
| 54 |
|
---|
| 55 | it('should read data from Socket', function (done) {
|
---|
| 56 | socket.write('hello')
|
---|
| 57 | socket.write(' world')
|
---|
| 58 | socket.end('... ok')
|
---|
| 59 |
|
---|
| 60 | var chunks = ''
|
---|
| 61 | pair.on('data', function (chunk) {
|
---|
| 62 | chunks += chunk
|
---|
| 63 | })
|
---|
| 64 | pair.on('end', function () {
|
---|
| 65 | assert.strictEqual(chunks, 'hello world... ok')
|
---|
| 66 |
|
---|
| 67 | done()
|
---|
| 68 | })
|
---|
| 69 | })
|
---|
| 70 |
|
---|
| 71 | it('should invoke `close` callback', function (done) {
|
---|
| 72 | handle._options.close = function (callback) {
|
---|
| 73 | done()
|
---|
| 74 | process.nextTick(callback)
|
---|
| 75 | }
|
---|
| 76 |
|
---|
| 77 | pair.end('hello')
|
---|
| 78 | socket.resume()
|
---|
| 79 | })
|
---|
| 80 |
|
---|
| 81 | it('should kill pending requests', function (done) {
|
---|
| 82 | handle._options.close = function () {
|
---|
| 83 | setTimeout(done, 75)
|
---|
| 84 | }
|
---|
| 85 |
|
---|
| 86 | socket.write('hello')
|
---|
| 87 | socket.destroy()
|
---|
| 88 | })
|
---|
| 89 |
|
---|
| 90 | if (mode === 'normal') {
|
---|
| 91 | it('should invoke `getPeerName` callback', function () {
|
---|
| 92 | handle._options.getPeerName = function () {
|
---|
| 93 | return { address: 'ohai' }
|
---|
| 94 | }
|
---|
| 95 |
|
---|
| 96 | assert.strictEqual(socket.remoteAddress, 'ohai')
|
---|
| 97 | })
|
---|
| 98 |
|
---|
| 99 | it('should emit ECONNRESET at `close` event', function (done) {
|
---|
| 100 | pair.other.emit('close')
|
---|
| 101 |
|
---|
| 102 | socket.on('error', function (err) {
|
---|
| 103 | assert(/ECONNRESET/.test(err.message))
|
---|
| 104 | done()
|
---|
| 105 | })
|
---|
| 106 | })
|
---|
| 107 | }
|
---|
| 108 | })
|
---|
| 109 | })
|
---|
| 110 | })
|
---|