| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | 'use strict'const co = require('co')const expect = require('expect.js')const describe = require('mocha').describeconst it = require('mocha').itconst { fork } = require('child_process')const path = require('path')const Pool = require('../')const wait = (time) => new Promise((resolve) => setTimeout(resolve, time))describe('idle timeout', () => {  it('should timeout and remove the client', (done) => {    const pool = new Pool({ idleTimeoutMillis: 10 })    pool.query('SELECT NOW()')    pool.on('remove', () => {      expect(pool.idleCount).to.equal(0)      expect(pool.totalCount).to.equal(0)      done()    })  })  it(    'times out and removes clients when others are also removed',    co.wrap(function* () {      const pool = new Pool({ idleTimeoutMillis: 10 })      const clientA = yield pool.connect()      const clientB = yield pool.connect()      clientA.release()      clientB.release(new Error())      const removal = new Promise((resolve) => {        pool.on('remove', () => {          expect(pool.idleCount).to.equal(0)          expect(pool.totalCount).to.equal(0)          resolve()        })      })      const timeout = wait(100).then(() => Promise.reject(new Error('Idle timeout failed to occur')))      try {        yield Promise.race([removal, timeout])      } finally {        pool.end()      }    })  )  it(    'can remove idle clients and recreate them',    co.wrap(function* () {      const pool = new Pool({ idleTimeoutMillis: 1 })      const results = []      for (var i = 0; i < 20; i++) {        let query = pool.query('SELECT NOW()')        expect(pool.idleCount).to.equal(0)        expect(pool.totalCount).to.equal(1)        results.push(yield query)        yield wait(2)        expect(pool.idleCount).to.equal(0)        expect(pool.totalCount).to.equal(0)      }      expect(results).to.have.length(20)    })  )  it(    'does not time out clients which are used',    co.wrap(function* () {      const pool = new Pool({ idleTimeoutMillis: 1 })      const results = []      for (var i = 0; i < 20; i++) {        let client = yield pool.connect()        expect(pool.totalCount).to.equal(1)        expect(pool.idleCount).to.equal(0)        yield wait(10)        results.push(yield client.query('SELECT NOW()'))        client.release()        expect(pool.idleCount).to.equal(1)        expect(pool.totalCount).to.equal(1)      }      expect(results).to.have.length(20)      return pool.end()    })  )  it('unrefs the connections and timeouts so the program can exit when idle when the allowExitOnIdle option is set', function (done) {    const child = fork(path.join(__dirname, 'idle-timeout-exit.js'), [], {      silent: true,      env: { ...process.env, ALLOW_EXIT_ON_IDLE: '1' },    })    let result = ''    child.stdout.setEncoding('utf8')    child.stdout.on('data', (chunk) => (result += chunk))    child.on('error', (err) => done(err))    child.on('close', () => {      expect(result).to.equal('completed first\ncompleted second\n')      done()    })  })  it('keeps old behavior when allowExitOnIdle option is not set', function (done) {    const child = fork(path.join(__dirname, 'idle-timeout-exit.js'), [], {      silent: true,    })    let result = ''    child.stdout.setEncoding('utf8')    child.stdout.on('data', (chunk) => (result += chunk))    child.on('error', (err) => done(err))    child.on('close', () => {      expect(result).to.equal('completed first\ncompleted second\nremoved\n')      done()    })  })})
 |