mirror of
https://github.com/Unitech/pm2.git
synced 2025-12-08 20:35:53 +00:00
112 lines
2.8 KiB
JavaScript
112 lines
2.8 KiB
JavaScript
|
|
const forEachLimit = require('async/forEachLimit')
|
|
const fs = require('fs')
|
|
const exec = require('child_process').exec
|
|
const path = require('path')
|
|
const chalk = require('ansis')
|
|
const Table = require('cli-table-redemption');
|
|
|
|
const testFolder = './test/e2e/'
|
|
|
|
const CONCURRENT_TEST = 3
|
|
const DOCKER_IMAGE_NAME = 'pm2-test'
|
|
|
|
var timings = {};
|
|
|
|
function run(cmd, cb) {
|
|
exec(cmd, function(err, stdout, stderr) {
|
|
if (err) {
|
|
console.log(`Retrying ${cmd}`)
|
|
return exec(cmd, function(err, stdout, stderr) {
|
|
if (err) return cb(stdout.split('\n'));
|
|
return cb(null);
|
|
})
|
|
}
|
|
return cb(null)
|
|
})
|
|
}
|
|
|
|
function buildContainer(cb) {
|
|
exec(`docker build -t ${DOCKER_IMAGE_NAME} -f test/Dockerfile .`, cb)
|
|
}
|
|
|
|
function listAllTest(cb) {
|
|
var test_suite = []
|
|
|
|
fs.readdir(testFolder, (err, folders) => {
|
|
forEachLimit(folders, 4, (folder, next) => {
|
|
var fold = path.join(testFolder, folder)
|
|
fs.readdir(fold, (err, files) => {
|
|
if (err) return next()
|
|
files.forEach((file) => {
|
|
test_suite.push(path.join(fold, file))
|
|
})
|
|
next()
|
|
})
|
|
}, function() {
|
|
launchTestSuite(test_suite, cb)
|
|
})
|
|
})
|
|
}
|
|
|
|
function launchTestSuite(files, cb) {
|
|
forEachLimit(files, CONCURRENT_TEST, function(file, next) {
|
|
var cmd = `docker run -v ${path.resolve(__dirname, '..')}:/var/pm2 ${DOCKER_IMAGE_NAME} bash ${file}`
|
|
|
|
console.log(chalk.bold(`Running test ${file}`))
|
|
timings[file] = new Date().getTime()
|
|
|
|
run(cmd, function(err) {
|
|
if (err) {
|
|
// Display Error
|
|
console.error(chalk.bold.red(`${'='.repeat(25)} Test File ${file} has failed ${'='.repeat(25)}`))
|
|
console.error(chalk.bold('Output (stderr):'))
|
|
err.forEach(function(line) {
|
|
console.error(line)
|
|
})
|
|
console.error(chalk.bold.red(`${'='.repeat(80)}`))
|
|
return next(err)
|
|
}
|
|
|
|
timings[file] = new Date().getTime() - timings[file]
|
|
|
|
console.log(chalk.bold.green(`✓ Test ${file} success`))
|
|
return next();
|
|
})
|
|
}, (err) => {
|
|
if (err) {
|
|
console.log('Test Suite has failed')
|
|
cb(err)
|
|
}
|
|
console.log('Test Suite passed succesfully')
|
|
cb()
|
|
})
|
|
}
|
|
|
|
buildContainer(function(err) {
|
|
if (err) {
|
|
console.error(err)
|
|
process.exit(1)
|
|
}
|
|
console.log(`Container ${DOCKER_IMAGE_NAME} has been built`)
|
|
|
|
return listAllTest(function(err) {
|
|
|
|
var table = new Table({
|
|
head: ['Test', 'Duration'],
|
|
style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
|
|
})
|
|
|
|
Object.keys(timings).forEach(function(test) {
|
|
table.push([test, timings[test]])
|
|
})
|
|
|
|
console.log(table.toString());
|
|
|
|
if (err) {
|
|
return console.error(chalk.bold.red('Test suite failed'))
|
|
}
|
|
console.log(chalk.bold.blue('Test suite succeeded'))
|
|
})
|
|
})
|