You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
7.4 KiB

var test = require('tape')
var websocket = require('./')
var echo = require("./echo-server")
var WebSocketServer = require('ws').Server
var http = require('http')
var concat = require('concat-stream')
var Buffer = require('safe-buffer').Buffer
var ts = require('typescript')
test('echo server', function(t) {
echo.start(function() {
var client = websocket(echo.url)
client.on('error', console.error)
client.on('data', function(data) {
t.ok(Buffer.isBuffer(data), 'is a buffer')
t.equal(data.toString(), 'hello world')
client.end()
echo.stop(function() {
t.end()
})
})
client.write('hello world')
})
})
test('emitting not connected errors', function(t) {
echo.start(function() {
var client = websocket(echo.url)
client.on('error', function() {
echo.stop(function() {
t.true(true, 'should emit error')
t.end()
})
})
client.once('data', function(data) {
client.end()
client.write('abcde')
})
client.write('hello world')
})
})
test('passes options to websocket constructor', function(t) {
t.plan(3)
opts = {
verifyClient: function verifyClient(info) {
t.equal(info.req.headers['x-custom-header'], 'Custom Value')
return true
}
}
echo.start(opts, function() {
var options = {headers: {'x-custom-header': 'Custom Value'}}
var client = websocket(echo.url, options)
client.on('error', console.error)
client.on('data', function(data) {
t.ok(Buffer.isBuffer(data), 'is a buffer')
t.equal(data.toString(), 'hello world')
client.end()
echo.stop(function() {})
})
client.write('hello world')
})
})
test('destroy', function(t) {
t.plan(1)
echo.start(function() {
var client = websocket(echo.url, echo.options)
client.on('close', function() {
echo.stop(function() {
t.pass('destroyed')
})
})
setTimeout(function() {
client.destroy()
}, 200)
})
})
test('drain', function(t) {
t.plan(1)
echo.start(function() {
var client = websocket(echo.url, echo.options)
client.on('drain', function() {
client.destroy()
echo.stop(function() {
t.pass('drained')
})
})
// write until buffer is full
while (client.write('foobar')) {}
})
})
test('emit sending errors if the socket is closed by the other party', function(t) {
var server = http.createServer()
var wss = new WebSocketServer({ server: server })
server.listen(8344, function() {
var client = websocket('ws://localhost:8344')
wss.on('connection', function(ws) {
var stream = websocket(ws)
client.destroy()
setTimeout(function() {
stream.write('hello world')
}, 50)
stream.on('error', function(err) {
t.ok(err, 'client errors')
server.close(t.end.bind(t))
})
})
})
})
test('destroy client pipe should close server pipe', function(t) {
t.plan(1)
var clientDestroy = function() {
var client = websocket(echo.url, echo.options)
client.on('data', function(o) {
client.destroy()
})
client.write(Buffer.from('hello'))
}
var opts = {}
var server = http.createServer()
opts.server = server
var wss = new WebSocketServer(opts)
wss.on('connection', function(ws) {
var stream = websocket(ws)
stream.on('close', function() {
server.close(function() {
t.pass('close is called')
})
})
stream.pipe(stream)
})
server.listen(echo.port, clientDestroy)
})
test('error on socket should forward it to pipe', function(t) {
t.plan(1)
var clientConnect = function() {
websocket(echo.url, echo.options)
}
var opts = {}
var server = http.createServer()
opts.server = server
var wss = new WebSocketServer(opts)
wss.on('connection', function(ws) {
var stream = websocket(ws)
stream.on('error', function() {
server.close(function() {
t.pass('error is called')
})
})
stream.socket.emit('error', new Error('Fake error'))
})
server.listen(echo.port, clientConnect)
})
test('stream end', function(t) {
t.plan(1)
var server = http.createServer()
websocket.createServer({ server: server }, handle)
function handle (stream) {
stream.pipe(concat(function (body) {
t.equal(body.toString(), 'pizza cats\n')
server.close()
}))
}
server.listen(0, function () {
var w = websocket('ws://localhost:' + server.address().port)
w.end('pizza cats\n')
})
})
test('stream handlers should fire once per connection', function(t) {
t.plan(2)
var server = http.createServer()
var wss = websocket.createServer({ server: server }, function() {
server.close(function() {
t.equal(m, 1)
})
})
var m = 0
wss.on('stream', function(stream, request) {
t.ok(request instanceof http.IncomingMessage)
m++
})
server.listen(0, function() {
var w = websocket('ws://localhost:' + server.address().port)
w.end('pizza cats\n')
})
})
test('client with writev', function(t) {
var server = http.createServer()
var str = ''
var wss = websocket.createServer({
server: server
}, function (stream) {
stream.once('data', function(data) {
t.ok(Buffer.isBuffer(data), 'is a buffer')
t.equal(data.toString(), 'hello world')
stream.once('data', function(data) {
t.ok(Buffer.isBuffer(data), 'is a buffer')
t.equal(data.toString(), str)
stream.end()
server.close()
t.end()
})
})
})
server.listen(8352, function () {
var client = websocket('ws://localhost:8352', {
objectMode: false
})
client.on('error', console.error)
client.once('connect', function () {
client.cork()
do {
str += 'foobar'
} while (client.write('foobar'))
client.uncork()
})
client.write('hello world')
})
})
test('server with writev', function(t) {
var server = http.createServer()
var str = ''
var wss = websocket.createServer({
server: server,
objectMode: false
}, function (stream) {
stream.cork()
do {
str += 'foobar'
} while (stream.write('foobar'))
stream.uncork()
})
server.listen(8352, function () {
var client = websocket('ws://localhost:8352')
client.on('error', console.error)
client.once('data', function(data) {
t.ok(Buffer.isBuffer(data), 'is a buffer')
t.equal(data.toString(), str)
client.end()
server.close()
t.end()
})
})
})
test('stop echo', function(t) {
echo.stop(function() {
t.end()
})
})
test('typescript compilation', function(t) {
function compile(fileNames, options) {
const program = ts.createProgram(fileNames, options)
const emitResult = program.emit()
const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics)
return allDiagnostics.map(diagnostic => {
if (diagnostic.file) {
let { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start)
let message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")
return `${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`
} else {
return `${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`
}
});
}
const messages = compile(['./ts-tests.ts'], {
noEmit: true,
noImplicitAny: true,
target: ts.ScriptTarget.ES5,
module: ts.ModuleKind.CommonJS
})
t.equal(messages.length, 0, 'no errors emitted')
t.end()
})