UNPKG

11 kBJavaScriptView Raw
1"use strict";
2require("reflect-metadata");
3var rxjs_1 = require("rxjs");
4var reports_1 = require("./reports");
5var path = require("path");
6var exeution_error_1 = require("./exeution-error");
7var log_1 = require("./log");
8var noop = function () {
9};
10if (global && global['jasmine']) {
11 global['jasmine']['DEFAULT_TIMEOUT_INTERVAL'] = Math.pow(2, 31) - 1;
12}
13var observifyFromPromiseWithContext = function (func, context) {
14 var args = [];
15 for (var _i = 2; _i < arguments.length; _i++) {
16 args[_i - 2] = arguments[_i];
17 }
18 return rxjs_1.Observable.fromPromise(new Promise(function (resolve) {
19 resolve(func.apply(context, args));
20 }));
21};
22var wrapWithExecution = function (index) {
23 var setupStartTime, setupEndTime;
24 return {
25 startTime: function () {
26 setupStartTime = Date.now();
27 },
28 stopTime: function () {
29 setupEndTime = Date.now();
30 },
31 totalTime: function () {
32 if (!setupStartTime || !setupEndTime) {
33 return 0;
34 }
35 return setupEndTime - setupStartTime;
36 },
37 instanceNumber: index
38 };
39};
40var buildFlowStream = function (reports, testClass) {
41 return function (index) {
42 reports._setStep(reports_1.EExecutionStep.INIT);
43 reports._setInstanceNumber(index);
44 var context = new testClass(index, reports);
45 var setupFunction = context.$$setup || noop;
46 var setupReportFunction = context.$$setupReport || noop;
47 var scenarioFunction = context.$$scenario || noop;
48 var scenarioReportFunction = context.$$scenarioReport || noop;
49 var teardownFunction = context.$$teardown || noop;
50 var teardownReportFunction = context.$$teardownReport || noop;
51 var methods = {
52 setup: setupFunction,
53 scenario: scenarioFunction,
54 teardown: teardownFunction
55 };
56 var reportMethods = {
57 setup: setupReportFunction,
58 scenario: scenarioReportFunction,
59 teardown: teardownReportFunction
60 };
61 var setupData = wrapWithExecution(index);
62 var scenarioData = wrapWithExecution(index);
63 var teardownData = wrapWithExecution(index);
64 var teardownSetupResult, teardownScenarioResult;
65 return {
66 instance: context,
67 setupAndScenario: // Setup
68 observifyFromPromiseWithContext(methods.setup, context, setupData)
69 .flatMap(function (result) {
70 log_1.logDebug("\t\t\u2319 DONE SETUP (" + (index + 1) + ")", 'blue');
71 var setupResult = {
72 get executionTime() {
73 return setupData.totalTime();
74 },
75 executionResult: result
76 };
77 teardownSetupResult = setupResult;
78 // Setup Report
79 reports._setInstanceNumber(index);
80 reports._setStep(reports_1.EExecutionStep.SETUP);
81 reports._setTest({
82 result: result,
83 instance: context,
84 });
85 return observifyFromPromiseWithContext(reportMethods.setup, context, reports, setupResult).map(function () { return setupResult; });
86 })
87 .flatMap(function (setupResult) {
88 // Scenario
89 return observifyFromPromiseWithContext(methods.scenario, context, scenarioData, setupResult);
90 })
91 .flatMap(function (res) {
92 log_1.logDebug("\t\t\u2319 DONE SCENARIO (" + (index + 1) + ")", 'blue');
93 var stepResult = {
94 get executionTime() {
95 return scenarioData.totalTime();
96 },
97 executionResult: res
98 };
99 teardownScenarioResult = stepResult;
100 // Scenario Report
101 reports._setInstanceNumber(index);
102 reports._setStep(reports_1.EExecutionStep.SCENARIO);
103 reports._setTest({
104 result: res,
105 instance: context,
106 });
107 return observifyFromPromiseWithContext(reportMethods.scenario, context, reports, stepResult).map(function () { return stepResult; });
108 }),
109 teardown: function () {
110 // Teardown
111 return observifyFromPromiseWithContext(methods.teardown, context, teardownData, teardownSetupResult, teardownScenarioResult)
112 .flatMap(function (result) {
113 log_1.logDebug("\t\t\u2319 DONE TEARDOWN (" + (index + 1) + ")", 'blue');
114 var tdResult = {
115 get executionTime() {
116 return teardownData.totalTime();
117 },
118 executionResult: result
119 };
120 // Teardown Report
121 reports._setInstanceNumber(index);
122 reports._setStep(reports_1.EExecutionStep.TEARDOWN);
123 reports._setTest({
124 result: result,
125 instance: context,
126 });
127 return observifyFromPromiseWithContext(reportMethods.teardown, context, reports, teardownSetupResult, teardownScenarioResult, tdResult).map(function () { return tdResult; });
128 });
129 }
130 };
131 };
132};
133var resolveExecutor = function (singleLogic, stopOnError, executor, counter, teardownInstances) {
134 if (typeof executor === 'number') {
135 executor = {
136 parallel: false,
137 totalCount: executor,
138 };
139 }
140 if (executor['totalCount']) {
141 var times = executor['totalCount'];
142 var parallel = executor['parallel'] || false;
143 var obs = rxjs_1.Observable.of(null);
144 var failedExecutions_1 = [];
145 var buildExec_1 = function (ind) {
146 var instance = singleLogic(ind);
147 teardownInstances.push(instance.teardown);
148 return rxjs_1.Observable.of(ind).do(function (ind) { return log_1.log("\t\u2319 Executing instance #" + (ind + 1) + "...", 'blue'); }).flatMap(function () {
149 return instance.setupAndScenario
150 .catch(function (err) {
151 log_1.log('\t\t⌙ ' + String(err), 'red');
152 if (stopOnError) {
153 throw err;
154 }
155 failedExecutions_1.push({
156 index: ind + 1,
157 error: err
158 });
159 return rxjs_1.Observable.of(null);
160 });
161 });
162 };
163 if (parallel) {
164 counter.count = counter.count + times;
165 obs = obs.flatMapTo(rxjs_1.Observable.forkJoin(new Array(times).fill(null).map(function (dummy, ind) { return buildExec_1(ind); })));
166 }
167 else {
168 var _loop_1 = function (i) {
169 counter.count++;
170 obs = obs.flatMap(function () { return buildExec_1(i); });
171 };
172 for (var i = 0; i < times; i++) {
173 _loop_1(i);
174 }
175 }
176 return obs.do(function () {
177 if (failedExecutions_1.length > 0) {
178 throw new exeution_error_1.ExecutionErrors('Some of instances failed to execute!', failedExecutions_1);
179 }
180 });
181 }
182 else if (executor['timeToWait']) {
183 var time_1 = executor['timeToWait'];
184 return rxjs_1.Observable.of(null).do(function () { return log_1.log("\t\u2319 Waiting " + time_1 + "ms before next execution...", 'cyan'); }).delay(time_1);
185 }
186};
187exports.execute = function () {
188 var classes = [];
189 for (var _i = 0; _i < arguments.length; _i++) {
190 classes[_i] = arguments[_i];
191 }
192 (classes || []).forEach(function (testClass) {
193 var classConfig = testClass.$$config;
194 var strestConfig = testClass.$$configFile;
195 if (!classConfig) {
196 throw new Error("Class " + testClass.name + " is not decorated with @StressTest()!");
197 }
198 var reports = new reports_1.Reports();
199 var testName = classConfig.name || testClass.name;
200 var executionsOrder = classConfig.instances;
201 var stopOnError = classConfig.stopOnError;
202 var repeatExecution = classConfig.repeat || 1;
203 var singleFlow = buildFlowStream(reports, testClass);
204 describe("[" + testName + "]", function () {
205 executionsOrder.forEach(function (executionOrderIns) {
206 var executionOrder = executionOrderIns.getArr();
207 var executionStr = executionOrderIns.asString();
208 var _loop_2 = function (i) {
209 var title = "[ #" + i + " ][ " + executionStr + " ]";
210 it(title, function () {
211 return new Promise(function (resolve, reject) {
212 var counter = {
213 count: 0
214 };
215 var teardownInstances = [];
216 var obsRes = rxjs_1.Observable.of(null).do(function () {
217 log_1.bgLog(title + " - EXEC...", 'yellow');
218 });
219 executionOrder.forEach(function (executor) {
220 obsRes = obsRes.flatMapTo(resolveExecutor(singleFlow, stopOnError, executor, counter, teardownInstances));
221 });
222 obsRes
223 .do(function () { return log_1.log("\t\u2319 Flow execution is done, running teardown methods...", 'green'); })
224 .flatMap(function () {
225 return rxjs_1.Observable.merge.apply(rxjs_1.Observable, teardownInstances.map(function (tearndownFn) { return tearndownFn(); }));
226 })
227 .subscribe(function () {
228 setTimeout(resolve, 100);
229 }, function (e) {
230 setTimeout(function () {
231 reject(e);
232 }, 100);
233 });
234 });
235 });
236 };
237 for (var i = 1; i <= repeatExecution; i++) {
238 _loop_2(i);
239 }
240 });
241 afterAll(function () {
242 log_1.logDebug('afterAll called: executing reporters...');
243 reports.saveReport(reports, testName, strestConfig.reporters, path.resolve(process.cwd(), strestConfig.reportDirectory));
244 });
245 });
246 });
247};
248exports.addToTestSuite = exports.execute;
249//# sourceMappingURL=executer.js.map
\No newline at end of file