/* This file contains utilities for generating a mock truffle project to test solcover's run script against. */ const assert = require('assert'); const fs = require('fs'); const shell = require('shelljs'); /** * Moves existing coverage reports into a safe place while testing run script which * would overwrite them. Silences shell complaints about non-existent files. */ module.exports.protectCoverage = function () { shell.config.silent = true; shell.rm('-Rf', './safe'); shell.mkdir('./safe'); shell.mv('./coverage', './safe/coverage'); shell.mv('./coverage.json', './safe/coverage.json'); shell.config.silent = false; }; /** * Restores pre-existing coverage reports after testing run script. * Silences shell complaints about non-existent files. */ module.exports.restoreCoverage = function () { shell.config.silent = true; shell.mv('./safe/coverage', './coverage'); shell.mv('./safe/coverage.json', './coverage.json'); shell.rm('-Rf', './safe'); shell.config.silent = false; }; /** * Installs mock truffle project at ./mock with a single contract * and test specified by the params. * @param {String} contract located in /test/sources/run/ * @param {[type]} test located in /test/run/ */ module.exports.install = function (contract, test, config) { shell.mkdir('./mock'); shell.mkdir('./mock/contracts'); shell.mkdir('./mock/migrations'); shell.mkdir('./mock/test'); // Mock contracts if (Array.isArray(contract)){ contract.forEach(item => { shell.cp(`./test/sources/run/${item}`, `./mock/contracts/${item}`); }) } else { shell.cp(`./test/sources/run/${contract}`, `./mock/contracts/${contract}`); } shell.cp('./test/sources/run/Migrations.sol', './mock/contracts/Migrations.sol'); // Mock migrations const initialMigration = ` let Migrations = artifacts.require('Migrations.sol'); module.exports = function(deployer) { deployer.deploy(Migrations); };`; const contractLocation = './' + contract; const deployContracts = ` var contract = artifacts.require('${contractLocation}'); module.exports = function(deployer) { deployer.deploy(contract); };`; fs.writeFileSync('./mock/migrations/1_initial_migration.js', initialMigration); fs.writeFileSync('./mock/migrations/2_deploy_contracts.js', deployContracts); // Mock test shell.cp(`./test/run/${test}`, `./mock/test/${test}`); // Mock truffle.js const trufflejs = `module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" }}};` ; const configjs = `module.exports = ${JSON.stringify(config)}`; fs.writeFileSync('./mock/truffle.js', trufflejs); fs.writeFileSync('./.solcover.js', configjs); }; /** * Installs mock truffle project at ./mock with a single contract * and test specified by the params. * @param {String} contract located in /test/sources/run/ * @param {[type]} test located in /test/run/ */ module.exports.installInheritanceTest = function (config) { shell.mkdir('./mock'); shell.mkdir('./mock/contracts'); shell.mkdir('./mock/migrations'); shell.mkdir('./mock/test'); // Mock contracts shell.cp(`./test/sources/run/Proxy.sol`, `./mock/contracts/Proxy.sol`); shell.cp(`./test/sources/run/Owned.sol`, `./mock/contracts/Owned.sol`); shell.cp('./test/sources/run/Migrations.sol', './mock/contracts/Migrations.sol'); // Mock migrations const initialMigration = ` let Migrations = artifacts.require('Migrations.sol'); module.exports = function(deployer) { deployer.deploy(Migrations); };`; const deployContracts = ` var Owned = artifacts.require('./Owned.sol'); var Proxy = artifacts.require('./Proxy.sol'); module.exports = function(deployer) { deployer.deploy(Owned); deployer.link(Owned, Proxy); deployer.deploy(Proxy); };`; fs.writeFileSync('./mock/migrations/1_initial_migration.js', initialMigration); fs.writeFileSync('./mock/migrations/2_deploy_contracts.js', deployContracts); // Mock test shell.cp(`./test/run/inheritance.js`, `./mock/test/inheritance.js`); // Mock truffle.js const trufflejs = `module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" }}};` ; const configjs = `module.exports = ${JSON.stringify(config)}`; fs.writeFileSync('./mock/truffle.js', trufflejs); fs.writeFileSync('./.solcover.js', configjs); }; /** * Removes mock truffle project and coverage reports generated by runCovered tests */ module.exports.remove = function () { shell.config.silent = true; shell.rm('./.solcover.js'); shell.rm('-Rf', 'mock'); shell.rm('-Rf', 'coverage'); shell.rm('coverage.json'); shell.config.silent = false; };