Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
test: refactor test-gc-tls-external-memory
- Don’t use network connections, we don’t need them and
  they add more native objects into the mix when we care
  about other kinds of native objects.
- Run GC only once every 64 iterations – this cuts down
  running time from 4 s to 400 ms.
- Use `common.mustCall()` for the `connect()` handler.
- Make sure that the TLS sockets do get garbage collected,
  since the test would otherwise also pass if they remain
  alive indefinitely.
  • Loading branch information
addaleax committed Sep 2, 2018
commit ddb45bd631c941d9fb25283cead1adc7c1825e7a
46 changes: 30 additions & 16 deletions test/parallel/test-gc-tls-external-memory.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,42 @@ const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');

const makeDuplexPair = require('../common/duplexpair');
const onGC = require('../common/ongc');
const assert = require('assert');
const net = require('net');
const tls = require('tls');

// Payload doesn't matter. We just need to have the tls
// connection try and connect somewhere.
const yolo = Buffer.alloc(10000).fill('yolo');
const server = net.createServer(function(socket) {
socket.write(yolo);
});
const dummyPayload = Buffer.alloc(10000, 'yolo');

server.listen(0, common.mustCall(function() {
const { port } = server.address();
let runs = 0;
connect();
let runs = 0;

function connect() {
// Count garbage-collected TLS sockets.
let gced = 0;
function ongc() { gced++; }

connect();

function connect() {
if (runs % 64 === 0)
global.gc();
assert(process.memoryUsage().external >= 0);
if (runs++ < 512)
tls.connect(port).on('error', connect);
else
server.close();
const externalMemoryUsage = process.memoryUsage().external;
assert(externalMemoryUsage >= 0, `${externalMemoryUsage} < 0`);
if (runs++ === 512) {
// Make sure at least half the TLS sockets have been gargbage collected
// (so that this test can actually check what it's testing):
assert(gced >= 256, `${gced} < 256`);
return;
}
}));

const { clientSide, serverSide } = makeDuplexPair();

const tlsSocket = tls.connect({ socket: clientSide });
tlsSocket.on('error', common.mustCall(connect));
onGC(tlsSocket, { ongc });

// Use setImmediate so that we don't trigger the error within the same
// event loop tick.
setImmediate(() => serverSide.write(dummyPayload));
}