diff --git a/src/cmap/connection_pool.ts b/src/cmap/connection_pool.ts index 0df9f5d91bc..91b0a52bc49 100644 --- a/src/cmap/connection_pool.ts +++ b/src/cmap/connection_pool.ts @@ -76,6 +76,11 @@ export interface ConnectionPoolOptions extends Omit { + mockServer = await mock.createServer(); + mockServer.setMessageHandler(request => { + const doc = request.document; + if (isHello(doc)) { + request.reply(Object.assign({}, mock.HELLO, { maxWireVersion: 9 })); + } else { + request.reply({ ok: 1 }); + } + }); + }); + + afterEach(async () => { + await mock.cleanup(); + sinon.restore(); + }); + + for (const { setting, expected } of [ + { setting: undefined, expected: true }, + { setting: true, expected: true }, + { setting: false, expected: false } + ]) { + it(`clears the pool with interruptInUseConnections=${expected} when the option is ${setting}`, async function () { + topology = topologyWithPlaceholderClient( + [mockServer.hostAddress()], + setting === undefined ? {} : { interruptInUseConnections: setting } + ); + await topology.connect(); + + const [address] = topology.s.servers.keys(); + const server = topology.s.servers.get(address); + const clearStub = sinon.stub(server.pool, 'clear'); + + // Simulate the SDAM monitor reporting a network timeout for this server. + const error = new MongoNetworkTimeoutError('connection timed out'); + error.addErrorLabel(MongoErrorLabel.ResetPool); + error.addErrorLabel(MongoErrorLabel.InterruptInUseConnections); + topology.serverUpdateHandler(new ServerDescription(address, undefined, { error })); + + expect(clearStub).to.have.been.calledOnceWithExactly({ + interruptInUseConnections: expected + }); + }); + } + }); + describe('client metadata', function () { let mockServer;