From 835d9704974999d565127a391a24f870ca5a1c36 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Wed, 19 Aug 2020 23:28:02 +0200 Subject: [PATCH] fix: close() deadlock When no resume is going to be scheduled, request.onError might never be detected. Fixes: https://github.com/mcollina/undici/issues/344 --- test/request-timeout.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/request-timeout.js b/test/request-timeout.js index 1f24b812146..d8e0e029546 100644 --- a/test/request-timeout.js +++ b/test/request-timeout.js @@ -2,6 +2,7 @@ const { test } = require('tap') const { Client, errors } = require('..') +const { kConnect } = require('../lib/symbols') const { createServer } = require('http') const EventEmitter = require('events') const FakeTimers = require('@sinonjs/fake-timers') @@ -667,3 +668,32 @@ test('pipeline timeout', (t) => { ) }) }) + +test('client.close should not deadlock', (t) => { + t.plan(2) + + const clock = FakeTimers.install() + t.teardown(clock.uninstall.bind(clock)) + + const server = createServer((req, res) => { + }) + t.teardown(server.close.bind(server)) + + server.listen(0, () => { + const client = new Client(`http://localhost:${server.address().port}`) + t.teardown(client.destroy.bind(client)) + + client[kConnect](() => { + client.request({ path: '/', method: 'GET', requestTimeout: 100 }, (err, response) => { + t.ok(err instanceof errors.RequestTimeoutError) + }) + + client.close((err) => { + console.error(new Error().stack) + t.error(err) + }) + + clock.tick(100) + }) + }) +})