From dd772c1f131213df68524acfe115929ffb277a6d Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 2 Sep 2018 12:56:31 +0200 Subject: [PATCH] test: refactor test-gc-tls-external-memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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: https://github.com/nodejs/node/pull/22651 Reviewed-By: Luigi Pinca Reviewed-By: Rich Trott Reviewed-By: George Adams Reviewed-By: James M Snell --- test/parallel/test-gc-tls-external-memory.js | 46 +++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/test/parallel/test-gc-tls-external-memory.js b/test/parallel/test-gc-tls-external-memory.js index c19fbbe5088306..d77553b1573009 100644 --- a/test/parallel/test-gc-tls-external-memory.js +++ b/test/parallel/test-gc-tls-external-memory.js @@ -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)); +}