@sitespeed.io/testrunner
Version:
A test runner for sitespeed.io server.
117 lines (92 loc) • 2.77 kB
JavaScript
import path from 'node:path';
import { createRequire } from 'node:module';
import fs from 'node:fs';
// eslint-disable-next-line unicorn/import-style
import { extname } from 'node:path';
import nconf from 'nconf';
import yaml from 'js-yaml';
const require = createRequire(import.meta.url);
const version = require('./package.json').version;
import { SitespeedioTestRunner } from './src/sitespeedio-testrunner.js';
import { validate } from './src/validateconfig.js';
import { getBaseFilePath } from './src/utility.js';
const defaultConfig = getBaseFilePath('./config/default.yaml');
function getFilteredConfig() {
const config = nconf.get();
const filteredConfig = { ...config };
// List of keys to exclude
const keysToExclude = ['type', '_', '$0', 'config'];
for (const key of keysToExclude) {
delete filteredConfig[key];
}
return filteredConfig;
}
nconf.argv();
if (nconf.get('help')) {
console.log('sitespeed.io test runner ' + version);
console.log('--help Get help.');
console.log(
'--config Path to a JSON/yaml configuration file that will replace default config.'
);
console.log('--version The version number.');
process.exit();
}
if (nconf.get('version')) {
console.log(version);
process.exit();
}
const configFile = nconf.get('config') || defaultConfig;
const fileExtension = extname(configFile).toLowerCase();
let configFromFile;
nconf.env({
parseValues: true,
separator: '_',
whitelist: [
'redis_host',
'redis_port',
'redis_password',
'docker_extraparameters',
'docker_container',
'location_name',
'sitespeed.io_s3_endpoint',
'sitespeed.io_s3_bucketname',
'sitespeed.io_s3_key',
'sitespeed.io_s3_secret',
'sitespeed.io_s3_region',
'sitespeed.io_s3_options_forcePathStyle',
'sitespeed.io_resultBaseURL'
]
});
try {
const fileContent = fs.readFileSync(
path.resolve(process.cwd(), configFile),
'utf8'
);
if (fileExtension === '.json') {
configFromFile = JSON.parse(fileContent);
} else if (fileExtension === '.yaml' || fileExtension === '.yml') {
configFromFile = yaml.load(fileContent);
} else {
throw new Error(
'Unsupported configuration file type. Only JSON and YAML are supported.'
);
}
nconf.defaults(configFromFile);
} catch (error) {
console.error('Error reading configuration file:', error);
process.exit(1);
}
try {
validate(getFilteredConfig());
} catch {
process.exit(1);
}
const testRunner = new SitespeedioTestRunner();
async function cleanUpAgent(type) {
testRunner.stop(type);
}
for (const eventType of [`exit`, `SIGINT`, `SIGTERM`]) {
process.on(eventType, cleanUpAgent.bind(undefined, eventType));
}
testRunner.start();