| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | 
							- 'use strict'
 
- const co = require('co')
 
- const expect = require('expect.js')
 
- const describe = require('mocha').describe
 
- const it = require('mocha').it
 
- const { 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()
 
-     })
 
-   })
 
- })
 
 
  |