From: ilanap Date: Sun, 4 Aug 2019 07:16:33 +0000 (+0300) Subject: Issue-ID: SDC-2483 X-Git-Tag: 1.6.1~200 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=061ca938ca6998b4ec33a862c763854259cfeab1;p=sdc.git Issue-ID: SDC-2483 Adding https support for cucumber tests and slight refactoring Signed-off-by: ilanap Change-Id: Ib772d18cd4278238571daf54bcb6372c553d6e4b --- diff --git a/cucumber-js-test-apis-ci/config.json b/cucumber-js-test-apis-ci/config.json index 00c6552482..fdee980b09 100644 --- a/cucumber-js-test-apis-ci/config.json +++ b/cucumber-js-test-apis-ci/config.json @@ -1,22 +1,28 @@ { - "protocol" : "http", - "onboarding" : { + "protocol" : "http", "port" : "onboarding.port", "prefix" : "onboarding-api/v1.0", "server" : "onboarding.server", - "user" : "onboarding.user" + "user" : "onboarding.user", + "isDefault" : true }, "catalog" : { + "protocol" : "http", "port" : "CatalogBE.port", "prefix" : "sdc2/rest/v1", "server" : "CatalogBE.server", "user" : "CatalogBE.user" }, "activity_spec" : { + "protocol" : "http", "port" : "activity-spec.port", "prefix" : "activity-spec-api/v1.0", "server" : "activity_spec.server", "user" : "activity-spec.user" + }, + "initData" : { + "vlm" : {"id": null, "versionId": null}, + "vsp" : {"id": null, "versionId": null} } } diff --git a/cucumber-js-test-apis-ci/cucumber-common/package.json b/cucumber-js-test-apis-ci/cucumber-common/package.json new file mode 100644 index 0000000000..1efc8f12ad --- /dev/null +++ b/cucumber-js-test-apis-ci/cucumber-common/package.json @@ -0,0 +1,37 @@ +{ + "name": "cucumber-common", + "version": "1.0.14", + "description": "Cucumber common methods and utilities", + "repository": "", + "main": "index.js", + "directories": { + "doc": "docs" + }, + "scripts": { + "test": "cucumber-js", + "test-and-report": "npm-run-all -c -s test cucumber-html-report", + "cucumber-html-report": "node plugins/reporter.js", + "cucumber-docs": "jsdoc ./stepDefinitions -c plugins/jsdoc_config.json --readme plugins/README.md" + }, + "author": "", + "license": "Apache-2.0", + "dependencies": { + "assert": "^1.4.1", + "btoa": "^1.2.1", + "cucumber": "^5.1.0", + "cucumber-html-reporter": "^4.0.4", + "docdash": "^1.0.2", + "find-up": "^4.1.0", + "jsdoc": "^3.5.5", + "jsdoc-one-page": "0.0.5", + "lodash": "^4.17.11", + "md5": "^2.2.1", + "needle": "^2.4.0", + "node-zip": "^1.1.1", + "normalize-newline": "^3.0.0", + "npm-run-all": "^4.1.2", + "request": "^2.83.0", + "yamljs": "^0.3.0" + }, + "devDependencies": {} +} diff --git a/cucumber-js-test-apis-ci/plugins/README.md b/cucumber-js-test-apis-ci/cucumber-common/plugins/README.md similarity index 86% rename from cucumber-js-test-apis-ci/plugins/README.md rename to cucumber-js-test-apis-ci/cucumber-common/plugins/README.md index a57d61b1bb..9eaeb8f3a6 100644 --- a/cucumber-js-test-apis-ci/plugins/README.md +++ b/cucumber-js-test-apis-ci/cucumber-common/plugins/README.md @@ -7,8 +7,9 @@ The Modules on the left contains all steps for particalar aress and/or explanati
  • Copy the config.json to devConfig.json
  • Replace the server and user values with the correct values

    How to run with Maven

    -
  • "mvn clean install -f dev_pom.xml" will install npm if needed, download all modules and create the documentation under the "docs" folder -
  • "mvn test-and-report" will run all tests in the features folder and create an HTML report under the "reports" folder +
  • "mvn clean install" will install npm if needed, download all modules +
  • run "mvn install -DskipTests=true -P dev" to create the documentation under the "docs" folder +
  • "mvn test -P dev" will run all tests in the features folder and create an HTML report under the "reports" folder

    How to develop tests

    You can open the project in IntelliJ and Webstorm to run and develop scenarios.
  • You will need to install the Cucumber.Js plugin In order to install, go to "Settings/Plugins". If cucumber.js in not on the list, go to "Browse repositories.." and install . diff --git a/cucumber-js-test-apis-ci/plugins/jsdoc_config.json b/cucumber-js-test-apis-ci/cucumber-common/plugins/jsdoc_config.json similarity index 86% rename from cucumber-js-test-apis-ci/plugins/jsdoc_config.json rename to cucumber-js-test-apis-ci/cucumber-common/plugins/jsdoc_config.json index a5a608e805..2757000472 100644 --- a/cucumber-js-test-apis-ci/plugins/jsdoc_config.json +++ b/cucumber-js-test-apis-ci/cucumber-common/plugins/jsdoc_config.json @@ -7,7 +7,8 @@ "outputSourceFiles": false } }, - "plugins": ["plugins/steps"], + + "plugins": ["./steps"], "opts": { "template": "node_modules/jsdoc-one-page", "destination": "docs/" diff --git a/cucumber-js-test-apis-ci/plugins/reporter.js b/cucumber-js-test-apis-ci/cucumber-common/plugins/reporter.js similarity index 100% rename from cucumber-js-test-apis-ci/plugins/reporter.js rename to cucumber-js-test-apis-ci/cucumber-common/plugins/reporter.js diff --git a/cucumber-js-test-apis-ci/plugins/steps.js b/cucumber-js-test-apis-ci/cucumber-common/plugins/steps.js similarity index 100% rename from cucumber-js-test-apis-ci/plugins/steps.js rename to cucumber-js-test-apis-ci/cucumber-common/plugins/steps.js diff --git a/cucumber-js-test-apis-ci/stepDefinitions/world.js b/cucumber-js-test-apis-ci/cucumber-common/stepDefinitions/world.js similarity index 71% rename from cucumber-js-test-apis-ci/stepDefinitions/world.js rename to cucumber-js-test-apis-ci/cucumber-common/stepDefinitions/world.js index eaf48aa31f..7811aba886 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/world.js +++ b/cucumber-js-test-apis-ci/cucumber-common/stepDefinitions/world.js @@ -15,14 +15,24 @@ */ const { setWorldConstructor } = require('cucumber'); const _ = require('lodash'); +const findUp = require('find-up'); -let config = require('../config.json'); + + +let configPath = findUp.sync('config.json'); +configPath = configPath.replace(/\\/g, '/'); + +let config = require(configPath); let localConfig = {}; try { - localConfig = require('../devConfig.json'); + let devConfigPath = findUp.sync('devConfig.json'); + devConfigPath = devConfigPath.replace(/\\/g, '/'); + localConfig = require(devConfigPath); } catch (e) { try { - localConfig = require('../environments/dockerConfig.json'); + let envdir = findUp.sync('environments', {type: 'directory'}); + envdir = envdir.replace(/\\/g, '/'); + localConfig = require(envdir + '/dockerConfig.json'); } catch (e) { console.error("no env configuration was found!"); } @@ -35,11 +45,10 @@ var {setDefaultTimeout} = require('cucumber'); /** * @module Context * @description Context that is used per feature file and can be accessed as 'this.context' in all steps.
    + * This class can be extended in order to add additional configurations. *
    * Contains the following items:
    *
  • this.context.server
      REST server and onboarding prefix including version. set either in configuration file or from the command line or SERVER environment variable
    - *
  • this.context.vlm
      When a VLM has been created, this has the an id and versionId set to the correct IDs.
    - *
  • this.context.vsp
      When a VSP has been created, this has the an id and versionId and componentId set to the correct IDs.
    *
  • this.context.item
      When a VLM or VSP has been created, this has the an id and versionId set to the correct IDs.
    *
  • this.context
      Object with properties that were saved in the steps.
    *
  • this.context.inputdata
      Automatically updated with the last responseData from the Rest call
      Object with properties that were prepares in the steps.
    @@ -50,23 +59,32 @@ class CustomWorld { this.context = {}; this.context.headers = {}; let typeName; + + this.context.defaultServerType = 'main'; for (typeName in config) { this.context.headers[typeName] = {}; if (config[typeName].user) { this.context.headers[typeName]['USER_ID'] = config[typeName].user; } + // adding additional headers + if (config[typeName].additionalHeaders) { + _.assign(this.context.headers[typeName] , config[typeName].additionalHeaders); + } + if (config[typeName].isDefault !== undefined && config[typeName].isDefault) { + this.context.defaultServerType = typeName; + } } - - this.context.vlm = {id: null, versionId: null}; - this.context.vsp = {id: null, versionId: null}; this.context.item = {id: null, versionId: null, componentId: null}; + // adding the default items that should also be initialized + if (config.initData) { + _.assign(this.context, config.initData); + } this.context.shouldFail = false; this.context.errorCode = null; this.context.inputData = null; this.context.responseData = null; - this.context.defaultServerType = 'onboarding'; this.config = config; @@ -76,17 +94,14 @@ class CustomWorld { var _config = config; return function(type) { let typeData = _config[type]; - let _url = _config.protocol + '://' + + let _url = typeData.protocol + '://' + typeData.server + ':' + typeData.port + '/' + typeData.prefix; return _url; } })(); - setDefaultTimeout(60 * 1000); } } - - setWorldConstructor(CustomWorld); diff --git a/cucumber-js-test-apis-ci/cucumber-common/utils/UpdateTestConfig.js b/cucumber-js-test-apis-ci/cucumber-common/utils/UpdateTestConfig.js new file mode 100644 index 0000000000..a2c1dae2f7 --- /dev/null +++ b/cucumber-js-test-apis-ci/cucumber-common/utils/UpdateTestConfig.js @@ -0,0 +1,81 @@ +/* + * Copyright © 2016-2017 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict' + +const fs = require('fs'); + +var pathToRoot = process.env.TESTS_BASE; +if (!pathToRoot.endsWith("/")) { + pathToRoot += "/"; +} +var envConfig = require(pathToRoot + 'config.json'); +var protocol = (process.env.PROTOCOL !== undefined) ? process.env.PROTOCOL : 'https'; + +try { + envConfig = require(pathToRoot + 'environments/dockerConfig.json'); +} catch (e) { +} + +function run() { + var inputArgs = process.argv.slice(2); + let changeConfig = false; + if (process.env.K8S_CONF_PATH !== undefined) { + console.log('updating with kubernetes services'); + let k8sConfig = require(pathToRoot + process.env.K8S_CONF_PATH); + mapK8sPod2Docker(k8sConfig, inputArgs[0], inputArgs[1]); + changeConfig = true; + } else { + console.log('not updating at all'); + } + if (changeConfig) { + let data = JSON.stringify(envConfig, null, 2); + console.log('writing config file: ' + pathToRoot+'environments/dockerConfig.json'); + console.log(data); + fs.writeFileSync(pathToRoot+'environments/dockerConfig.json', data); + } +} + +function mapK8sPod2Docker(k8sConfig, id, k8sid) { + let item = k8sConfig.items.find(item => { + if (item.spec !== undefined && item.spec.ports !== undefined) { + let spec = item.spec.ports.find(port => { + if (port.name === k8sid) { + return true; + } + }); + return (spec !== undefined); + } else { + return false; + } + }); + + item.spec.ports.forEach(port => { + if (port.name === k8sid) { + envConfig[id].port = port.nodePort; + let rancherData = JSON.parse(item.metadata.annotations["field.cattle.io/publicEndpoints"]); + let address = rancherData.find(address => { + return address.port === port.nodePort; + }); + envConfig[id].port = address.port; + envConfig[id].server = address.addresses[0]; + envConfig[id].protocol = protocol; + envConfig[id].user = process.env.SDC_USER_ID; + } + }); + +} + +run(); diff --git a/cucumber-js-test-apis-ci/cucumber-common/utils/Utils.js b/cucumber-js-test-apis-ci/cucumber-common/utils/Utils.js new file mode 100644 index 0000000000..22ee775080 --- /dev/null +++ b/cucumber-js-test-apis-ci/cucumber-common/utils/Utils.js @@ -0,0 +1,223 @@ +/* + * Copyright © 2016-2017 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const needle = require('needle'); +const fs = require('fs'); +require('node-zip'); +var btoa = require('btoa'); +const md5 = require('md5'); +const _ = require('lodash'); + +function getOptionsForRequest(context, method, path, type) { + if (type == undefined || type == null) { + type = context.defaultServerType + } + let server = context.getUrlForType(type); + let options = { + method: method, + url: server + path, + headers: _.clone(context.headers[type]) + }; +// options.headers["Content-Type"] = "application/json"; +// options.headers["accept"] = "application/json"; + return options; +} + +function _requestBinaryFormData(context, method, path, fileName, formInputName, type) { + let options = getOptionsForRequest(context, method, path, type); + let formData = {}; + if (method === 'POST' || method === 'PUT') { + //formData[formInputName] = fs.createReadStream(fileName); + //options.formData = formData; + let fileData = { + file: fileName + }; + fileData['content_type'] = 'multipart/form-data'; + options.formData = {}; + options.formData[formInputName] = fileData; + } + return _request(context, method, path, options); +} +function _requestBinaryBody(context, method, path, fileName, type) { + let options = getOptionsForRequest(context, method, path, type); + if (method === 'POST' || method === 'PUT') { + options.body = fs.createReadStream(fileName); + options.headers['Content-Type'] = 'application/octet-stream'; + + } + return _request(context, method, path, options); +} + + +function _requestPayload(context, method, path, filePath, type) { + let options = getOptionsForRequest(context, method, path, type); + options.json = _createPayload(filePath); + options.headers['Content-MD5'] = addCheckSum(options.json); + return _request(context, method, path, options); +} + +function _requestRest(context, method, path, data, type) { + let options = getOptionsForRequest(context, method, path, type); + if (method === 'POST' || method === 'PUT') { + options.json = data; + } + return _request(context, method, path, options); +} + +function _request(context, method, path, options) { + console.log('--> Calling REST ' + options.method +' url: ' + options.url); + let inputData = options.json; + let needleOptions = {headers: options.headers, rejectUnauthorized: false}; + if (inputData == undefined) { + if (options.formData != undefined) { + inputData = options.formData; + needleOptions.multipart = true; + } + if (inputData && inputData.body != undefined) { + inputData = options.body; + } + } else { + needleOptions.json = true; + } + return needle(method, options.url, inputData, needleOptions) + .then(function(result) { + context.inputData = null; + let isExpected = (context.shouldFail) ? (result.statusCode != 200 && result.statusCode != 201) : (result.statusCode == 200 || result.statusCode == 201); + data = result.body; + if (!isExpected) { + console.log('Did not get expected response code'); + throw 'Status Code was ' + result.statusCode ; + } + if (context.shouldFail && context.errorCode) { + if (typeof data === 'string' && data) { + data = JSON.parse(data); + } + let errorCode = data.errorCode; + let contextErrorCode = context.errorCode; + context.errorCode = null; + if (errorCode !== contextErrorCode) { + throw 'Error Code was ' + errorCode + ' instead of ' + contextErrorCode; + } + } + if (context.shouldFail && context.errorMessage) { + if (typeof data === 'string' && data) { + data = JSON.parse(data); + } + let errorMessage = data.message; + let contextErrorMessage = context.errorMessage; + context.errorMessage = null; + if (errorMessage !== contextErrorMessage) { + throw 'Error Message was ' + errorMessage + ' instead of ' + contextErrorMessage; + } + } + if (context.shouldFail) { + context.shouldFail = false; + return({statusCode: result.statusCode, data: {}}); + } + + if (typeof data === 'string' && data) { + if (data.startsWith('[') || data.startsWith('{')) { + data = JSON.parse(data); + } + } + context.responseData = data; + context.inputData = data; + return({statusCode: result.statusCode, data: data}); + + }) + .catch(function(err) { + console.error('Request URL: ' + options.url); + console.error('Request Method: ' + options.method); + console.log(err); + throw err; + }) +} + +function download(context, path, filePath, type) { + if (type == undefined || type == null) { + type = context.defaultServerType + } + let server = context.getUrlForType(type); + let options = { + method: 'GET', + url: server + path, + headers: context.headers[type] + }; + + console.log('--> Calling REST download url: ' + options.url); + return needle('GET', options.url, {}, { + headers: options.headers, + rejectUnauthorized: false, + output: filePath + }) + .then(function (result) { + let zipFile = fs.readFileSync(filePath, 'binary'); + let zip = new JSZip(zipFile, {base64: false, checkCRC32: true}); + if (zip.files['MANIFEST.json']) { + let manifestData = zip.files['MANIFEST.json']._data; + manifestData = manifestData.replace(/\\n/g, ''); + context.responseData = JSON.parse(manifestData); + } + return zip; + }) + .catch(function (err) { + console.error('Request URL: ' + options.url); + console.error('Request Method: ' + options.method); + throw err; + }) +} + +function _random() { + let d = new Date(); + return d.getTime().toString().split('').reverse().join(''); +} + +function _getJSONFromFile(file) { + return JSON.parse(fs.readFileSync(file, 'utf8')); +} + +function _createPayload(fileName) { + var body = fs.readFileSync(fileName); + let payload = { + payloadData: body.toString('base64'), + payloadName: fileName.substring(fileName.lastIndexOf("/") + 1 ) + }; + return payload; +} + +function addCheckSum(payloadData) { + let _md5 = md5(JSON.stringify(payloadData)); + return btoa(_md5.toLowerCase()); +} + +function _getFile(file, format) { + if(format === '' ){ + return fs.readFileSync(file) + } + return fs.readFileSync(file, format); +} + + +module.exports = { + getFile: _getFile, + request: _requestRest, + requestPayload: _requestPayload, + requestBinaryFormData: _requestBinaryFormData, + requestBinaryBody: _requestBinaryBody, + random : _random, + getJSONFromFile: _getJSONFromFile, + download: download, + payload: _createPayload +}; diff --git a/cucumber-js-test-apis-ci/cucumber.js b/cucumber-js-test-apis-ci/cucumber.js index 0eb79d3ac5..0f3b6bc961 100644 --- a/cucumber-js-test-apis-ci/cucumber.js +++ b/cucumber-js-test-apis-ci/cucumber.js @@ -1,3 +1,3 @@ module.exports = { - "default" : "--require stepDefinitions -f summary -r ./features -f summary:report/summary.txt -f json:report/report.json --format-options '{\"colorsEnabled\": false}'" + "default" : "--require stepDefinitions --require cucumber-common/stepDefinitions -f summary -r ./features -f summary:report/summary.txt -f json:report/report.json --format-options '{\"colorsEnabled\": false}'" }; \ No newline at end of file diff --git a/cucumber-js-test-apis-ci/dev_pom.xml b/cucumber-js-test-apis-ci/dev_pom.xml deleted file mode 100644 index 7ad10f8d3f..0000000000 --- a/cucumber-js-test-apis-ci/dev_pom.xml +++ /dev/null @@ -1,138 +0,0 @@ - - 4.0.0 - - onboarding-cucumber - cucumber-report - - - org.openecomp.sdc - sdc-onboarding - 1.3.1-SNAPSHOT - ../onboarding/pom.xml - - - - - - maven-clean-plugin - 2.6.1 - - - clean.dist.folder - clean - - clean - - - - - ${basedir}/report - - **/* - - - - ${basedir}/resources/downloads - - **/* - - - - ${basedir}/docs - - **/* - - - - - - - - - - - maven-antrun-plugin - - - create-reporting-folders - generate-sources - - - - - - - - - run - - - - - - - - - - com.github.eirslett - frontend-maven-plugin - 1.6 - - - ${project.parent.parent.basedir} - - - - - - install node and yarn - - install-node-and-yarn - - - v9.4.0 - v1.3.2 - - - - - yarn run install - - yarn - - - install - - - - yarn run cucumber docs - - yarn - - - false - run cucumber-docs - - - - - yarn run cucumber test - - yarn - - - false - run test-and-report - - test - - - - - - - - - diff --git a/cucumber-js-test-apis-ci/docker/Dockerfile b/cucumber-js-test-apis-ci/docker/Dockerfile index fb4409215f..eab4e89f30 100644 --- a/cucumber-js-test-apis-ci/docker/Dockerfile +++ b/cucumber-js-test-apis-ci/docker/Dockerfile @@ -1,11 +1,12 @@ FROM node:8.16.0 - ENV TESTS_BASE /var/lib/tests USER root RUN mkdir $TESTS_BASE -COPY cucumber $TESTS_BASE -COPY startup.sh $TESTS_BASE -RUN chmod 777 $TESTS_BASE/startup.sh +RUN mkdir $TESTS_BASE/environments +COPY cucumber $TESTS_BASE +COPY startup.sh . +RUN chmod 777 ./startup.sh +RUN chmod -R 777 $TESTS_BASE/node_modules/ -ENTRYPOINT [ "/var/lib/tests/startup.sh" ] +ENTRYPOINT [ "./startup.sh" ] diff --git a/cucumber-js-test-apis-ci/docker/startup.sh b/cucumber-js-test-apis-ci/docker/startup.sh index 3170411ae5..b3ad4f140a 100644 --- a/cucumber-js-test-apis-ci/docker/startup.sh +++ b/cucumber-js-test-apis-ci/docker/startup.sh @@ -1,6 +1,9 @@ #!/bin/bash cd /var/lib/tests + +rm devConfig.json + mkdir resources/downloads -yarn install -yarn run test-and-report + +npm run test-and-report diff --git a/cucumber-js-test-apis-ci/package.json b/cucumber-js-test-apis-ci/package.json index 0aecbdc4fd..646b71fe30 100644 --- a/cucumber-js-test-apis-ci/package.json +++ b/cucumber-js-test-apis-ci/package.json @@ -9,19 +9,23 @@ "scripts": { "test": "cucumber-js", "test-and-report": "npm-run-all -c -s test cucumber-html-report", - "cucumber-html-report": "node plugins/reporter.js", - "cucumber-docs": "jsdoc ./stepDefinitions -c plugins/jsdoc_config.json --readme plugins/README.md" + "cucumber-html-report": "node cucumber-common/plugins/reporter.js", + "cucumber-docs": "jsdoc ./stepDefinitions -c cucumber-common/plugins/jsdoc_config.json --readme cucumber-common/plugins/README.md" }, "author": "", "license": "Apache-2.0", "dependencies": { "assert": "^1.4.1", + "btoa": "^1.2.1", "cucumber": "^3.2.1", "cucumber-html-reporter": "^3.0.4", "docdash": "^0.4.0", + "find-up": "^4.1.0", "jsdoc": "^3.5.5", "jsdoc-one-page": "0.0.5", "lodash": "^4.17.4", + "md5": "^2.2.1", + "needle": "^2.4.0", "node-zip": "^1.1.1", "normalize-newline": "^3.0.0", "npm-run-all": "^4.1.2", diff --git a/cucumber-js-test-apis-ci/pom.xml b/cucumber-js-test-apis-ci/pom.xml index e24a7d2093..41c3352961 100644 --- a/cucumber-js-test-apis-ci/pom.xml +++ b/cucumber-js-test-apis-ci/pom.xml @@ -25,6 +25,12 @@ + + ${basedir}/node_modules + + **/* + + ${basedir}/report @@ -60,6 +66,38 @@ + + com.github.eirslett + frontend-maven-plugin + 1.6 + + + ${project.parent.parent.basedir} + + + + + install node and npm + + install-node-and-npm + + generate-resources + + v10.15.3 + 6.4.1 + + + + npm run install + + npm + + + install + + + + @@ -67,21 +105,83 @@ ${project.build.directory}/docker_assembly false - - ${basedir} - - features/**/* - stepDefinitions/**/* - plugins/**/* - resources/**/* - *.js* - - ${project.build.directory}/docker_assembly/cucumber - false - + + dev + + false + + + + + maven-antrun-plugin + + + create-reporting-folders + initialize + + + + + + + + + + + + com.github.eirslett + frontend-maven-plugin + 1.6 + + + ${project.basedir} + ${project.parent.parent.basedir} + + + + + + npm run install + + npm + + + install + + + + + npm run cucumber test + + npm + + + false + run test-and-report + + test + + + + npm run documentation + + npm + + + false + run cucumber-docs + + install + + + + + + + docker @@ -89,6 +189,37 @@ + + maven-resources-plugin + 3.0.2 + + + copy-resources + package + + copy-resources + + + ${project.build.directory}/docker_assembly/cucumber + + + ${basedir} + + features/**/* + stepDefinitions/**/* + plugins/**/* + resources/**/* + node_modules/**/* + cucumber-common/**/* + *.js* + + false + + + + + + io.fabric8 docker-maven-plugin diff --git a/cucumber-js-test-apis-ci/stepDefinitions/ActivitySpec_steps.js b/cucumber-js-test-apis-ci/stepDefinitions/ActivitySpec_steps.js index 7fe8ddf201..d12421bd90 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/ActivitySpec_steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/ActivitySpec_steps.js @@ -16,7 +16,7 @@ const {Then, When} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); const _ = require('lodash'); When('I want to create an ActivitySpec', function () { diff --git a/cucumber-js-test-apis-ci/stepDefinitions/Collaboration_Steps.js b/cucumber-js-test-apis-ci/stepDefinitions/Collaboration_Steps.js index c4de758300..a0713c5b61 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/Collaboration_Steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/Collaboration_Steps.js @@ -15,7 +15,7 @@ */ const {Then, When, Given} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); /** * @module Collaboration diff --git a/cucumber-js-test-apis-ci/stepDefinitions/General_Steps.js b/cucumber-js-test-apis-ci/stepDefinitions/General_Steps.js index 2076366595..e59d441e10 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/General_Steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/General_Steps.js @@ -20,7 +20,7 @@ const normalizeNewline = require('normalize-newline'); require('node-zip'); YAML = require('yamljs'); const fs = require('fs'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); function getPath(path, context) { let compiled = _.template(path); diff --git a/cucumber-js-test-apis-ci/stepDefinitions/GlobalTypes.js b/cucumber-js-test-apis-ci/stepDefinitions/GlobalTypes.js index 461fee74a7..f278a2ebb0 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/GlobalTypes.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/GlobalTypes.js @@ -16,9 +16,9 @@ const {Then, When} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); When('I want to get interface lifecycle types', function () { let path = '/catalog/interfaceLifecycleTypes'; - return util.request(this.context, 'GET', path, null, false, 'catalog'); + return util.request(this.context, 'GET', path, null, 'catalog'); }); \ No newline at end of file diff --git a/cucumber-js-test-apis-ci/stepDefinitions/InputData_steps.js b/cucumber-js-test-apis-ci/stepDefinitions/InputData_steps.js index 57a374b9bb..782aeaec23 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/InputData_steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/InputData_steps.js @@ -17,7 +17,7 @@ const {Then, When, Given} = require('cucumber'); const assert = require('assert'); const _ = require('lodash'); const fs = require('fs'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); /** * @module InputData diff --git a/cucumber-js-test-apis-ci/stepDefinitions/InterfaceOperationSteps.js b/cucumber-js-test-apis-ci/stepDefinitions/InterfaceOperationSteps.js index 3e2321963c..ba716d0e4d 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/InterfaceOperationSteps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/InterfaceOperationSteps.js @@ -15,7 +15,7 @@ */ const {Then, When} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); When('I want to create a VF', function() { @@ -27,7 +27,7 @@ When('I want to create a VF', function() { var type = "resources"; let path = '/catalog/' + type; - return util.request(this.context, 'POST', path, inputData, false, 'catalog').then(result => { + return util.request(this.context, 'POST', path, inputData, 'catalog').then(result => { this.context.component = {uniqueId : result.data.uniqueId, type : type, id : result.data.inputs[0].uniqueId}; }); }); @@ -41,7 +41,7 @@ When('I want to create a Service', function() { var type = "services"; let path = '/catalog/' + type; - return util.request(this.context, 'POST', path, inputData, false, 'catalog').then(result => { + return util.request(this.context, 'POST', path, inputData, 'catalog').then(result => { this.context.component = {uniqueId : result.data.uniqueId, type : type, id : result.data.inputs[0].uniqueId}; }); }); @@ -68,7 +68,7 @@ When('I want to create an Operation', function() { inputData.interfaces.interface1.operations.delete.outputs.listToscaDataDefinition[0].name = util.random(); inputData.interfaces.interface1.operations.delete.description = operationName + " description"; - return util.request(this.context, 'POST', path, inputData, false, 'catalog').then(result => { + return util.request(this.context, 'POST', path, inputData, 'catalog').then(result => { {intOperations = result.data.interfaces[0].operations}; this.context.interface = { interfaceUniqueId : result.data.interfaces[0].uniqueId, interfaceType : result.data.interfaces[0].type, @@ -86,7 +86,7 @@ When('I want to update an Operation', function () { inputData.interfaces.interface1.operations.delete.inputs.listToscaDataDefinition[0].inputId = this.context.component.id; inputData.interfaces.interface1.operations.delete.outputs.listToscaDataDefinition[0].name = util.random(); - return util.request(this.context, 'PUT', path, inputData, false, 'catalog').then((result)=> { + return util.request(this.context, 'PUT', path, inputData, 'catalog').then((result)=> { {intOperations = result.data.interfaces[0].operations}; this.context.interface = { interfaceUniqueId : result.data.interfaces[0].uniqueId, interfaceType : result.data.interfaces[0].type, @@ -98,7 +98,7 @@ When('I want to update an Operation', function () { When('I want to get an Operation by Id', function () { let path = '/catalog/'+ this.context.component.type + '/' + this.context.component.uniqueId + '/interfaces/' + this.context.interface.interfaceUniqueId + '/operations/' +this.context.interface.operationUniqueId ; - return util.request(this.context, 'GET', path, null, false, 'catalog').then((result)=> { + return util.request(this.context, 'GET', path, null, 'catalog').then((result)=> { {intOperations = result.data.interfaces[0].operations}; this.context.interface = { interfaceUniqueId : result.data.interfaces[0].uniqueId, @@ -111,7 +111,7 @@ When('I want to get an Operation by Id', function () { When('I want to list Operations', function () { let path = '/catalog/'+ this.context.component.type + '/' + this.context.component.uniqueId + '/filteredDataByParams?include=interfaces'; - return util.request(this.context, 'GET', path, null, false, 'catalog').then((result)=> { + return util.request(this.context, 'GET', path, null, 'catalog').then((result)=> { }); }); @@ -119,14 +119,14 @@ When('I want to list Operations', function () { When('I want to delete an Operation', function() { let path = '/catalog/'+ this.context.component.type + '/'+ this.context.component.uniqueId +'/interfaces/' + this.context.interface.interfaceUniqueId + '/operations/' +this.context.interface.operationUniqueId ; - return util.request(this.context, 'DELETE', path, null, false, 'catalog'); + return util.request(this.context, 'DELETE', path, null, 'catalog'); }); When('I want to checkin this component', function () { let path = '/catalog/'+ this.context.component.type + '/' + this.context.component.uniqueId + '/lifecycleState/CHECKIN' ; let inputData = {userRemarks: 'checkin'}; - return util.request(this.context, 'POST', path, inputData, false, 'catalog').then((result)=> { + return util.request(this.context, 'POST', path, inputData, 'catalog').then((result)=> { this.context.component = {uniqueId : result.data.uniqueId, type : this.context.component.type}; }); }); @@ -135,7 +135,7 @@ When('I want to checkin this component', function () { Then('I want to submit this component', function () { let path = '/catalog/'+ this.context.component.type + '/' + this.context.component.uniqueId + '/lifecycleState/certificationRequest' ; let inputData = {userRemarks: 'submit'}; - return util.request(this.context, 'POST', path, inputData, false, 'catalog').then((result)=> { + return util.request(this.context, 'POST', path, inputData, 'catalog').then((result)=> { this.context.component = {uniqueId : result.data.uniqueId}; }); }); @@ -143,7 +143,7 @@ Then('I want to submit this component', function () { Then('I want to certify this component', function () { let path = '/catalog/'+ this.context.component.type +'/' + this.context.component.uniqueId + '/lifecycleState/certify' ; let inputData = {userRemarks: 'certify'}; - return util.request(this.context, 'POST', path, inputData, false, 'catalog').then((result)=> { + return util.request(this.context, 'POST', path, inputData, 'catalog').then((result)=> { this.context.component = {uniqueId : result.data.uniqueId}; }); }); \ No newline at end of file diff --git a/cucumber-js-test-apis-ci/stepDefinitions/Item_steps.js b/cucumber-js-test-apis-ci/stepDefinitions/Item_steps.js index 3ff7f20f73..6f2c0872af 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/Item_steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/Item_steps.js @@ -15,7 +15,7 @@ */ const {Then, When} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); /** * @module Item * @description uses item id and version id from context diff --git a/cucumber-js-test-apis-ci/stepDefinitions/NetworkPackage_steps.js b/cucumber-js-test-apis-ci/stepDefinitions/NetworkPackage_steps.js index 731d5b8470..cdb5cbe07d 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/NetworkPackage_steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/NetworkPackage_steps.js @@ -15,7 +15,7 @@ */ const {Then, When} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); const _ = require('lodash'); const fs = require('fs'); require('node-zip'); @@ -28,7 +28,7 @@ require('node-zip'); **/ Then('I want to upload a NetworkPackage for this VSP from path {string}', function (string) { let path = '/vendor-software-products/' + this.context.item.id + '/versions/' + this.context.item.versionId + '/orchestration-template-candidate'; - return util.request(this.context, 'POST', path, string, true); + return util.requestBinaryFormData(this.context, 'POST', path, string, 'upload'); }); /** @@ -37,9 +37,9 @@ Then('I want to upload a NetworkPackage for this VSP from path {string}', functi * @exampleFile Example_HEAT.feature * @step I want to download the NetworkPackage for this VSP to path {string} **/ -When('I want to download the NetworkPackage for this VSP to path {string}', function (string, callback) { +When('I want to download the NetworkPackage for this VSP to path {string}', function (string) { let path = '/vendor-software-products/' + this.context.item.id + '/versions/' + this.context.item.versionId + '/orchestration-template-candidate'; - return [util.download(this.context, path, string, callback)]; + return util.download(this.context, path, string); }); /** diff --git a/cucumber-js-test-apis-ci/stepDefinitions/Questionnaire_steps.js b/cucumber-js-test-apis-ci/stepDefinitions/Questionnaire_steps.js index 2e169fadc8..8da747eadb 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/Questionnaire_steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/Questionnaire_steps.js @@ -15,7 +15,7 @@ */ const {Then, When} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); const _ = require('lodash'); function getPath(path, context) { diff --git a/cucumber-js-test-apis-ci/stepDefinitions/REST_Steps.js b/cucumber-js-test-apis-ci/stepDefinitions/REST_Steps.js index c3844124d7..4671f36db5 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/REST_Steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/REST_Steps.js @@ -15,7 +15,7 @@ */ const {When} = require('cucumber'); const _ = require('lodash'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); _.templateSettings.interpolate = /{([\s\S]+?)}/g; function getPath(path, context) { diff --git a/cucumber-js-test-apis-ci/stepDefinitions/Toggle_Steps.js b/cucumber-js-test-apis-ci/stepDefinitions/Toggle_Steps.js index 16bcc2afb9..8b416fc07d 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/Toggle_Steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/Toggle_Steps.js @@ -16,7 +16,7 @@ const {Then, When, Given} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); /** diff --git a/cucumber-js-test-apis-ci/stepDefinitions/Utils.js b/cucumber-js-test-apis-ci/stepDefinitions/Utils.js deleted file mode 100644 index 66e959f6e5..0000000000 --- a/cucumber-js-test-apis-ci/stepDefinitions/Utils.js +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright © 2016-2017 European Support Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -const request = require('request'); -const fs = require('fs'); -require('node-zip'); - -function _request(context, method, path, data, isBinary=false, type='onboarding') { - let server = context.getUrlForType(type); - - let options = { - method: method, - url: server + path, - headers: context.headers[type] - }; - console.log('--> Calling REST ' + options.method +' url: ' + options.url); - - return new Promise(function (resolve, reject) { - if (method === 'POST' || method === 'PUT') { - if (isBinary) { - var formData = { - upload: fs.createReadStream(data), - }; - options.formData = formData; - } else { - options.json = data; - } - } - request(options, function (err, result, data) { - context.inputData = null; - if (err) { - console.error('Request URL: ' + result.request.uri.href); - console.error('Request Method: ' + result.request.method); - console.error('Response Status Code: ' +result.statusCode); - console.log(err); - reject(err); - } else { - let isExpected = (context.shouldFail) ? (result.statusCode != 200 && result.statusCode != 201) : (result.statusCode == 200 || result.statusCode == 201); - if (!isExpected) { - console.error('Request URL: ' + result.request.uri.href); - console.error('Request Method: ' + result.request.method); - console.error('Response Status Code: ' +result.statusCode); - console.error(result.body); - reject('Status Code was ' + result.statusCode); - } - if (context.shouldFail && context.errorCode) { - if (typeof data === 'string' && data) { - data = JSON.parse(data); - } - let errorCode = data.errorCode; - let contextErrorCode = context.errorCode; - context.errorCode = null; - if (errorCode !== contextErrorCode) { - reject('Error Code was ' + errorCode + ' instead of ' + contextErrorCode); - } - } - if (context.shouldFail && context.errorMessage) { - if (typeof data === 'string' && data) { - data = JSON.parse(data); - } - let errorMessage = data.message; - let contextErrorMessage = context.errorMessage; - context.errorMessage = null; - if (errorMessage !== contextErrorMessage) { - reject('Error Message was ' + errorMessage + ' instead of ' + contextErrorMessage); - } - } - if (context.shouldFail) { - context.shouldFail = false; - resolve({statusCode: result.statusCode, data: {}}); - return; - } - if (method === 'GET' && isBinary) { - // downloading (NetworkPackage) files - return ({ - blob: blobUtil.createBlob([data], {type: 'text/plain'}), - headers: result.headers - }); - } else { - if (typeof data === 'string' && data) { - data = JSON.parse(data); - } - context.responseData = data; - context.inputData = data; - resolve({statusCode: result.statusCode, data: data}); - } - } - }); - }); -} - -function download(context, path, filePath, callback, type='onboarding') { - let server = context.getUrlForType(type); - let options = { - method: 'GET', - url: server + path, - headers: context.headers[type] - }; - console.log('--> Calling REST download url: ' + options.url); - - var file = fs.createWriteStream(filePath); - var r = request(options).pipe(file); - r.on('error', function (err) { - console.log(err); - callback(err); - }); - r.on('finish', function () { - file.close(); - let zipFile = fs.readFileSync(filePath, 'binary'); - let zip = new JSZip(zipFile, {base64: false, checkCRC32: true}); - if (zip.files['MANIFEST.json']) { - let manifestData = zip.files['MANIFEST.json']._data; - manifestData = manifestData.replace(/\\n/g, ''); - context.responseData = JSON.parse(manifestData); - } - callback(); - }); - -}; - -function _random() { - let d = new Date(); - return d.getTime().toString().split('').reverse().join(''); -} - -function _getJSONFromFile(file) { - return JSON.parse(fs.readFileSync(file, 'utf8')); -} - - -module.exports = { - request: _request, - random : _random, - getJSONFromFile: _getJSONFromFile, - download: download -}; diff --git a/cucumber-js-test-apis-ci/stepDefinitions/VF_steps.js b/cucumber-js-test-apis-ci/stepDefinitions/VF_steps.js index a24a90b0a5..b753105e8a 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/VF_steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/VF_steps.js @@ -15,7 +15,7 @@ */ const {Then, When} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); /** @@ -37,7 +37,7 @@ Then('I want to create a VF for this Item', function () { this.context.inputData.tags[0] = result.data.name; this.context.inputData.vendorName = result.data.vendorName; this.context.inputData.csarUUID = this.context.item.id; - return util.request(this.context, 'POST', '/catalog/resources', this.context.inputData, false, 'catalog'); + return util.request(this.context, 'POST', '/catalog/resources', this.context.inputData, 'catalog'); }); }); diff --git a/cucumber-js-test-apis-ci/stepDefinitions/VLM_steps.js b/cucumber-js-test-apis-ci/stepDefinitions/VLM_steps.js index 35e78b2d97..9990bf2717 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/VLM_steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/VLM_steps.js @@ -15,7 +15,7 @@ */ const {Then, When, Given} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); /** * @module VLM diff --git a/cucumber-js-test-apis-ci/stepDefinitions/VSP_steps.js b/cucumber-js-test-apis-ci/stepDefinitions/VSP_steps.js index b9b928a7f6..2feb29d7a6 100644 --- a/cucumber-js-test-apis-ci/stepDefinitions/VSP_steps.js +++ b/cucumber-js-test-apis-ci/stepDefinitions/VSP_steps.js @@ -15,7 +15,7 @@ */ const {Then, When} = require('cucumber'); const assert = require('assert'); -const util = require('./Utils.js'); +const util = require('../cucumber-common/utils/Utils.js'); const _ = require('lodash'); @@ -107,9 +107,9 @@ Then('I want to add a component', function () { * @exampleFile Example_VSP.feature * @step I want to get the package for this Item to path {string} **/ -When('I want to get the package for this Item to path {string}', function (string, callback) { +When('I want to get the package for this Item to path {string}', function (string) { let path = '/vendor-software-products/packages/' + this.context.item.id; - return [util.download(this.context, path, string, callback)]; + return util.download(this.context, path, string); });