node/test/sequential/test-net-GH-5504.js
Roman Reiss 7049d7b474 test: increase timeouts on ARM
This commit introduces platform-specific test timeouts for the ARM
architectures. ARMv6 is notoriously slow so gets very large timeouts on
both the timeout value for each test, as well as certain problematic
individual tests. ARMv7 and ARMv8 also get slightly increased headroom.

PR-URL: https://github.com/iojs/io.js/pull/1366
Fixes: https://github.com/iojs/io.js/issues/1343
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-04-09 15:10:34 +02:00

107 lines
2.6 KiB
JavaScript

var common = require('../common');
var assert = require('assert');
// this test only fails with CentOS 6.3 using kernel version 2.6.32
// On other linuxes and darwin, the `read` call gets an ECONNRESET in
// that case. On sunos, the `write` call fails with EPIPE.
//
// However, old CentOS will occasionally send an EOF instead of a
// ECONNRESET or EPIPE when the client has been destroyed abruptly.
//
// Make sure we don't keep trying to write or read more in that case.
switch (process.argv[2]) {
case 'server': return server();
case 'client': return client();
case undefined: return parent();
default: throw new Error('wtf');
}
function server() {
var net = require('net');
var content = new Buffer(64 * 1024 * 1024);
content.fill('#');
net.createServer(function(socket) {
this.close();
socket.on('end', function() {
console.error('end');
});
socket.on('_socketEnd', function() {
console.error('_socketEnd');
});
socket.write(content);
}).listen(common.PORT, function() {
console.log('listening');
});
}
function client() {
var net = require('net');
var client = net.connect({
host: 'localhost',
port: common.PORT
}, function() {
client.destroy();
});
}
function parent() {
var spawn = require('child_process').spawn;
var node = process.execPath;
var assert = require('assert');
var serverExited = false;
var clientExited = false;
var serverListened = false;
var opt = {
env: {
NODE_DEBUG: 'net',
NODE_COMMON_PORT: process.env.NODE_COMMON_PORT,
}
};
process.on('exit', function() {
assert(serverExited);
assert(clientExited);
assert(serverListened);
console.log('ok');
});
setTimeout(function() {
if (s) s.kill();
if (c) c.kill();
setTimeout(function() {
throw new Error('hang');
});
}, common.platformTimeout(2000)).unref();
var s = spawn(node, [__filename, 'server'], opt);
var c;
wrap(s.stderr, process.stderr, 'SERVER 2>');
wrap(s.stdout, process.stdout, 'SERVER 1>');
s.on('exit', function(c) {
console.error('server exited', c);
serverExited = true;
});
s.stdout.once('data', function() {
serverListened = true;
c = spawn(node, [__filename, 'client']);
wrap(c.stderr, process.stderr, 'CLIENT 2>');
wrap(c.stdout, process.stdout, 'CLIENT 1>');
c.on('exit', function(c) {
console.error('client exited', c);
clientExited = true;
});
});
function wrap(inp, out, w) {
inp.setEncoding('utf8');
inp.on('data', function(c) {
c = c.trim();
if (!c) return;
out.write(w + c.split('\n').join('\n' + w) + '\n');
});
}
}