UNPKG

kui-shell

Version:

This is the monorepo for Kui, the hybrid command-line/GUI electron-based Kubernetes tool

292 lines 12.6 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = require("path"); const colors = require("colors"); const mocha_1 = require("mocha"); const CLI = require("./cli"); const Selectors = require("./selectors"); colors.enable(); const codeCoverageNyc = () => process.env.TRAVIS_BUILD_DIR ? path_1.join(process.env.TRAVIS_BUILD_DIR, 'node_modules/nyc') : path_1.join(process.env.TEST_SUITE_ROOT, '../nyc'); const codeCoverageRoot = () => path_1.relative(process.env.TEST_ROOT, path_1.join(process.env.TEST_SUITE_ROOT, 'core')); const codeCoverageTempDirectory = () => process.env.TRAVIS_BUILD_DIR ? path_1.join(process.env.TRAVIS_BUILD_DIR, 'packages/test/.nyc_output') : path_1.join(process.env.TEST_ROOT, '.nyc_output'); function codeCoverageDesired() { return process.env.NYC !== undefined && (!process.env.TRAVIS_JOB_ID || process.env.MOCHA_RUN_TARGET === 'electron'); } function writeCodeCoverage(app) { return __awaiter(this, void 0, void 0, function* () { if (codeCoverageDesired() && app && app.client) { console.log('Writing code coverage data'); yield app.client.executeAsync((tempDirectory, nycModule, root, done) => { process.chdir('/tmp'); const NYC = require(nycModule); const nyc = new NYC({ tempDirectory, cwd: root }); nyc.createTempDirectory(); Object.keys(__coverage__).forEach(function (absFile) { const map = JSON.parse(require('fs').readFileSync(`${absFile}.map`)); nyc.sourceMaps._sourceMapCache.registerMap(absFile, map); }, nyc); const coverage = nyc.sourceMaps.remapCoverage(__coverage__); const coverageFilename = require('path').resolve(tempDirectory, nyc.processInfo.uuid + '.json'); require('fs').writeFileSync(coverageFilename, JSON.stringify(coverage), 'utf-8'); setTimeout(done, 0); }, codeCoverageTempDirectory(), codeCoverageNyc(), codeCoverageRoot()); } }); } let app; mocha_1.after(() => __awaiter(void 0, void 0, void 0, function* () { if (app && app.isRunning()) { yield app.stop(); } })); const prepareElectron = (popup) => { const Application = require('spectron').Application; const electron = require('electron'); const appMain = process.env.APP_MAIN || '../../node_modules/@kui-shell/core/main/main.js'; const opts = { env: {}, chromeDriverArgs: ['--no-sandbox'], startTimeout: parseInt(process.env.TIMEOUT) || 60000, waitTimeout: parseInt(process.env.TIMEOUT) || 60000 }; if (process.env.PORT_OFFSET) { opts['port'] = 9515 + parseInt(process.env.PORT_OFFSET, 10); const userDataDir = `/tmp/kui-profile-${process.env.PORT_OFFSET}`; opts.chromeDriverArgs.push(`--user-data-dir=${userDataDir}`); console.log(`Using chromedriver port ${opts['port']}`); console.log(`Using chromedriver user-data-dir ${userDataDir}`); } if (process.env.MOCHA_RUN_TARGET === 'webpack') { console.log(`Testing Webpack against chromium`); opts['path'] = electron; opts['args'] = [path_1.join(process.env.TEST_SUITE_ROOT, 'core/tests/lib/main.js')]; } else if (process.env.TEST_FROM_BUILD) { console.log(`Using build-based assets: ${process.env.TEST_FROM_BUILD}`); opts['path'] = process.env.TEST_FROM_BUILD; } else { console.log('Using filesystem-based assets'); opts['path'] = electron; opts['args'] = [appMain]; } if (process.env.CHROMEDRIVER_PORT) { opts['port'] = parseInt(process.env.CHROMEDRIVER_PORT); } if (process.env.WSKNG_NODE_DEBUG) { opts.env['NODE_DEBUG'] = process.env.WSKNG_NODE_DEBUG; } if (process.env.DEBUG) { opts.env['DEBUG'] = process.env.DEBUG; } if (popup) { opts.env['KUI_POPUP'] = JSON.stringify(popup); } return new Application(opts); }; exports.refresh = (ctx, wait = true, clean = false) => __awaiter(void 0, void 0, void 0, function* () { yield ctx.app.client.refresh(); if (clean) { yield ctx.app.client.localStorage('DELETE'); } if (wait) { yield CLI.waitForSession(ctx); yield CLI.waitForRepl(ctx.app); } }); exports.before = (ctx, options) => { const noApp = (options && options.noApp) || false; const popup = options && options.popup; const beforeStart = options && options.beforeStart; const afterStart = options && options.afterStart; const noProxySessionWait = options && options.noProxySessionWait; if (process.env.TRAVIS_JOB_ID) { ctx.retries(1); } return function () { return __awaiter(this, void 0, void 0, function* () { ctx['_kuiDestroyAfter'] = false; if (!noApp) { if (app && !popup) { if (!beforeStart && !afterStart) { ctx.app = app; try { yield exports.refresh(ctx, !noProxySessionWait, true); return; } catch (err) { console.error('error refreshing in before for reuse start', err); throw err; } } } ctx.app = prepareElectron(popup); if (popup) { ctx['_kuiDestroyAfter'] = true; } else { app = ctx.app; } } try { if (beforeStart) { yield beforeStart(); } const start = noApp ? () => Promise.resolve() : () => { return (ctx.app .start() .then(() => CLI.waitForSession(ctx, noProxySessionWait)) .then(() => ctx.app.client.localStorage('DELETE')) .then(() => !noProxySessionWait && CLI.waitForRepl(ctx.app))); }; ctx.timeout(process.env.TIMEOUT || 60000); yield start(); if (afterStart) { yield afterStart(); } } catch (err) { console.error('error refreshing in before for fresh start', err); throw err; } }); }; }; exports.after = (ctx, f) => () => __awaiter(void 0, void 0, void 0, function* () { if (f) yield f(); yield writeCodeCoverage(ctx.app); const anyFailed = ctx.tests && ctx.tests.some(test => test.state === 'failed'); if (anyFailed && ctx.app && ctx.app.client) { ctx.app.client.getRenderProcessLogs().then(logs => logs .filter(log => !/SFMono/.test(log.message)) .filter(log => !/fonts.gstatic/.test(log.message)) .forEach(log => { if (log.level === 'SEVERE' && log.message.indexOf('The requested resource was not found') < 0 && log.message.indexOf('Error compiling app source') < 0 && log.message.indexOf('ReferenceError') < 0 && log.message.indexOf('SyntaxError') < 0 && log.message.indexOf('ENOENT') < 0 && log.message.indexOf('UsageError') < 0 && log.message.indexOf('Usage:') < 0 && log.message.indexOf('Unexpected option') < 0) { const logMessage = log.message.substring(log.message.indexOf('%c') + 2).replace(/%c|%s|"/g, ''); console.log(`${log.level}`.red.bold, logMessage); } })); } if (ctx.app && ctx.app.isRunning() && ctx['_kuiDestroyAfter']) { return ctx.app.stop(); } }); exports.oops = (ctx, wait = false) => (err) => __awaiter(void 0, void 0, void 0, function* () { try { if (process.env.MOCHA_RUN_TARGET) { console.log(`Error: mochaTarget=${process.env.MOCHA_RUN_TARGET} testTitle=${ctx.title}`); } console.log(err); const promises = []; if (ctx.app) { try { promises.push(yield ctx.app.client.getHTML(Selectors.OUTPUT_LAST).then(html => { console.log('here is the output of the prior output:'); console.log(html.replace(/<style>.*<\/style>/, '')); })); promises.push(yield ctx.app.client.getHTML(Selectors.PROMPT_BLOCK_FINAL).then(html => { console.log('here is the content of the last block:'); console.log(html.replace(/<style>.*<\/style>/, '')); })); } catch (err) { console.error('error trying to get the output of the last block', err); } promises.push(ctx.app.client.getMainProcessLogs().then(logs => logs.forEach(log => { if (log.indexOf('INFO:CONSOLE') < 0) { console.log('MAIN'.cyan.bold, log); } }))); promises.push(ctx.app.client.getRenderProcessLogs().then(logs => logs .filter(log => !/SFMono/.test(log.message)) .filter(log => !/fonts.gstatic/.test(log.message)) .forEach(log => { if (log.message.indexOf('%c') === -1) { console.log('RENDER'.yellow.bold, log.message.red); } else { const logMessage = log.message.substring(log.message.indexOf('%c') + 2).replace(/%c|%s|"/g, ''); console.log('RENDER'.yellow.bold, logMessage); } }))); promises.push(yield ctx.app.client .getText(Selectors.OOPS) .then(anyErrors => { if (anyErrors) { console.log('Error from the UI'.magenta.bold, anyErrors); } }) .catch(() => { })); } if (wait) { yield Promise.all(promises); } } catch (err2) { console.error('error in common.oops', err2); } throw err; }); exports.restart = (ctx) => __awaiter(void 0, void 0, void 0, function* () { yield ctx.app.restart(); return CLI.waitForSession(ctx); }); exports.localIt = (msg, func) => { if (process.env.MOCHA_RUN_TARGET !== 'webpack') return it(msg, func); }; exports.localDescribe = (msg, suite) => { if (process.env.MOCHA_RUN_TARGET !== 'webpack') return describe(msg, suite); }; exports.dockerDescribe = (msg, suite) => { if (process.env.MOCHA_RUN_TARGET !== 'webpack' && (!process.env.TRAVIS_JOB_ID || process.platform === 'linux')) { return describe(msg, suite); } }; exports.remoteIt = (msg, func) => { if (process.env.MOCHA_RUN_TARGET === 'webpack') return it(msg, func); }; exports.pDescribe = (msg, suite) => { if (process.env.MOCHA_RUN_TARGET !== 'webpack' || process.env.KUI_USE_PROXY === 'true') return describe(msg, suite); }; exports.proxyIt = (msg, func) => { if (process.env.MOCHA_RUN_TARGET === 'webpack' && process.env.KUI_USE_PROXY === 'true') return it(msg, func); }; exports.pit = (msg, func) => { if (process.env.MOCHA_RUN_TARGET !== 'webpack' || process.env.KUI_USE_PROXY === 'true') return it(msg, func); }; exports.expectedVersion = process.env.TRAVIS_JOB_ID && (process.env.MOCHA_RUN_TARGET === 'electron' || process.env.MOCHA_RUN_TARGET === 'webpack') ? '0.0.1' : require('@kui-shell/settings/package.json').version; //# sourceMappingURL=common.js.map