summaryrefslogtreecommitdiffstats
path: root/test/gc.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/gc.js')
-rw-r--r--test/gc.js98
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()
+ })
+ })
+})