|
|
|
const API = require('./../lib/api');
|
|
|
|
const utils = require('./plugin-assets/plugin.utils');
|
|
|
|
const buidlerUtils = require('./plugin-assets/buidler.utils');
|
|
|
|
const PluginUI = require('./plugin-assets/buidler.ui');
|
|
|
|
|
|
|
|
const pkg = require('./../package.json');
|
|
|
|
const death = require('death');
|
|
|
|
const path = require('path');
|
|
|
|
const Web3 = require('web3');
|
|
|
|
const ganache = require('ganache-cli');
|
|
|
|
|
|
|
|
const { task, internalTask, types } = require("@nomiclabs/buidler/config");
|
|
|
|
const { ensurePluginLoadedWithUsePlugin } = require("@nomiclabs/buidler/plugins");
|
|
|
|
const { BuidlerPluginError } = require("@nomiclabs/buidler/internal/core/errors");
|
|
|
|
const { createProvider } = require("@nomiclabs/buidler/internal/core/providers/construction");
|
|
|
|
|
|
|
|
const {
|
|
|
|
TASK_TEST_RUN_MOCHA_TESTS,
|
|
|
|
TASK_TEST,
|
|
|
|
TASK_COMPILE,
|
|
|
|
} = require("@nomiclabs/buidler/builtin-tasks/task-names");
|
|
|
|
|
|
|
|
const util = require('util');
|
|
|
|
|
|
|
|
function plugin() {
|
|
|
|
let api;
|
|
|
|
let address;
|
|
|
|
let network;
|
|
|
|
let error;
|
|
|
|
let testsErrored = false;
|
|
|
|
|
|
|
|
const ui = new PluginUI();
|
|
|
|
|
|
|
|
extendEnvironment(env => {
|
|
|
|
env.config.logger = {log: null};
|
|
|
|
env.config = buidlerUtils.normalizeConfig(env.config);
|
|
|
|
|
|
|
|
api = new API(utils.loadSolcoverJS(env.config));
|
|
|
|
|
|
|
|
const networkConfig = {
|
|
|
|
url: `http://${api.host}:${api.port}`,
|
|
|
|
gas: api.gasLimit,
|
|
|
|
gasPrice: api.gasPrice
|
|
|
|
}
|
|
|
|
|
|
|
|
const provider = createProvider(api.defaultNetworkName, networkConfig);
|
|
|
|
|
|
|
|
env.config.networks[api.defaultNetworkName] = networkConfig;
|
|
|
|
env.config.defaultNetwork = api.defaultNetworkName;
|
|
|
|
|
|
|
|
env.network = {
|
|
|
|
name: api.defaultNetworkName,
|
|
|
|
config: networkConfig,
|
|
|
|
provider: provider,
|
|
|
|
}
|
|
|
|
|
|
|
|
env.ethereum = provider;
|
|
|
|
|
|
|
|
// Keep a reference so we can set the from account
|
|
|
|
network = env.network;
|
|
|
|
})
|
|
|
|
|
|
|
|
function myTimeout(){
|
|
|
|
return new Promise(resolve => {
|
|
|
|
setTimeout(()=>{
|
|
|
|
console.log('TIMEOUT')
|
|
|
|
}, 2000)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
task("timeout", 'desc').setAction(async function(taskArguments, { config }, runSuper){
|
|
|
|
await myTimeout();
|
|
|
|
});
|
|
|
|
|
|
|
|
task("coverage", "Generates a code coverage report for tests")
|
|
|
|
|
|
|
|
.addOptionalParam("file", ui.flags.file, null, types.string)
|
|
|
|
.addOptionalParam("solcoverjs", ui.flags.solcoverjs, null, types.string)
|
|
|
|
.addOptionalParam('temp', ui.flags.temp, null, types.string)
|
|
|
|
|
|
|
|
.setAction(async function(taskArguments, { run, config }, runSuper){
|
|
|
|
console.log(util.inspect())
|
|
|
|
try {
|
|
|
|
death(buidlerUtils.finish.bind(null, config, api)); // Catch interrupt signals
|
|
|
|
config.logger = {log: null};
|
|
|
|
config = buidlerUtils.normalizeConfig(config);
|
|
|
|
|
|
|
|
api = new API(utils.loadSolcoverJS(config));
|
|
|
|
|
|
|
|
// Server launch
|
|
|
|
const address = await api.ganache(ganache);
|
|
|
|
const web3 = new Web3(address);
|
|
|
|
const accounts = await web3.eth.getAccounts();
|
|
|
|
const nodeInfo = await web3.eth.getNodeInfo();
|
|
|
|
const ganacheVersion = nodeInfo.split('/')[1];
|
|
|
|
|
|
|
|
// Set default account
|
|
|
|
network.from = accounts[0];
|
|
|
|
|
|
|
|
// Version Info
|
|
|
|
ui.report('versions', [
|
|
|
|
ganacheVersion,
|
|
|
|
pkg.version
|
|
|
|
]);
|
|
|
|
|
|
|
|
// Network Info
|
|
|
|
ui.report('network', [
|
|
|
|
api.defaultNetworkName,
|
|
|
|
api.port
|
|
|
|
]);
|
|
|
|
|
|
|
|
// Run post-launch server hook;
|
|
|
|
await api.onServerReady(config);
|
|
|
|
|
|
|
|
// Instrument
|
|
|
|
const skipFiles = api.skipFiles || [];
|
|
|
|
|
|
|
|
let {
|
|
|
|
targets,
|
|
|
|
skipped
|
|
|
|
} = utils.assembleFiles(config, skipFiles);
|
|
|
|
|
|
|
|
targets = api.instrument(targets);
|
|
|
|
utils.reportSkipped(config, skipped);
|
|
|
|
|
|
|
|
// Filesystem & Compiler Re-configuration
|
|
|
|
const {
|
|
|
|
tempArtifactsDir,
|
|
|
|
tempContractsDir
|
|
|
|
} = utils.getTempLocations(config);
|
|
|
|
|
|
|
|
utils.save(targets, config.paths.sources, tempContractsDir);
|
|
|
|
utils.save(skipped, config.paths.sources, tempContractsDir);
|
|
|
|
|
|
|
|
config.paths.sources = tempContractsDir;
|
|
|
|
config.paths.artifacts = tempArtifactsDir;
|
|
|
|
config.paths.cache = buidlerUtils.tempCacheDir(config);
|
|
|
|
console.log(config.paths.cache)
|
|
|
|
|
|
|
|
config.solc.optimizer.enabled = false;
|
|
|
|
await run(TASK_COMPILE);
|
|
|
|
|
|
|
|
await api.onCompileComplete(config);
|
|
|
|
|
|
|
|
try {
|
|
|
|
failures = await run(TASK_TEST, {testFiles: []})
|
|
|
|
} catch (e) {
|
|
|
|
error = e.stack;
|
|
|
|
console.log(e.message + error)
|
|
|
|
}
|
|
|
|
await api.onTestsComplete(config);
|
|
|
|
|
|
|
|
// Run Istanbul
|
|
|
|
await api.report();
|
|
|
|
await api.onIstanbulComplete(config);
|
|
|
|
} catch(e) {
|
|
|
|
error = e;
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = plugin;
|
|
|
|
|