kui-shell
Version:
This is the monorepo for Kui, the hybrid command-line/GUI electron-based Kubernetes tool
292 lines • 12.6 kB
JavaScript
;
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