From 5eef46311d262dfb7a953ab47d85fd6c48414cfe Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Tue, 12 Aug 2025 14:50:35 +0200 Subject: [PATCH 1/4] eventsource: also test for minimum time in reconnectionTime tests --- test/eventsource/eventsource-connect.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/eventsource/eventsource-connect.js b/test/eventsource/eventsource-connect.js index 55683fc6951..cbe7fbbd33f 100644 --- a/test/eventsource/eventsource-connect.js +++ b/test/eventsource/eventsource-connect.js @@ -203,6 +203,7 @@ describe('EventSource - received response must have content-type to be text/even eventSourceInstance.close() + assert.strictEqual(end - start > (2.9 * reconnectionTime), true) assert.strictEqual(end - start < (3.5 * reconnectionTime), true) }) @@ -226,6 +227,7 @@ describe('EventSource - received response must have content-type to be text/even eventSourceInstance.close() + assert.strictEqual(end - start > (2.9 * reconnectionTime), true) assert.strictEqual(end - start < (3.5 * reconnectionTime), true) }) }) From aaaa427d28f7eb2522c1687d88daf26fa399ee10 Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Wed, 13 Aug 2025 02:15:48 +0200 Subject: [PATCH 2/4] more info --- test/eventsource/eventsource-connect.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/eventsource/eventsource-connect.js b/test/eventsource/eventsource-connect.js index cbe7fbbd33f..38c7514a1f0 100644 --- a/test/eventsource/eventsource-connect.js +++ b/test/eventsource/eventsource-connect.js @@ -203,8 +203,8 @@ describe('EventSource - received response must have content-type to be text/even eventSourceInstance.close() - assert.strictEqual(end - start > (2.9 * reconnectionTime), true) - assert.strictEqual(end - start < (3.5 * reconnectionTime), true) + assert.strictEqual(end - start > (2.9 * reconnectionTime), true, `Expected reconnection to happen after at least ${2.9 * reconnectionTime}ms, but took ${end - start}ms`) + assert.strictEqual(end - start < (3.5 * reconnectionTime), true, `Expected reconnection to happen within ${3.5 * reconnectionTime}ms, but took ${end - start}ms`) }) test('should try to connect again if server is unreachable', async () => { @@ -227,7 +227,7 @@ describe('EventSource - received response must have content-type to be text/even eventSourceInstance.close() - assert.strictEqual(end - start > (2.9 * reconnectionTime), true) - assert.strictEqual(end - start < (3.5 * reconnectionTime), true) + assert.strictEqual(end - start > (2.9 * reconnectionTime), true, `Expected reconnection to happen after at least ${2.9 * reconnectionTime}ms, but took ${end - start}ms`) + assert.strictEqual(end - start < (3.5 * reconnectionTime), true, `Expected reconnection to happen within ${3.5 * reconnectionTime}ms, but took ${end - start}ms`) }) }) From 18f22929c4e573f9c463861573ba111e671d0c5b Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Wed, 13 Aug 2025 02:22:11 +0200 Subject: [PATCH 3/4] less flaky? --- test/eventsource/eventsource-connect.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/eventsource/eventsource-connect.js b/test/eventsource/eventsource-connect.js index 38c7514a1f0..b7f33b979bc 100644 --- a/test/eventsource/eventsource-connect.js +++ b/test/eventsource/eventsource-connect.js @@ -207,8 +207,8 @@ describe('EventSource - received response must have content-type to be text/even assert.strictEqual(end - start < (3.5 * reconnectionTime), true, `Expected reconnection to happen within ${3.5 * reconnectionTime}ms, but took ${end - start}ms`) }) - test('should try to connect again if server is unreachable', async () => { - const reconnectionTime = 500 + test('should try to connect again if server is unreachable, configure reconnectionTime', async () => { + const reconnectionTime = 1000 const domain = 'bad.n' + randomInt(1e10).toString(36) + '.proxy' From b0010d8dc985d96fa7de487dc9e5f445cd29f74d Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Wed, 13 Aug 2025 03:33:09 +0200 Subject: [PATCH 4/4] use faketimers --- test/eventsource/eventsource-connect.js | 30 ++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/test/eventsource/eventsource-connect.js b/test/eventsource/eventsource-connect.js index b7f33b979bc..95af14d5567 100644 --- a/test/eventsource/eventsource-connect.js +++ b/test/eventsource/eventsource-connect.js @@ -3,7 +3,8 @@ const assert = require('node:assert') const events = require('node:events') const http = require('node:http') -const { test, describe } = require('node:test') +const { test, describe, after } = require('node:test') +const FakeTimers = require('@sinonjs/fake-timers') const { EventSource, defaultReconnectionTime } = require('../../lib/web/eventsource/eventsource') const { randomInt } = require('node:crypto') @@ -184,6 +185,9 @@ describe('EventSource - received response must have content-type to be text/even }) test('should try to connect again if server is unreachable', async () => { + const clock = FakeTimers.install() + + after(() => clock.uninstall()) const reconnectionTime = defaultReconnectionTime const domain = 'bad.n' + randomInt(1e10).toString(36) + '.proxy' @@ -193,22 +197,29 @@ describe('EventSource - received response must have content-type to be text/even eventSourceInstance.onerror = (error) => { onerrorCalls.push(error) } + clock.tick(reconnectionTime) + await events.once(eventSourceInstance, 'error') const start = Date.now() + clock.tick(reconnectionTime) await events.once(eventSourceInstance, 'error') + clock.tick(reconnectionTime) await events.once(eventSourceInstance, 'error') + clock.tick(reconnectionTime) await events.once(eventSourceInstance, 'error') const end = Date.now() eventSourceInstance.close() - assert.strictEqual(end - start > (2.9 * reconnectionTime), true, `Expected reconnection to happen after at least ${2.9 * reconnectionTime}ms, but took ${end - start}ms`) - assert.strictEqual(end - start < (3.5 * reconnectionTime), true, `Expected reconnection to happen within ${3.5 * reconnectionTime}ms, but took ${end - start}ms`) + assert.strictEqual(onerrorCalls.length, 4, 'Expected 4 error events') + assert.strictEqual(end - start, 3 * reconnectionTime, `Expected reconnection to happen after ${3 * reconnectionTime}ms, but took ${end - start}ms`) }) test('should try to connect again if server is unreachable, configure reconnectionTime', async () => { const reconnectionTime = 1000 + const clock = FakeTimers.install() + after(() => clock.uninstall()) const domain = 'bad.n' + randomInt(1e10).toString(36) + '.proxy' @@ -217,17 +228,26 @@ describe('EventSource - received response must have content-type to be text/even reconnectionTime } }) + + const onerrorCalls = [] + eventSourceInstance.onerror = (error) => { + onerrorCalls.push(error) + } + await events.once(eventSourceInstance, 'error') const start = Date.now() + clock.tick(reconnectionTime) await events.once(eventSourceInstance, 'error') + clock.tick(reconnectionTime) await events.once(eventSourceInstance, 'error') + clock.tick(reconnectionTime) await events.once(eventSourceInstance, 'error') const end = Date.now() eventSourceInstance.close() - assert.strictEqual(end - start > (2.9 * reconnectionTime), true, `Expected reconnection to happen after at least ${2.9 * reconnectionTime}ms, but took ${end - start}ms`) - assert.strictEqual(end - start < (3.5 * reconnectionTime), true, `Expected reconnection to happen within ${3.5 * reconnectionTime}ms, but took ${end - start}ms`) + assert.strictEqual(onerrorCalls.length, 4, 'Expected 4 error events') + assert.strictEqual(end - start, 3 * reconnectionTime, `Expected reconnection to happen after ${3 * reconnectionTime}ms, but took ${end - start}ms`) }) })