From 400b001d65949fc347d3b514b7192e9330ea3d6c Mon Sep 17 00:00:00 2001 From: Sagar Tiwari Date: Wed, 19 Feb 2020 19:17:53 +0530 Subject: [PATCH 1/6] Added test:stress script --- config/default.js | 5 +- package-lock.json | 868 +++++++++++++++++++++- package.json | 4 +- src/services/ProcessorServiceMilestone.js | 12 +- test/stress/README.md | 17 + test/stress/doTest.js | 300 ++++++++ 6 files changed, 1167 insertions(+), 39 deletions(-) create mode 100644 test/stress/README.md create mode 100644 test/stress/doTest.js diff --git a/config/default.js b/config/default.js index 46d8860..22662da 100644 --- a/config/default.js +++ b/config/default.js @@ -35,5 +35,8 @@ module.exports = { ES_METADATA_INDEX: process.env.ES_METADATA_INDEX || 'metadata', ES_TYPE: process.env.ES_TYPE || 'doc', // ES 6.x accepts only 1 Type per index and it's mandatory to define it ES_METADATA_DEFAULT_ID: process.env.ES_METADATA_DEFAULT_ID || 1 // use for setting default id of metadata - } + }, + + STRESS_BASIC_QTY: process.env.STRESS_BASIC_QTY || 100, + STRESS_TESTER_TIMEOUT: process.env.STRESS_TESTER_TIMEOUT || 80 } diff --git a/package-lock.json b/package-lock.json index d971540..b54b781 100644 --- a/package-lock.json +++ b/package-lock.json @@ -186,11 +186,88 @@ "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.0.tgz", "integrity": "sha1-JjNHCk6r6aR82aRf2yDtX5NAe8o=" }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", + "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "@types/express-jwt": { + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", + "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", + "requires": { + "@types/express": "*", + "@types/express-unless": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz", + "integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==", + "requires": { + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "@types/express-unless": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.1.tgz", + "integrity": "sha512-5fuvg7C69lemNgl0+v+CUxDYWVPSfXHhJPst4yTLcqi4zKJpORCxnDrnnilk3k0DTq/WrAUdvXFs01+vUqUZHw==", + "requires": { + "@types/express": "*" + } + }, "@types/lodash": { "version": "4.14.134", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.134.tgz", "integrity": "sha512-2/O0khFUCFeDlbi7sZ7ZFRCcT812fAeOLm7Ev4KbwASkZ575TDrDcY7YyaoHdTOzKcNbfiwLYZqPmoC4wadrsw==" }, + "@types/mime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" + }, + "@types/node": { + "version": "13.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.2.tgz", + "integrity": "sha512-uvilvAQbdJvnSBFcKJ2td4016urcGvsiR+N4dHGU87ml8O2Vl6l+ErOi9w0kXSPiwJ1AYlIW+0pDXDWWMOiWbw==" + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + }, + "@types/serve-static": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -224,7 +301,6 @@ "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -299,6 +375,19 @@ "es-abstract": "^1.7.0" } }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -313,6 +402,25 @@ "lodash": "^4.17.11" } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "auth0-js": { + "version": "9.12.2", + "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.12.2.tgz", + "integrity": "sha512-0VfPu5UcgkGKQc7Q8KPqgkqqhLgXGsDCro2tde7hHPYK9JEzOyq82v0szUTHWlwQE1VT8K2/qZAsGDf7hFjI7g==", + "requires": { + "base64-js": "^1.3.0", + "idtoken-verifier": "^2.0.1", + "js-cookie": "^2.2.0", + "qs": "^6.7.0", + "superagent": "^3.8.3", + "url-join": "^4.0.1", + "winchan": "^0.2.2" + } + }, "aws-sdk": { "version": "2.480.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.480.0.tgz", @@ -329,6 +437,24 @@ "xml2js": "0.4.19" } }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "axios": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.12.0.tgz", + "integrity": "sha1-uQewIhzDTsHJ+sGOx/B935V4W6Q=", + "requires": { + "follow-redirects": "0.0.7" + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -340,17 +466,40 @@ "js-tokens": "^3.0.2" } }, + "babel-runtime": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.6.1.tgz", + "integrity": "sha1-eIuUtvY04luRvWxd9y1GdFevsAA=", + "requires": { + "core-js": "^2.1.0" + } + }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "requires": { + "precond": "0.2" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, "bin-protocol": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/bin-protocol/-/bin-protocol-3.1.1.tgz", @@ -387,7 +536,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -414,6 +562,22 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "bunyan": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", + "requires": { + "dtrace-provider": "~0.8", + "moment": "^2.10.6", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -452,6 +616,11 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -545,6 +714,21 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "codependency": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/codependency/-/codependency-0.1.4.tgz", + "integrity": "sha1-0XY6tyZL1wyR2WJumIYtN5K/jUo=", + "requires": { + "semver": "5.0.1" + }, + "dependencies": { + "semver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.1.tgz", + "integrity": "sha1-n7P0AE+QDYPEeWj+QvdYPgWDLMk=" + } + } + }, "color": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", @@ -595,6 +779,14 @@ "text-hex": "1.0.x" } }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", @@ -608,11 +800,15 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "config": { "version": "3.1.0", @@ -665,6 +861,16 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -696,6 +902,19 @@ "which": "^1.2.9" } }, + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -778,6 +997,11 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -813,6 +1037,39 @@ "esutils": "^2.0.2" } }, + "dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "optional": true, + "requires": { + "nan": "^2.14.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + } + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -909,6 +1166,11 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1422,6 +1684,11 @@ "vary": "~1.1.2" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -1433,17 +1700,20 @@ "tmp": "^0.0.33" } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", @@ -1549,6 +1819,15 @@ "write": "^0.2.1" } }, + "follow-redirects": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz", + "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=", + "requires": { + "debug": "^2.2.0", + "stream-consume": "^0.1.0" + } + }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -1571,6 +1850,26 @@ } } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -1631,6 +1930,14 @@ "pump": "^3.0.0" } }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -1677,6 +1984,20 @@ } } }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1758,6 +2079,16 @@ "toidentifier": "1.0.0" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -1774,6 +2105,19 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "idtoken-verifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/idtoken-verifier/-/idtoken-verifier-2.0.1.tgz", + "integrity": "sha512-sLLFPPc6D6Ske7JNHHrrWHbQKuY1OJN9GcJd6Y1LjMvInJBr26Axbo6o07JYPPTRUzJahBWHudabgFoNo23lMw==", + "requires": { + "base64-js": "^1.3.0", + "crypto-js": "^3.1.9-1", + "es6-promise": "^4.2.8", + "jsbn": "^1.1.0", + "unfetch": "^4.1.0", + "url-join": "^4.0.1" + } + }, "ieee754": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", @@ -1795,7 +2139,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1942,6 +2285,11 @@ "has-symbols": "^1.0.0" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1968,6 +2316,11 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", @@ -2082,6 +2435,11 @@ "topo": "3.x.x" } }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -2098,17 +2456,26 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -2116,6 +2483,11 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -2124,6 +2496,34 @@ "minimist": "^1.2.0" } }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "jsx-ast-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", @@ -2133,6 +2533,49 @@ "array-includes": "^3.0.3" } }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jwks-rsa": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.7.0.tgz", + "integrity": "sha512-tq7DVJt9J6wTvl9+AQfwZIiPSuY2Vf0F+MovfRTFuBqLB1xgDVhegD33ChEAQ6yBv9zFvUIyj4aiwrSA5VehUw==", + "requires": { + "@types/express-jwt": "0.0.42", + "debug": "^4.1.0", + "jsonwebtoken": "^8.5.1", + "limiter": "^1.1.4", + "lru-memoizer": "^2.0.1", + "ms": "^2.1.2", + "request": "^2.88.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "kuler": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", @@ -2150,6 +2593,26 @@ "invert-kv": "^2.0.0" } }, + "le_node": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/le_node/-/le_node-1.8.0.tgz", + "integrity": "sha512-NXzjxBskZ4QawTNwlGdRG05jYU0LhV2nxxmP3x7sRMHyROV0jPdyyikO9at+uYrWX3VFt0Y/am11oKITedx0iw==", + "requires": { + "babel-runtime": "6.6.1", + "codependency": "0.1.4", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.11", + "reconnect-core": "1.3.0", + "semver": "5.1.0" + }, + "dependencies": { + "semver": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" + } + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -2160,6 +2623,11 @@ "type-check": "~0.3.2" } }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -2195,12 +2663,52 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -2277,6 +2785,26 @@ "yallist": "^2.1.2" } }, + "lru-memoizer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.0.tgz", + "integrity": "sha512-oKjxgJhL+m1wfEkez7/a6iyRZUdohej+2u04qCaAQ7BBfx/qD4RH3jOQhPsd8Y3pcm7IhcNtE3kCEIDCMPiJFQ==", + "requires": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "~4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", + "requires": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + } + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -2339,6 +2867,11 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "millisecond": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/millisecond/-/millisecond-0.1.2.tgz", + "integrity": "sha1-bMWtOGJByrjniv+WT4cCjuyS2sU=" + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -2367,7 +2900,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2381,7 +2913,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" }, @@ -2389,8 +2920,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } }, @@ -2465,6 +2995,11 @@ } } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2481,12 +3016,59 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "^6.0.1" + } + } + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -2605,6 +3187,11 @@ "yargs-parser": "^13.0.0" } }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2651,7 +3238,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -2819,8 +3405,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -2868,6 +3453,11 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -2955,6 +3545,11 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -3000,8 +3595,12 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" }, "pump": { "version": "3.0.0", @@ -3081,6 +3680,14 @@ "util-deprecate": "^1.0.1" } }, + "reconnect-core": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reconnect-core/-/reconnect-core-1.3.0.tgz", + "integrity": "sha1-+65SkZp4d9hE4yRtAaLyZwHIM8g=", + "requires": { + "backoff": "~2.5.0" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -3096,6 +3703,50 @@ "es6-error": "^4.0.1" } }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3189,6 +3840,12 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -3202,8 +3859,7 @@ "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" }, "send": { "version": "0.17.1", @@ -3355,6 +4011,29 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + } + } + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -3394,6 +4073,11 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3455,6 +4139,55 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -3511,6 +4244,21 @@ } } }, + "tc-core-library-js": { + "version": "github:appirio-tech/tc-core-library-js#d16413db30b1eed21c0cf426e185bedb2329ddab", + "from": "github:appirio-tech/tc-core-library-js#v2.6", + "requires": { + "auth0-js": "^9.4.2", + "axios": "^0.12.0", + "bunyan": "^1.8.12", + "jsonwebtoken": "^8.3.0", + "jwks-rsa": "^1.3.0", + "le_node": "^1.3.1", + "lodash": "^4.17.10", + "millisecond": "^0.1.2", + "request": "^2.88.0" + } + }, "test-exclude": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", @@ -3570,6 +4318,22 @@ "hoek": "6.x.x" } }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -3581,6 +4345,19 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -3625,6 +4402,11 @@ } } }, + "unfetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.1.0.tgz", + "integrity": "sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg==" + }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", @@ -3640,7 +4422,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" }, @@ -3648,8 +4429,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" } } }, @@ -3662,6 +4442,19 @@ "querystring": "0.2.0" } }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, + "urlencode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/urlencode/-/urlencode-1.1.0.tgz", + "integrity": "sha1-HyuibwE8hfATP3o61v8nMK33y7c=", + "requires": { + "iconv-lite": "~0.4.11" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3692,6 +4485,16 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -3716,6 +4519,11 @@ "string-width": "^1.0.2 || 2" } }, + "winchan": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.2.2.tgz", + "integrity": "sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ==" + }, "winston": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", @@ -3806,8 +4614,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", @@ -3866,8 +4673,7 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "13.2.2", diff --git a/package.json b/package.json index 6745ef8..c273b7b 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "sync:es": "node migrations/elasticsearch_sync.js", "view-data": "node test/common/view-data.js", "test": "NODE_ENV=test npm run sync:es && mocha test/e2e/*.test.js --timeout 30000 --exit && NODE_ENV=test npm run sync:es", - "test:cov": "nyc --reporter=html --reporter=text npm test" + "test:cov": "nyc --reporter=html --reporter=text npm test", + "test:stress": "npm run sync:es && node test/stress/doTest.js" }, "author": "TCSCODER", "license": "none", @@ -29,6 +30,7 @@ "http-aws-es": "^6.0.0", "joi": "^14.3.1", "lodash": "^4.17.11", + "moment": "^2.24.0", "no-kafka": "^3.4.3", "tc-core-library-js": "github:appirio-tech/tc-core-library-js#v2.6", "topcoder-healthcheck-dropin": "^1.0.3", diff --git a/src/services/ProcessorServiceMilestone.js b/src/services/ProcessorServiceMilestone.js index 9fa1d6c..e6e26ce 100644 --- a/src/services/ProcessorServiceMilestone.js +++ b/src/services/ProcessorServiceMilestone.js @@ -93,9 +93,9 @@ async function create (message) { // one ES index call instead of multiple calls. Otherwise ES may fail with error `version conflict`. // This would be turned on back, as soon as we get rid of such cascading updates inside Project Service. // - // await helper.updateTimelineESPromise(message.timelineId, updateDocPromise) - // logger.debug(`Milestone created successfully in elasticsearch index, (milestoneId: ${message.id})`) - logger.debug(`TEMPORARY SKIPPED: Milestone created successfully in elasticsearch index, (milestoneId: ${message.id})`) + await helper.updateTimelineESPromise(message.timelineId, updateDocPromise) + logger.debug(`Milestone created successfully in elasticsearch index, (milestoneId: ${message.id})`) + // logger.debug(`TEMPORARY SKIPPED: Milestone created successfully in elasticsearch index, (milestoneId: ${message.id})`) } create.schema = { @@ -124,9 +124,9 @@ async function update (message) { // one ES index call instead of multiple calls. Otherwise ES may fail with error `version conflict`. // This would be turned on back, as soon as we get rid of such cascading updates inside Project Service. // - // await helper.updateTimelineESPromise(message.timelineId, updateDocPromise) - // logger.debug(`Milestone updated successfully in elasticsearch index, (milestoneId: ${message.id})`) - logger.debug(`TEMPORARY SKIPPED: Milestone updated successfully in elasticsearch index, (milestoneId: ${message.id})`) + await helper.updateTimelineESPromise(message.timelineId, updateDocPromise) + logger.debug(`Milestone updated successfully in elasticsearch index, (milestoneId: ${message.id})`) + // logger.debug(`TEMPORARY SKIPPED: Milestone updated successfully in elasticsearch index, (milestoneId: ${message.id})`) } update.schema = { diff --git a/test/stress/README.md b/test/stress/README.md new file mode 100644 index 0000000..04a9d51 --- /dev/null +++ b/test/stress/README.md @@ -0,0 +1,17 @@ +## Configuration + +* STRESS_BASIC_QTY: As requested in challenge description + +* STRESS_TESTER_TIMEOUT: Number of seconds to wait after queueing create/update/delete requests +and before validating data. Default is 80s, which is enough for `STRESS_BASIC_QTY=100`. This +might have to be increased if `STRESS_BASIC_QTY` is higher than 100. + +## Validation + +* Start processor: + + npm start + +* Run `npm run test:stress` + +Saves ids of milestones not updated/created/deleted to `test/stress/stress_test_errors.json` diff --git a/test/stress/doTest.js b/test/stress/doTest.js new file mode 100644 index 0000000..efd65d2 --- /dev/null +++ b/test/stress/doTest.js @@ -0,0 +1,300 @@ +global.Promise = require('bluebird') +const config = require('config') +const Kafka = require('no-kafka') +const helper = require('../../src/common/helper') +const testHelper = require('../common/testHelper') +const _ = require('lodash') +const moment = require('moment') +const constants = require('../../src/constants') +const fs = require('fs') + +const producer = new Kafka.Producer({ + connectionString: config.KAFKA_URL, + handlerConcurrency: 1, + groupId: "project-api" +}) + +const es_client = helper.getESClient() + +async function createTimeline() { + let now = moment().format(); + + const timeline_payload = { + "resource": constants.RESOURCES.TIMELINE, + "createdAt": now, + "updatedAt": now, + "timestamp": now, + "id": "1", + "name": "stress test timeline", + "description": "description", + "startDate": now, + "endDate": moment().add(7, "days").format(), + "reference": "project", + "referenceId": 1, + "createdBy": 40051336, + "updatedBy": 40051336, + "milestones": [] + } + + const last_end_date = moment().add(3, "hours") + + _.forEach(_.range(1, config.STRESS_BASIC_QTY * 2 + 1), (i) => { + + const milestone_payload = { + "resource": constants.RESOURCES.MILESTONE, + "timelineId": "1", + "createdAt": now, + "updatedAt": now, + "startDate": last_end_date.format(), + "createdBy": 40051333, + "updatedBy": 40051333, + "hidden": false, + "id": i, + "name": "original milestone " + i, + "description": "description", + "duration": 3, + "completionDate": "2021-06-30T00:00:00.000Z", + "status": "open", + "type": "type3", + "details": { + "detail1": { + "subDetail1C": 3 + }, + "detail2": [ + 2, + 3, + 4 + ] + }, + "order": 1, + "plannedText": "plannedText 3", + "activeText": "activeText 3", + "completedText": "completedText 3", + "blockedText": "blockedText 3", + "actualStartDate": null + } + + last_end_date.add(4, "hours") + + milestone_payload.endDate = last_end_date.format() + + timeline_payload.milestones.push(milestone_payload) + }) + + return es_client.create({ + index: config.get('esConfig.ES_TIMELINE_INDEX'), + type: config.get('esConfig.ES_TYPE'), + id: "1", + body: timeline_payload + }) +} + +function shuffleArray(array) { + for (var i = array.length - 1; i > 0; i--) { + var j = Math.floor(Math.random() * (i + 1)); + var temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + return array +} + +async function deleteMilestones(ids) { + const deletion_requests = _.map(ids, (i) => { + + const payload = { + "resource": constants.RESOURCES.MILESTONE, + "timelineId": "1", + "id": i + } + + const delete_msg = { + "topic": config.DELETE_DATA_TOPIC, + "originator": "project-api", + "timestamp": moment().format(), + "mime-type": "application/json", + "payload": payload + } + return producer.send({ + "topic": config.DELETE_DATA_TOPIC, + "message": { + "value": JSON.stringify(delete_msg) + } + }) + }) + return Promise.all(deletion_requests) +} + +async function updateMilestones(ids) { + const now = moment().format() + + const update_requests = _.map(ids, (i) => { + + const payload = { + "resource": constants.RESOURCES.MILESTONE, + "timelineId": "1", + "id": i, + "name": "updated milestone " + i, + "duration": 4, + "status": "open", + "type": "type3", + "order": 1, + "plannedText": "planned text 3", + "activeText": "active text 3", + "completedText": " completed text 3", + "blockedText": "blocked text 3" + } + const update_msg = { + "topic": config.UPDATE_DATA_TOPIC, + "originator": "project-api", + "timestamp": moment().format(), + "mime-type": "application/json", + "payload": payload + } + return producer.send({ + "topic": config.UPDATE_DATA_TOPIC, + "message": { + "value": JSON.stringify(update_msg) + } + }) + }) + + return Promise.all(update_requests) +} + +async function createNewMilestones(ids) { + const now = moment().format() + const last_end_date = moment().add(10, "hours") + + const milestone_create_requests = _.map(ids, (i) => { + + const milestone_payload = { + "resource": constants.RESOURCES.MILESTONE, + "timelineId": "1", + "createdAt": now, + "updatedAt": now, + "startDate": last_end_date.format(), + "createdBy": 40051333, + "updatedBy": 40051333, + "hidden": false, + "id": i, + "name": "new milestone " + i, + "description": "description", + "duration": 3, + "completionDate": "2021-06-30T00:00:00.000Z", + "status": "open", + "type": "type3", + "details": { + "detail1": { + "subDetail1C": 3 + }, + "detail2": [ + 2, + 3, + 4 + ] + }, + "order": 1, + "plannedText": "plannedText 3", + "activeText": "activeText 3", + "completedText": "completedText 3", + "blockedText": "blockedText 3", + "actualStartDate": null + } + + last_end_date.add(4, "hours") + + milestone_payload.endDate = last_end_date.format() + + const create_msg = { + "topic": config.CREATE_DATA_TOPIC, + "originator": "project-api", + "timestamp": moment().format(), + "mime-type": "application/json", + "payload": milestone_payload + } + + return producer.send({ + "topic": config.CREATE_DATA_TOPIC, + "message": { + "value": JSON.stringify(create_msg) + } + }) + }) + + return Promise.all(milestone_create_requests) +} + +async function sleep(n) { + return new Promise((resolve) => { + setTimeout(resolve, n) + }) +} + +async function main() { + await producer.init() + await createTimeline() + + console.log(`waiting for 5 seconds for timeline to be created`) + await sleep(5000) + console.log("queueing milestone operations") + + const ids = shuffleArray(_.range(1, config.STRESS_BASIC_QTY * 2 + 1)) + const ids_to_delete = ids.slice(0, config.STRESS_BASIC_QTY) + const ids_to_create = _.map(ids_to_delete, (i) => i + 10000) + const ids_to_update = ids.slice(config.STRESS_BASIC_QTY) + + await Promise.all([ + deleteMilestones(ids_to_delete), + updateMilestones(ids_to_update), + createNewMilestones(ids_to_create) + ]) + + console.log(`waiting for ${config.STRESS_TESTER_TIMEOUT} seconds...`) + await sleep(1000 * config.STRESS_TESTER_TIMEOUT) + + const timeline = await testHelper.getTimelineESData("1") + + const milestones = {} + + _.forEach(timeline.milestones, (ms) => { + milestones[ms.id] = ms + }) + + const errors = { + deletion: [], + updates: [], + creation: [] + } + + _.forEach(ids_to_delete, (i) => { + if (milestones[i]) { + console.log(`milestone with id: ${i} not deleted`) + errors.deletion.push(i) + } + }) + + _.forEach(ids_to_update, (i) => { + if (! (milestones[i] && milestones[i].name == 'updated milestone ' + i)) { + console.log(`milestone with id: ${i} not updated`) + errors.updates.push(i) + } + }) + + _.forEach(ids_to_create, (i) => { + if (! (milestones[i] && milestones[i].name == 'new milestone ' + i)) { + console.log(`milestone with id: ${i} not created`) + errors.creation.push(i) + } + }) + + fs.writeFileSync(__dirname + "/stress_test_errors.json", JSON.stringify(errors, null, 4)) +} + +main().then(() => { + console.log("done") + process.exit(0) +}, (e) => { + console.log(e) + process.exit(1) +}) From 1edcca330c2394d9bffe33f07c59130a088a23d3 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 21 Feb 2020 09:51:10 +0800 Subject: [PATCH 2/6] refactor: stress test code enhancements --- config/default.js | 1 + package.json | 2 +- src/services/ProcessorServiceMilestone.js | 12 - src/services/ProcessorServiceProject.js | 2 +- test/stress/README.md | 26 +- test/stress/doTest.js | 342 +++++++++++----------- test/stress/stress_test_errors.json | 5 + 7 files changed, 188 insertions(+), 202 deletions(-) create mode 100644 test/stress/stress_test_errors.json diff --git a/config/default.js b/config/default.js index 22662da..aa3e3df 100644 --- a/config/default.js +++ b/config/default.js @@ -37,6 +37,7 @@ module.exports = { ES_METADATA_DEFAULT_ID: process.env.ES_METADATA_DEFAULT_ID || 1 // use for setting default id of metadata }, + // configuration for the stress test, see `test/stress/README.md` STRESS_BASIC_QTY: process.env.STRESS_BASIC_QTY || 100, STRESS_TESTER_TIMEOUT: process.env.STRESS_TESTER_TIMEOUT || 80 } diff --git a/package.json b/package.json index c273b7b..5b0fe5e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "view-data": "node test/common/view-data.js", "test": "NODE_ENV=test npm run sync:es && mocha test/e2e/*.test.js --timeout 30000 --exit && NODE_ENV=test npm run sync:es", "test:cov": "nyc --reporter=html --reporter=text npm test", - "test:stress": "npm run sync:es && node test/stress/doTest.js" + "test:stress": "NODE_ENV=test npm run sync:es && NODE_ENV=test node test/stress/doTest.js" }, "author": "TCSCODER", "license": "none", diff --git a/src/services/ProcessorServiceMilestone.js b/src/services/ProcessorServiceMilestone.js index e6e26ce..128457a 100644 --- a/src/services/ProcessorServiceMilestone.js +++ b/src/services/ProcessorServiceMilestone.js @@ -88,14 +88,8 @@ async function create (message) { return _.assign(doc._source, { milestones }) } - // NOTE Disable indexing milestones when create at the moment, as it's now being indexed inside Project Service. - // It's because adding a milestones may cause cascading updates of other milestones and in such cases we are doing - // one ES index call instead of multiple calls. Otherwise ES may fail with error `version conflict`. - // This would be turned on back, as soon as we get rid of such cascading updates inside Project Service. - // await helper.updateTimelineESPromise(message.timelineId, updateDocPromise) logger.debug(`Milestone created successfully in elasticsearch index, (milestoneId: ${message.id})`) - // logger.debug(`TEMPORARY SKIPPED: Milestone created successfully in elasticsearch index, (milestoneId: ${message.id})`) } create.schema = { @@ -119,14 +113,8 @@ async function update (message) { return _.assign(doc._source, { milestones }) } - // NOTE Disable indexing milestones when update at the moment, as it's now being indexed inside Project Service. - // It's because updating a milestones may cause cascading updates of other milestones and in such cases we are doing - // one ES index call instead of multiple calls. Otherwise ES may fail with error `version conflict`. - // This would be turned on back, as soon as we get rid of such cascading updates inside Project Service. - // await helper.updateTimelineESPromise(message.timelineId, updateDocPromise) logger.debug(`Milestone updated successfully in elasticsearch index, (milestoneId: ${message.id})`) - // logger.debug(`TEMPORARY SKIPPED: Milestone updated successfully in elasticsearch index, (milestoneId: ${message.id})`) } update.schema = { diff --git a/src/services/ProcessorServiceProject.js b/src/services/ProcessorServiceProject.js index 1f5568d..becf604 100644 --- a/src/services/ProcessorServiceProject.js +++ b/src/services/ProcessorServiceProject.js @@ -47,7 +47,7 @@ function createSchema () { createdAt: Joi.date(), createdBy: Joi.number().integer().positive(), updatedAt: Joi.date(), - updatedBy: Joi.number().integer().positive(), + updatedBy: Joi.number().integer().positive() })).optional().allow(null), external: Joi.object().keys({ id: Joi.string(), diff --git a/test/stress/README.md b/test/stress/README.md index 04a9d51..f7c19ad 100644 --- a/test/stress/README.md +++ b/test/stress/README.md @@ -1,17 +1,25 @@ ## Configuration -* STRESS_BASIC_QTY: As requested in challenge description +* `STRESS_BASIC_QTY`: As requested in challenge description -* STRESS_TESTER_TIMEOUT: Number of seconds to wait after queueing create/update/delete requests -and before validating data. Default is 80s, which is enough for `STRESS_BASIC_QTY=100`. This -might have to be increased if `STRESS_BASIC_QTY` is higher than 100. +* `STRESS_TESTER_TIMEOUT`: Number of seconds to wait after queueing create/update/delete requests and before validating data. Default is 80s, which is enough for `STRESS_BASIC_QTY=100`. This might have to be increased if `STRESS_BASIC_QTY` is higher than 100. -## Validation +## Run -* Start processor: +* Start processor - npm start + It should point the **test** ES, so set `NODE_ENV=test`. -* Run `npm run test:stress` + ``` + NODE_ENV=test npm start + ``` -Saves ids of milestones not updated/created/deleted to `test/stress/stress_test_errors.json` +* Run stress test + + It would test using **test** ES, as this command sets `NODE_ENV=test`. + + ``` + npm run test:stress + ``` + +I would save ids of milestones not updated/created/deleted to `test/stress/stress_test_errors.json` diff --git a/test/stress/doTest.js b/test/stress/doTest.js index efd65d2..5cb4720 100644 --- a/test/stress/doTest.js +++ b/test/stress/doTest.js @@ -6,254 +6,249 @@ const testHelper = require('../common/testHelper') const _ = require('lodash') const moment = require('moment') const constants = require('../../src/constants') -const fs = require('fs') const producer = new Kafka.Producer({ connectionString: config.KAFKA_URL, handlerConcurrency: 1, - groupId: "project-api" + groupId: 'project-api' }) -const es_client = helper.getESClient() - -async function createTimeline() { - let now = moment().format(); - - const timeline_payload = { - "resource": constants.RESOURCES.TIMELINE, - "createdAt": now, - "updatedAt": now, - "timestamp": now, - "id": "1", - "name": "stress test timeline", - "description": "description", - "startDate": now, - "endDate": moment().add(7, "days").format(), - "reference": "project", - "referenceId": 1, - "createdBy": 40051336, - "updatedBy": 40051336, - "milestones": [] +const esClient = helper.getESClient() + +async function createTimeline () { + let now = moment().format() + + const timelinePayload = { + 'resource': constants.RESOURCES.TIMELINE, + 'createdAt': now, + 'updatedAt': now, + 'timestamp': now, + 'id': '1', + 'name': 'stress test timeline', + 'description': 'description', + 'startDate': now, + 'endDate': moment().add(7, 'days').format(), + 'reference': 'project', + 'referenceId': 1, + 'createdBy': 40051336, + 'updatedBy': 40051336, + 'milestones': [] } - const last_end_date = moment().add(3, "hours") + const lastEndDate = moment().add(3, 'hours') _.forEach(_.range(1, config.STRESS_BASIC_QTY * 2 + 1), (i) => { - - const milestone_payload = { - "resource": constants.RESOURCES.MILESTONE, - "timelineId": "1", - "createdAt": now, - "updatedAt": now, - "startDate": last_end_date.format(), - "createdBy": 40051333, - "updatedBy": 40051333, - "hidden": false, - "id": i, - "name": "original milestone " + i, - "description": "description", - "duration": 3, - "completionDate": "2021-06-30T00:00:00.000Z", - "status": "open", - "type": "type3", - "details": { - "detail1": { - "subDetail1C": 3 + const milestonePayload = { + 'resource': constants.RESOURCES.MILESTONE, + 'timelineId': '1', + 'createdAt': now, + 'updatedAt': now, + 'startDate': lastEndDate.format(), + 'createdBy': 40051333, + 'updatedBy': 40051333, + 'hidden': false, + 'id': i, + 'name': 'original milestone ' + i, + 'description': 'description', + 'duration': 3, + 'completionDate': '2021-06-30T00:00:00.000Z', + 'status': 'open', + 'type': 'type3', + 'details': { + 'detail1': { + 'subDetail1C': 3 }, - "detail2": [ + 'detail2': [ 2, 3, 4 ] }, - "order": 1, - "plannedText": "plannedText 3", - "activeText": "activeText 3", - "completedText": "completedText 3", - "blockedText": "blockedText 3", - "actualStartDate": null + 'order': 1, + 'plannedText': 'plannedText 3', + 'activeText': 'activeText 3', + 'completedText': 'completedText 3', + 'blockedText': 'blockedText 3', + 'actualStartDate': null } - last_end_date.add(4, "hours") + lastEndDate.add(4, 'hours') - milestone_payload.endDate = last_end_date.format() + milestonePayload.endDate = lastEndDate.format() - timeline_payload.milestones.push(milestone_payload) + timelinePayload.milestones.push(milestonePayload) }) - return es_client.create({ + return esClient.create({ index: config.get('esConfig.ES_TIMELINE_INDEX'), type: config.get('esConfig.ES_TYPE'), - id: "1", - body: timeline_payload + id: '1', + body: timelinePayload, + refresh: 'wait_for' }) } -function shuffleArray(array) { +function shuffleArray (array) { for (var i = array.length - 1; i > 0; i--) { - var j = Math.floor(Math.random() * (i + 1)); - var temp = array[i]; - array[i] = array[j]; - array[j] = temp; + var j = Math.floor(Math.random() * (i + 1)) + var temp = array[i] + array[i] = array[j] + array[j] = temp } return array } -async function deleteMilestones(ids) { - const deletion_requests = _.map(ids, (i) => { - +async function deleteMilestones (ids) { + const deletionRequests = _.map(ids, (i) => { const payload = { - "resource": constants.RESOURCES.MILESTONE, - "timelineId": "1", - "id": i + 'resource': constants.RESOURCES.MILESTONE, + 'timelineId': '1', + 'id': i } - const delete_msg = { - "topic": config.DELETE_DATA_TOPIC, - "originator": "project-api", - "timestamp": moment().format(), - "mime-type": "application/json", - "payload": payload + const deleteMsg = { + 'topic': config.DELETE_DATA_TOPIC, + 'originator': 'project-api', + 'timestamp': moment().format(), + 'mime-type': 'application/json', + 'payload': payload } return producer.send({ - "topic": config.DELETE_DATA_TOPIC, - "message": { - "value": JSON.stringify(delete_msg) + 'topic': config.DELETE_DATA_TOPIC, + 'message': { + 'value': JSON.stringify(deleteMsg) } }) }) - return Promise.all(deletion_requests) + return Promise.all(deletionRequests) } -async function updateMilestones(ids) { +async function updateMilestones (ids) { const now = moment().format() - const update_requests = _.map(ids, (i) => { - + const updateRequests = _.map(ids, (i) => { const payload = { - "resource": constants.RESOURCES.MILESTONE, - "timelineId": "1", - "id": i, - "name": "updated milestone " + i, - "duration": 4, - "status": "open", - "type": "type3", - "order": 1, - "plannedText": "planned text 3", - "activeText": "active text 3", - "completedText": " completed text 3", - "blockedText": "blocked text 3" + 'resource': constants.RESOURCES.MILESTONE, + 'timelineId': '1', + 'id': i, + 'name': 'updated milestone ' + i, + 'duration': 4, + 'status': 'open', + 'type': 'type3', + 'order': 1, + 'plannedText': 'planned text 3', + 'activeText': 'active text 3', + 'completedText': ' completed text 3', + 'blockedText': 'blocked text 3' } - const update_msg = { - "topic": config.UPDATE_DATA_TOPIC, - "originator": "project-api", - "timestamp": moment().format(), - "mime-type": "application/json", - "payload": payload + const updateMsg = { + 'topic': config.UPDATE_DATA_TOPIC, + 'originator': 'project-api', + 'timestamp': now, + 'mime-type': 'application/json', + 'payload': payload } return producer.send({ - "topic": config.UPDATE_DATA_TOPIC, - "message": { - "value": JSON.stringify(update_msg) + 'topic': config.UPDATE_DATA_TOPIC, + 'message': { + 'value': JSON.stringify(updateMsg) } }) }) - return Promise.all(update_requests) + return Promise.all(updateRequests) } -async function createNewMilestones(ids) { +async function createNewMilestones (ids) { const now = moment().format() - const last_end_date = moment().add(10, "hours") - - const milestone_create_requests = _.map(ids, (i) => { - - const milestone_payload = { - "resource": constants.RESOURCES.MILESTONE, - "timelineId": "1", - "createdAt": now, - "updatedAt": now, - "startDate": last_end_date.format(), - "createdBy": 40051333, - "updatedBy": 40051333, - "hidden": false, - "id": i, - "name": "new milestone " + i, - "description": "description", - "duration": 3, - "completionDate": "2021-06-30T00:00:00.000Z", - "status": "open", - "type": "type3", - "details": { - "detail1": { - "subDetail1C": 3 + const lastEndDate = moment().add(10, 'hours') + + const milestoneCreateRequests = _.map(ids, (i) => { + const milestonePayload = { + 'resource': constants.RESOURCES.MILESTONE, + 'timelineId': '1', + 'createdAt': now, + 'updatedAt': now, + 'startDate': lastEndDate.format(), + 'createdBy': 40051333, + 'updatedBy': 40051333, + 'hidden': false, + 'id': i, + 'name': 'new milestone ' + i, + 'description': 'description', + 'duration': 3, + 'completionDate': '2021-06-30T00:00:00.000Z', + 'status': 'open', + 'type': 'type3', + 'details': { + 'detail1': { + 'subDetail1C': 3 }, - "detail2": [ + 'detail2': [ 2, 3, 4 ] }, - "order": 1, - "plannedText": "plannedText 3", - "activeText": "activeText 3", - "completedText": "completedText 3", - "blockedText": "blockedText 3", - "actualStartDate": null + 'order': 1, + 'plannedText': 'plannedText 3', + 'activeText': 'activeText 3', + 'completedText': 'completedText 3', + 'blockedText': 'blockedText 3', + 'actualStartDate': null } - last_end_date.add(4, "hours") + lastEndDate.add(4, 'hours') - milestone_payload.endDate = last_end_date.format() + milestonePayload.endDate = lastEndDate.format() - const create_msg = { - "topic": config.CREATE_DATA_TOPIC, - "originator": "project-api", - "timestamp": moment().format(), - "mime-type": "application/json", - "payload": milestone_payload + const createMsg = { + 'topic': config.CREATE_DATA_TOPIC, + 'originator': 'project-api', + 'timestamp': moment().format(), + 'mime-type': 'application/json', + 'payload': milestonePayload } return producer.send({ - "topic": config.CREATE_DATA_TOPIC, - "message": { - "value": JSON.stringify(create_msg) + 'topic': config.CREATE_DATA_TOPIC, + 'message': { + 'value': JSON.stringify(createMsg) } }) }) - return Promise.all(milestone_create_requests) + return Promise.all(milestoneCreateRequests) } -async function sleep(n) { +async function sleep (n) { return new Promise((resolve) => { setTimeout(resolve, n) }) } -async function main() { +async function main () { await producer.init() + console.log('Creating initial data...') await createTimeline() - - console.log(`waiting for 5 seconds for timeline to be created`) - await sleep(5000) - console.log("queueing milestone operations") + console.log('Initial data is created.') const ids = shuffleArray(_.range(1, config.STRESS_BASIC_QTY * 2 + 1)) - const ids_to_delete = ids.slice(0, config.STRESS_BASIC_QTY) - const ids_to_create = _.map(ids_to_delete, (i) => i + 10000) - const ids_to_update = ids.slice(config.STRESS_BASIC_QTY) + const idsToDelete = ids.slice(0, config.STRESS_BASIC_QTY) + const idsToCreate = _.map(idsToDelete, (i) => i + 10000) + const idsToUpdate = ids.slice(config.STRESS_BASIC_QTY) + console.log('Running multiple operations...') await Promise.all([ - deleteMilestones(ids_to_delete), - updateMilestones(ids_to_update), - createNewMilestones(ids_to_create) + deleteMilestones(idsToDelete), + updateMilestones(idsToUpdate), + createNewMilestones(idsToCreate) ]) - console.log(`waiting for ${config.STRESS_TESTER_TIMEOUT} seconds...`) + console.log(`Waiting for ${config.STRESS_TESTER_TIMEOUT} seconds before validating the result data...`) await sleep(1000 * config.STRESS_TESTER_TIMEOUT) - const timeline = await testHelper.getTimelineESData("1") + const timeline = await testHelper.getTimelineESData('1') const milestones = {} @@ -261,38 +256,27 @@ async function main() { milestones[ms.id] = ms }) - const errors = { - deletion: [], - updates: [], - creation: [] - } - - _.forEach(ids_to_delete, (i) => { + _.forEach(idsToDelete, (i) => { if (milestones[i]) { - console.log(`milestone with id: ${i} not deleted`) - errors.deletion.push(i) + console.error(`milestone with id: ${i} not deleted`) } }) - _.forEach(ids_to_update, (i) => { - if (! (milestones[i] && milestones[i].name == 'updated milestone ' + i)) { - console.log(`milestone with id: ${i} not updated`) - errors.updates.push(i) + _.forEach(idsToUpdate, (i) => { + if (!(milestones[i] && milestones[i].name === 'updated milestone ' + i)) { + console.error(`milestone with id: ${i} not updated`) } }) - _.forEach(ids_to_create, (i) => { - if (! (milestones[i] && milestones[i].name == 'new milestone ' + i)) { - console.log(`milestone with id: ${i} not created`) - errors.creation.push(i) + _.forEach(idsToCreate, (i) => { + if (!(milestones[i] && milestones[i].name === 'new milestone ' + i)) { + console.error(`milestone with id: ${i} not created`) } }) - - fs.writeFileSync(__dirname + "/stress_test_errors.json", JSON.stringify(errors, null, 4)) } main().then(() => { - console.log("done") + console.log('done') process.exit(0) }, (e) => { console.log(e) diff --git a/test/stress/stress_test_errors.json b/test/stress/stress_test_errors.json new file mode 100644 index 0000000..88cc301 --- /dev/null +++ b/test/stress/stress_test_errors.json @@ -0,0 +1,5 @@ +{ + "deletion": [], + "updates": [], + "creation": [] +} \ No newline at end of file From 7427ba5f441d478ffb85b4f7aa1a48502484679e Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 21 Feb 2020 10:13:39 +0800 Subject: [PATCH 3/6] docs: improve stress test doc --- test/stress/README.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/test/stress/README.md b/test/stress/README.md index f7c19ad..6f5f188 100644 --- a/test/stress/README.md +++ b/test/stress/README.md @@ -1,6 +1,20 @@ +# Stress test + +## Overview + +This test is checking if any error would happen if we create, updated and delete milestones in **the same** timeline document in Elasticsearch `timelines` index at the same time. We are sending multiple Kafka events in parallel to trigger create, updated and delete milestone operations. + +1. First, the script should create initial data in the ES index: + - create one timeline in the `timeline` index with `2*STRESS_BASIC_QTY` milestones (it's important that all milestones belong to the same timeline) + +2. After initial data is created start an actual stress test by sending `3*STRESS_BASIC_QTY` Kafka messages in parallel: + - `STRESS_BASIC_QTY` Kafka messages to delete half of the initially created milestones + - `STRESS_BASIC_QTY` Kafka messages to update another half of initially created milestones + - `STRESS_BASIC_QTY` Kafka messages to create `STRESS_BASIC_QTY` new milestones in the same timeline + ## Configuration -* `STRESS_BASIC_QTY`: As requested in challenge description +* `STRESS_BASIC_QTY`: The basic number of objects to use in stress test. * `STRESS_TESTER_TIMEOUT`: Number of seconds to wait after queueing create/update/delete requests and before validating data. Default is 80s, which is enough for `STRESS_BASIC_QTY=100`. This might have to be increased if `STRESS_BASIC_QTY` is higher than 100. @@ -21,5 +35,3 @@ ``` npm run test:stress ``` - -I would save ids of milestones not updated/created/deleted to `test/stress/stress_test_errors.json` From bb75e2231b8b0de26c9c184ccb351a3cf147379a Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 21 Feb 2020 15:31:01 +0800 Subject: [PATCH 4/6] chore: enable unit tests for milestone updates --- test/e2e/processor.timeline.index.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/processor.timeline.index.test.js b/test/e2e/processor.timeline.index.test.js index 33473b5..f162aca 100644 --- a/test/e2e/processor.timeline.index.test.js +++ b/test/e2e/processor.timeline.index.test.js @@ -620,7 +620,7 @@ describe('TC Timeline And Nested Timeline Topic Tests', () => { }) }) -xdescribe('TC Milestone Topic Tests', () => { +describe('TC Milestone Topic Tests', () => { before(async () => { // runs before all tests in this block await ProcessorService.create(timelineCreatedMessage) From aea0d82b2b62ef201682030faab0b3887d469fe2 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Tue, 5 May 2020 13:22:50 +0300 Subject: [PATCH 5/6] chore: updated package-lock with moment --- package-lock.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab544cc..c5fe996 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3084,8 +3084,7 @@ "moment": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "optional": true + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "ms": { "version": "2.1.2", From 6efa8769d238beb245eb37d1890941417aaa2021 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Tue, 5 May 2020 13:23:09 +0300 Subject: [PATCH 6/6] chore: remove redundant log file --- test/stress/stress_test_errors.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 test/stress/stress_test_errors.json diff --git a/test/stress/stress_test_errors.json b/test/stress/stress_test_errors.json deleted file mode 100644 index 88cc301..0000000 --- a/test/stress/stress_test_errors.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "deletion": [], - "updates": [], - "creation": [] -} \ No newline at end of file