coverage for browser tests
This commit is contained in:
parent
f5a1a26368
commit
095b19aeb4
2
testlib/selenium/.gitignore
vendored
Normal file
2
testlib/selenium/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
coverage/
|
||||||
|
coveage-*.json
|
4947
testlib/selenium/escodegen.browser.js
Normal file
4947
testlib/selenium/escodegen.browser.js
Normal file
File diff suppressed because one or more lines are too long
6605
testlib/selenium/esprima.js
Normal file
6605
testlib/selenium/esprima.js
Normal file
File diff suppressed because one or more lines are too long
1097
testlib/selenium/instrumenter.js
Normal file
1097
testlib/selenium/instrumenter.js
Normal file
File diff suppressed because it is too large
Load Diff
@ -35,12 +35,23 @@ var httpPort = 8080;
|
|||||||
|
|
||||||
var p = `http://localhost:${httpPort}/testlib/selenium/testhost.html`;
|
var p = `http://localhost:${httpPort}/testlib/selenium/testhost.html`;
|
||||||
|
|
||||||
var argv = require('minimist')(process.argv.slice(2), {"boolean": ["keep-open"]});
|
var argv = require('minimist')(process.argv.slice(2), {"boolean": ["keep-open", "coverage"]});
|
||||||
|
|
||||||
function printUsage() {
|
function printUsage() {
|
||||||
console.log(`Usage: [--keep-open] TESTSCRIPT`);
|
console.log(`Usage: [--keep-open] TESTSCRIPT`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function randId(n) {
|
||||||
|
let s = "";
|
||||||
|
var choices = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
|
||||||
|
for (let i = 0; i < n; i++) {
|
||||||
|
s += choices.charAt(Math.floor(Math.random() * choices.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
if (argv._.length != 1) {
|
if (argv._.length != 1) {
|
||||||
console.log("exactly one test script must be given");
|
console.log("exactly one test script must be given");
|
||||||
printUsage();
|
printUsage();
|
||||||
@ -48,6 +59,7 @@ if (argv._.length != 1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var testScriptName = path.resolve(argv._[0]);
|
var testScriptName = path.resolve(argv._[0]);
|
||||||
|
var testName = path.basename(testScriptName, ".js");
|
||||||
var projectRoot = path.resolve(__dirname, "../../") + "/";
|
var projectRoot = path.resolve(__dirname, "../../") + "/";
|
||||||
if (!testScriptName.startsWith(projectRoot)) {
|
if (!testScriptName.startsWith(projectRoot)) {
|
||||||
console.log("test file must be inside wallet project root");
|
console.log("test file must be inside wallet project root");
|
||||||
@ -119,6 +131,9 @@ var driver = new webdriver.Builder()
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
driver.get(p);
|
driver.get(p);
|
||||||
|
if (argv["coverage"]) {
|
||||||
|
driver.executeScript("window.requestCoverage = true;");
|
||||||
|
}
|
||||||
driver.executeScript(script);
|
driver.executeScript(script);
|
||||||
driver.wait(untilTestOver);
|
driver.wait(untilTestOver);
|
||||||
|
|
||||||
@ -136,9 +151,23 @@ driver.manage().logs().get("browser").then((logs) => {
|
|||||||
console.log(l.message.substring(s2));
|
console.log(l.message.substring(s2));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!argv["keep-open"]) {
|
let coverage = driver.executeScript("return JSON.stringify(window.__coverage__);");
|
||||||
driver.quit();
|
coverage.then((covStr) => {
|
||||||
l.close();
|
let cov = JSON.parse(covStr);
|
||||||
}
|
if (cov) {
|
||||||
|
let covTranslated = {};
|
||||||
|
for (let f in cov) {
|
||||||
|
let p = path.resolve(projectRoot, f);
|
||||||
|
let c = covTranslated[p] = cov[f];
|
||||||
|
c.path = p;
|
||||||
|
}
|
||||||
|
fs.writeFileSync(`coverage-${testName}-${randId(5)}.json`, JSON.stringify(covTranslated));
|
||||||
|
}
|
||||||
|
if (!argv["keep-open"]) {
|
||||||
|
driver.quit();
|
||||||
|
l.close();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
6
testlib/selenium/system.js
Normal file
6
testlib/selenium/system.js
Normal file
File diff suppressed because one or more lines are too long
@ -2,8 +2,37 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Browser Test Host</title>
|
<title>Browser Test Host</title>
|
||||||
<script src="/lib/vendor/system-csp-production.src.js"></script>
|
|
||||||
|
<script src="/testlib/selenium/esprima.js"></script>
|
||||||
|
<script src="/testlib/selenium/escodegen.browser.js"></script>
|
||||||
|
<script src="/testlib/selenium/instrumenter.js"></script>
|
||||||
|
|
||||||
|
<!-- for instrumentation to work, we have to use the non-csp version -->
|
||||||
|
<script src="/testlib/selenium/system.js"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
|
var requestCoverage = false;
|
||||||
|
|
||||||
|
let parser = document.createElement('a');
|
||||||
|
|
||||||
|
let oldTranslate = System.translate.bind(System);
|
||||||
|
System.translate = (load) => {
|
||||||
|
if (!requestCoverage) {
|
||||||
|
return oldTranslate(load);
|
||||||
|
}
|
||||||
|
let inst = new Instrumenter();
|
||||||
|
let srcP = oldTranslate(load);
|
||||||
|
|
||||||
|
console.dir(load);
|
||||||
|
|
||||||
|
return Promise.resolve(srcP).then((src) => {
|
||||||
|
parser.href = load.name;
|
||||||
|
let modName = parser.pathname.substring(1);
|
||||||
|
return inst.instrumentSync(src, modName);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
System.config({
|
System.config({
|
||||||
baseURL: "/",
|
baseURL: "/",
|
||||||
defaultJSExtensions: true,
|
defaultJSExtensions: true,
|
||||||
|
Loading…
Reference in New Issue
Block a user