From 4882f9a263e0dc026c8a20ab367366fa6ce28bb6 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sat, 18 Mar 2017 20:02:00 -0700 Subject: [PATCH] test: fix flaky test-tls-socket-close Replace timer/timeout race with event-based ordering, eliminating test flakiness. PR-URL: https://github.com/nodejs/node/pull/11921 Fixes: https://github.com/nodejs/node/issues/11912 Reviewed-By: Colin Ihrig Reviewed-By: Santiago Gimeno Reviewed-By: James M Snell --- test/parallel/test-tls-socket-close.js | 45 ++++++++++++++++---------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/test/parallel/test-tls-socket-close.js b/test/parallel/test-tls-socket-close.js index 440c0c4ff7c..3259031979d 100644 --- a/test/parallel/test-tls-socket-close.js +++ b/test/parallel/test-tls-socket-close.js @@ -9,35 +9,46 @@ const net = require('net'); const key = fs.readFileSync(common.fixturesDir + '/keys/agent2-key.pem'); const cert = fs.readFileSync(common.fixturesDir + '/keys/agent2-cert.pem'); -const T = 100; - +let tlsSocket; // tls server const tlsServer = tls.createServer({ cert, key }, (socket) => { - setTimeout(() => { - socket.on('error', (error) => { - assert.strictEqual(error.code, 'EINVAL'); - tlsServer.close(); - netServer.close(); - }); - socket.write('bar'); - }, T * 2); + tlsSocket = socket; + socket.on('error', common.mustCall((error) => { + assert.strictEqual(error.code, 'EINVAL'); + tlsServer.close(); + netServer.close(); + })); }); +let netSocket; // plain tcp server const netServer = net.createServer((socket) => { - // if client wants to use tls + // if client wants to use tls tlsServer.emit('connection', socket); - socket.setTimeout(T, () => { - // this breaks if TLSSocket is already managing the socket: - socket.destroy(); - }); + netSocket = socket; }).listen(0, common.mustCall(function() { - // connect client tls.connect({ host: 'localhost', port: this.address().port, rejectUnauthorized: false - }).write('foo'); + }).write('foo', 'utf8', common.mustCall(() => { + assert(netSocket); + netSocket.setTimeout(1, common.mustCall(() => { + assert(tlsSocket); + // this breaks if TLSSocket is already managing the socket: + netSocket.destroy(); + const interval = setInterval(() => { + // Checking this way allows us to do the write at a time that causes a + // segmentation fault (not always, but often) in Node.js 7.7.3 and + // earlier. If we instead, for example, wait on the `close` event, then + // it will not segmentation fault, which is what this test is all about. + if (tlsSocket._handle._parent.bytesRead === 0) { + tlsSocket.write('bar'); + clearInterval(interval); + } + }, 1); + })); + })); }));