Skip to content

Commit

Permalink
test: refactor test-gc-tls-external-memory
Browse files Browse the repository at this point in the history
- 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.

PR-URL: #22651
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: George Adams <george.adams@uk.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
addaleax authored and targos committed Sep 5, 2018
1 parent 7a3bbd2 commit dd772c1
Showing 1 changed file with 30 additions and 16 deletions.
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));
}

0 comments on commit dd772c1

Please sign in to comment.