]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-15633 collect jest test data for Kibana
authorJeremy Davis <jeremy.davis@sonarsource.com>
Thu, 11 Nov 2021 10:20:48 +0000 (11:20 +0100)
committersonartech <sonartech@sonarsource.com>
Tue, 16 Nov 2021 20:03:55 +0000 (20:03 +0000)
server/sonar-web/config/jest/ElasticSearchReporter.js [new file with mode: 0644]
server/sonar-web/jest.config.js

diff --git a/server/sonar-web/config/jest/ElasticSearchReporter.js b/server/sonar-web/config/jest/ElasticSearchReporter.js
new file mode 100644 (file)
index 0000000..e0c8b57
--- /dev/null
@@ -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);
+    }
+  }
+};
index a83d3ab64e2ce93e113c2d7db61d0c4b5adfbc15..f5b819e37a25a6a9016e9007774dd7aacedda1eb 100644 (file)
@@ -39,6 +39,12 @@ module.exports = {
         classNameTemplate: '{classname}',
         titleTemplate: '{title}'
       }
+    ],
+    [
+      './config/jest/ElasticSearchReporter.js',
+      {
+        outputFilepath: '/tmp/ut-ts-web-monitoring.log'
+      }
     ]
   ]
 };