const ContentCacheManager = require('../../app/js/ContentCacheManager')
const fs = require('fs')
const crypto = require('crypto')
const path = require('path')
const os = require('os')
const async = require('async')
const _createHash = crypto.createHash

const files = process.argv.slice(2)

function test(hashType, filePath, callback) {
  // override the default hash in ContentCacheManager
  crypto.createHash = function (hash) {
    if (hashType === 'hmac-sha1') {
      return crypto.createHmac('sha1', 'a secret')
    }
    hash = hashType
    return _createHash(hash)
  }
  fs.mkdtemp(path.join(os.tmpdir(), 'pdfcache'), (err, dir) => {
    if (err) {
      return callback(err)
    }
    const t0 = process.hrtime.bigint()
    ContentCacheManager.update(dir, filePath, (x) => {
      const t1 = process.hrtime.bigint()
      const cold = Number(t1 - t0) / 1e6
      ContentCacheManager.update(dir, filePath, (x) => {
        const t2 = process.hrtime.bigint()
        const warm = Number(t2 - t1) / 1e6
        fs.rmdir(dir, { recursive: true }, (err) => {
          if (err) {
            return callback(err)
          }
          console.log(
            'uvthreads',
            process.env.UV_THREADPOOL_SIZE,
            filePath,
            'hashType',
            hashType,
            'cold-start',
            cold.toFixed(2),
            'ms',
            'warm-start',
            warm.toFixed(2),
            'ms'
          )
          callback(null, [hashType, cold, warm])
        })
      })
    })
  })
}

var jobs = []
files.forEach((file) => {
  jobs.push((cb) => {
    test('md5', file, cb)
  })
  jobs.push((cb) => {
    test('sha1', file, cb)
  })
  jobs.push((cb) => {
    test('hmac-sha1', file, cb)
  })
  jobs.push((cb) => {
    test('sha256', file, cb)
  })
})

async.timesSeries(
  10,
  (n, cb) => {
    console.log('run', n)
    async.series(jobs, cb)
  },
  () => {
    console.log('DONE')
  }
)

const ContentCacheManager = require('../../app/js/ContentCacheManager')
const fs = require('fs')
const crypto = require('crypto')
const path = require('path')
const os = require('os')
const async = require('async')
const _createHash = crypto.createHash

const files = process.argv.slice(2)

function test(hashType, filePath, callback) {
  // override the default hash in ContentCacheManager
  crypto.createHash = function (hash) {
    if (hashType === 'hmac-sha1') {
      return crypto.createHmac('sha1', 'a secret')
    }
    hash = hashType
    return _createHash(hash)
  }
  fs.mkdtemp(path.join(os.tmpdir(), 'pdfcache'), (err, dir) => {
    if (err) {
      return callback(err)
    }
    const t0 = process.hrtime.bigint()
    ContentCacheManager.update(dir, filePath, (x) => {
      const t1 = process.hrtime.bigint()
      const cold = Number(t1 - t0) / 1e6
      ContentCacheManager.update(dir, filePath, (x) => {
        const t2 = process.hrtime.bigint()
        const warm = Number(t2 - t1) / 1e6
        fs.rmdir(dir, { recursive: true }, (err) => {
          if (err) {
            return callback(err)
          }
          console.log(
            'uvthreads',
            process.env.UV_THREADPOOL_SIZE,
            filePath,
            'hashType',
            hashType,
            'cold-start',
            cold.toFixed(2),
            'ms',
            'warm-start',
            warm.toFixed(2),
            'ms'
          )
          callback(null, [hashType, cold, warm])
        })
      })
    })
  })
}

var jobs = []
files.forEach((file) => {
  jobs.push((cb) => {
    test('md5', file, cb)
  })
  jobs.push((cb) => {
    test('sha1', file, cb)
  })
  jobs.push((cb) => {
    test('hmac-sha1', file, cb)
  })
  jobs.push((cb) => {
    test('sha256', file, cb)
  })
})

async.timesSeries(10, (n, cb) => {
  async.series(jobs, cb)
})

remove unnecessary console.log from hash benchmark