1 | "use strict";
|
2 | require("reflect-metadata");
|
3 | var rxjs_1 = require("rxjs");
|
4 | var reports_1 = require("./reports");
|
5 | var path = require("path");
|
6 | var exeution_error_1 = require("./exeution-error");
|
7 | var log_1 = require("./log");
|
8 | var noop = function () {
|
9 | };
|
10 | if (global && global['jasmine']) {
|
11 | global['jasmine']['DEFAULT_TIMEOUT_INTERVAL'] = Math.pow(2, 31) - 1;
|
12 | }
|
13 | var 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 | };
|
22 | var 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 | };
|
40 | var 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:
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 | };
|
133 | var 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 | };
|
187 | exports.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 | };
|
248 | exports.addToTestSuite = exports.execute;
|
249 |
|
\ | No newline at end of file |