UNPKG

testable-utils

Version:
188 lines (176 loc) 6.11 kB
const _ = require('lodash'); const pathModule = require('path'); function isWdioContext(browser) { return _.isObject(browser) && _.isFunction(browser.addCommand); } function registerLogCommands(browser, log) { if (isWdioContext(browser)) { browser.addCommand('testableLogTrace', function() { return log.trace.apply(log, arguments); }); browser.addCommand('testableLogDebug', function() { return log.debug.apply(log, arguments); }); browser.addCommand('testableLogInfo', function() { return log.info.apply(log, arguments); }); browser.addCommand('testableLogError', function() { return log.error.apply(log, arguments); }); browser.addCommand('testableLogFatal', function() { return log.fatal.apply(log, arguments); }); } } function registerCsvCommands(browser, csv) { if (isWdioContext(browser)) { browser.addCommand('testableCsvGet', function(name, index) { return csv.open(name).get(index); }); browser.addCommand('testableCsvRandom', function(name) { return csv.open(name).random(); }); browser.addCommand('testableCsvNext', function(name, options) { return csv.open(name).next(options); }); } } function doGetResult(results, options, start) { return results.get(options).then(function(value) { if (_.isNumber(value) && options.condition(value)) return Promise.resolve(value); else if (shouldContinuePolling(options, start)) { return delay(PollIntervalMs).then(function() { return doGetResult(results, options, start); }); } else { return Promise.reject(`Value ${value} for ${options.name} never matched condition specified`); } }, function(err) { if (shouldContinuePolling(options, start)) { return delay(PollIntervalMs).then(function() { return doGetResult(results, options, start); }); } else { return Promise.reject('Failed to get metric value that matches condition. Error: ' + err); } }); } function shouldContinuePolling(options, start) { return !_.isNumber(options.timeout) || options.timeout === 0 || (Date.now() + PollIntervalMs - start < options.timeout); } function waitForCondition(options, results, doNotWait) { if (doNotWait) return Promise.resolve(); else if (!_.isFunction(options.condition)) return Promise.reject('Must specify a condition function'); else { const start = Date.now(); return doGetResult(results, options, start).catch(function(err) { throw new Error(err); }); } } function registerResultsCommands(browser, results, doNotWait) { if (isWdioContext(browser)) { browser.addCommand('testableResult', function(resource, url) { return results(resource, url); }); browser.addCommand('testableTiming', function(result) { const args = Array.prototype.slice.call(arguments, 1); return result.timing.apply(result, args); }); browser.addCommand('testableCounter', function(result) { const args = Array.prototype.slice.call(arguments, 1); return result.counter.apply(result, args); }); browser.addCommand('testableHistogram', function(result) { const args = Array.prototype.slice.call(arguments, 1); return result.histogram.apply(result, args); }); browser.addCommand('testableMetered', function(result) { const args = Array.prototype.slice.call(arguments, 1); return result.metered.apply(result, args); }); browser.addCommand('testableGetMetric', function() { return results.get.apply(results, arguments); }); browser.addCommand('testableWaitForValue', function(options) { return results.waitForValue(options).catch(function(err) { throw new Error(err); }); }); browser.addCommand('testableWaitForCondition', function(options) { return results.waitForCondition(options).catch(function(err) { throw new Error(err); }); }); browser.addCommand('testableIncrementAndWaitForValue', function(name, value) { return results.incrementAndWaitForValue(name, value).catch(function(err) { throw new Error(err); }); }); browser.addCommand('testableBarrier', function(name, value) { return results.barrier(name, value).catch(function(err) { throw new Error(err); }); }); } } function registerInfoCommands(browser, info, isLocal) { if (isWdioContext(browser)) { browser.addCommand('testableInfo', function () { return info; }); browser.addCommand('testableScreenshot', async function(name) { const path = pathModule.join(process.env.OUTPUT_DIR || '.', name + '.png'); await browser.saveScreenshot(path); return path; }); } } function registerStopwatchCommands(browser, stopwatch) { if (isWdioContext(browser)) { browser.addCommand('testableStopwatch', function(code, metricName, resource) { return stopwatch(code, metricName, resource); }); } } function registerEventsCommands(browser, events, doNotWait, waitForFinish) { if (isWdioContext(browser)) { browser.addCommand('testableWaitForEvent', function(eventName, timeout, defaultVal) { if (doNotWait) return Promise.resolve(defaultVal); else { let resolved = false; return new Promise(function(resolve, reject) { let timeoutHandle; const listener = function(contents) { resolved = true; if (timeoutHandle) clearTimeout(timeoutHandle); resolve(contents); }; if (timeout && timeout > 0) { timeoutHandle = setTimeout(function() { if (!resolved) { events.off(eventName, listener); reject(`Timeout waiting for event ${eventName}`); } }, timeout); } events.once(eventName, listener); }); } }); browser.addCommand('testableWaitForFinish', function() { return waitForFinish(); }); } } module.exports.registerLogCommands = registerLogCommands; module.exports.registerCsvCommands = registerCsvCommands; module.exports.registerResultsCommands = registerResultsCommands; module.exports.registerInfoCommands = registerInfoCommands; module.exports.registerStopwatchCommands = registerStopwatchCommands; module.exports.registerEventsCommands = registerEventsCommands;