forked from xdebug/vscode-php-debug
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdbgp.ts
More file actions
91 lines (83 loc) · 3.48 KB
/
Copy pathdbgp.ts
File metadata and controls
91 lines (83 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import {DbgpConnection, ENCODING} from '../dbgp';
import {Socket} from 'net';
import * as iconv from 'iconv-lite';
import * as chai from 'chai';
const assert = chai.assert;
describe('DbgpConnection', () => {
function makePacket(message: string): Buffer {
const messageBuffer = iconv.encode(message, ENCODING);
return Buffer.concat([new Buffer(messageBuffer.length + '\0'), messageBuffer, new Buffer('\0')]);
}
const message = '<?xml version="1.0" encoding="iso-8859-1"?>\n<init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug">This is just a test</init>';
const packet = makePacket(message);
let socket: Socket;
let conn: DbgpConnection;
beforeEach(() => {
socket = new Socket();
conn = new DbgpConnection(socket);
});
it('should parse a response in one data event', done => {
conn.on('message', (document: XMLDocument) => {
assert.equal(document.documentElement.nodeName, 'init');
assert.equal(document.documentElement.textContent, 'This is just a test');
done();
});
conn.on('warning', done);
conn.on('error', done);
setTimeout(() => {
socket.emit('data', packet);
}, 100);
});
it('should parse a response over multiple data events', done => {
conn.on('message', (document: XMLDocument) => {
assert.equal(document.documentElement.nodeName, 'init');
assert.equal(document.documentElement.textContent, 'This is just a test');
done();
});
conn.on('warning', done);
conn.on('error', done);
const part1 = packet.slice(0, 50);
const part2 = packet.slice(50, 100);
const part3 = packet.slice(100);
setTimeout(() => {
socket.emit('data', part1);
setTimeout(() => {
socket.emit('data', part2);
setTimeout(() => {
socket.emit('data', part3);
}, 100);
}, 100);
}, 100);
});
it('should parse multiple responses in one data event', done => {
conn.once('message', (document: XMLDocument) => {
assert.equal(document.documentElement.nodeName, 'init');
assert.equal(document.documentElement.textContent, 'This is just a test');
conn.once('message', (document: XMLDocument) => {
assert.equal(document.documentElement.nodeName, 'response');
assert.equal(document.documentElement.textContent, 'This is just another test');
done();
});
});
conn.on('warning', done);
conn.on('error', done);
const packet2 = makePacket('<?xml version="1.0" encoding="iso-8859-1"?>\n<response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug">This is just another test</response>');
setTimeout(() => {
socket.emit('data', packet);
setTimeout(() => {
socket.emit('data', packet2);
});
}, 100);
});
it('should error on invalid XML', () => new Promise((resolve, reject) => {
conn.on('error', (error: Error) => {
assert.isDefined(error);
assert.instanceOf(error, Error);
resolve();
});
conn.once('message', (document: XMLDocument) => {
reject(new Error('emitted message event'));
});
socket.emit('data', makePacket('<</<<><>>><?><>'));
}));
});