@loadmill/executer 0.1.35 → 0.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/errors.d.ts +5 -0
- package/dist/errors.js +38 -0
- package/dist/errors.js.map +1 -0
- package/dist/extraction-combiner.d.ts +4 -2
- package/dist/extraction-combiner.js +96 -46
- package/dist/extraction-combiner.js.map +1 -1
- package/dist/mill-version.js +1 -1
- package/dist/post-script/ast-walker/index.js.map +1 -1
- package/dist/sampler.js +4 -3
- package/dist/sampler.js.map +1 -1
- package/dist/sequence.js +254 -114
- package/dist/sequence.js.map +1 -1
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +29 -0
- package/dist/utils.js.map +1 -0
- package/dist/ws.d.ts +69 -0
- package/dist/ws.js +462 -0
- package/dist/ws.js.map +1 -0
- package/package.json +5 -5
- package/src/errors.ts +10 -0
- package/src/extraction-combiner.ts +15 -4
- package/src/mill-version.ts +1 -1
- package/src/post-script/ast-walker/index.ts +1 -1
- package/src/sampler.ts +4 -3
- package/src/sequence.ts +109 -37
- package/src/utils.ts +8 -0
- package/src/ws.ts +268 -0
- package/test/post-script-executor.spec.ts +24 -24
- package/yarn-error.log +0 -18827
package/dist/sequence.js
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
2
|
var __assign = (this && this.__assign) || function () {
|
|
18
3
|
__assign = Object.assign || function(t) {
|
|
19
4
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
@@ -100,7 +85,6 @@ var clamp_1 = __importDefault(require("lodash/clamp"));
|
|
|
100
85
|
var find_1 = __importDefault(require("lodash/find"));
|
|
101
86
|
var map_1 = __importDefault(require("lodash/map"));
|
|
102
87
|
var filter_1 = __importDefault(require("lodash/filter"));
|
|
103
|
-
var forEach_1 = __importDefault(require("lodash/forEach"));
|
|
104
88
|
var asserter_1 = require("./asserter");
|
|
105
89
|
var failures_1 = require("./failures");
|
|
106
90
|
var request_stats_1 = require("./request-stats");
|
|
@@ -117,9 +101,12 @@ var errors_1 = require("@loadmill/universal/dist/errors");
|
|
|
117
101
|
var parameters_1 = require("@loadmill/core/dist/parameters");
|
|
118
102
|
var conf_1 = require("@loadmill/core/dist/conf");
|
|
119
103
|
var DEFAULT_CACHE_CONTROL = conf_1.confDefaults.DEFAULT_CACHE_CONTROL, DEFAULT_REQUEST_DELAY = conf_1.confDefaults.DEFAULT_REQUEST_DELAY;
|
|
120
|
-
var
|
|
104
|
+
var MAX_RESPONSE_BYTES = conf_1.confExtrema.MAX_RESPONSE_BYTES, MAX_RESPONSE_COLLECT = conf_1.confExtrema.MAX_RESPONSE_COLLECT, MIN_REQUEST_DELAY = conf_1.confExtrema.MIN_REQUEST_DELAY, MAX_REQUEST_LOOPS_ITERATIONS = conf_1.confExtrema.MAX_REQUEST_LOOPS_ITERATIONS;
|
|
121
105
|
var request_1 = require("@loadmill/core/dist/request");
|
|
122
106
|
var test_run_event_emitter_1 = require("./test-run-event-emitter");
|
|
107
|
+
var ws_1 = require("./ws");
|
|
108
|
+
var errors_2 = require("./errors");
|
|
109
|
+
var utils_1 = require("./utils");
|
|
123
110
|
exports.reqIdParamName = 'loadmill-request-id';
|
|
124
111
|
var SOCKET_TIMEOUT = request_1.DEFAULT_REQUEST_TIMEOUT + 5000; // deafult + some extra
|
|
125
112
|
var isPerformance = typeof performance !== 'undefined';
|
|
@@ -205,6 +192,12 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
205
192
|
writable: true,
|
|
206
193
|
value: void 0
|
|
207
194
|
});
|
|
195
|
+
Object.defineProperty(this, "wsHandler", {
|
|
196
|
+
enumerable: true,
|
|
197
|
+
configurable: true,
|
|
198
|
+
writable: true,
|
|
199
|
+
value: void 0
|
|
200
|
+
});
|
|
208
201
|
Object.defineProperty(this, "passStats", {
|
|
209
202
|
enumerable: true,
|
|
210
203
|
configurable: true,
|
|
@@ -218,6 +211,73 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
218
211
|
lastStartedIndex: _this.lastStartedIndex,
|
|
219
212
|
}); }
|
|
220
213
|
});
|
|
214
|
+
Object.defineProperty(this, "resolveAndSetWSReqData", {
|
|
215
|
+
enumerable: true,
|
|
216
|
+
configurable: true,
|
|
217
|
+
writable: true,
|
|
218
|
+
value: function (_a, reqIndex) {
|
|
219
|
+
var url = _a.url, headers = _a.headers, postData = _a.postData, _b = _a.timeout, timeout = _b === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _b, _c = _a.expectedStatus, expectedStatus = _c === void 0 ? 'SUCCESS' : _c;
|
|
220
|
+
var preparedUrl = _this.prepareWsUrl(url, reqIndex);
|
|
221
|
+
var preparedHeaders = _this.prepareWsHeaders(headers, reqIndex);
|
|
222
|
+
var preparedMessage = _this.prepareWsMessage(postData, reqIndex);
|
|
223
|
+
return {
|
|
224
|
+
expectedStatus: expectedStatus,
|
|
225
|
+
headers: preparedHeaders,
|
|
226
|
+
message: preparedMessage,
|
|
227
|
+
timeout: timeout,
|
|
228
|
+
url: preparedUrl,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
Object.defineProperty(this, "prepareWsUrl", {
|
|
233
|
+
enumerable: true,
|
|
234
|
+
configurable: true,
|
|
235
|
+
writable: true,
|
|
236
|
+
value: function (url, reqIndex) {
|
|
237
|
+
var resolvedUrl = _this.resolve(url, function (e) { return setParameterErrorHistogram(e, 'Failed to compute URL - '); });
|
|
238
|
+
_this.resolvedRequests[reqIndex].url = resolvedUrl;
|
|
239
|
+
return resolvedUrl;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
Object.defineProperty(this, "prepareWsHeaders", {
|
|
243
|
+
enumerable: true,
|
|
244
|
+
configurable: true,
|
|
245
|
+
writable: true,
|
|
246
|
+
value: function (headers, reqIndex) {
|
|
247
|
+
var resolvedHeadersObj = {};
|
|
248
|
+
var resolvedHeaders = [];
|
|
249
|
+
if (headers && !isEmpty_1.default(headers)) {
|
|
250
|
+
resolvedHeaders.push.apply(resolvedHeaders, _this.resolveHeaders(headers));
|
|
251
|
+
resolvedHeaders.forEach(function (_a) {
|
|
252
|
+
var name = _a.name, value = _a.value;
|
|
253
|
+
return resolvedHeadersObj[name] = value;
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
_this.resolvedRequests[reqIndex].headers = resolvedHeaders;
|
|
257
|
+
return resolvedHeadersObj;
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
Object.defineProperty(this, "prepareWsMessage", {
|
|
261
|
+
enumerable: true,
|
|
262
|
+
configurable: true,
|
|
263
|
+
writable: true,
|
|
264
|
+
value: function (postData, reqIndex) {
|
|
265
|
+
var resolvedMessage = '';
|
|
266
|
+
if (postData) {
|
|
267
|
+
resolvedMessage = _this.resolve(postData.text, function (err) {
|
|
268
|
+
return setParameterErrorHistogram(err, 'Failed to compute Websocket message - ');
|
|
269
|
+
});
|
|
270
|
+
if (resolvedMessage && resolvedMessage.length > utils_1.getMaxRequestBodySize()) {
|
|
271
|
+
throw new errors_2.RequestFailuresError('Websocket message size is too large');
|
|
272
|
+
}
|
|
273
|
+
_this.resolvedRequests[reqIndex].postData = {
|
|
274
|
+
mimeType: postData.mimeType,
|
|
275
|
+
text: resolvedMessage,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return resolvedMessage;
|
|
279
|
+
}
|
|
280
|
+
});
|
|
221
281
|
Object.defineProperty(this, "checkProgressEvent", {
|
|
222
282
|
enumerable: true,
|
|
223
283
|
configurable: true,
|
|
@@ -253,6 +313,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
253
313
|
freeSocketTimeout: SOCKET_TIMEOUT / 2
|
|
254
314
|
});
|
|
255
315
|
this.postScriptRunner = new post_script_executor_1.PostScriptRunner();
|
|
316
|
+
this.wsHandler = new ws_1.WSSequenceHandler();
|
|
256
317
|
}
|
|
257
318
|
Object.defineProperty(SequenceExecutor.prototype, "startAndPass", {
|
|
258
319
|
enumerable: false,
|
|
@@ -318,11 +379,14 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
318
379
|
log_1.default.info(reason, error_1);
|
|
319
380
|
log_1.default.info('Unexpected error info:', unexpectedError);
|
|
320
381
|
}
|
|
382
|
+
this.wsHandler.closeAllConnections();
|
|
321
383
|
throw error_1;
|
|
322
384
|
case 6:
|
|
323
385
|
++reqIndex;
|
|
324
386
|
return [3 /*break*/, 1];
|
|
325
|
-
case 7:
|
|
387
|
+
case 7:
|
|
388
|
+
this.wsHandler.closeAllConnections();
|
|
389
|
+
return [2 /*return*/];
|
|
326
390
|
}
|
|
327
391
|
});
|
|
328
392
|
});
|
|
@@ -371,7 +435,10 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
371
435
|
configurable: true,
|
|
372
436
|
writable: true,
|
|
373
437
|
value: function (request, reqIndex, requests) {
|
|
374
|
-
var skipBefore = request.skipBefore;
|
|
438
|
+
var skipBefore = request.skipBefore, disabled = request.disabled;
|
|
439
|
+
if (disabled) {
|
|
440
|
+
return reqIndex + 1;
|
|
441
|
+
}
|
|
375
442
|
if (skipBefore) {
|
|
376
443
|
var goTo = skipBefore.goTo, negate = skipBefore.negate, condition = skipBefore.condition;
|
|
377
444
|
var shouldSkip = this.isTruthyParameter('skip', condition);
|
|
@@ -404,7 +471,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
404
471
|
: rawDelay)), MIN_REQUEST_DELAY, Infinity);
|
|
405
472
|
problem = conf_1.validateIntegerDelay(delay, false);
|
|
406
473
|
if (problem) {
|
|
407
|
-
throw new RequestFailuresError("Invalid Request Delay: " + problem);
|
|
474
|
+
throw new errors_2.RequestFailuresError("Invalid Request Delay: " + problem);
|
|
408
475
|
}
|
|
409
476
|
return [4 /*yield*/, promiseUtils.delay(delay)];
|
|
410
477
|
case 1:
|
|
@@ -435,9 +502,10 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
435
502
|
case 0:
|
|
436
503
|
loopIteration = 0;
|
|
437
504
|
maxIterations = getLoopIterations(requestConf.loop);
|
|
505
|
+
this.wsHandler.clearMessages();
|
|
438
506
|
_b.label = 1;
|
|
439
507
|
case 1:
|
|
440
|
-
if (!(loopIteration < maxIterations)) return [3 /*break*/,
|
|
508
|
+
if (!(loopIteration < maxIterations)) return [3 /*break*/, 9];
|
|
441
509
|
loopIteration++;
|
|
442
510
|
request = this.prepareRequest(requestConf, index);
|
|
443
511
|
return [4 /*yield*/, this.sendRequest(request, index)];
|
|
@@ -447,32 +515,35 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
447
515
|
resTime = Number(this.parameters.__responseTime);
|
|
448
516
|
_a = requestConf.timeout, timeout = _a === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _a;
|
|
449
517
|
if (resTime > timeout) {
|
|
450
|
-
throw new RequestFailuresError("Response received after timeout of " + timeout + "ms exceeded");
|
|
518
|
+
throw new errors_2.RequestFailuresError("Response received after timeout of " + timeout + "ms exceeded");
|
|
451
519
|
}
|
|
452
|
-
|
|
520
|
+
res.wsExtractionData = { messages: this.wsHandler.messages, timeLimit: timeout - resTime };
|
|
521
|
+
return [4 /*yield*/, this.processSuccessfulResponse(index, requestConf, res)];
|
|
522
|
+
case 3:
|
|
523
|
+
failedAssertionsHistogram = _b.sent();
|
|
453
524
|
this.resolvedRequests[index].retried = loopIteration > 1 ? loopIteration - 1 : undefined;
|
|
454
|
-
if (!(loopIteration < maxIterations)) return [3 /*break*/,
|
|
455
|
-
if (!this.shouldStopLooping(requestConf.loop)) return [3 /*break*/,
|
|
456
|
-
return [3 /*break*/,
|
|
457
|
-
case
|
|
458
|
-
case
|
|
525
|
+
if (!(loopIteration < maxIterations)) return [3 /*break*/, 7];
|
|
526
|
+
if (!this.shouldStopLooping(requestConf.loop)) return [3 /*break*/, 4];
|
|
527
|
+
return [3 /*break*/, 9];
|
|
528
|
+
case 4: return [4 /*yield*/, promiseUtils.delay(1000)];
|
|
529
|
+
case 5:
|
|
459
530
|
_b.sent(); // todo yigal - make this configrable?
|
|
460
|
-
_b.label =
|
|
461
|
-
case
|
|
462
|
-
case
|
|
531
|
+
_b.label = 6;
|
|
532
|
+
case 6: return [3 /*break*/, 8];
|
|
533
|
+
case 7:
|
|
463
534
|
if (this.hasLoopingFailed(requestConf.loop)) {
|
|
464
|
-
throw new RequestFailuresError("Request failed to meet loop condition for " + maxIterations + " iterations");
|
|
535
|
+
throw new errors_2.RequestFailuresError("Request failed to meet loop condition for " + maxIterations + " iterations");
|
|
465
536
|
}
|
|
466
|
-
_b.label =
|
|
467
|
-
case
|
|
468
|
-
case
|
|
537
|
+
_b.label = 8;
|
|
538
|
+
case 8: return [3 /*break*/, 1];
|
|
539
|
+
case 9:
|
|
469
540
|
if (!isEmpty_1.default(failedAssertionsHistogram)) {
|
|
470
541
|
message = 'Request failed due to assertions.';
|
|
471
542
|
log_1.default.debug(message, {
|
|
472
543
|
failedAssertionsHistogram: failedAssertionsHistogram,
|
|
473
544
|
parameters: this.parameters,
|
|
474
545
|
});
|
|
475
|
-
throw new RequestFailuresError(message, failedAssertionsHistogram);
|
|
546
|
+
throw new errors_2.RequestFailuresError(message, failedAssertionsHistogram);
|
|
476
547
|
}
|
|
477
548
|
this.onRequestSuccess(index, resTime);
|
|
478
549
|
return [2 /*return*/];
|
|
@@ -597,7 +668,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
597
668
|
case 7:
|
|
598
669
|
reportedReason = errors_1.unknownStatusCorsError;
|
|
599
670
|
_c.label = 8;
|
|
600
|
-
case 8: throw new RequestFailuresError(message, (_b = {}, _b[reportedReason] = 1, _b));
|
|
671
|
+
case 8: throw new errors_2.RequestFailuresError(message, (_b = {}, _b[reportedReason] = 1, _b));
|
|
601
672
|
case 9:
|
|
602
673
|
failure = this.failures[reqIndex];
|
|
603
674
|
if (failure) {
|
|
@@ -611,6 +682,27 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
611
682
|
}
|
|
612
683
|
});
|
|
613
684
|
Object.defineProperty(SequenceExecutor.prototype, "prepareRequest", {
|
|
685
|
+
enumerable: false,
|
|
686
|
+
configurable: true,
|
|
687
|
+
writable: true,
|
|
688
|
+
value: function (requestConf, reqIndex) {
|
|
689
|
+
if (this.isWSRequest(requestConf) && !envUtils.isBrowser()) {
|
|
690
|
+
return this.prepareWSRequest(requestConf, reqIndex);
|
|
691
|
+
}
|
|
692
|
+
return this.prepareHttpRequest(requestConf, reqIndex);
|
|
693
|
+
}
|
|
694
|
+
});
|
|
695
|
+
Object.defineProperty(SequenceExecutor.prototype, "isWSRequest", {
|
|
696
|
+
enumerable: false,
|
|
697
|
+
configurable: true,
|
|
698
|
+
writable: true,
|
|
699
|
+
value: function (_a) {
|
|
700
|
+
var url = _a.url;
|
|
701
|
+
var resolvedUrl = this.resolve(url, function (e) { return setParameterErrorHistogram(e, 'Failed to compute URL - '); });
|
|
702
|
+
return resolvedUrl.startsWith('ws://') || resolvedUrl.startsWith('wss://');
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
Object.defineProperty(SequenceExecutor.prototype, "prepareHttpRequest", {
|
|
614
706
|
enumerable: false,
|
|
615
707
|
configurable: true,
|
|
616
708
|
writable: true,
|
|
@@ -659,8 +751,8 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
659
751
|
var data = this.resolve(postData.text, function (err) {
|
|
660
752
|
return setParameterErrorHistogram(err, 'Failed to compute request body - ');
|
|
661
753
|
});
|
|
662
|
-
if (data && data.length > getMaxRequestBodySize()) {
|
|
663
|
-
throw new RequestFailuresError('Request body size is too large');
|
|
754
|
+
if (data && data.length > utils_1.getMaxRequestBodySize()) {
|
|
755
|
+
throw new errors_2.RequestFailuresError('Request body size is too large');
|
|
664
756
|
}
|
|
665
757
|
// This invocation will behave differently according to different types set on the request:
|
|
666
758
|
request.send(data);
|
|
@@ -718,7 +810,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
718
810
|
request.on('progress', progressHandler);
|
|
719
811
|
// This makes superagent populate res.text regardless of the response's content type:
|
|
720
812
|
request.buffer();
|
|
721
|
-
// Otherwise we expose superagent and its version -
|
|
813
|
+
// Otherwise we expose superagent and its version -
|
|
722
814
|
// better have something more general (in case the user didnt set one):
|
|
723
815
|
var uaHeader = request.get('User-Agent');
|
|
724
816
|
if (!uaHeader || uaHeader.startsWith('node-superagent')) {
|
|
@@ -730,6 +822,16 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
730
822
|
return request;
|
|
731
823
|
}
|
|
732
824
|
});
|
|
825
|
+
Object.defineProperty(SequenceExecutor.prototype, "prepareWSRequest", {
|
|
826
|
+
enumerable: false,
|
|
827
|
+
configurable: true,
|
|
828
|
+
writable: true,
|
|
829
|
+
value: function (requestConf, reqIndex) {
|
|
830
|
+
var _this = this;
|
|
831
|
+
var wsRequestArgs = this.resolveAndSetWSReqData(requestConf, reqIndex);
|
|
832
|
+
return new ws_1.WSRequest(wsRequestArgs, this.wsHandler, function (e) { return _this.setSingleFailure(reqIndex, 'Websocket error ' + e.message); });
|
|
833
|
+
}
|
|
834
|
+
});
|
|
733
835
|
Object.defineProperty(SequenceExecutor.prototype, "validateDomain", {
|
|
734
836
|
enumerable: false,
|
|
735
837
|
configurable: true,
|
|
@@ -738,15 +840,15 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
738
840
|
var _a, _b, _c;
|
|
739
841
|
if (isEmpty_1.default(domain)) {
|
|
740
842
|
var message = 'HTTP request domain name is empty';
|
|
741
|
-
throw new RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
|
|
843
|
+
throw new errors_2.RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
|
|
742
844
|
}
|
|
743
845
|
if (conf_1.validate.isUrl(domain)) {
|
|
744
846
|
var message = "HTTP request domain name [" + domain + "] is not valid";
|
|
745
|
-
throw new RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
|
|
847
|
+
throw new errors_2.RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
|
|
746
848
|
}
|
|
747
849
|
else if (!uriUtils.isVerified(domain, this.domainsWhiteList)) {
|
|
748
850
|
var message = "HTTP request domain name [" + domain + "] is not on white list";
|
|
749
|
-
throw new RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
|
|
851
|
+
throw new errors_2.RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
|
|
750
852
|
}
|
|
751
853
|
}
|
|
752
854
|
});
|
|
@@ -780,21 +882,32 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
780
882
|
configurable: true,
|
|
781
883
|
writable: true,
|
|
782
884
|
value: function (reqIndex, requestConf, res) {
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
885
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
886
|
+
var assertionResults, failuresHistogram;
|
|
887
|
+
return __generator(this, function (_a) {
|
|
888
|
+
switch (_a.label) {
|
|
889
|
+
case 0:
|
|
890
|
+
// modifies parameters:
|
|
891
|
+
return [4 /*yield*/, this.handleExtractions(requestConf, res)];
|
|
892
|
+
case 1:
|
|
893
|
+
// modifies parameters:
|
|
894
|
+
_a.sent();
|
|
895
|
+
if (!envUtils.isBrowser()) {
|
|
896
|
+
this.handlePostScript(requestConf, res);
|
|
897
|
+
}
|
|
898
|
+
this.setPostParameters(reqIndex);
|
|
899
|
+
assertionResults = this.handleAssertions(requestConf) || [];
|
|
900
|
+
log_1.default.trace('Assertion results: ', assertionResults);
|
|
901
|
+
failuresHistogram = {};
|
|
902
|
+
assertionResults.forEach(function (result, index) {
|
|
903
|
+
if (!result) {
|
|
904
|
+
failuresHistogram[index] = 1;
|
|
905
|
+
}
|
|
906
|
+
});
|
|
907
|
+
return [2 /*return*/, failuresHistogram];
|
|
908
|
+
}
|
|
909
|
+
});
|
|
796
910
|
});
|
|
797
|
-
return failuresHistogram;
|
|
798
911
|
}
|
|
799
912
|
});
|
|
800
913
|
Object.defineProperty(SequenceExecutor.prototype, "setPostParameters", {
|
|
@@ -810,10 +923,26 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
810
923
|
configurable: true,
|
|
811
924
|
writable: true,
|
|
812
925
|
value: function (requestConf, res) {
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
926
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
927
|
+
var _i, _a, extractions;
|
|
928
|
+
return __generator(this, function (_b) {
|
|
929
|
+
switch (_b.label) {
|
|
930
|
+
case 0:
|
|
931
|
+
_i = 0, _a = (requestConf.extract || []);
|
|
932
|
+
_b.label = 1;
|
|
933
|
+
case 1:
|
|
934
|
+
if (!(_i < _a.length)) return [3 /*break*/, 4];
|
|
935
|
+
extractions = _a[_i];
|
|
936
|
+
return [4 /*yield*/, this.extractInScope(res, extractions)];
|
|
937
|
+
case 2:
|
|
938
|
+
_b.sent();
|
|
939
|
+
_b.label = 3;
|
|
940
|
+
case 3:
|
|
941
|
+
_i++;
|
|
942
|
+
return [3 /*break*/, 1];
|
|
943
|
+
case 4: return [2 /*return*/];
|
|
944
|
+
}
|
|
945
|
+
});
|
|
817
946
|
});
|
|
818
947
|
}
|
|
819
948
|
});
|
|
@@ -822,11 +951,28 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
822
951
|
configurable: true,
|
|
823
952
|
writable: true,
|
|
824
953
|
value: function (res, extractions) {
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
954
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
955
|
+
var contextParameters, extractionCombiner, _i, _a, _b, name_1, extraction;
|
|
956
|
+
return __generator(this, function (_c) {
|
|
957
|
+
switch (_c.label) {
|
|
958
|
+
case 0:
|
|
959
|
+
contextParameters = Object.assign({}, this.parameters);
|
|
960
|
+
extractionCombiner = new extraction_combiner_1.ExtractionCombiner(contextParameters, res, res.wsExtractionData);
|
|
961
|
+
_i = 0, _a = Object.entries(extractions);
|
|
962
|
+
_c.label = 1;
|
|
963
|
+
case 1:
|
|
964
|
+
if (!(_i < _a.length)) return [3 /*break*/, 4];
|
|
965
|
+
_b = _a[_i], name_1 = _b[0], extraction = _b[1];
|
|
966
|
+
return [4 /*yield*/, this.extract(name_1, extraction, extractionCombiner)];
|
|
967
|
+
case 2:
|
|
968
|
+
_c.sent();
|
|
969
|
+
_c.label = 3;
|
|
970
|
+
case 3:
|
|
971
|
+
_i++;
|
|
972
|
+
return [3 /*break*/, 1];
|
|
973
|
+
case 4: return [2 /*return*/];
|
|
974
|
+
}
|
|
975
|
+
});
|
|
830
976
|
});
|
|
831
977
|
}
|
|
832
978
|
});
|
|
@@ -835,31 +981,46 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
835
981
|
configurable: true,
|
|
836
982
|
writable: true,
|
|
837
983
|
value: function (parameterName, extraction, extractionCombiner) {
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
984
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
985
|
+
var combinedExtractor, result, error_3, genericMessage, prettyMessage, publicMessage;
|
|
986
|
+
return __generator(this, function (_a) {
|
|
987
|
+
switch (_a.label) {
|
|
988
|
+
case 0:
|
|
989
|
+
log_1.default.trace('Parameter extraction start: ', { parameterName: parameterName, extraction: extraction });
|
|
990
|
+
return [4 /*yield*/, extractionCombiner.combine(extraction)];
|
|
991
|
+
case 1:
|
|
992
|
+
combinedExtractor = _a.sent();
|
|
993
|
+
_a.label = 2;
|
|
994
|
+
case 2:
|
|
995
|
+
_a.trys.push([2, 4, , 5]);
|
|
996
|
+
return [4 /*yield*/, combinedExtractor()];
|
|
997
|
+
case 3:
|
|
998
|
+
result = _a.sent();
|
|
999
|
+
return [3 /*break*/, 5];
|
|
1000
|
+
case 4:
|
|
1001
|
+
error_3 = _a.sent();
|
|
1002
|
+
genericMessage = "Failed to extract value for parameter \"" + parameterName + "\"";
|
|
1003
|
+
log_1.default.debug(genericMessage, error_3);
|
|
1004
|
+
prettyMessage = error_3.prettyMessage;
|
|
1005
|
+
publicMessage = prettyMessage
|
|
1006
|
+
? genericMessage + " - " + prettyMessage
|
|
1007
|
+
: genericMessage;
|
|
1008
|
+
throw new errors_2.RequestFailuresError(publicMessage);
|
|
1009
|
+
case 5:
|
|
1010
|
+
if (result != null) {
|
|
1011
|
+
this.parameters[parameterName] = result;
|
|
1012
|
+
}
|
|
1013
|
+
else if (this.parameters[parameterName] == null) {
|
|
1014
|
+
// Existing parameter value acts as default. If no such value exists,
|
|
1015
|
+
// we set the value to be an empty string to differentiate it from undefined parameters.
|
|
1016
|
+
// Otherwise, this parameter's usages would stay untouched, e.g. "${paramName}".
|
|
1017
|
+
this.parameters[parameterName] = '';
|
|
1018
|
+
}
|
|
1019
|
+
log_1.default.trace('Parameter value:', this.parameters[parameterName]);
|
|
1020
|
+
return [2 /*return*/];
|
|
1021
|
+
}
|
|
1022
|
+
});
|
|
1023
|
+
});
|
|
863
1024
|
}
|
|
864
1025
|
});
|
|
865
1026
|
Object.defineProperty(SequenceExecutor.prototype, "resolve", {
|
|
@@ -885,7 +1046,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
885
1046
|
}
|
|
886
1047
|
catch (e) {
|
|
887
1048
|
var message = ['Post Script', e.name + ':', e.message].join(' ');
|
|
888
|
-
throw new RequestFailuresError(message);
|
|
1049
|
+
throw new errors_2.RequestFailuresError(message);
|
|
889
1050
|
}
|
|
890
1051
|
test_run_event_emitter_1.testRunEventsEmitter.postScript.finished();
|
|
891
1052
|
}
|
|
@@ -965,9 +1126,6 @@ function isSimpleRequest(headers) {
|
|
|
965
1126
|
key !== 'content-type';
|
|
966
1127
|
});
|
|
967
1128
|
}
|
|
968
|
-
var getMaxRequestBodySize = function () {
|
|
969
|
-
return envUtils.isBrowser() ? MAX_LOAD_REQUEST_BODY_LENGTH : MAX_API_REQUEST_BODY_LENGTH;
|
|
970
|
-
};
|
|
971
1129
|
var getLoopIterations = function (LoopConf) {
|
|
972
1130
|
var declared = (LoopConf && LoopConf.iterations) || 1;
|
|
973
1131
|
return Math.min(MAX_REQUEST_LOOPS_ITERATIONS, declared);
|
|
@@ -984,7 +1142,7 @@ var extendResponseHeaders = function (headers, redirectHeaders) {
|
|
|
984
1142
|
var isExpectedStatus = function (_a, status) {
|
|
985
1143
|
var expectedStatus = _a.expectedStatus, url = _a.url;
|
|
986
1144
|
if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS) {
|
|
987
|
-
return 200 <= status && status < 400;
|
|
1145
|
+
return (200 <= status && status < 400) || status === 101;
|
|
988
1146
|
}
|
|
989
1147
|
else if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ERROR) {
|
|
990
1148
|
log_1.default.debug('user asked to fail this request', url);
|
|
@@ -1020,22 +1178,4 @@ var setTCPReuse = function (request, agent, sslAgent) {
|
|
|
1020
1178
|
_oldRequest.apply.apply(_oldRequest, __spreadArray([this], args));
|
|
1021
1179
|
};
|
|
1022
1180
|
};
|
|
1023
|
-
var RequestFailuresError = /** @class */ (function (_super) {
|
|
1024
|
-
__extends(RequestFailuresError, _super);
|
|
1025
|
-
function RequestFailuresError(message, histogram) {
|
|
1026
|
-
var _a;
|
|
1027
|
-
if (histogram === void 0) { histogram = (_a = {}, _a[message] = 1, _a); }
|
|
1028
|
-
var _this = _super.call(this, message) || this;
|
|
1029
|
-
Object.defineProperty(_this, "histogram", {
|
|
1030
|
-
enumerable: true,
|
|
1031
|
-
configurable: true,
|
|
1032
|
-
writable: true,
|
|
1033
|
-
value: histogram
|
|
1034
|
-
});
|
|
1035
|
-
// Workaround suggested in: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
|
|
1036
|
-
Object.setPrototypeOf(_this, RequestFailuresError.prototype);
|
|
1037
|
-
return _this;
|
|
1038
|
-
}
|
|
1039
|
-
return RequestFailuresError;
|
|
1040
|
-
}(Error));
|
|
1041
1181
|
//# sourceMappingURL=sequence.js.map
|