blob: ae8c0b2e027ac203c51259287088e41bc41edb95 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
const path = require('path');
const fse = require('fs-extra');
const fs = require('fs');
const glob = require('glob');
const {testNameFromFile} = require('./util');
const util = require('util');
const {blacklist, SVGBlacklist} = require('./blacklist');
let _tests = [];
let _testsMap = {};
class Test {
constructor(fileUrl) {
this.fileUrl = fileUrl;
this.name = testNameFromFile(fileUrl);
// If this test case ignore svg testing.
this.ignoreSVG = false;
this.status = 'unsettled';
// Run results
this.results = []; // Screenshots
this.actualLogs = [];
this.expectedLogs = [];
this.actualErrors = [];
this.expectedErrors = [];
// Use echarts versions.
this.actualVersion = null;
this.expectedVersion = null;
// Last timestamp
this.lastRun = 0;
// Use SVG
this.useSVG = false;
}
}
function getCacheFilePath() {
return path.join(__dirname, 'tmp/__cache__.json');;
}
module.exports.getTestsList = function () {
return _tests;
};
module.exports.getTestByFileUrl = function (url) {
return _testsMap[url];
};
module.exports.updateTestsList = async function (setPendingTestToUnsettled) {
let tmpFolder = path.join(__dirname, 'tmp');
fse.ensureDirSync(tmpFolder);
_tests = [];
_testsMap = {};
try {
let cachedStr = fs.readFileSync(getCacheFilePath(), 'utf-8');
_tests = JSON.parse(cachedStr);
_tests.forEach(test => {
// In somehow tests are stopped and leave the status pending.
// Set the status to unsettled again.
if (setPendingTestToUnsettled) {
if (test.status === 'pending') {
test.status = 'unsettled';
}
}
_testsMap[test.fileUrl] = test;
});
}
catch(e) {
_tests = [];
}
// Find if there is new html file
let files = await util.promisify(glob)('**.html', { cwd: path.resolve(__dirname, '../') });
files.forEach(fileUrl => {
if (blacklist.includes(fileUrl)) {
return;
}
if (_testsMap[fileUrl]) {
return;
}
let test = new Test(fileUrl);
test.ignoreSVG = SVGBlacklist.includes(fileUrl);
_tests.push(test);
_testsMap[fileUrl] = test;
});
let actionsMetaData = {};
let metaPath = path.join(__dirname, 'actions/__meta__.json');
try {
actionsMetaData = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
}
catch(e) {}
_tests.forEach(testOpt => {
testOpt.actions = actionsMetaData[testOpt.name] || 0;
});
return _tests;
};
module.exports.saveTestsList = function () {
fse.outputFileSync(getCacheFilePath(), JSON.stringify(_tests, null, 2), 'utf-8');
};
module.exports.mergeTestsResults = function (testsResults) {
testsResults.forEach(testResult => {
if (_testsMap[testResult.fileUrl]) {
Object.assign(_testsMap[testResult.fileUrl], testResult);
}
});
};
module.exports.updateActionsMeta = function (testName, actions) {
let metaData;
let metaPath = path.join(__dirname, 'actions/__meta__.json');
try {
metaData = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
}
catch(e) {
metaData = {};
}
metaData[testName] = actions.length;
fs.writeFileSync(metaPath, JSON.stringify(
metaData, Object.keys(metaData).sort((a, b) => a.localeCompare(b)), 2
), 'utf-8');
};