| /* |
| * 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'); |
| }; |