1 | var util = require ('util');
|
2 | var path = require ('path');
|
3 |
|
4 | var assert = require ('assert');
|
5 |
|
6 | var df = require ("../");
|
7 | var flow = require ("../flow");
|
8 |
|
9 | var baseName = path.basename (__filename, path.extname (__filename));
|
10 |
|
11 | var tests = [];
|
12 |
|
13 |
|
14 |
|
15 | var dataflows = [{
|
16 | description: "task failed at constructor call",
|
17 | config: {
|
18 | tasks: [{
|
19 | className: "non-existent-task",
|
20 | produce: "data.ok"
|
21 | }]
|
22 | },
|
23 | request: {
|
24 | test: true
|
25 | },
|
26 | completed: false,
|
27 | failed: true
|
28 | }, {
|
29 | description: "one completed and one skipped task",
|
30 | config: {
|
31 | tasks: [{
|
32 | className: "./test/task/002-ok-task",
|
33 | produce: "data.ok"
|
34 | }, {
|
35 | className: "./test/task/002-skip-task",
|
36 | requires: "{$data.ok}",
|
37 | produce: "data.skip"
|
38 | }]
|
39 | },
|
40 | request: {
|
41 | test: true
|
42 | },
|
43 | failed: false,
|
44 | completed: true
|
45 | }, {
|
46 | description: "two skipped tasks",
|
47 | config: {
|
48 | tasks: [{
|
49 | className: "./test/task/002-skip-task",
|
50 | produce: "data.skip1"
|
51 | }, {
|
52 | className: "./test/task/002-skip-task",
|
53 | produce: "data.skip2"
|
54 | }]
|
55 | },
|
56 | request: {
|
57 | test: true
|
58 | },
|
59 | failed: false,
|
60 | completed: true
|
61 | }, {
|
62 | description: "it's ok to skip some tasks if requirements not satisfied",
|
63 | config: {
|
64 | tasks: [{
|
65 | className: "./test/task/002-ok-task",
|
66 | produce: "data.ok"
|
67 | }, {
|
68 | className: "./test/task/002-skip-task",
|
69 | requires: "{$data.nothing}",
|
70 | produce: "data.skip"
|
71 | }]
|
72 | },
|
73 | request: {
|
74 | test: true
|
75 | },
|
76 | failed: false,
|
77 | completed: true
|
78 | }, {
|
79 | description: "skipped important task",
|
80 | config: {
|
81 | tasks: [{
|
82 | className: "./test/task/002-ok-task",
|
83 | produce: "data.ok"
|
84 | }, {
|
85 | className: "./test/task/002-skip-task",
|
86 | important: true,
|
87 | requires: "{$data.nothing}",
|
88 | produce: "data.skip"
|
89 | }]
|
90 | },
|
91 | request: {
|
92 | test: true
|
93 | },
|
94 | failed: true,
|
95 | completed: false
|
96 | }, {
|
97 | description: "important task decide itself fail or skip",
|
98 | config: {
|
99 | tasks: [{
|
100 | className: "./test/task/002-skip-task",
|
101 | important: true,
|
102 | produce: "data.ok"
|
103 | }]
|
104 | },
|
105 | request: {
|
106 | test: true
|
107 | },
|
108 | failed: true,
|
109 | completed: false
|
110 | }, {
|
111 | description: "fail task",
|
112 | config: {
|
113 | tasks: [{
|
114 | className: "./test/task/002-fail-task",
|
115 | produce: "data.fail"
|
116 | }]
|
117 | },
|
118 | request: {
|
119 | test: true
|
120 | },
|
121 | failed: true,
|
122 | completed: false
|
123 | }, {
|
124 | description: "fail task is skipped by requirements",
|
125 | config: {
|
126 | tasks: [{
|
127 | className: "./test/task/002-ok-task",
|
128 | produce: "data.ok"
|
129 | }, {
|
130 | className: "./test/task/002-fail-task",
|
131 | requires: "{$data.ok}",
|
132 | produce: "data.fail"
|
133 | }]
|
134 | },
|
135 | request: {
|
136 | test: true
|
137 | },
|
138 | failed: true,
|
139 | completed: false
|
140 |
|
141 |
|
142 | }];
|
143 |
|
144 | describe (baseName + " running dataflow", function () {
|
145 | dataflows.map (function (item) {
|
146 | it (item.description, function (done) {
|
147 |
|
148 | var df = new flow (
|
149 | {
|
150 | tasks: item.config.tasks,
|
151 | logger: "VERBOSE" in process.env ? undefined : function () {}
|
152 | }, {
|
153 | request: item.request
|
154 | }
|
155 | );
|
156 |
|
157 | if (!df.ready) {
|
158 | console.log ("dataflow not ready");
|
159 | assert (item.failed === true);
|
160 | done ();
|
161 | return;
|
162 | }
|
163 |
|
164 | df.on ('completed', function () {
|
165 | assert (item.completed === true);
|
166 | done ();
|
167 | });
|
168 |
|
169 | df.on ('failed', function () {
|
170 | assert (item.failed === true);
|
171 | done ();
|
172 | });
|
173 |
|
174 | df.on ('exception', function () {
|
175 | assert (item.exception === true);
|
176 | done ();
|
177 | });
|
178 |
|
179 | if (item.autoRun || item.autoRun == void 0)
|
180 | df.run();
|
181 |
|
182 | });
|
183 | });
|
184 | });
|
185 |
|
186 |
|
187 | return;
|
188 |
|
189 | var started = new Date ();
|
190 |
|
191 | var repeat = parseInt (process.argv[2]) || 1;
|
192 |
|
193 | repeat.times (function () {
|
194 |
|
195 | var independentConfig = {
|
196 | description: "1000 independent tasks",
|
197 | config: {
|
198 | tasks: []
|
199 | },
|
200 | request: {
|
201 | test: true
|
202 | },
|
203 | failed: failure ('1000 independent tasks'),
|
204 | completed: ok ('1000 independent tasks')
|
205 |
|
206 | };
|
207 |
|
208 | 1000..times (function (num) {
|
209 | independentConfig.config.tasks.push ({
|
210 | className: "./test/task/002-ok-task",
|
211 | produce: "data.ok"+num
|
212 | });
|
213 | });
|
214 |
|
215 | var independentDf = new flow (
|
216 | util.extend (true, {}, independentConfig.config),
|
217 | {request: independentConfig.request}
|
218 | );
|
219 |
|
220 | if (!independentDf.ready)
|
221 | return independentConfig.failed ();
|
222 |
|
223 | independentDf.on ('completed', independentConfig.completed);
|
224 |
|
225 | independentDf.on ('failed', independentConfig.failed);
|
226 |
|
227 | if (independentConfig.autoRun || independentConfig.autoRun == void 0)
|
228 | independentDf.run();
|
229 |
|
230 | var dependentConfig = {
|
231 | description: "1000 dependent tasks",
|
232 | config: {
|
233 | tasks: []
|
234 | },
|
235 | request: {
|
236 | test: true
|
237 | },
|
238 | failed: failure ('1000 dependent tasks'),
|
239 | completed: ok ('1000 dependent tasks')
|
240 |
|
241 | };
|
242 |
|
243 | dependentConfig.config.tasks.push ({
|
244 | className: "./test/task/002-ok-task",
|
245 | produce: "data.ok0"
|
246 | });
|
247 |
|
248 | 999..times (function (num) {
|
249 | dependentConfig.config.tasks.push ({
|
250 | className: "./test/task/002-ok-task",
|
251 | produce: "data.ok"+(num+1),
|
252 | require: "{$data.ok"+num+"}"
|
253 | });
|
254 | });
|
255 |
|
256 | var dependentDf = new flow (
|
257 | util.extend (true, {}, dependentConfig.config),
|
258 | {request: dependentConfig.request}
|
259 | );
|
260 |
|
261 | if (!dependentDf.ready)
|
262 | return dependentConfig.failed ();
|
263 |
|
264 | dependentDf.on ('completed', dependentConfig.completed);
|
265 |
|
266 | dependentDf.on ('failed', dependentConfig.failed);
|
267 |
|
268 | if (dependentConfig.autoRun || dependentConfig.autoRun == void 0)
|
269 | dependentDf.run();
|
270 |
|
271 | });
|
272 |
|
273 | process.on('exit', function () {
|
274 | var finished = new Date ();
|
275 | console.error ('finished in', finished.getTime () - started.getTime (), 'ms');
|
276 | });
|
277 |
|
278 |
|
279 |
|
280 |
|
281 |
|
282 |
|
283 |
|
284 |
|
285 |
|
286 |
|
287 |
|
288 |
|
289 |
|
290 |
|
291 |
|
292 |
|
293 |
|