Merge branch 'hotfix/21.56.9' into master
[gitter.git] / test / make-benchmark.js
blob34ee4bec7c6cafa1cd1a636025b97de96667c8a0
1 /* eslint no-console: ["error", { allow: ["log", "warn", "error"] }] */
2 'use strict';
4 var Benchmark = require('benchmark');
5 var benchmarks = require('beautify-benchmark');
6 var metrics = require('datadog-metrics');
7 var os = require('os');
8 var path = require('path');
10 var benchmarkName = path.basename(module.parent.filename, '.js');
12 var submitToDatadog = process.env.DATADOG_API_KEY;
14 if (submitToDatadog) {
15 metrics.init({ prefix: 'build.benchmarks.' });
18 function submitDatadogMetrics(stats) {
19 var tags = ['benchmark_host:' + os.hostname()]; // Can't use host
20 if (process.env.GIT_BRANCH) tags.push('branch:' + process.env.GIT_BRANCH);
22 metrics.gauge(benchmarkName + '.' + stats.name, stats.mean, tags);
23 metrics.flush();
26 function targetStats(target) {
27 return {
28 name: target.name,
29 hz: target.hz,
30 size: target.stats.sample.length,
31 mean: target.stats.mean
35 process.on('uncaughtException', function(err) {
36 console.error(err);
37 console.error(err.stack);
38 process.exit(1);
39 });
41 module.exports = function makeBenchmark(options) {
42 var suite = new Benchmark.Suite();
44 Object.keys(options.tests).forEach(function(name) {
45 var fn = options.tests[name];
47 if (fn.length === 0) {
48 suite.add(name, {
49 maxTime: options.maxTime || 2,
50 initCount: options.initCount || 1,
51 fn: fn
52 });
53 } else {
54 suite.add(name, {
55 maxTime: options.maxTime || 2,
56 initCount: options.initCount || 1,
57 defer: true,
58 fn: function(deferred) {
59 fn(function(err) {
60 if (err) throw err;
61 deferred.resolve();
62 });
64 });
66 });
68 suite.on('cycle', function(event) {
69 var target = event.target;
70 if (submitToDatadog) {
71 submitDatadogMetrics(targetStats(target));
74 benchmarks.add(target);
75 });
77 suite.on('complete', function() {
78 function doAfter(callback) {
79 if (!options.after) return callback();
81 if (options.after.length === 0) {
82 try {
83 options.after();
84 } catch (err) {
85 callback(err);
87 return;
90 options.after(callback);
93 doAfter(function() {
94 benchmarks.log();
96 if (submitToDatadog) {
97 // Give datadog a second to flush
98 setTimeout(function() {
99 process.exit();
100 }, 2000);
101 return;
103 process.exit();
107 var before = options.before;
109 if (!before) {
110 suite.run({ async: true });
111 return;
114 if (before.length === 0) {
115 before();
116 suite.run({ async: true });
117 return;
120 before(function(err) {
121 if (err) throw err;
122 suite.run({ async: true });