fune/tools/code-coverage/PerTestCoverageUtils.jsm
Cristian Tuns 4d37cf70f1 Backed out 19 changesets (bug 1541508) for causing xpcshell failures on test_notHeadlessByDefault.js CLOSED TREE
Backed out changeset 08476fa2bc27 (bug 1541508)
Backed out changeset 0bf7514845db (bug 1541508)
Backed out changeset aa612a5e9ef7 (bug 1541508)
Backed out changeset 6bb9360473f7 (bug 1541508)
Backed out changeset b3d8e92f50c2 (bug 1541508)
Backed out changeset fa40dded133e (bug 1541508)
Backed out changeset 2e7db4aa8d4f (bug 1541508)
Backed out changeset 6098e2eb62ea (bug 1541508)
Backed out changeset 2c599ee639c4 (bug 1541508)
Backed out changeset 7d44f6e2644c (bug 1541508)
Backed out changeset c1279c3d674c (bug 1541508)
Backed out changeset 8bd08a62a590 (bug 1541508)
Backed out changeset 740010cb005c (bug 1541508)
Backed out changeset 0bfc7dd85c62 (bug 1541508)
Backed out changeset c4374a351356 (bug 1541508)
Backed out changeset 44ccfeca7364 (bug 1541508)
Backed out changeset e944e706a523 (bug 1541508)
Backed out changeset 2c59d66f43e4 (bug 1541508)
Backed out changeset a1896eacb6f1 (bug 1541508)
2022-11-01 22:38:52 -04:00

129 lines
3.9 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* exported PerTestCoverageUtils */
"use strict";
var EXPORTED_SYMBOLS = ["PerTestCoverageUtils"];
const env = Cc["@mozilla.org/process/environment;1"].getService(
Ci.nsIEnvironment
);
// This is the directory where gcov is emitting the gcda files.
const gcovPrefixPath = env.get("GCOV_PREFIX");
// This is the directory where codecoverage.py is expecting to see the gcda files.
const gcovResultsPath = env.get("GCOV_RESULTS_DIR");
// This is the directory where the JS engine is emitting the lcov files.
const jsvmPrefixPath = env.get("JS_CODE_COVERAGE_OUTPUT_DIR");
// This is the directory where codecoverage.py is expecting to see the lcov files.
const jsvmResultsPath = env.get("JSVM_RESULTS_DIR");
const gcovPrefixDir = Cc["@mozilla.org/file/local;1"].createInstance(
Ci.nsIFile
);
if (gcovPrefixPath) {
gcovPrefixDir.initWithPath(gcovPrefixPath);
}
let gcovResultsDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
if (gcovResultsPath) {
gcovResultsDir.initWithPath(gcovResultsPath);
}
const jsvmPrefixDir = Cc["@mozilla.org/file/local;1"].createInstance(
Ci.nsIFile
);
if (jsvmPrefixPath) {
jsvmPrefixDir.initWithPath(jsvmPrefixPath);
}
let jsvmResultsDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
if (jsvmResultsPath) {
jsvmResultsDir.initWithPath(jsvmResultsPath);
}
function awaitPromise(promise) {
let ret;
let complete = false;
let error = null;
promise
.catch(e => (error = e))
.then(v => {
ret = v;
complete = true;
});
Services.tm.spinEventLoopUntil(
"PerTestCoverageUtils.jsm:awaitPromise",
() => complete
);
if (error) {
throw new Error(error);
}
return ret;
}
function removeDirectoryContents(dir) {
let entries = dir.directoryEntries;
while (entries.hasMoreElements()) {
entries.nextFile.remove(true);
}
}
function moveDirectoryContents(src, dst) {
let entries = src.directoryEntries;
while (entries.hasMoreElements()) {
entries.nextFile.moveTo(dst, null);
}
}
var PerTestCoverageUtils = class PerTestCoverageUtilsClass {
// Resets the counters to 0.
static async beforeTest() {
if (!PerTestCoverageUtils.enabled) {
return;
}
// Flush the counters.
let codeCoverageService = Cc[
"@mozilla.org/tools/code-coverage;1"
].getService(Ci.nsICodeCoverage);
await codeCoverageService.flushCounters();
// Remove coverage files created by the flush, and those that might have been created between the end of a previous test and the beginning of the next one (e.g. some tests can create a new content process for every sub-test).
removeDirectoryContents(gcovPrefixDir);
removeDirectoryContents(jsvmPrefixDir);
// Move coverage files from the GCOV_RESULTS_DIR and JSVM_RESULTS_DIR directories, so we can accumulate the counters.
moveDirectoryContents(gcovResultsDir, gcovPrefixDir);
moveDirectoryContents(jsvmResultsDir, jsvmPrefixDir);
}
static beforeTestSync() {
awaitPromise(this.beforeTest());
}
// Dumps counters and moves the gcda files in the directory expected by codecoverage.py.
static async afterTest() {
if (!PerTestCoverageUtils.enabled) {
return;
}
// Flush the counters.
let codeCoverageService = Cc[
"@mozilla.org/tools/code-coverage;1"
].getService(Ci.nsICodeCoverage);
await codeCoverageService.flushCounters();
// Move the coverage files in GCOV_RESULTS_DIR and JSVM_RESULTS_DIR, so that the execution from now to shutdown (or next test) is not counted.
moveDirectoryContents(gcovPrefixDir, gcovResultsDir);
moveDirectoryContents(jsvmPrefixDir, jsvmResultsDir);
}
static afterTestSync() {
awaitPromise(this.afterTest());
}
};
PerTestCoverageUtils.enabled = !!gcovResultsPath;