diff options
Diffstat (limited to 'test/gc.js')
-rw-r--r-- | test/gc.js | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/test/gc.js b/test/gc.js new file mode 100644 index 0000000..c1ceecf --- /dev/null +++ b/test/gc.js @@ -0,0 +1,98 @@ +'use strict' +/* global WeakRef, FinalizationRegistry */ + +const { test } = require('tap') +const { createServer } = require('net') +const { Client, Pool } = require('..') + +const SKIP = typeof WeakRef === 'undefined' || typeof FinalizationRegistry === 'undefined' + +setInterval(() => { + global.gc() +}, 100).unref() + +test('gc should collect the client if, and only if, there are no active sockets', { skip: SKIP }, t => { + t.plan(4) + + const server = createServer((socket) => { + socket.write('HTTP/1.1 200 OK\r\n') + socket.write('Content-Length: 0\r\n') + socket.write('Keep-Alive: timeout=1s\r\n') + socket.write('Connection: keep-alive\r\n') + socket.write('\r\n\r\n') + }) + t.teardown(server.close.bind(server)) + + let weakRef + let disconnected = false + + const registry = new FinalizationRegistry((data) => { + t.equal(data, 'test') + t.equal(disconnected, true) + t.equal(weakRef.deref(), undefined) + }) + + server.listen(0, () => { + const client = new Client(`http://localhost:${server.address().port}`, { + keepAliveTimeoutThreshold: 100 + }) + client.once('disconnect', () => { + disconnected = true + }) + + weakRef = new WeakRef(client) + registry.register(client, 'test') + + client.request({ + path: '/', + method: 'GET' + }, (err, { body }) => { + t.error(err) + body.resume() + }) + }) +}) + +test('gc should collect the pool if, and only if, there are no active sockets', { skip: SKIP }, t => { + t.plan(4) + + const server = createServer((socket) => { + socket.write('HTTP/1.1 200 OK\r\n') + socket.write('Content-Length: 0\r\n') + socket.write('Keep-Alive: timeout=1s\r\n') + socket.write('Connection: keep-alive\r\n') + socket.write('\r\n\r\n') + }) + t.teardown(server.close.bind(server)) + + let weakRef + let disconnected = false + + const registry = new FinalizationRegistry((data) => { + t.equal(data, 'test') + t.equal(disconnected, true) + t.equal(weakRef.deref(), undefined) + }) + + server.listen(0, () => { + const pool = new Pool(`http://localhost:${server.address().port}`, { + connections: 1, + keepAliveTimeoutThreshold: 500 + }) + + pool.once('disconnect', () => { + disconnected = true + }) + + weakRef = new WeakRef(pool) + registry.register(pool, 'test') + + pool.request({ + path: '/', + method: 'GET' + }, (err, { body }) => { + t.error(err) + body.resume() + }) + }) +}) |