@loadmill/executer 0.1.34 → 0.1.38
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/post-script/virtual-machine/vm2-virtual-machine.js +1 -1
- package/dist/post-script/virtual-machine/vm2-virtual-machine.js.map +1 -1
- package/dist/sampler.js +4 -3
- package/dist/sampler.js.map +1 -1
- package/dist/sequence.js +301 -134
- package/dist/sequence.js.map +1 -1
- package/dist/test-run-event-emitter.d.ts +11 -0
- package/dist/test-run-event-emitter.js +36 -0
- package/dist/test-run-event-emitter.js.map +1 -0
- 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 +66 -0
- package/dist/ws.js +435 -0
- package/dist/ws.js.map +1 -0
- package/package.json +6 -6
- 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/post-script/virtual-machine/vm2-virtual-machine.ts +1 -1
- package/src/sampler.ts +4 -3
- package/src/sequence.ts +141 -58
- package/src/single-runner.ts +3 -3
- package/src/test-run-event-emitter.ts +24 -0
- package/src/utils.ts +8 -0
- package/src/ws.ts +233 -0
- package/test/post-script-executor.spec.ts +24 -24
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,8 +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");
|
|
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");
|
|
122
110
|
exports.reqIdParamName = 'loadmill-request-id';
|
|
123
111
|
var SOCKET_TIMEOUT = request_1.DEFAULT_REQUEST_TIMEOUT + 5000; // deafult + some extra
|
|
124
112
|
var isPerformance = typeof performance !== 'undefined';
|
|
@@ -150,6 +138,12 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
150
138
|
writable: true,
|
|
151
139
|
value: void 0
|
|
152
140
|
});
|
|
141
|
+
Object.defineProperty(this, "postScriptRunner", {
|
|
142
|
+
enumerable: true,
|
|
143
|
+
configurable: true,
|
|
144
|
+
writable: true,
|
|
145
|
+
value: void 0
|
|
146
|
+
});
|
|
153
147
|
Object.defineProperty(this, "avgResTime", {
|
|
154
148
|
enumerable: true,
|
|
155
149
|
configurable: true,
|
|
@@ -198,6 +192,12 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
198
192
|
writable: true,
|
|
199
193
|
value: void 0
|
|
200
194
|
});
|
|
195
|
+
Object.defineProperty(this, "wsHandler", {
|
|
196
|
+
enumerable: true,
|
|
197
|
+
configurable: true,
|
|
198
|
+
writable: true,
|
|
199
|
+
value: void 0
|
|
200
|
+
});
|
|
201
201
|
Object.defineProperty(this, "passStats", {
|
|
202
202
|
enumerable: true,
|
|
203
203
|
configurable: true,
|
|
@@ -211,6 +211,73 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
211
211
|
lastStartedIndex: _this.lastStartedIndex,
|
|
212
212
|
}); }
|
|
213
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
|
+
});
|
|
214
281
|
Object.defineProperty(this, "checkProgressEvent", {
|
|
215
282
|
enumerable: true,
|
|
216
283
|
configurable: true,
|
|
@@ -245,6 +312,8 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
245
312
|
timeout: SOCKET_TIMEOUT,
|
|
246
313
|
freeSocketTimeout: SOCKET_TIMEOUT / 2
|
|
247
314
|
});
|
|
315
|
+
this.postScriptRunner = new post_script_executor_1.PostScriptRunner();
|
|
316
|
+
this.wsHandler = new ws_1.WSSequenceHandler();
|
|
248
317
|
}
|
|
249
318
|
Object.defineProperty(SequenceExecutor.prototype, "startAndPass", {
|
|
250
319
|
enumerable: false,
|
|
@@ -310,11 +379,14 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
310
379
|
log_1.default.info(reason, error_1);
|
|
311
380
|
log_1.default.info('Unexpected error info:', unexpectedError);
|
|
312
381
|
}
|
|
382
|
+
this.wsHandler.closeAllConnections();
|
|
313
383
|
throw error_1;
|
|
314
384
|
case 6:
|
|
315
385
|
++reqIndex;
|
|
316
386
|
return [3 /*break*/, 1];
|
|
317
|
-
case 7:
|
|
387
|
+
case 7:
|
|
388
|
+
this.wsHandler.closeAllConnections();
|
|
389
|
+
return [2 /*return*/];
|
|
318
390
|
}
|
|
319
391
|
});
|
|
320
392
|
});
|
|
@@ -363,7 +435,10 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
363
435
|
configurable: true,
|
|
364
436
|
writable: true,
|
|
365
437
|
value: function (request, reqIndex, requests) {
|
|
366
|
-
var skipBefore = request.skipBefore;
|
|
438
|
+
var skipBefore = request.skipBefore, disabled = request.disabled;
|
|
439
|
+
if (disabled) {
|
|
440
|
+
return reqIndex + 1;
|
|
441
|
+
}
|
|
367
442
|
if (skipBefore) {
|
|
368
443
|
var goTo = skipBefore.goTo, negate = skipBefore.negate, condition = skipBefore.condition;
|
|
369
444
|
var shouldSkip = this.isTruthyParameter('skip', condition);
|
|
@@ -396,7 +471,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
396
471
|
: rawDelay)), MIN_REQUEST_DELAY, Infinity);
|
|
397
472
|
problem = conf_1.validateIntegerDelay(delay, false);
|
|
398
473
|
if (problem) {
|
|
399
|
-
throw new RequestFailuresError("Invalid Request Delay: " + problem);
|
|
474
|
+
throw new errors_2.RequestFailuresError("Invalid Request Delay: " + problem);
|
|
400
475
|
}
|
|
401
476
|
return [4 /*yield*/, promiseUtils.delay(delay)];
|
|
402
477
|
case 1:
|
|
@@ -421,50 +496,54 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
421
496
|
writable: true,
|
|
422
497
|
value: function (requestConf, index) {
|
|
423
498
|
return __awaiter(this, void 0, void 0, function () {
|
|
424
|
-
var failedAssertionsHistogram, resTime, loopIteration, maxIterations, request, res, timeout, message;
|
|
425
|
-
return __generator(this, function (
|
|
426
|
-
switch (
|
|
499
|
+
var failedAssertionsHistogram, resTime, loopIteration, maxIterations, request, res, _a, timeout, message;
|
|
500
|
+
return __generator(this, function (_b) {
|
|
501
|
+
switch (_b.label) {
|
|
427
502
|
case 0:
|
|
428
503
|
loopIteration = 0;
|
|
429
504
|
maxIterations = getLoopIterations(requestConf.loop);
|
|
430
|
-
|
|
505
|
+
this.wsHandler.clearMessages();
|
|
506
|
+
_b.label = 1;
|
|
431
507
|
case 1:
|
|
432
|
-
if (!(loopIteration < maxIterations)) return [3 /*break*/,
|
|
508
|
+
if (!(loopIteration < maxIterations)) return [3 /*break*/, 9];
|
|
433
509
|
loopIteration++;
|
|
434
510
|
request = this.prepareRequest(requestConf, index);
|
|
435
511
|
return [4 /*yield*/, this.sendRequest(request, index)];
|
|
436
512
|
case 2:
|
|
437
|
-
res =
|
|
513
|
+
res = _b.sent();
|
|
438
514
|
// Setting now to avoid possible user overwrite:
|
|
439
515
|
resTime = Number(this.parameters.__responseTime);
|
|
440
|
-
|
|
516
|
+
_a = requestConf.timeout, timeout = _a === void 0 ? request_1.DEFAULT_REQUEST_TIMEOUT : _a;
|
|
441
517
|
if (resTime > timeout) {
|
|
442
|
-
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");
|
|
443
519
|
}
|
|
444
|
-
|
|
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();
|
|
445
524
|
this.resolvedRequests[index].retried = loopIteration > 1 ? loopIteration - 1 : undefined;
|
|
446
|
-
if (!(loopIteration < maxIterations)) return [3 /*break*/,
|
|
447
|
-
if (!this.shouldStopLooping(requestConf.loop)) return [3 /*break*/,
|
|
448
|
-
return [3 /*break*/,
|
|
449
|
-
case
|
|
450
|
-
case
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
case
|
|
454
|
-
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:
|
|
530
|
+
_b.sent(); // todo yigal - make this configrable?
|
|
531
|
+
_b.label = 6;
|
|
532
|
+
case 6: return [3 /*break*/, 8];
|
|
533
|
+
case 7:
|
|
455
534
|
if (this.hasLoopingFailed(requestConf.loop)) {
|
|
456
|
-
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");
|
|
457
536
|
}
|
|
458
|
-
|
|
459
|
-
case
|
|
460
|
-
case
|
|
537
|
+
_b.label = 8;
|
|
538
|
+
case 8: return [3 /*break*/, 1];
|
|
539
|
+
case 9:
|
|
461
540
|
if (!isEmpty_1.default(failedAssertionsHistogram)) {
|
|
462
541
|
message = 'Request failed due to assertions.';
|
|
463
542
|
log_1.default.debug(message, {
|
|
464
543
|
failedAssertionsHistogram: failedAssertionsHistogram,
|
|
465
544
|
parameters: this.parameters,
|
|
466
545
|
});
|
|
467
|
-
throw new RequestFailuresError(message, failedAssertionsHistogram);
|
|
546
|
+
throw new errors_2.RequestFailuresError(message, failedAssertionsHistogram);
|
|
468
547
|
}
|
|
469
548
|
this.onRequestSuccess(index, resTime);
|
|
470
549
|
return [2 /*return*/];
|
|
@@ -589,7 +668,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
589
668
|
case 7:
|
|
590
669
|
reportedReason = errors_1.unknownStatusCorsError;
|
|
591
670
|
_c.label = 8;
|
|
592
|
-
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));
|
|
593
672
|
case 9:
|
|
594
673
|
failure = this.failures[reqIndex];
|
|
595
674
|
if (failure) {
|
|
@@ -603,6 +682,27 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
603
682
|
}
|
|
604
683
|
});
|
|
605
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", {
|
|
606
706
|
enumerable: false,
|
|
607
707
|
configurable: true,
|
|
608
708
|
writable: true,
|
|
@@ -651,8 +751,8 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
651
751
|
var data = this.resolve(postData.text, function (err) {
|
|
652
752
|
return setParameterErrorHistogram(err, 'Failed to compute request body - ');
|
|
653
753
|
});
|
|
654
|
-
if (data && data.length > getMaxRequestBodySize()) {
|
|
655
|
-
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');
|
|
656
756
|
}
|
|
657
757
|
// This invocation will behave differently according to different types set on the request:
|
|
658
758
|
request.send(data);
|
|
@@ -710,7 +810,7 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
710
810
|
request.on('progress', progressHandler);
|
|
711
811
|
// This makes superagent populate res.text regardless of the response's content type:
|
|
712
812
|
request.buffer();
|
|
713
|
-
// Otherwise we expose superagent and its version -
|
|
813
|
+
// Otherwise we expose superagent and its version -
|
|
714
814
|
// better have something more general (in case the user didnt set one):
|
|
715
815
|
var uaHeader = request.get('User-Agent');
|
|
716
816
|
if (!uaHeader || uaHeader.startsWith('node-superagent')) {
|
|
@@ -718,10 +818,20 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
718
818
|
}
|
|
719
819
|
}
|
|
720
820
|
this.resolvedRequests[reqIndex].headers = manipulationUtils.objToSingletonArray(request.header);
|
|
721
|
-
request.expectedStatus = requestConf.expectedStatus;
|
|
821
|
+
request.expectedStatus = requestConf.expectedStatus || request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS;
|
|
722
822
|
return request;
|
|
723
823
|
}
|
|
724
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
|
+
});
|
|
725
835
|
Object.defineProperty(SequenceExecutor.prototype, "validateDomain", {
|
|
726
836
|
enumerable: false,
|
|
727
837
|
configurable: true,
|
|
@@ -730,15 +840,15 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
730
840
|
var _a, _b, _c;
|
|
731
841
|
if (isEmpty_1.default(domain)) {
|
|
732
842
|
var message = 'HTTP request domain name is empty';
|
|
733
|
-
throw new RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
|
|
843
|
+
throw new errors_2.RequestFailuresError(message, (_a = {}, _a[message] = 1, _a));
|
|
734
844
|
}
|
|
735
845
|
if (conf_1.validate.isUrl(domain)) {
|
|
736
846
|
var message = "HTTP request domain name [" + domain + "] is not valid";
|
|
737
|
-
throw new RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
|
|
847
|
+
throw new errors_2.RequestFailuresError(message, (_b = {}, _b[message] = 1, _b));
|
|
738
848
|
}
|
|
739
849
|
else if (!uriUtils.isVerified(domain, this.domainsWhiteList)) {
|
|
740
850
|
var message = "HTTP request domain name [" + domain + "] is not on white list";
|
|
741
|
-
throw new RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
|
|
851
|
+
throw new errors_2.RequestFailuresError(message, (_c = {}, _c[message] = 1, _c));
|
|
742
852
|
}
|
|
743
853
|
}
|
|
744
854
|
});
|
|
@@ -772,21 +882,32 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
772
882
|
configurable: true,
|
|
773
883
|
writable: true,
|
|
774
884
|
value: function (reqIndex, requestConf, res) {
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
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
|
+
});
|
|
788
910
|
});
|
|
789
|
-
return failuresHistogram;
|
|
790
911
|
}
|
|
791
912
|
});
|
|
792
913
|
Object.defineProperty(SequenceExecutor.prototype, "setPostParameters", {
|
|
@@ -802,10 +923,26 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
802
923
|
configurable: true,
|
|
803
924
|
writable: true,
|
|
804
925
|
value: function (requestConf, res) {
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
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
|
+
});
|
|
809
946
|
});
|
|
810
947
|
}
|
|
811
948
|
});
|
|
@@ -814,11 +951,28 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
814
951
|
configurable: true,
|
|
815
952
|
writable: true,
|
|
816
953
|
value: function (res, extractions) {
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
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
|
+
});
|
|
822
976
|
});
|
|
823
977
|
}
|
|
824
978
|
});
|
|
@@ -827,31 +981,46 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
827
981
|
configurable: true,
|
|
828
982
|
writable: true,
|
|
829
983
|
value: function (parameterName, extraction, extractionCombiner) {
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
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
|
+
});
|
|
855
1024
|
}
|
|
856
1025
|
});
|
|
857
1026
|
Object.defineProperty(SequenceExecutor.prototype, "resolve", {
|
|
@@ -869,23 +1038,42 @@ var SequenceExecutor = /** @class */ (function () {
|
|
|
869
1038
|
value: function (_a, _b) {
|
|
870
1039
|
var postScript = _a.postScript;
|
|
871
1040
|
var _c = _b.text, text = _c === void 0 ? '' : _c;
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
var staticContext = { $: $_1, __: parameters_1.parameterFunctionOperations };
|
|
882
|
-
Object.assign(this.parameters, new post_script_executor_1.PostScriptRunner().run({ staticContext: staticContext }, this.parameters, postScript));
|
|
1041
|
+
if (postScript) {
|
|
1042
|
+
test_run_event_emitter_1.testRunEventsEmitter.postScript.started();
|
|
1043
|
+
try {
|
|
1044
|
+
var result = this.runPostScript(postScript, text);
|
|
1045
|
+
Object.assign(this.parameters, result);
|
|
1046
|
+
}
|
|
1047
|
+
catch (e) {
|
|
1048
|
+
var message = ['Post Script', e.name + ':', e.message].join(' ');
|
|
1049
|
+
throw new errors_2.RequestFailuresError(message);
|
|
883
1050
|
}
|
|
1051
|
+
test_run_event_emitter_1.testRunEventsEmitter.postScript.finished();
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
});
|
|
1055
|
+
Object.defineProperty(SequenceExecutor.prototype, "runPostScript", {
|
|
1056
|
+
enumerable: false,
|
|
1057
|
+
configurable: true,
|
|
1058
|
+
writable: true,
|
|
1059
|
+
value: function (postScript, text) {
|
|
1060
|
+
var staticContext = this.getStaticContext(text);
|
|
1061
|
+
return this.postScriptRunner.run({ staticContext: staticContext }, this.parameters, postScript);
|
|
1062
|
+
}
|
|
1063
|
+
});
|
|
1064
|
+
Object.defineProperty(SequenceExecutor.prototype, "getStaticContext", {
|
|
1065
|
+
enumerable: false,
|
|
1066
|
+
configurable: true,
|
|
1067
|
+
writable: true,
|
|
1068
|
+
value: function (text) {
|
|
1069
|
+
var $ = {};
|
|
1070
|
+
try {
|
|
1071
|
+
$ = JSON.parse(text);
|
|
884
1072
|
}
|
|
885
1073
|
catch (e) {
|
|
886
|
-
|
|
887
|
-
throw new RequestFailuresError(message);
|
|
1074
|
+
log_1.default.debug('res text (body) cannot be JSON parsed', e.name, e.message);
|
|
888
1075
|
}
|
|
1076
|
+
return { $: $, __: parameters_1.parameterFunctionOperations };
|
|
889
1077
|
}
|
|
890
1078
|
});
|
|
891
1079
|
Object.defineProperty(SequenceExecutor.prototype, "handleAssertions", {
|
|
@@ -938,9 +1126,6 @@ function isSimpleRequest(headers) {
|
|
|
938
1126
|
key !== 'content-type';
|
|
939
1127
|
});
|
|
940
1128
|
}
|
|
941
|
-
var getMaxRequestBodySize = function () {
|
|
942
|
-
return envUtils.isBrowser() ? MAX_LOAD_REQUEST_BODY_LENGTH : MAX_API_REQUEST_BODY_LENGTH;
|
|
943
|
-
};
|
|
944
1129
|
var getLoopIterations = function (LoopConf) {
|
|
945
1130
|
var declared = (LoopConf && LoopConf.iterations) || 1;
|
|
946
1131
|
return Math.min(MAX_REQUEST_LOOPS_ITERATIONS, declared);
|
|
@@ -957,7 +1142,7 @@ var extendResponseHeaders = function (headers, redirectHeaders) {
|
|
|
957
1142
|
var isExpectedStatus = function (_a, status) {
|
|
958
1143
|
var expectedStatus = _a.expectedStatus, url = _a.url;
|
|
959
1144
|
if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.SUCCESS) {
|
|
960
|
-
return 200 <= status && status < 400;
|
|
1145
|
+
return (200 <= status && status < 400) || status === 101;
|
|
961
1146
|
}
|
|
962
1147
|
else if (expectedStatus === request_1.ALLOWED_RESPONSE_STATUSES.ERROR) {
|
|
963
1148
|
log_1.default.debug('user asked to fail this request', url);
|
|
@@ -993,22 +1178,4 @@ var setTCPReuse = function (request, agent, sslAgent) {
|
|
|
993
1178
|
_oldRequest.apply.apply(_oldRequest, __spreadArray([this], args));
|
|
994
1179
|
};
|
|
995
1180
|
};
|
|
996
|
-
var RequestFailuresError = /** @class */ (function (_super) {
|
|
997
|
-
__extends(RequestFailuresError, _super);
|
|
998
|
-
function RequestFailuresError(message, histogram) {
|
|
999
|
-
var _a;
|
|
1000
|
-
if (histogram === void 0) { histogram = (_a = {}, _a[message] = 1, _a); }
|
|
1001
|
-
var _this = _super.call(this, message) || this;
|
|
1002
|
-
Object.defineProperty(_this, "histogram", {
|
|
1003
|
-
enumerable: true,
|
|
1004
|
-
configurable: true,
|
|
1005
|
-
writable: true,
|
|
1006
|
-
value: histogram
|
|
1007
|
-
});
|
|
1008
|
-
// 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
|
|
1009
|
-
Object.setPrototypeOf(_this, RequestFailuresError.prototype);
|
|
1010
|
-
return _this;
|
|
1011
|
-
}
|
|
1012
|
-
return RequestFailuresError;
|
|
1013
|
-
}(Error));
|
|
1014
1181
|
//# sourceMappingURL=sequence.js.map
|