From 5d8bf784d0a78c7e409eafd8810cc5ee1374a215 Mon Sep 17 00:00:00 2001 From: Warren James Date: Mon, 8 Jan 2024 11:32:02 -0500 Subject: [PATCH 1/7] test(DRVIERS-2677): Update prose tests --- ...ver_discovery_and_monitoring.prose.test.ts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts b/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts index ad8ade8c7dd..7552f5b308a 100644 --- a/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts +++ b/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts @@ -1,11 +1,15 @@ import { expect } from 'chai'; import { once } from 'events'; +import * as sinon from 'sinon'; +import { setTimeout } from 'timers/promises'; +import { connect } from '../../mongodb'; import { CONNECTION_POOL_CLEARED, CONNECTION_POOL_READY, type MongoClient, SERVER_HEARTBEAT_FAILED, + SERVER_HEARTBEAT_STARTED, SERVER_HEARTBEAT_SUCCEEDED } from '../../mongodb'; @@ -179,4 +183,40 @@ describe('Server Discovery and Monitoring Prose Tests', function () { } }); }); + + describe('Heartbeat tests', function () { + let client: MongoClient; + let connectSpy; + const events: { event: any; time: number }[] = []; + + // Spy on socket constructor + + beforeEach(function () { + client = this.configuration.newClient({ + heartbeatFrequencyMS: 10000, + appName: 'HeartbeatTest', + maxPoolSize: 1, + minPoolSize: 0 + }); + + client.on(SERVER_HEARTBEAT_STARTED, event => { + events.push({ event, time: performance.now() }); + }); + + // set up spy + connectSpy = sinon.spy(connect); + }); + + afterEach(async function () { + sinon.restore(); + }); + + it('emits the first HeartbeatStartedEvent after the monitoring socket was created', async function () { + await client.connect(); + await setTimeout(2000); + await client.close(); + + expect(events).to.have.length.gte(2); + }); + }); }); From aa2542d55b2e5cc9cf4919b5e3a81a873f276373 Mon Sep 17 00:00:00 2001 From: Warren James Date: Mon, 8 Jan 2024 17:25:55 -0500 Subject: [PATCH 2/7] Add prose test --- ...ver_discovery_and_monitoring.prose.test.ts | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 test/unit/sdam/server_discovery_and_monitoring.prose.test.ts diff --git a/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts b/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts new file mode 100644 index 00000000000..cad595aae8b --- /dev/null +++ b/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts @@ -0,0 +1,59 @@ +import { expect } from 'chai'; +import { createServer, type Server } from 'net'; + +import { MongoClient, SERVER_HEARTBEAT_FAILED, SERVER_HEARTBEAT_STARTED } from '../../mongodb'; + +describe('Heartbeat tests', function () { + let client: MongoClient; + // Mock server + let server: Server; + // Shared array + const events: string[] = []; + + beforeEach(async function () { + // Create TCP server that responds to hellos by closing the connection + // and pushing "client connection created" to shared array + server = createServer(clientSocket => { + console.log(`connection from ${clientSocket.remoteAddress}`); + events.push('client connected'); + clientSocket.end(); + }); + server.listen(9999); + + // set up client to connect to mock server with the following configuration + // { + // serverSelectionTimeoutMS: 500, + // maxPoolSize: 1, + // minPoolSize: 0 + // } + client = new MongoClient('mongodb://localhost:9999', { + serverSelectionTimeoutMS: 500, + maxPoolSize: 1, + minPoolSize: 0 + }); + + // Listen to `ServerHeartbeatStartedEvent` and `ServerHeartbeatSucceededEvent`, pushing the + // event name to the shared array when event is emitted + for (const e of [SERVER_HEARTBEAT_STARTED, SERVER_HEARTBEAT_FAILED]) { + client.on(e, () => { + events.push(e); + }); + } + + // Attempt to connect to mock server + const maybeError = await client.connect().catch(e => e); + // Catch error + expect(maybeError).to.be.instanceOf(Error); + }); + + afterEach(async function () { + if (server.listening) server.close(); + }); + + it('emits the first HeartbeatStartedEvent after the monitoring socket was created', async function () { + expect(events).to.have.lengthOf(3); + expect(events[0]).to.equal('client connection created'); + expect(events[1]).to.equal(SERVER_HEARTBEAT_STARTED); + expect(events[3]).to.equal(SERVER_HEARTBEAT_FAILED); + }); +}); From 645630a02098bfe46d522c781e1e38b2509e831e Mon Sep 17 00:00:00 2001 From: Warren James Date: Mon, 8 Jan 2024 17:29:03 -0500 Subject: [PATCH 3/7] move prose test to unit test file --- ...ver_discovery_and_monitoring.prose.test.ts | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts b/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts index 7552f5b308a..9c4ec6c7ab9 100644 --- a/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts +++ b/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts @@ -183,40 +183,4 @@ describe('Server Discovery and Monitoring Prose Tests', function () { } }); }); - - describe('Heartbeat tests', function () { - let client: MongoClient; - let connectSpy; - const events: { event: any; time: number }[] = []; - - // Spy on socket constructor - - beforeEach(function () { - client = this.configuration.newClient({ - heartbeatFrequencyMS: 10000, - appName: 'HeartbeatTest', - maxPoolSize: 1, - minPoolSize: 0 - }); - - client.on(SERVER_HEARTBEAT_STARTED, event => { - events.push({ event, time: performance.now() }); - }); - - // set up spy - connectSpy = sinon.spy(connect); - }); - - afterEach(async function () { - sinon.restore(); - }); - - it('emits the first HeartbeatStartedEvent after the monitoring socket was created', async function () { - await client.connect(); - await setTimeout(2000); - await client.close(); - - expect(events).to.have.length.gte(2); - }); - }); }); From 85026165c7acd6635df2c37d0539cb27ec1d4f1c Mon Sep 17 00:00:00 2001 From: Warren James Date: Mon, 8 Jan 2024 17:30:06 -0500 Subject: [PATCH 4/7] revert --- .../server_discovery_and_monitoring.prose.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts b/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts index 9c4ec6c7ab9..ad8ade8c7dd 100644 --- a/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts +++ b/test/integration/server-discovery-and-monitoring/server_discovery_and_monitoring.prose.test.ts @@ -1,15 +1,11 @@ import { expect } from 'chai'; import { once } from 'events'; -import * as sinon from 'sinon'; -import { setTimeout } from 'timers/promises'; -import { connect } from '../../mongodb'; import { CONNECTION_POOL_CLEARED, CONNECTION_POOL_READY, type MongoClient, SERVER_HEARTBEAT_FAILED, - SERVER_HEARTBEAT_STARTED, SERVER_HEARTBEAT_SUCCEEDED } from '../../mongodb'; From 8e970e8f95c5f078103affbd3dd0c049d8ed3354 Mon Sep 17 00:00:00 2001 From: Warren James Date: Tue, 9 Jan 2024 10:36:35 -0500 Subject: [PATCH 5/7] update test --- .../server_discovery_and_monitoring.prose.test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts b/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts index cad595aae8b..07fa6807d1d 100644 --- a/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts +++ b/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts @@ -14,9 +14,12 @@ describe('Heartbeat tests', function () { // Create TCP server that responds to hellos by closing the connection // and pushing "client connection created" to shared array server = createServer(clientSocket => { - console.log(`connection from ${clientSocket.remoteAddress}`); events.push('client connected'); - clientSocket.end(); + + clientSocket.once('data', () => { + events.push('client hello received'); + clientSocket.end(); + }); }); server.listen(9999); @@ -50,10 +53,11 @@ describe('Heartbeat tests', function () { if (server.listening) server.close(); }); - it('emits the first HeartbeatStartedEvent after the monitoring socket was created', async function () { - expect(events).to.have.lengthOf(3); + it('emits the first HeartbeatStartedEvent after the monitoring socket was created and before hello is sent', async function () { + expect(events).to.have.lengthOf(4); expect(events[0]).to.equal('client connection created'); expect(events[1]).to.equal(SERVER_HEARTBEAT_STARTED); + expect(events[2]).to.equal('client hello received'); expect(events[3]).to.equal(SERVER_HEARTBEAT_FAILED); }); }); From f4f9b46dbc2e64685ec2e154187fd32196f390ed Mon Sep 17 00:00:00 2001 From: Warren James Date: Fri, 12 Jan 2024 17:04:19 -0500 Subject: [PATCH 6/7] revert prose test --- ...ver_discovery_and_monitoring.prose.test.ts | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts b/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts index 07fa6807d1d..6b3a6732a76 100644 --- a/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts +++ b/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts @@ -1,4 +1,5 @@ import { expect } from 'chai'; +import { once } from 'events'; import { createServer, type Server } from 'net'; import { MongoClient, SERVER_HEARTBEAT_FAILED, SERVER_HEARTBEAT_STARTED } from '../../mongodb'; @@ -9,6 +10,8 @@ describe('Heartbeat tests', function () { let server: Server; // Shared array const events: string[] = []; + const PORT = 9999; + const CONN_STRING = `mongodb://localhost:${PORT}`; beforeEach(async function () { // Create TCP server that responds to hellos by closing the connection @@ -18,21 +21,19 @@ describe('Heartbeat tests', function () { clientSocket.once('data', () => { events.push('client hello received'); - clientSocket.end(); + clientSocket.destroy(); }); }); - server.listen(9999); + server.listen(PORT); + + await once(server, 'listening'); // set up client to connect to mock server with the following configuration // { // serverSelectionTimeoutMS: 500, - // maxPoolSize: 1, - // minPoolSize: 0 // } - client = new MongoClient('mongodb://localhost:9999', { - serverSelectionTimeoutMS: 500, - maxPoolSize: 1, - minPoolSize: 0 + client = new MongoClient(CONN_STRING, { + serverSelectionTimeoutMS: 500 }); // Listen to `ServerHeartbeatStartedEvent` and `ServerHeartbeatSucceededEvent`, pushing the @@ -42,22 +43,25 @@ describe('Heartbeat tests', function () { events.push(e); }); } - - // Attempt to connect to mock server - const maybeError = await client.connect().catch(e => e); - // Catch error - expect(maybeError).to.be.instanceOf(Error); }); afterEach(async function () { if (server.listening) server.close(); }); - it('emits the first HeartbeatStartedEvent after the monitoring socket was created and before hello is sent', async function () { + it('emits the first HeartbeatStartedEvent before the monitoring socket was created', async function () { + // Attempt to connect to mock server + const maybeError = await client.connect().catch(e => e); + // Catch error + expect(maybeError).to.be.instanceOf(Error); + expect(events).to.have.lengthOf(4); - expect(events[0]).to.equal('client connection created'); - expect(events[1]).to.equal(SERVER_HEARTBEAT_STARTED); - expect(events[2]).to.equal('client hello received'); - expect(events[3]).to.equal(SERVER_HEARTBEAT_FAILED); + + expect(events).to.deep.equal([ + SERVER_HEARTBEAT_STARTED, + 'client connected', + 'client hello received', + SERVER_HEARTBEAT_FAILED + ]); }); }); From dc2c3633dc5c0316ba46f36b2d0356305af73345 Mon Sep 17 00:00:00 2001 From: Warren James Date: Thu, 18 Jan 2024 09:55:33 -0500 Subject: [PATCH 7/7] remove length check --- test/unit/sdam/server_discovery_and_monitoring.prose.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts b/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts index 6b3a6732a76..debd4a233a4 100644 --- a/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts +++ b/test/unit/sdam/server_discovery_and_monitoring.prose.test.ts @@ -55,8 +55,6 @@ describe('Heartbeat tests', function () { // Catch error expect(maybeError).to.be.instanceOf(Error); - expect(events).to.have.lengthOf(4); - expect(events).to.deep.equal([ SERVER_HEARTBEAT_STARTED, 'client connected',