mirror of
https://github.com/engineer-man/piston.git
synced 2025-08-23 21:20:03 +02:00
109 lines
3.1 KiB
JavaScript
Executable file
109 lines
3.1 KiB
JavaScript
Executable file
#!/usr/bin/env node
|
|
// Test the specified package
|
|
require('nocamel');
|
|
const config = require('../config');
|
|
const Logger = require('logplease');
|
|
const logger = Logger.create('test');
|
|
const cp = require('child_process');
|
|
const runtime = require('../runtime');
|
|
const { Job } = require('../job');
|
|
|
|
(async function () {
|
|
logger.info('Setting loglevel to', config.log_level);
|
|
Logger.setLogLevel(config.log_level);
|
|
|
|
let runtimes_to_test;
|
|
let failed = false;
|
|
|
|
if (process.argv[2] === '--all') {
|
|
// load all
|
|
runtimes_to_test = JSON.parse(
|
|
cp.execSync(
|
|
`nix eval ${config.flake_path}#pistonRuntimes --json --apply builtins.attrNames`
|
|
)
|
|
);
|
|
} else {
|
|
runtimes_to_test = [process.argv[2]];
|
|
}
|
|
|
|
for (const runtime_name of runtimes_to_test) {
|
|
const runtime_path = `${config.flake_path}#pistonRuntimes.${runtime_name}`;
|
|
logger.info(`Testing runtime ${runtime_path}`);
|
|
|
|
logger.debug(`Loading runtime metadata`);
|
|
const metadata = JSON.parse(
|
|
cp.execSync(`nix eval --json ${runtime_path}.metadata --json`)
|
|
);
|
|
|
|
logger.debug(`Loading runtime tests`);
|
|
const tests = JSON.parse(
|
|
cp.execSync(`nix eval --json ${runtime_path}.tests --json`)
|
|
);
|
|
|
|
logger.debug(`Loading runtime`);
|
|
|
|
const testable_runtime = new runtime.Runtime({
|
|
...metadata,
|
|
...runtime.Runtime.compute_all_limits(
|
|
metadata.language,
|
|
metadata.limitOverrides
|
|
),
|
|
flake_path: runtime_path,
|
|
});
|
|
|
|
testable_runtime.ensure_built();
|
|
|
|
logger.info(`Running tests`);
|
|
|
|
for (const test of tests) {
|
|
const files = [];
|
|
|
|
for (const file_name of Object.keys(test.files)) {
|
|
const file_content = test.files[file_name];
|
|
const this_file = {
|
|
name: file_name,
|
|
content: file_content,
|
|
};
|
|
|
|
if (file_name == test.main) files.unshift(this_file);
|
|
else files.push(this_file);
|
|
}
|
|
|
|
const job = new Job({
|
|
runtime: testable_runtime,
|
|
args: test.args || [],
|
|
stdin: test.stdin || '',
|
|
files,
|
|
timeouts: {
|
|
run: 3000,
|
|
compile: 10000,
|
|
},
|
|
memory_limits: {
|
|
run: config.run_memory_limit,
|
|
compile: config.compile_memory_limit,
|
|
},
|
|
});
|
|
|
|
await job.prime();
|
|
const result = await job.execute();
|
|
await job.cleanup();
|
|
|
|
if (result.run.stdout.trim() !== 'OK') {
|
|
failed = true;
|
|
|
|
logger.error('Test Failed:');
|
|
console.log(job, result);
|
|
} else {
|
|
logger.info('Test Passed');
|
|
}
|
|
}
|
|
}
|
|
|
|
if (failed) {
|
|
logger.error('One or more tests failed');
|
|
process.exit(1);
|
|
} else {
|
|
logger.info('All tests passed');
|
|
process.exit(0);
|
|
}
|
|
})();
|