From dfbefa2ce55a057fd8665e3e4f6532fe3ee0f4de Mon Sep 17 00:00:00 2001 From: Eugenio Romano Date: Fri, 9 Aug 2019 07:51:04 +0100 Subject: [PATCH] split protractor configuration file (#4983) --- e2e/protractor/fail-fast.js | 80 ++++++++ e2e/protractor/override-jasmine.js | 112 ++++++++++++ e2e/protractor/save-remote.js | 150 +++++++++++++++ package-lock.json | 210 +++++++++++---------- package.json | 2 +- protractor.conf.ts | 285 +---------------------------- 6 files changed, 451 insertions(+), 388 deletions(-) create mode 100644 e2e/protractor/fail-fast.js create mode 100644 e2e/protractor/override-jasmine.js create mode 100644 e2e/protractor/save-remote.js diff --git a/e2e/protractor/fail-fast.js b/e2e/protractor/fail-fast.js new file mode 100644 index 0000000000..02ec887c00 --- /dev/null +++ b/e2e/protractor/fail-fast.js @@ -0,0 +1,80 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports.init = init; +exports.getSpecReferences = getSpecReferences; +exports.disableSpecs = disableSpecs; + +var wrap = require('lodash.wrap'); + +var refs = undefined; + +function init() { + refs = getSpecReferences(); + + return { + specDone: function specDone(result) { + if (result.status === 'failed') { + disableSpecs(refs); + } + } + }; +} + +/** + * Gather references to all jasmine specs and suites, through any (currently hacky) means possible. + * + * @return {Object} An object with `specs` and `suites` properties, arrays of respective types. + */ + +function getSpecReferences() { + var specs = []; + var suites = []; + + // Use specFilter to gather references to all specs. + jasmine.getEnv().specFilter = function (spec) { + specs.push(spec); + return true; + }; + + // Wrap jasmine's describe function to gather references to all suites. + jasmine.getEnv().describe = wrap(jasmine.getEnv().describe, function (describe) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var suite = describe.apply(null, args); + suites.push(suite); + return suite; + }); + + return { + specs: specs, + suites: suites + }; +} + +/** + * Hacky workaround to facilitate "fail fast". Disable all specs (basically `xit`), then + * remove references to all before/after functions, else they'll still run. Disabling the + * suites themselves does not appear to have an effect. + */ + +function disableSpecs() { + if (!refs) { + throw new Error('jasmine-fail-fast: Must call init() before calling disableSpecs()!'); + } + + refs.specs.forEach(function (spec) { + return spec.disable(); + }); + + refs.suites.forEach(function (suite) { + suite.beforeFns = []; + suite.afterFns = []; + suite.beforeAllFns = []; + suite.afterAllFns = []; + }); +} diff --git a/e2e/protractor/override-jasmine.js b/e2e/protractor/override-jasmine.js new file mode 100644 index 0000000000..125ffec3d1 --- /dev/null +++ b/e2e/protractor/override-jasmine.js @@ -0,0 +1,112 @@ +function beforeAllRewrite() { + + const originalBeforeAll = global.beforeAll; + + // tslint:disable-next-line + global.beforeAll = function (beforeAllFunction, timeout) { + const wrapClbk = async (done) => { + try { + await beforeAllFunction(done); + } catch (error) { + console.log('Error Before all second attempt in 10 sec'); + sleep(10000); + try { + await beforeAllFunction(done); + } catch (e) { + // tslint:disable-next-line:no-console + console.log('Error Before all second attempt fail all' + JSON.stringify(error)); + expect(true).toBe(false); + } + } + + done(); + return; + }; + + originalBeforeAll(wrapClbk, timeout); + + }; +}; + +function afterAllRewrite() { + + const originalAfterAll = global.afterAll; + + // tslint:disable-next-line + global.afterAll = function (afterAllFunction, timeout) { + const wrapClbk = async (done) => { + try { + await afterAllFunction(done); + } catch (error) { + // tslint:disable-next-line:no-console + console.log('Error After all' + JSON.stringify(error)); + } + + done(); + return; + }; + + originalAfterAll(wrapClbk, timeout); + + }; +}; + +function beforeEachAllRewrite() { + + const originalBeforeEach = global.beforeEach; + + // tslint:disable-next-line + global.beforeEach = function (beforeEachFunction, timeout) { + const wrapClbk = async (done) => { + try { + await beforeEachFunction(done); + } catch (error) { + // tslint:disable-next-line:no-console + console.log('Error before Each' + JSON.stringify(error)); + expect(true).toBe(false); + } + + done(); + return; + }; + + originalBeforeEach(wrapClbk, timeout); + + }; +}; + +function afterEachAllRewrite() { + + const originalAfterEach = global.afterEach; + + // tslint:disable-next-line + global.afterEach = function (afterEachFunction, timeout) { + const wrapClbk = async (done) => { + try { + await afterEachFunction(done); + } catch (error) { + // tslint:disable-next-line:no-console + console.log('Error After each' + JSON.stringify(error)); + + } + + done(); + return; + }; + + originalAfterEach(wrapClbk, timeout); + + }; +}; + +function sleep(delay) { + var start = new Date().getTime(); + while (new Date().getTime() < start + delay) ; +} + +module.exports = { + beforeAllRewrite: beforeAllRewrite, + afterAllRewrite: afterAllRewrite, + beforeEachAllRewrite: beforeEachAllRewrite, + afterEachAllRewrite: afterEachAllRewrite +}; diff --git a/e2e/protractor/save-remote.js b/e2e/protractor/save-remote.js new file mode 100644 index 0000000000..adb66ad231 --- /dev/null +++ b/e2e/protractor/save-remote.js @@ -0,0 +1,150 @@ +const htmlReporter = require('protractor-html-reporter-2'); + +function buildNumber() { + let buildNumber = process.env.TRAVIS_BUILD_NUMBER; + if (!buildNumber) { + process.env.TRAVIS_BUILD_NUMBER = Date.now(); + } + + return process.env.TRAVIS_BUILD_NUMBER; +} + +async function uploadScreenshot(alfrescoJsApi, retryCount) { + let files = fs.readdirSync(path.join(__dirname, './e2e-output/screenshots')); + + if (files && files.length > 0) { + + let folder; + + try { + folder = await alfrescoJsApi.nodes.addNode('-my-', { + 'name': `retry-${retryCount}`, + 'relativePath': `Builds/${buildNumber()}/screenshot`, + 'nodeType': 'cm:folder' + }, {}, { + 'overwrite': true + }); + } catch (error) { + folder = await alfrescoJsApi.nodes.getNode('-my-', { + 'relativePath': `Builds/${buildNumber()}/screenshot/retry-${retryCount}`, + 'nodeType': 'cm:folder' + }, {}, { + 'overwrite': true + }); + } + + for (const fileName of files) { + let pathFile = path.join(__dirname, './e2e-output/screenshots', fileName); + let file = fs.createReadStream(pathFile); + + let safeFileName = fileName.replace(new RegExp('"', 'g'), ''); + + try { + await alfrescoJsApi.upload.uploadFile( + file, + '', + folder.entry.id, + null, + { + 'name': safeFileName, + 'nodeType': 'cm:content', + 'autoRename': true + } + ); + } catch (error) { + console.log(error); + } + } + } +} + +async function uploadReport(alfrescoJsApi, filenameReport) { + let pathFile = path.join(__dirname, './e2e-output/junit-report/html', filenameReport + '.html'); + let reportFile = fs.createReadStream(pathFile); + + let reportFolder; + + try { + reportFolder = await alfrescoJsApi.nodes.addNode('-my-', { + 'name': 'report', + 'relativePath': `Builds/${buildNumber()}`, + 'nodeType': 'cm:folder' + }, {}, { + 'overwrite': true + }); + } catch (error) { + reportFolder = await alfrescoJsApi.nodes.getNode('-my-', { + 'relativePath': `Builds/${buildNumber()}/report`, + 'nodeType': 'cm:folder' + }, {}, { + 'overwrite': true + }); + + } + + try { + await alfrescoJsApi.upload.uploadFile( + reportFile, + '', + reportFolder.entry.id, + null, + { + 'name': reportFile.name, + 'nodeType': 'cm:content', + 'autoRename': true + } + ); + + } catch (error) { + console.log('error' + error); + + } +} + +async function saveReport(alfrescoJsApi, retryCount) { + let filenameReport = `ProtractorTestReport-${FOLDER}-${retryCount}`; + + let output = ''; + let savePath = `${projectRoot}/e2e-output/junit-report/`; + let temporaryHtmlPath = savePath + 'html/temporaryHtml/'; + let lastFileName = ''; + + let files = fs.readdirSync(savePath); + + if (files && files.length > 0) { + for (const fileName of files) { + const testConfigReport = { + reportTitle: 'Protractor Test Execution Report', + outputPath: temporaryHtmlPath, + outputFilename: Math.random().toString(36).substr(2, 5) + filenameReport, + }; + + let filePath = `${projectRoot}/e2e-output/junit-report/` + fileName; + + new htmlReporter().from(filePath, testConfigReport); + lastFileName = testConfigReport.outputFilename; + } + } + + let lastHtmlFile = temporaryHtmlPath + lastFileName + '.html'; + + if (!(fs.lstatSync(lastHtmlFile).isDirectory())) { + output = output + fs.readFileSync(lastHtmlFile); + } + + let fileName = savePath + 'html/' + filenameReport + '.html'; + + fs.writeFileSync(fileName, output, 'utf8'); + + await uploadReport(alfrescoJsApi, filenameReport); + + rimraf(`${projectRoot}/e2e-output/screenshots/`, function () { + console.log('done delete screenshot'); + }); +} + +module.exports = { + uploadScreenshot: uploadScreenshot, + uploadReport: uploadReport, + saveReport: saveReport +}; diff --git a/package-lock.json b/package-lock.json index ab143d2c00..4cbbf7cd8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6502,27 +6502,28 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, @@ -6533,15 +6534,17 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": false, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6549,39 +6552,42 @@ }, "chownr": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "optional": true, @@ -6591,28 +6597,28 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "optional": true, @@ -6622,14 +6628,14 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, @@ -6646,7 +6652,7 @@ }, "glob": { "version": "7.1.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "optional": true, @@ -6661,14 +6667,14 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": false, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, @@ -6678,7 +6684,7 @@ }, "ignore-walk": { "version": "3.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "optional": true, @@ -6688,7 +6694,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, @@ -6699,53 +6705,58 @@ }, "inherits": { "version": "2.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } }, "isarray": { "version": "1.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -6753,7 +6764,7 @@ }, "minizlib": { "version": "1.2.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "optional": true, @@ -6763,23 +6774,24 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true, "optional": true }, "needle": { "version": "2.3.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", "dev": true, "optional": true, @@ -6791,7 +6803,7 @@ }, "node-pre-gyp": { "version": "0.12.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", "dev": true, "optional": true, @@ -6810,7 +6822,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "optional": true, @@ -6821,14 +6833,14 @@ }, "npm-bundled": { "version": "1.0.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "dev": true, "optional": true, @@ -6839,7 +6851,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, @@ -6852,43 +6864,45 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, + "optional": true, "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, @@ -6899,21 +6913,21 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": false, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, @@ -6926,7 +6940,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true, "optional": true @@ -6935,7 +6949,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": false, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "optional": true, @@ -6951,7 +6965,7 @@ }, "rimraf": { "version": "2.6.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "optional": true, @@ -6961,50 +6975,52 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": false, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7013,7 +7029,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, @@ -7023,23 +7039,24 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.8", - "resolved": false, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, "optional": true, @@ -7055,14 +7072,14 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, @@ -7072,15 +7089,17 @@ }, "wrappy": { "version": "1.0.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", - "resolved": false, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "dev": true, + "optional": true } } }, @@ -7855,18 +7874,6 @@ } } }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -9101,23 +9108,6 @@ "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", "dev": true }, - "jasmine-fail-fast": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jasmine-fail-fast/-/jasmine-fail-fast-2.0.0.tgz", - "integrity": "sha1-5dguaimiX2YsZA5MMnDC+acTh+c=", - "dev": true, - "requires": { - "lodash": "3.10.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.0.tgz", - "integrity": "sha1-k9UcZygopEFqEq9XIguoqHN+L7s=", - "dev": true - } - } - }, "jasmine-reporters": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz", @@ -10263,6 +10253,12 @@ "lodash.escape": "^3.0.0" } }, + "lodash.wrap": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.wrap/-/lodash.wrap-4.1.1.tgz", + "integrity": "sha1-nDdwlHqCHsaXipNXHhphea/Nf8g=", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -18930,4 +18926,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 1880740763..cc583de4c5 100644 --- a/package.json +++ b/package.json @@ -144,7 +144,6 @@ "husky": "^1.2.0", "jasmine-ajax": "3.2.0", "jasmine-core": "~2.8.0", - "jasmine-fail-fast": "^2.0.0", "jasmine-reporters": "^2.3.2", "jasmine-spec-reporter": "~4.2.1", "jasmine2-protractor-utils": "1.1.3", @@ -163,6 +162,7 @@ "license-checker": "^25.0.1", "lint-staged": "^8.1.7", "lite-server": "^2.4.0", + "lodash.wrap": "^4.1.1", "markdownlint-cli": "^0.16.0", "mdast-util-compact": "^1.0.1", "mdast-util-heading-range": "^2.1.0", diff --git a/protractor.conf.ts b/protractor.conf.ts index 8a850ada9f..b3fcbb1d45 100644 --- a/protractor.conf.ts +++ b/protractor.conf.ts @@ -1,11 +1,15 @@ const path = require('path'); const { SpecReporter } = require('jasmine-spec-reporter'); const jasmineReporters = require('jasmine-reporters'); -const htmlReporter = require('protractor-html-reporter-2'); const retry = require('protractor-retry').retry; const tsConfig = require('./e2e/tsconfig.e2e.json'); const AlfrescoApi = require('@alfresco/js-api').AlfrescoApiCompatibility; const TestConfig = require('./e2e/test.config'); +const failFast = require('./e2e/protractor/fail-fast'); + +const { beforeAllRewrite, afterAllRewrite, beforeEachAllRewrite, afterEachAllRewrite } = require('./e2e/protractor/override-jasmine'); +const { uploadScreenshot, saveReport } = require('./e2e/protractor/save-remote'); + const argv = require('yargs').argv; const fs = require('fs'); const rimraf = require('rimraf'); @@ -36,8 +40,6 @@ let LIST_SPECS = process.env.LIST_SPECS || []; let LOG = process.env.LOG ? true : false; let arraySpecs = []; -let failFast = require('jasmine-fail-fast'); - if (LOG) { console.log('======= PROTRACTOR CONFIGURATION ====== '); console.log('SAVE_SCREENSHOT : ' + SAVE_SCREENSHOT); @@ -78,277 +80,6 @@ let specs = () => { specs(); -let buildNumber = () => { - let buildNumber = process.env.TRAVIS_BUILD_NUMBER; - if (!buildNumber) { - process.env.TRAVIS_BUILD_NUMBER = Date.now(); - } - - return process.env.TRAVIS_BUILD_NUMBER; -}; - -let uploadScreenshot = async function (alfrescoJsApi, retryCount) { - let files = fs.readdirSync(path.join(__dirname, './e2e-output/screenshots')); - - if (files && files.length > 0) { - - let folder; - - try { - folder = await alfrescoJsApi.nodes.addNode('-my-', { - 'name': `retry-${retryCount}`, - 'relativePath': `Builds/${buildNumber()}/screenshot`, - 'nodeType': 'cm:folder' - }, {}, { - 'overwrite': true - }); - } catch (error) { - folder = await alfrescoJsApi.nodes.getNode('-my-', { - 'relativePath': `Builds/${buildNumber()}/screenshot/retry-${retryCount}`, - 'nodeType': 'cm:folder' - }, {}, { - 'overwrite': true - }); - } - - for (const fileName of files) { - let pathFile = path.join(__dirname, './e2e-output/screenshots', fileName); - let file = fs.createReadStream(pathFile); - - let safeFileName = fileName.replace(new RegExp('"', 'g'), ''); - - try { - await alfrescoJsApi.upload.uploadFile( - file, - '', - folder.entry.id, - null, - { - 'name': safeFileName, - 'nodeType': 'cm:content', - 'autoRename': true - } - ); - } catch (error) { - console.log(error); - } - } - } -}; - -let uploadReport = async function (alfrescoJsApi, filenameReport) { - let pathFile = path.join(__dirname, './e2e-output/junit-report/html', filenameReport + '.html'); - let reportFile = fs.createReadStream(pathFile); - - let reportFolder; - - try { - reportFolder = await alfrescoJsApi.nodes.addNode('-my-', { - 'name': 'report', - 'relativePath': `Builds/${buildNumber()}`, - 'nodeType': 'cm:folder' - }, {}, { - 'overwrite': true - }); - } catch (error) { - reportFolder = await alfrescoJsApi.nodes.getNode('-my-', { - 'relativePath': `Builds/${buildNumber()}/report`, - 'nodeType': 'cm:folder' - }, {}, { - 'overwrite': true - }); - - } - - try { - await - alfrescoJsApi.upload.uploadFile( - reportFile, - '', - reportFolder.entry.id, - null, - { - 'name': reportFile.name, - 'nodeType': 'cm:content', - 'autoRename': true - } - ); - - } catch (error) { - console.log('error' + error); - - } -}; - -let beforeAllRewrite = function () { - - const originalBeforeAll = global.beforeAll; - - // tslint:disable-next-line - global.beforeAll = function (beforeAllFunction, timeout) { - const wrapClbk = async (done) => { - try { - await beforeAllFunction(done); - } catch (error) { - console.log('Error Before all second attempt in 10 sec'); - sleep(10000); - try { - await beforeAllFunction(done); - } catch (e) { - // tslint:disable-next-line:no-console - console.log('Error Before all second attempt fail all' + JSON.stringify(error)); - expect(true).toBe(false); - } - } - - done(); - return; - }; - - originalBeforeAll(wrapClbk, timeout); - - }; -}; - -let afterAllRewrite = function () { - - const originalAfterAll = global.afterAll; - - // tslint:disable-next-line - global.afterAll = function (afterAllFunction, timeout) { - const wrapClbk = async (done) => { - try { - await afterAllFunction(done); - } catch (error) { - // tslint:disable-next-line:no-console - console.log('Error After all' + JSON.stringify(error)); - } - - done(); - return; - }; - - originalAfterAll(wrapClbk, timeout); - - }; -}; - -let beforeEachAllRewrite = function () { - - const originalBeforeEach = global.beforeEach; - - // tslint:disable-next-line - global.beforeEach = function (beforeEachFunction, timeout) { - const wrapClbk = async (done) => { - try { - await beforeEachFunction(done); - } catch (error) { - // tslint:disable-next-line:no-console - console.log('Error before Each' + JSON.stringify(error)); - expect(true).toBe(false); - } - - done(); - return; - }; - - originalBeforeEach(wrapClbk, timeout); - - }; -}; - -let afterEachAllRewrite = function () { - - const originalAfterEach = global.afterEach; - - // tslint:disable-next-line - global.afterEach = function (afterEachFunction, timeout) { - const wrapClbk = async (done) => { - try { - await afterEachFunction(done); - } catch (error) { - // tslint:disable-next-line:no-console - console.log('Error After each' + JSON.stringify(error)); - - } - - done(); - return; - }; - - originalAfterEach(wrapClbk, timeout); - - }; -}; - -let browserLogErrorPrint = function () { - - if (process.env.LOG) { - var browserLogs = require('protractor-browser-logs'), - logs = browserLogs(browser); - - global.logs = logs; - - beforeEach(function () { - logs.reset(); - - // You can put here all expected generic expectations. - logs.ignore('favicon.ico'); - logs.ignore('favicon.ico'); - logs.ignore('favicon-96x96.png'); - logs.ignore(logs.or(logs.INFO, logs.DEBUG)); - }); - - afterEach(async () => { - let url = await browser.getCurrentUrl(); - - return logs.verify(); - }); - } -}; - -let saveReport = async function (alfrescoJsApi, retryCount) { - let filenameReport = `ProtractorTestReport-${FOLDER}-${retryCount}`; - - let output = ''; - let savePath = `${projectRoot}/e2e-output/junit-report/`; - let temporaryHtmlPath = savePath + 'html/temporaryHtml/'; - let lastFileName = ''; - - let files = fs.readdirSync(savePath); - - if (files && files.length > 0) { - for (const fileName of files) { - const testConfigReport = { - reportTitle: 'Protractor Test Execution Report', - outputPath: temporaryHtmlPath, - outputFilename: Math.random().toString(36).substr(2, 5) + filenameReport, - }; - - let filePath = `${projectRoot}/e2e-output/junit-report/` + fileName; - - new htmlReporter().from(filePath, testConfigReport); - lastFileName = testConfigReport.outputFilename; - } - } - - let lastHtmlFile = temporaryHtmlPath + lastFileName + '.html'; - - if (!(fs.lstatSync(lastHtmlFile).isDirectory())) { - output = output + fs.readFileSync(lastHtmlFile); - } - - let fileName = savePath + 'html/' + filenameReport + '.html'; - - fs.writeFileSync(fileName, output, 'utf8'); - - await uploadReport(alfrescoJsApi, filenameReport); - - rimraf(`${projectRoot}/e2e-output/screenshots/`, function () { - console.log('done delete screenshot'); - }); -}; - exports.config = { allScriptsTimeout: TIMEOUT, @@ -438,7 +169,6 @@ exports.config = { beforeEachAllRewrite(); afterAllRewrite(); beforeAllRewrite(); - browserLogErrorPrint(); retry.onPrepare(); @@ -542,8 +272,3 @@ exports.config = { } }; - -function sleep(delay) { - var start = new Date().getTime(); - while (new Date().getTime() < start + delay) ; -}