From 8871c8fed824a18fe93d9ad167275492426720fa Mon Sep 17 00:00:00 2001 From: Jeremy Davis Date: Thu, 11 Nov 2021 11:20:48 +0100 Subject: [PATCH] SONAR-15633 collect jest test data for Kibana --- .../config/jest/ElasticSearchReporter.js | 93 +++++++++++++++++++ server/sonar-web/jest.config.js | 6 ++ 2 files changed, 99 insertions(+) create mode 100644 server/sonar-web/config/jest/ElasticSearchReporter.js diff --git a/server/sonar-web/config/jest/ElasticSearchReporter.js b/server/sonar-web/config/jest/ElasticSearchReporter.js new file mode 100644 index 00000000000..e0c8b571642 --- /dev/null +++ b/server/sonar-web/config/jest/ElasticSearchReporter.js @@ -0,0 +1,93 @@ +/* + * SonarQube + * Copyright (C) 2009-2021 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* eslint-disable no-console */ + +const fse = require('fs-extra'); +const { tokenToString } = require('typescript'); + +const ES_ITEM_CATEGORY = 'Validate-UT-Typescript'; +const ES_ITEM_KIND = 'testcase'; +const ES_ITEM_OPERATION = 'total'; +const ES_ITEM_SUITE = 'Standalone'; + +module.exports = class ElasticSearchReporter { + constructor(globalConfig, options) { + this.rootDir = globalConfig.rootDir; + this.outputFilepath = options.outputFilepath; + } + + stripFilePath(path) { + return path.replace(this.rootDir, ''); + } + + writeToFile(data) { + try { + fse.writeJsonSync(this.outputFilepath, data); + } catch (e) { + console.error(e); + } + } + + collectTestData(testClassResults) { + const commit = process.env.GIT_SHA1; + const build = process.env.BUILD_NUMBER; + + const data = testClassResults.reduce((flattenedTestResults, testClassResult) => { + const formattedTestResults = this.formatTestResults(testClassResult, commit, build); + + return flattenedTestResults.concat(formattedTestResults); + }, []); + + this.writeToFile(data); + } + + formatTestResults(testClassResult, commit, build) { + const timestamp = new Date(testClassResult.perfStats.start).toISOString(); + const testClass = this.stripFilePath(testClassResult.testFilePath); + + return testClassResult.testResults.map(testResult => ({ + fields: { + commit, + build, + category: ES_ITEM_CATEGORY, + kind: ES_ITEM_KIND, + operation: ES_ITEM_OPERATION, + suite: ES_ITEM_SUITE, + measureClass: '', + measureMethod: '', + timestamp, + testClass, + testMethod: testResult.fullName, + duration: testResult.duration + } + })); + } + + onRunComplete(contexts, { testResults }) { + if (process.env.CIRRUS_BRANCH === 'branch-nightly-build') { + if (!this.outputFilepath) { + throw new Error('option `outputFilepath` is undefined'); + } + + this.collectTestData(testResults); + } + } +}; diff --git a/server/sonar-web/jest.config.js b/server/sonar-web/jest.config.js index a83d3ab64e2..f5b819e37a2 100644 --- a/server/sonar-web/jest.config.js +++ b/server/sonar-web/jest.config.js @@ -39,6 +39,12 @@ module.exports = { classNameTemplate: '{classname}', titleTemplate: '{title}' } + ], + [ + './config/jest/ElasticSearchReporter.js', + { + outputFilepath: '/tmp/ut-ts-web-monitoring.log' + } ] ] }; -- 2.39.5