Skip to content

Commit

Permalink
Improve error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
larskissel committed Dec 6, 2021
1 parent 109448f commit 603a4fa
Show file tree
Hide file tree
Showing 3 changed files with 205 additions and 65 deletions.
2 changes: 0 additions & 2 deletions lib/client/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ function getTestPageName(qunitHtmlFile) {
result = qunitHtmlFile;
}

result = result.replace(/[:*?"<>|]/g, "");
result = result.replace(/[\\/]/g, ".");
result = result.replace(/\.qunit\.html/g, "");
result = result.replace(/\.qunit\./g, "--");
result = result.replace(/\.qunit--/g, "--");
Expand Down
64 changes: 45 additions & 19 deletions lib/fileExportReporter.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@ const mkdirp = require("mkdirp");

const defaultPath = "./karma-ui5-reports";

async function getUniqueFileName(fileName) {
async function fileExists(path) {
function escapeFileName(fileName) {
fileName = fileName.replace(/[:*?"<>|]/g, "");
fileName = fileName.replace(/[\\/]/g, ".");
return fileName;
}

async function getUniqueFileName(exportDir, fileName) {
async function fileExists(_fileName) {
try {
await fs.access(path);
await fs.access(path.join(exportDir, _fileName));
return true;
} catch (err) {
if (err.code === "ENOENT") {
Expand All @@ -18,7 +24,7 @@ async function getUniqueFileName(fileName) {
}

const fileExtension = path.extname(fileName);
const fileNameWithoutExtension = fileName.slice(0, fileName.lastIndexOf(fileExtension));
const fileNameWithoutExtension = path.basename(fileName, fileExtension);
for (let index = 1; await fileExists(fileName); index++) {
fileName = `${fileNameWithoutExtension}_${index}${fileExtension}`;
}
Expand All @@ -28,6 +34,7 @@ async function getUniqueFileName(fileName) {

const FileExportReporter = function(baseReporterDecorator, config, logger) {
let reporterInProcess = true;
let exitCode = 0;
let reporterCompleted = function() {};
const log = logger.create("reporter.ui5--fileExport");
const reporterConfig = config.ui5.fileExport;
Expand All @@ -44,15 +51,20 @@ const FileExportReporter = function(baseReporterDecorator, config, logger) {

baseReporterDecorator(this);

async function writeSingleFile(outputFile, content) {
log.info(`Writing file: ${outputFile}`);
await mkdirp(path.dirname(outputFile));
outputFile = await getUniqueFileName(outputFile);
async function writeSingleFile(fileDir, fileName, content) {
await mkdirp(fileDir);
const uniqueFileName = await getUniqueFileName(fileDir, fileName);
const pathToWrite = path.join(fileDir, uniqueFileName);
if (!pathToWrite.startsWith(fileDir)) {
log.warn(`Invalid export file path: ${pathToWrite}\n\tMake sure the file path is in directory: ${fileDir}`);
return;
}
log.debug(`Writing file: ${pathToWrite}`);
try {
await fs.writeFile(outputFile, content);
log.info(`Saved file '${outputFile}'`);
await fs.writeFile(pathToWrite, content);
log.info(`Saved file '${pathToWrite}'`);
} catch (err) {
log.warn("Failed to write file\n\t" + err.message);
log.warn("Failed to write file " + pathToWrite + "\n\t" + err.message);
}
}

Expand All @@ -68,23 +80,37 @@ const FileExportReporter = function(baseReporterDecorator, config, logger) {
return;
}

for (const file of result.exportFiles) {
const pathSegments = [outputDir, path.basename(file.name)];
if (multiBrowsers) {
pathSegments.splice(1, 0, path.basename(browser.name));
}
if (!Array.isArray(result.exportFiles)) {
log.warn("Export files must be given as an array");
return;
}

let exportPath = outputDir;
if (multiBrowsers) {
exportPath = path.join(exportPath, escapeFileName(browser.name));
}
try {
for (const file of result.exportFiles) {
if (typeof file.name !== "string" || typeof file.content !== "string") {
log.warn("Invalid file object. \"name\" and \"content\" must be strings");
continue;
}

await writeSingleFile(path.join.apply(null, pathSegments), file.content);
await writeSingleFile(exportPath, escapeFileName(file.name), file.content);
}
} catch (err) {
log.warn("An unexpected error occured while exporting files\n\t" + err.message);
exitCode = 1;
}
reporterInProcess = false;
reporterCompleted();
};

this.onExit = function(done) {
if (reporterInProcess) {
reporterCompleted = done;
reporterCompleted = () => done(exitCode);
} else {
done();
done(exitCode);
}
};
};
Expand Down
Loading

0 comments on commit 603a4fa

Please sign in to comment.