1 |
|
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 |
|
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 | })
|