Skip to content

Commit 176d07d

Browse files
randunelsaghul
authored andcommitted
Connection listener can be undefined.
1 parent 628578b commit 176d07d

File tree

5 files changed

+154
-3
lines changed

5 files changed

+154
-3
lines changed

examples/client.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
const client = require('../lib/abstract_socket')
3+
const client = require('../lib/abstract_socket.js')
44
.connect('\0foo2', () => { //'connect' listener
55
console.log('client connected');
66
})

examples/server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
require('../lib/abstract_socket')
3+
require('../lib/abstract_socket.js')
44
.createServer(client => {
55
console.log('client connected');
66
client.on('end', () => {

lib/abstract_socket.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ exports.connect = exports.createConnection = function(name, connectListener) {
6868
}
6969

7070
const sock = new net.Socket(options);
71-
setImmediate(() => connectListener(sock));
71+
if ('function' === typeof connectListener) {
72+
setImmediate(() => connectListener(sock));
73+
}
7274
return sock;
7375
};
7476

package.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
"email": "saghul@gmail.com",
55
"url": "http://bettercallsaghul.com"
66
},
7+
"scripts": {
8+
"test": "./node_modules/.bin/mocha --growl --timeout 2000 test/*.test.js"
9+
},
710
"name": "abstract-socket",
811
"version": "1.1.0",
912
"description": "Abstract domain socket support for Node / io.js",
@@ -21,6 +24,10 @@
2124
"bindings": "^1.2.1",
2225
"nan": "^2.0.9"
2326
},
27+
"devDependencies": {
28+
"should": "8.2.x",
29+
"mocha": "2.4.x"
30+
},
2431
"os": [
2532
"linux"
2633
]

test/abstract-socket.test.js

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
'use strict';
2+
3+
const spawn = require('child_process').spawn;
4+
const should = require('should'); // jshint ignore: line
5+
const abs = require('../lib/abstract_socket.js');
6+
7+
const SOCKET_NAME = '\0test312';
8+
const SOME_DATA = 'asdqq\n';
9+
10+
describe('server', () => {
11+
describe('listening', () => {
12+
let server;
13+
beforeEach(() => (server = abs.createServer()) && server.listen(SOCKET_NAME));
14+
afterEach(() => server.close());
15+
16+
it('should listen on abstract socket', () => exec('lsof -U')
17+
.then(output => output.should.containEql(`@${SOCKET_NAME.slice(1)}`)));
18+
19+
it('should emit error when socket is busy', done => {
20+
const server = abs.createServer();
21+
server.listen(SOCKET_NAME);
22+
server.on('error', err => {
23+
err.syscall.should.equal('listen');
24+
done();
25+
});
26+
});
27+
});
28+
29+
describe('client connections', () => {
30+
let server;
31+
beforeEach(() => (server = abs.createServer()) && server.listen(SOCKET_NAME));
32+
afterEach(() => server.close());
33+
34+
it('should emit event when client connects', done => {
35+
server.on('connection', () => done());
36+
abs.connect(SOCKET_NAME);
37+
});
38+
39+
it('should receive client data', done => {
40+
server.on('connection', client => {
41+
client.on('data', data => {
42+
data.toString().should.equal(SOME_DATA);
43+
done();
44+
});
45+
});
46+
abs.connect(SOCKET_NAME).write(SOME_DATA);
47+
});
48+
});
49+
50+
describe('messages', () => {
51+
let server;
52+
beforeEach(() => (server = abs.createServer()) && server.listen(SOCKET_NAME));
53+
afterEach(() => server.close());
54+
55+
it('should be received from the client', done => {
56+
server.on('connection', client => {
57+
client.on('data', data => {
58+
data.toString().should.equal(SOME_DATA);
59+
done();
60+
});
61+
});
62+
const client = abs.connect(SOCKET_NAME, () => {
63+
client.write(SOME_DATA);
64+
});
65+
});
66+
});
67+
});
68+
69+
describe('client', () => {
70+
describe('should emit error', () => {
71+
it('when connecting to a non existent socket', done => {
72+
abs.connect('\0non-existent-socket').on('error', () => done());
73+
});
74+
75+
it('when connecting to a non abstract socket', done => {
76+
abs.connect('non-abstract-socket').on('error', () => done());
77+
});
78+
});
79+
80+
describe('connect callback', () => {
81+
let server;
82+
beforeEach(() => (server = abs.createServer()) && server.listen(SOCKET_NAME));
83+
afterEach(() => server.close());
84+
85+
it('should be called when connected', done => {
86+
abs.connect(SOCKET_NAME, () => done());
87+
});
88+
89+
it('should be called asynchronously', done => {
90+
let counter = 0;
91+
abs.connect(SOCKET_NAME, () => {
92+
counter.should.equal(1);
93+
done();
94+
});
95+
++counter;
96+
});
97+
});
98+
99+
describe('messages', () => {
100+
let server;
101+
beforeEach(() => (server = abs.createServer()) && server.listen(SOCKET_NAME));
102+
afterEach(() => server.close());
103+
104+
it('should be sent to the server', done => {
105+
server.on('connection', client => {
106+
client.on('data', data => {
107+
data.toString().should.equal(SOME_DATA);
108+
done();
109+
});
110+
});
111+
const client = abs.connect(SOCKET_NAME, () => {
112+
client.write(SOME_DATA);
113+
});
114+
});
115+
});
116+
});
117+
118+
function exec(cmd, options) {
119+
return new Promise((resolve, reject) => {
120+
let bin = cmd.split(' ').shift();
121+
let params = cmd.split(' ').slice(1);
122+
let child = spawn(bin, params, options);
123+
let res = new Buffer(0);
124+
let err = new Buffer(0);
125+
126+
child.stdout.on('data', buf => res = Buffer.concat([res, buf], res.length + buf.length));
127+
child.stderr.on('data', buf => err = Buffer.concat([err, buf], err.length + buf.length));
128+
child.on('close', code => {
129+
return setImmediate(() => {
130+
// setImmediate is required because there are often still
131+
// pending write requests in both stdout and stderr at this point
132+
if (code) {
133+
reject(err.toString());
134+
} else {
135+
resolve(res.toString());
136+
}
137+
});
138+
});
139+
child.on('error', reject);
140+
});
141+
}
142+

0 commit comments

Comments
 (0)