Branch data Line data Source code
1 [ + ]: 13 : /**
2 : 13 : * tee (GNU coreutils) 8.32
3 : 13 : * Copyright (C) 2020 Free Software Foundation, Inc.
4 : 13 : * License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
5 : 13 : * This is free software: you are free to change and redistribute it.
6 : 13 : * There is NO WARRANTY, to the extent permitted by law.
7 : 13 : *
8 : 13 : * Written by Mike Parker, Richard M. Stallman, and David MacKenzie.
9 : 13 : *
10 : 13 : * Implemented in node.js by Essam A. El-Sherif.
11 : 13 : *
12 : 13 : * @module node-tee.test
13 : 13 : * @desc Testing module for 'node-tee' core utility.
14 : 13 : * @version 1.0.1
15 : 13 : * @author Essam A. El-Sherif
16 : 13 : */
17 : 13 :
18 : 13 : /* Import nodeJS core modules */
19 : 13 : import os from 'node:os';
20 : 13 : import process from 'node:process';
21 : 13 : import assert from 'node:assert/strict';
22 : 13 : import fs from 'node:fs';
23 : 13 : import { exec, execSync } from 'node:child_process';
24 : 13 : import { fileURLToPath } from 'node:url';
25 : 13 : import { dirname, join } from 'node:path';
26 : 13 :
27 : 13 : /** @const {string} CMD_SHELL - The coreutils shell command. */
28 : 13 : const CMD_SHELL = 'tee';
29 : 13 :
30 : 13 : /** @const {string} CMD_NODE - The coreutils node command. */
31 : 13 : const CMD_NODE = 'node-tee';
32 : 13 :
33 : 13 : /** @const {string} CMD_NODE_TEST - The coreutils node testing command. */
34 : 13 : const CMD_NODE_TEST = 'node-tee-test';
35 : 13 :
36 : 13 : /* Emulate commonJS __filename and __dirname constants */
37 : 13 : const __filename = fileURLToPath(import.meta.url);
38 : 13 : const __dirname = dirname(__filename);
39 : 13 :
40 : 13 : /* Prepare test environment */
41 : 13 : const cmdNode = join(__dirname, '..', 'lib/node-tee.js');
42 : 13 : const cmdNodeTest = join(__dirname, '..', 'test/node-tee.test.js');
43 : 13 :
44 : 13 : let cmdShell = CMD_SHELL;
45 : 13 : let cmdShellVer = cmdShell;
46 : 13 :
47 : 13 : const devNull = os.devNull;
48 : 13 : const tmpDir = os.tmpdir();
49 : 13 : const noOpCmd = 'exit';
50 : 13 :
51 : 13 : let testCount = 1;
52 : 13 : let passCount = 0;
53 : 13 : let failCount = 0;
54 : 13 : let cancelCount = 0
55 : 13 : let skipCount = 0;
56 : 13 : let todoCount = 0;
57 : 13 : let startTime = Date.now();
58 : 13 :
59 : 13 : const suites = new Map();
60 : 13 :
61 : 13 : /** @const {object} cmdOptions - Command line arguments. */
62 : 13 : const cmdOptions = {
63 : 13 : node : true, // -n --node / - d --def
64 : 13 : verbose : false, // -v --verbose
65 : 13 : };
66 : 13 :
67 : 13 : /**
68 : 13 : * function main()
69 : 13 : * function verifyShellCmd()
70 : 13 : * function loadTestData()
71 : 13 : * function nodeRunner()
72 : 13 : * function defRunner()
73 : 13 : * async function makeTest()
74 : 13 : * function getCmdOutput()
75 : 13 : * function parseCmdLine()
76 : 13 : * function getHelp()
77 : 13 : * function getError()
78 : 13 : *
79 : 13 : * @func Main
80 : 13 : * @desc The application entry point function.
81 : 13 : */
82 [ + ]: 13 : (() => {
83 : 13 : parseCmdLine();
84 : 13 :
85 : 13 : if(process.env['NODE_TEE_TEST']){
86 : 13 : process.stdout.write(JSON.stringify(cmdOptions));
87 : 13 : }
88 : 13 : else{
89 : 13 : verifyShellCmd();
90 : 13 : loadTestData();
91 : 13 :
92 : 13 : if(cmdOptions.node){
93 : 13 :
94 : 13 : import('node:test')
95 [ + ]: 13 : .then(runner => {
96 : 1 : cmdOptions.verbose = false;
97 : 1 : nodeRunner(runner);
98 : 13 : })
99 : 13 : /* node:coverage disable */
100 : : .catch((e) => {
101 : : defRunner();
102 : : });
103 [ - ]: : }
104 : : else{
105 : : defRunner();
106 : : }
107 : : }
108 : : /* node:coverage enable */
109 : 13 : })('Main Function');
110 : 13 :
111 : 13 : /**
112 : 13 : * function main()
113 : 13 : * function verifyShellCmd()
114 : 13 : * function loadTestData()
115 : 13 : * function nodeRunner()
116 : 13 : * function defRunner()
117 : 13 : * async function makeTest()
118 : 13 : * function getCmdOutput()
119 : 13 : * function parseCmdLine()
120 : 13 : * function getHelp()
121 : 13 : * function getError()
122 : 13 : *
123 : 13 : * @func verifyShellCmd
124 : 13 : * @desc Verify existance of the core utility command and test its version.
125 : 13 : */
126 [ + ]: 1 : function verifyShellCmd(){
127 : 1 :
128 : 1 : let cmdVer = `\
129 : 1 : tee (GNU coreutils) 8.32
130 : 1 : Copyright (C) 2020 Free Software Foundation, Inc.
131 : 1 : License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
132 : 1 : This is free software: you are free to change and redistribute it.
133 : 1 : There is NO WARRANTY, to the extent permitted by law.
134 : 1 :
135 : 1 : Written by Mike Parker, Richard M. Stallman, and David MacKenzie.
136 : 1 : `;
137 : 1 : try{
138 : 1 : const ver = execSync(`${cmdShell} --version`, {encoding: 'UTF-8', stdio: ['pipe', 'pipe', 'ignore']});
139 : 1 :
140 : 1 : if(ver !== cmdVer)
141 [ - ]: 1 : cmdShellVer = '';
142 : 1 : }
143 : 1 : /* node:coverage disable */
144 [ - ]: : catch(e){
145 : : cmdShell = '';
146 : : cmdShellVer = '';
147 : : }
148 : : /* node:coverage enable */
149 : 1 : }
150 : 13 :
151 : 13 : /**
152 : 13 : * function main()
153 : 13 : * function verifyShellCmd()
154 : 13 : * function loadTestData()
155 : 13 : * function nodeRunner()
156 : 13 : * function defRunner()
157 : 13 : * async function makeTest()
158 : 13 : * function getCmdOutput()
159 : 13 : * function parseCmdLine()
160 : 13 : * function getHelp()
161 : 13 : * function getError()
162 : 13 : *
163 : 13 : * @func loadTestData
164 : 13 : * @desc Load test data.
165 : 13 : */
166 [ + ]: 1 : function loadTestData(){
167 : 1 :
168 : 1 : let cmdData = null;
169 : 1 : let suiteDesc = '';
170 : 1 : let actFile = '', expFile = '';
171 : 1 :
172 : 1 : // TEST SUITE #0 - Self test this test module
173 : 1 : suiteDesc = 'Self test this test module';
174 : 1 : suites.set(suiteDesc, []);
175 : 1 :
176 : 1 : // TEST ### - node-tee-test --help
177 : 1 : cmdData = {cmd_aux: null};
178 : 1 :
179 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} --help`;
180 : 1 : cmdData.cmd_exp = '';
181 : 1 : cmdData.cmd_inp = '';
182 : 1 :
183 : 1 : cmdData.cmd_out = getHelp();
184 : 1 : cmdData.cmd_err = '';
185 : 1 :
186 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
187 : 1 : cmdData.cmd_ext = 0;
188 : 1 : cmdData.cmd_desc = `${CMD_NODE_TEST} --help`;
189 : 1 :
190 : 1 : cmdData.cmd_skip = false;
191 : 1 : suites.get(suiteDesc).push(cmdData);
192 : 1 :
193 : 1 : // TEST ### - node-tee-test -h
194 : 1 : cmdData = {cmd_aux: null};
195 : 1 :
196 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} -h`;
197 : 1 : cmdData.cmd_exp = '';
198 : 1 : cmdData.cmd_inp = '';
199 : 1 :
200 : 1 : cmdData.cmd_out = getHelp();
201 : 1 : cmdData.cmd_err = '';
202 : 1 :
203 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
204 : 1 : cmdData.cmd_ext = 0;
205 : 1 : cmdData.cmd_desc = `${CMD_NODE_TEST} -h`;
206 : 1 :
207 : 1 : cmdData.cmd_skip = false;
208 : 1 : suites.get(suiteDesc).push(cmdData);
209 : 1 :
210 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test
211 : 1 : cmdData = {cmd_aux: null};
212 : 1 :
213 : 1 : cmdData.cmd_act = `node ${cmdNodeTest}`;
214 : 1 : cmdData.cmd_exp = '';
215 : 1 : cmdData.cmd_inp = '';
216 : 1 :
217 : 1 : cmdData.cmd_out = `{"node":true,"verbose":false}`;
218 : 1 : cmdData.cmd_err = '';
219 : 1 :
220 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
221 : 1 : cmdData.cmd_ext = 0;
222 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST}`;
223 : 1 :
224 : 1 : cmdData.cmd_skip = false;
225 : 1 : suites.get(suiteDesc).push(cmdData);
226 : 1 :
227 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test --node
228 : 1 : cmdData = {cmd_aux: null};
229 : 1 :
230 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} --node`;
231 : 1 : cmdData.cmd_exp = '';
232 : 1 : cmdData.cmd_inp = '';
233 : 1 :
234 : 1 : cmdData.cmd_out = `{"node":true,"verbose":false}`;
235 : 1 : cmdData.cmd_err = '';
236 : 1 :
237 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
238 : 1 : cmdData.cmd_ext = 0;
239 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST} --node`;
240 : 1 :
241 : 1 : cmdData.cmd_skip = false;
242 : 1 : suites.get(suiteDesc).push(cmdData);
243 : 1 :
244 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test -n
245 : 1 : cmdData = {cmd_aux: null};
246 : 1 :
247 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} -n`;
248 : 1 : cmdData.cmd_exp = '';
249 : 1 : cmdData.cmd_inp = '';
250 : 1 :
251 : 1 : cmdData.cmd_out = `{"node":true,"verbose":false}`;
252 : 1 : cmdData.cmd_err = '';
253 : 1 :
254 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
255 : 1 : cmdData.cmd_ext = 0;
256 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST} -n`;
257 : 1 :
258 : 1 : cmdData.cmd_skip = false;
259 : 1 : suites.get(suiteDesc).push(cmdData);
260 : 1 :
261 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test --def
262 : 1 : cmdData = {cmd_aux: null};
263 : 1 :
264 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} --def`;
265 : 1 : cmdData.cmd_exp = '';
266 : 1 : cmdData.cmd_inp = '';
267 : 1 :
268 : 1 : cmdData.cmd_out = `{"node":false,"verbose":false}`;
269 : 1 : cmdData.cmd_err = '';
270 : 1 :
271 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
272 : 1 : cmdData.cmd_ext = 0;
273 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST} --def`;
274 : 1 :
275 : 1 : cmdData.cmd_skip = false;
276 : 1 : suites.get(suiteDesc).push(cmdData);
277 : 1 :
278 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test -d
279 : 1 : cmdData = {cmd_aux: null};
280 : 1 :
281 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} -d`;
282 : 1 : cmdData.cmd_exp = '';
283 : 1 : cmdData.cmd_inp = '';
284 : 1 :
285 : 1 : cmdData.cmd_out = `{"node":false,"verbose":false}`;
286 : 1 : cmdData.cmd_err = '';
287 : 1 :
288 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
289 : 1 : cmdData.cmd_ext = 0;
290 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST} -d`;
291 : 1 :
292 : 1 : cmdData.cmd_skip = false;
293 : 1 : suites.get(suiteDesc).push(cmdData);
294 : 1 :
295 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test --verbose
296 : 1 : cmdData = {cmd_aux: null};
297 : 1 :
298 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} --verbose`;
299 : 1 : cmdData.cmd_exp = '';
300 : 1 : cmdData.cmd_inp = '';
301 : 1 :
302 : 1 : cmdData.cmd_out = `{"node":true,"verbose":true}`;
303 : 1 : cmdData.cmd_err = '';
304 : 1 :
305 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
306 : 1 : cmdData.cmd_ext = 0;
307 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST} --verbose`;
308 : 1 :
309 : 1 : cmdData.cmd_skip = false;
310 : 1 : suites.get(suiteDesc).push(cmdData);
311 : 1 :
312 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test -v
313 : 1 : cmdData = {cmd_aux: null};
314 : 1 :
315 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} -v`;
316 : 1 : cmdData.cmd_exp = '';
317 : 1 : cmdData.cmd_inp = '';
318 : 1 :
319 : 1 : cmdData.cmd_out = `{"node":true,"verbose":true}`;
320 : 1 : cmdData.cmd_err = '';
321 : 1 :
322 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
323 : 1 : cmdData.cmd_ext = 0;
324 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST} -v`;
325 : 1 :
326 : 1 : cmdData.cmd_skip = false;
327 : 1 : suites.get(suiteDesc).push(cmdData);
328 : 1 :
329 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test --xxx
330 : 1 : cmdData = {cmd_aux: null};
331 : 1 :
332 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} --xxx`;
333 : 1 : cmdData.cmd_exp = '';
334 : 1 : cmdData.cmd_inp = '';
335 : 1 :
336 : 1 : cmdData.cmd_out = ``;
337 : 1 : cmdData.cmd_err = `\
338 : 1 : ${CMD_NODE_TEST}: invalid option -- 'xxx'
339 : 1 : Try '${CMD_NODE_TEST} --help' for more information.
340 : 1 : `;
341 : 1 :
342 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
343 : 1 : cmdData.cmd_ext = 1;
344 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST} --xxx`;
345 : 1 :
346 : 1 : cmdData.cmd_skip = false;
347 : 1 : suites.get(suiteDesc).push(cmdData);
348 : 1 :
349 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test -x
350 : 1 : cmdData = {cmd_aux: null};
351 : 1 :
352 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} -x`;
353 : 1 : cmdData.cmd_exp = '';
354 : 1 : cmdData.cmd_inp = '';
355 : 1 :
356 : 1 : cmdData.cmd_out = ``;
357 : 1 : cmdData.cmd_err = `\
358 : 1 : ${CMD_NODE_TEST}: unrecognized option '-x'
359 : 1 : Try '${CMD_NODE_TEST} --help' for more information.
360 : 1 : `,
361 : 1 :
362 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
363 : 1 : cmdData.cmd_ext = 1;
364 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST} -x`;
365 : 1 :
366 : 1 : cmdData.cmd_skip = false;
367 : 1 : suites.get(suiteDesc).push(cmdData);
368 : 1 :
369 : 1 : // TEST ### - NODE_TEE_TEST=1 node-tee-test xxx
370 : 1 : cmdData = {cmd_aux: null};
371 : 1 :
372 : 1 : cmdData.cmd_act = `node ${cmdNodeTest} xxx`;
373 : 1 : cmdData.cmd_exp = '';
374 : 1 : cmdData.cmd_inp = '';
375 : 1 :
376 : 1 : cmdData.cmd_out = ``;
377 : 1 : cmdData.cmd_err = `\
378 : 1 : ${CMD_NODE_TEST}: unrecognized option 'xxx'
379 : 1 : Try '${CMD_NODE_TEST} --help' for more information.
380 : 1 : `,
381 : 1 :
382 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8', env:{NODE_TEE_TEST:1}};
383 : 1 : cmdData.cmd_ext = 1;
384 : 1 : cmdData.cmd_desc = `NODE_TEE_TEST=1 ${CMD_NODE_TEST} xxx`;
385 : 1 :
386 : 1 : cmdData.cmd_skip = false;
387 : 1 : suites.get(suiteDesc).push(cmdData);
388 : 1 :
389 : 1 : // TEST SUITE #1 - Test common coreutils options
390 : 1 : suiteDesc = 'Test common coreutils options';
391 : 1 : suites.set(suiteDesc, []);
392 : 1 :
393 : 1 : // TEST ### - tee --help
394 : 1 : cmdData = {cmd_aux: null};
395 : 1 :
396 : 1 : cmdData.cmd_act = `node ${cmdNode} --help`;
397 : 1 : cmdData.cmd_exp = '';
398 : 1 : cmdData.cmd_inp = '';
399 : 1 :
400 : 1 : cmdData.cmd_out = `\
401 : 1 : Usage: node-tee [OPTION]... [FILE]...
402 : 1 : Copy standard input to each FILE, and also to standard output.
403 : 1 :
404 : 1 : -a, --append append to the given FILEs, do not overwrite
405 : 1 : -i, --ignore-interrupts ignore interrupt signals
406 : 1 : -p diagnose errors writing to non pipes
407 : 1 : --output-error[=MODE] set behavior on write error. See MODE below
408 : 1 : --help display this help and exit
409 : 1 : --version output version information and exit
410 : 1 :
411 : 1 : MODE determines behavior with write errors on the outputs:
412 : 1 : 'warn' diagnose errors writing to any output
413 : 1 : 'warn-nopipe' diagnose errors writing to any output not a pipe
414 : 1 : 'exit' exit on error writing to any output
415 : 1 : 'exit-nopipe' exit on error writing to any output not a pipe
416 : 1 : The default MODE for the -p option is 'warn-nopipe'.
417 : 1 : The default operation when --output-error is not specified, is to
418 : 1 : exit immediately on error writing to a pipe, and diagnose errors
419 : 1 : writing to non pipe outputs.
420 : 1 : `;
421 : 1 : cmdData.cmd_err = '';
422 : 1 :
423 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
424 : 1 : cmdData.cmd_ext = 0;
425 : 1 : cmdData.cmd_desc = `${CMD_NODE} --help`;
426 : 1 :
427 : 1 : cmdData.cmd_skip = false;
428 : 1 : suites.get(suiteDesc).push(cmdData);
429 : 1 :
430 : 1 : // TEST ### - tee --version
431 : 1 : cmdData = {cmd_aux: null};
432 : 1 :
433 : 1 : cmdData.cmd_act = `node ${cmdNode} --version`;
434 : 1 : cmdData.cmd_exp = '';
435 : 1 : cmdData.cmd_inp = '';
436 : 1 :
437 : 1 : cmdData.cmd_out = `v1.0.1\n`;
438 : 1 : cmdData.cmd_err = '';
439 : 1 :
440 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
441 : 1 : cmdData.cmd_ext = 0;
442 : 1 : cmdData.cmd_desc = `${CMD_NODE} --version`;
443 : 1 :
444 : 1 : cmdData.cmd_skip = false;
445 : 1 : suites.get(suiteDesc).push(cmdData);
446 : 1 :
447 : 1 : // TEST ### - tee --
448 : 1 : cmdData = {cmd_aux: null};
449 : 1 :
450 : 1 : cmdData.cmd_act = `node ${cmdNode} --`;
451 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --`;
452 : 1 : cmdData.cmd_inp = '';
453 : 1 :
454 : 1 : cmdData.cmd_out = '';
455 : 1 : cmdData.cmd_err = '';
456 : 1 :
457 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
458 : 1 : cmdData.cmd_ext = 0;
459 : 1 : cmdData.cmd_desc = `${CMD_NODE} --`;
460 : 1 :
461 : 1 : cmdData.cmd_skip = false;
462 : 1 : suites.get(suiteDesc).push(cmdData);
463 : 1 :
464 : 1 : // TEST SUITE #2 - Validate command line arguments
465 : 1 : suiteDesc = 'Validate command line arguments';
466 : 1 : suites.set(suiteDesc, []);
467 : 1 :
468 : 1 : // TEST ### - tee --xxx
469 : 1 : cmdData = {cmd_aux: null};
470 : 1 :
471 : 1 : cmdData.cmd_act = `node ${cmdNode} --xxx`;
472 : 1 : cmdData.cmd_exp = cmdShellVer && `${cmdShell} --xxx`;
473 : 1 : cmdData.cmd_inp = '';
474 : 1 :
475 : 1 : cmdData.cmd_out = '';
476 : 1 : cmdData.cmd_err = `${CMD_NODE}: unrecognized option '--xxx'
477 : 1 : Try '${CMD_NODE} --help' for more information.\n`;
478 : 1 :
479 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
480 : 1 : cmdData.cmd_ext = 1;
481 : 1 : cmdData.cmd_desc = `${CMD_NODE} --xxx`;
482 : 1 :
483 : 1 : cmdData.cmd_skip = false;
484 : 1 : suites.get(suiteDesc).push(cmdData);
485 : 1 :
486 : 1 : // TEST ### - tee --output-error=
487 : 1 : cmdData = {cmd_aux: null};
488 : 1 :
489 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=`;
490 : 1 : cmdData.cmd_exp = cmdShellVer && `${cmdShell} --output-error=`;
491 : 1 : cmdData.cmd_inp = '';
492 : 1 :
493 : 1 : cmdData.cmd_out = '';
494 : 1 : cmdData.cmd_err = `\
495 : 1 : ${CMD_NODE}: ambiguous argument ‘’ for ‘--output-error’
496 : 1 : Valid arguments are:
497 : 1 : - ‘warn’
498 : 1 : - ‘warn-nopipe’
499 : 1 : - ‘exit’
500 : 1 : - ‘exit-nopipe’
501 : 1 : Try '${CMD_NODE} --help' for more information.\n`;
502 : 1 :
503 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
504 : 1 : cmdData.cmd_ext = 1;
505 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=`;
506 : 1 :
507 : 1 : cmdData.cmd_skip = false;
508 : 1 : suites.get(suiteDesc).push(cmdData);
509 : 1 :
510 : 1 : // TEST ### - tee --output-error=xxx
511 : 1 : cmdData = {cmd_aux: null};
512 : 1 :
513 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=xxx`;
514 : 1 : cmdData.cmd_exp = cmdShellVer && `${cmdShell} --output-error=xxx`;
515 : 1 : cmdData.cmd_inp = '';
516 : 1 :
517 : 1 : cmdData.cmd_out = '';
518 : 1 : cmdData.cmd_err = `\
519 : 1 : ${CMD_NODE}: invalid argument ‘xxx’ for ‘--output-error’
520 : 1 : Valid arguments are:
521 : 1 : - ‘warn’
522 : 1 : - ‘warn-nopipe’
523 : 1 : - ‘exit’
524 : 1 : - ‘exit-nopipe’
525 : 1 : Try '${CMD_NODE} --help' for more information.\n`;
526 : 1 :
527 : 1 :
528 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
529 : 1 : cmdData.cmd_ext = 1;
530 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=xxx`;
531 : 1 :
532 : 1 : cmdData.cmd_skip = false;
533 : 1 : suites.get(suiteDesc).push(cmdData);
534 : 1 :
535 : 1 : // TEST ### - tee -x
536 : 1 : cmdData = {cmd_aux: null};
537 : 1 :
538 : 1 : cmdData.cmd_act = `node ${cmdNode} -x`;
539 : 1 : cmdData.cmd_exp = cmdShellVer && `${cmdShell} -x`;
540 : 1 : cmdData.cmd_inp = '';
541 : 1 :
542 : 1 : cmdData.cmd_out = '';
543 : 1 : cmdData.cmd_err = `${CMD_NODE}: invalid option -- 'x'
544 : 1 : Try '${CMD_NODE} --help' for more information.\n`;
545 : 1 :
546 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
547 : 1 : cmdData.cmd_ext = 1;
548 : 1 : cmdData.cmd_desc = `${CMD_NODE} -x`;
549 : 1 :
550 : 1 : cmdData.cmd_skip = false;
551 : 1 : suites.get(suiteDesc).push(cmdData);
552 : 1 :
553 : 1 : // TEST SUITE #3 - Test normal operation
554 : 1 : suiteDesc = 'Test normal operation';
555 : 1 : suites.set(suiteDesc, []);
556 : 1 :
557 : 1 : // TEST ### - tee
558 : 1 : cmdData = {cmd_aux: null};
559 : 1 :
560 : 1 : cmdData.cmd_act = `node ${cmdNode}`;
561 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell}`;
562 : 1 : cmdData.cmd_inp = '';
563 : 1 :
564 : 1 : cmdData.cmd_out = '';
565 : 1 : cmdData.cmd_err = '';
566 : 1 :
567 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
568 : 1 : cmdData.cmd_ext = 0;
569 : 1 : cmdData.cmd_desc = `${CMD_NODE}`;
570 : 1 :
571 : 1 : cmdData.cmd_skip = false;
572 : 1 : suites.get(suiteDesc).push(cmdData);
573 : 1 :
574 : 1 : // TEST ### - tee << \\x00\\x01\\x02\\x03\\x04
575 : 1 : cmdData = {cmd_aux: null};
576 : 1 :
577 : 1 : cmdData.cmd_act = `node ${cmdNode}`;
578 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell}`;
579 : 1 : cmdData.cmd_inp = '\x00\x01\x02\x03\x04';
580 : 1 :
581 : 1 : cmdData.cmd_out = `\x00\x01\x02\x03\x04`;
582 : 1 : cmdData.cmd_err = '';
583 : 1 :
584 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
585 : 1 : cmdData.cmd_ext = 0;
586 : 1 : cmdData.cmd_desc = `${CMD_NODE}` + ` << \\x00\\x01\\x02\\x03\\x04`;
587 : 1 :
588 : 1 : cmdData.cmd_skip = false;
589 : 1 : suites.get(suiteDesc).push(cmdData);
590 : 1 :
591 : 1 : // TEST ### - tee << test data\\nline 1\\nline 2\\x04\\nline 3
592 : 1 : cmdData = {cmd_aux: null};
593 : 1 :
594 : 1 : cmdData.cmd_act = `node ${cmdNode}`;
595 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell}`;
596 : 1 : cmdData.cmd_inp = 'test data\nline 1\nline 2\x04\nline 3';
597 : 1 :
598 : 1 : cmdData.cmd_out = `test data
599 : 1 : line 1
600 : 1 : line 2\x04
601 : 1 : line 3`;
602 : 1 : cmdData.cmd_err = '';
603 : 1 :
604 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
605 : 1 : cmdData.cmd_ext = 0;
606 : 1 : cmdData.cmd_desc = `${CMD_NODE}` + ` << test data\\nline 1\\nline 2\\x04\\nline 3`;
607 : 1 :
608 : 1 : cmdData.cmd_skip = false;
609 : 1 : suites.get(suiteDesc).push(cmdData);
610 : 1 :
611 : 1 : // TEST ### - tee -i << test data\\nline 1\\nline 2\\x04\\nline 3
612 : 1 : cmdData = {cmd_aux: null};
613 : 1 :
614 : 1 : cmdData.cmd_act = `node ${cmdNode} -i`;
615 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} -i`;
616 : 1 : cmdData.cmd_inp = 'test data\nline 1\nline 2\x04\nline 3';
617 : 1 :
618 : 1 : cmdData.cmd_out = `test data
619 : 1 : line 1
620 : 1 : line 2\x04
621 : 1 : line 3`;
622 : 1 : cmdData.cmd_err = '';
623 : 1 :
624 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
625 : 1 : cmdData.cmd_ext = 0;
626 : 1 : cmdData.cmd_desc = `${CMD_NODE} -i` + ` << test data\\nline 1\\nline 2\\x04\\nline 3`;
627 : 1 :
628 : 1 : cmdData.cmd_skip = false;
629 : 1 : suites.get(suiteDesc).push(cmdData);
630 : 1 :
631 : 1 : // TEST ### - tee --ignore-interrupts << test data\\nline 1\\nline 2\\x04\\nline 3
632 : 1 : cmdData = {cmd_aux: null};
633 : 1 :
634 : 1 : cmdData.cmd_act = `node ${cmdNode} --ignore-interrupts`;
635 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --ignore-interrupts`;
636 : 1 : cmdData.cmd_inp = 'test data\nline 1\nline 2\x04\nline 3';
637 : 1 :
638 : 1 : cmdData.cmd_out = `test data
639 : 1 : line 1
640 : 1 : line 2\x04
641 : 1 : line 3`;
642 : 1 : cmdData.cmd_err = '';
643 : 1 :
644 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
645 : 1 : cmdData.cmd_ext = 0;
646 : 1 : cmdData.cmd_desc = `${CMD_NODE} --ignore-interrupts` + ` << test data\\nline 1\\nline 2\\x04\\nline 3`;
647 : 1 :
648 : 1 : cmdData.cmd_skip = false;
649 : 1 : suites.get(suiteDesc).push(cmdData);
650 : 1 :
651 : 1 : // TEST ### - tee << test data << CTRL-C signal
652 : 1 : cmdData = {cmd_aux: null};
653 : 1 :
654 : 1 : cmdData.cmd_act = `node ${cmdNode}`;
655 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell}`;
656 : 1 : cmdData.cmd_inp = 'test data';
657 : 1 :
658 : 1 : cmdData.cmd_out = `test data`;
659 : 1 : cmdData.cmd_err = '';
660 : 1 :
661 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
662 : 1 : cmdData.cmd_ext = 0;
663 : 1 : cmdData.cmd_desc = `${CMD_NODE}` + ` << test data << CTRL-C signal`;
664 : 1 :
665 : 1 : cmdData.signal = 'SIGINT';
666 : 1 :
667 : 1 : cmdData.cmd_skip = false;
668 : 1 : suites.get(suiteDesc).push(cmdData);
669 : 1 :
670 : 1 : // TEST ### - tee -i << test data << CTRL-C signal
671 : 1 : cmdData = {cmd_aux: null};
672 : 1 :
673 : 1 : cmdData.cmd_act = `node ${cmdNode} -i`;
674 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} -i`;
675 : 1 : cmdData.cmd_inp = 'test data';
676 : 1 :
677 : 1 : cmdData.cmd_out = `test data`;
678 : 1 : cmdData.cmd_err = '';
679 : 1 :
680 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
681 : 1 : cmdData.cmd_ext = 0;
682 : 1 : cmdData.cmd_desc = `${CMD_NODE} -i` + ` << test data << CTRL-C signal`;
683 : 1 :
684 : 1 : cmdData.signal = 'SIGINT';
685 : 1 :
686 : 1 : cmdData.cmd_skip = false;
687 : 1 : suites.get(suiteDesc).push(cmdData);
688 : 1 :
689 : 1 : // TEST ### - tee tmpDir/testTeeAct-1.pid << test data
690 : 1 : cmdData = {cmd_aux: null};
691 : 1 : cmdData.actFile = join(tmpDir, `testTeeAct-1.${process.pid}`);
692 : 1 : cmdData.expFile = join(tmpDir, `testTeeExp-1.${process.pid}`);
693 : 1 :
694 : 1 : fs.writeFileSync(cmdData.actFile, 'test data',{encoding: 'utf8'});
695 : 1 : fs.writeFileSync(cmdData.expFile, 'test data',{encoding: 'utf8'});
696 : 1 :
697 : 1 : cmdData.cmd_act = `node ${cmdNode} ${cmdData.actFile}`;
698 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} ${cmdData.expFile}`;
699 : 1 : cmdData.cmd_inp = 'test data';
700 : 1 :
701 : 1 : cmdData.cmd_out = 'test data';
702 : 1 : cmdData.cmd_err = '';
703 : 1 :
704 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
705 : 1 : cmdData.cmd_ext = 0;
706 : 1 : cmdData.cmd_desc = `${CMD_NODE} ${cmdData.actFile}` + ` << test data`;
707 : 1 :
708 [ + ]: 1 : cmdData.cmd_aux = (cmdData) => {
709 [ + ]: 1 : fs.open(cmdData.actFile, (err, fd) => {
710 [ + ]: 1 : fs.readFile(fd, 'utf8', (err, data) => {
711 : 1 : assert.strictEqual(data, 'test data');
712 [ + ]: 1 : fs.unlink(cmdData.actFile, (err)=>{});
713 : 1 : });
714 : 1 : });
715 [ + ]: 1 : fs.open(cmdData.expFile, (err, fd) => {
716 [ + ]: 1 : fs.readFile(fd, 'utf8', (err, data) => {
717 : 1 : assert.strictEqual(data, 'test data');
718 [ + ]: 1 : fs.unlink(cmdData.expFile, (err)=>{});
719 : 1 : });
720 : 1 : });
721 : 1 : };
722 : 1 :
723 : 1 : cmdData.cmd_skip = false;
724 : 1 : suites.get(suiteDesc).push(cmdData);
725 : 1 :
726 : 1 : // TEST ### - tee -a tmpDir/testTeeAct-2.pid << test data
727 : 1 : cmdData = {cmd_aux: null};
728 : 1 : cmdData.actFile = join(tmpDir, `testTeeAct-2.${process.pid}`);
729 : 1 : cmdData.expFile = join(tmpDir, `testTeeExp-2.${process.pid}`);
730 : 1 :
731 : 1 : fs.writeFileSync(cmdData.actFile, 'test data',{encoding: 'utf8'});
732 : 1 : fs.writeFileSync(cmdData.expFile, 'test data',{encoding: 'utf8'});
733 : 1 :
734 : 1 : cmdData.cmd_act = `node ${cmdNode} -a ${cmdData.actFile}`;
735 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} -a ${cmdData.expFile}`;
736 : 1 : cmdData.cmd_inp = 'test data';
737 : 1 :
738 : 1 : cmdData.cmd_out = 'test data';
739 : 1 : cmdData.cmd_err = '';
740 : 1 :
741 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
742 : 1 : cmdData.cmd_ext = 0;
743 : 1 : cmdData.cmd_desc = `${CMD_NODE} -a ${cmdData.actFile}` + ` << test data`;
744 : 1 :
745 [ + ]: 1 : cmdData.cmd_aux = (cmdData) => {
746 [ + ]: 1 : fs.open(cmdData.actFile, (err, fd) => {
747 [ + ]: 1 : fs.readFile(fd, 'utf8', (err, data) => {
748 : 1 : assert.strictEqual(data, 'test datatest data');
749 [ + ]: 1 : fs.unlink(cmdData.actFile, (err)=>{});
750 : 1 : });
751 : 1 : });
752 [ + ]: 1 : fs.open(cmdData.expFile, (err, fd) => {
753 [ + ]: 1 : fs.readFile(fd, 'utf8', (err, data) => {
754 : 1 : if(cmdShell)
755 : 1 : assert.strictEqual(data, 'test datatest data');
756 [ + ]: 1 : fs.unlink(cmdData.expFile, (err)=>{});
757 : 1 : });
758 : 1 : });
759 : 1 : };
760 : 1 :
761 : 1 : cmdData.cmd_skip = false;
762 : 1 : suites.get(suiteDesc).push(cmdData);
763 : 1 :
764 : 1 : // TEST SUITE #4 - Test warn/error conditions of output files
765 : 1 : suiteDesc = 'Test warn/error conditions of output files';
766 : 1 : suites.set(suiteDesc, []);
767 : 1 :
768 : 1 : // TEST ### - tee non-existent/file << test data
769 : 1 : cmdData = {cmd_aux: null};
770 : 1 :
771 : 1 : cmdData.cmd_act = `node ${cmdNode} non-existent/file`;
772 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} non-existent/file`;
773 : 1 : cmdData.cmd_inp = 'test data';
774 : 1 :
775 : 1 : cmdData.cmd_out = `test data`;
776 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
777 : 1 :
778 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
779 : 1 : cmdData.cmd_ext = 1;
780 : 1 : cmdData.cmd_desc = `${CMD_NODE} non-existent/file` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
781 : 1 :
782 : 1 : cmdData.cmd_skip = false;
783 : 1 : suites.get(suiteDesc).push(cmdData);
784 : 1 :
785 : 1 : // TEST ### - tee --output-error=warn non-existent/file << test data
786 : 1 : cmdData = {cmd_aux: null};
787 : 1 :
788 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=warn non-existent/file`;
789 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=warn non-existent/file`;
790 : 1 : cmdData.cmd_inp = 'test data';
791 : 1 :
792 : 1 : cmdData.cmd_out = `test data`;
793 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
794 : 1 :
795 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
796 : 1 : cmdData.cmd_ext = 1;
797 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=warn non-existent/file` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
798 : 1 :
799 : 1 : cmdData.cmd_skip = false;
800 : 1 : suites.get(suiteDesc).push(cmdData);
801 : 1 :
802 : 1 : // TEST ### - tee --output-error=warn-nopipe non-existent/file << test data
803 : 1 : cmdData = {cmd_aux: null};
804 : 1 :
805 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=warn-nopipe non-existent/file`;
806 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=warn-nopipe non-existent/file`;
807 : 1 : cmdData.cmd_inp = 'test data';
808 : 1 :
809 : 1 : cmdData.cmd_out = `test data`;
810 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
811 : 1 :
812 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
813 : 1 : cmdData.cmd_ext = 1;
814 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=warn-nopipe non-existent/file` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
815 : 1 :
816 : 1 : cmdData.cmd_skip = false;
817 : 1 : suites.get(suiteDesc).push(cmdData);
818 : 1 :
819 : 1 : // TEST ### - tee --output-error=exit non-existent/file << test data
820 : 1 : cmdData = {cmd_aux: null};
821 : 1 :
822 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=exit non-existent/file`;
823 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=exit non-existent/file`;
824 : 1 : cmdData.cmd_inp = 'test data';
825 : 1 :
826 : 1 : cmdData.cmd_out = ``;
827 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
828 : 1 :
829 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
830 : 1 : cmdData.cmd_ext = 1;
831 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=exit non-existent/file` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
832 : 1 :
833 : 1 : cmdData.cmd_skip = false;
834 : 1 : suites.get(suiteDesc).push(cmdData);
835 : 1 :
836 : 1 : // TEST ### - tee --output-error=exit-nopipe non-existent/file << test data
837 : 1 : cmdData = {cmd_aux: null};
838 : 1 :
839 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=exit-nopipe non-existent/file`;
840 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=exit-nopipe non-existent/file`;
841 : 1 : cmdData.cmd_inp = 'test data';
842 : 1 :
843 : 1 : cmdData.cmd_out = ``;
844 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
845 : 1 :
846 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
847 : 1 : cmdData.cmd_ext = 1;
848 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=exit-nopipe non-existent/file` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
849 : 1 :
850 : 1 : cmdData.cmd_skip = false;
851 : 1 : suites.get(suiteDesc).push(cmdData);
852 : 1 :
853 : 1 : // TEST ### - tee /dev/null non-existent/file /dev/null << test data
854 : 1 : cmdData = {cmd_aux: null};
855 : 1 :
856 : 1 : cmdData.cmd_act = `node ${cmdNode} ${devNull} non-existent/file ${devNull}`;
857 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} ${devNull} non-existent/file ${devNull}`;
858 : 1 : cmdData.cmd_inp = 'test data';
859 : 1 :
860 : 1 : cmdData.cmd_out = `test data`;
861 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
862 : 1 :
863 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
864 : 1 : cmdData.cmd_ext = 1;
865 : 1 : cmdData.cmd_desc = `${CMD_NODE} ${devNull} non-existent/file ${devNull}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
866 : 1 :
867 : 1 : cmdData.cmd_skip = false;
868 : 1 : suites.get(suiteDesc).push(cmdData);
869 : 1 :
870 : 1 : // TEST ### - tee --output-error=warn /dev/null non-existent/file /dev/null << test data
871 : 1 : cmdData = {cmd_aux: null};
872 : 1 :
873 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=warn ${devNull} non-existent/file ${devNull}`;
874 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=warn ${devNull} non-existent/file ${devNull}`;
875 : 1 : cmdData.cmd_inp = 'test data';
876 : 1 :
877 : 1 : cmdData.cmd_out = `test data`;
878 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
879 : 1 :
880 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
881 : 1 : cmdData.cmd_ext = 1;
882 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=warn ${devNull} non-existent/file ${devNull}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
883 : 1 :
884 : 1 : cmdData.cmd_skip = false;
885 : 1 : suites.get(suiteDesc).push(cmdData);
886 : 1 :
887 : 1 : // TEST ### - tee --output-error=warn-nopipe /dev/null non-existent/file /dev/null << test data
888 : 1 : cmdData = {cmd_aux: null};
889 : 1 :
890 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=warn-nopipe ${devNull} non-existent/file ${devNull}`;
891 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=warn-nopipe ${devNull} non-existent/file ${devNull}`;
892 : 1 : cmdData.cmd_inp = 'test data';
893 : 1 :
894 : 1 : cmdData.cmd_out = `test data`;
895 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
896 : 1 :
897 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
898 : 1 : cmdData.cmd_ext = 1;
899 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=warn-nopipe ${devNull} non-existent/file ${devNull}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
900 : 1 :
901 : 1 : cmdData.cmd_skip = false;
902 : 1 : suites.get(suiteDesc).push(cmdData);
903 : 1 :
904 : 1 : // TEST ### - tee --output-error=exit /dev/null non-existent/file /dev/null << test data
905 : 1 : cmdData = {cmd_aux: null};
906 : 1 :
907 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=exit ${devNull} non-existent/file ${devNull}`;
908 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=exit ${devNull} non-existent/file ${devNull}`;
909 : 1 : cmdData.cmd_inp = 'test data';
910 : 1 :
911 : 1 : cmdData.cmd_out = ``;
912 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
913 : 1 :
914 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
915 : 1 : cmdData.cmd_ext = 1;
916 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=exit ${devNull} non-existent/file ${devNull}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
917 : 1 :
918 : 1 : cmdData.cmd_skip = false;
919 : 1 : suites.get(suiteDesc).push(cmdData);
920 : 1 :
921 : 1 : // TEST ### - tee --output-error=exit-nopipe /dev/null non-existent/file /dev/null << test data
922 : 1 : cmdData = {cmd_aux: null};
923 : 1 :
924 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=exit-nopipe ${devNull} non-existent/file ${devNull}`;
925 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=exit-nopipe ${devNull} non-existent/file ${devNull}`;
926 : 1 : cmdData.cmd_inp = 'test data';
927 : 1 :
928 : 1 : cmdData.cmd_out = ``;
929 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
930 : 1 :
931 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
932 : 1 : cmdData.cmd_ext = 1;
933 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=exit-nopipe ${devNull} non-existent/file ${devNull}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
934 : 1 :
935 : 1 : cmdData.cmd_skip = false;
936 : 1 : suites.get(suiteDesc).push(cmdData);
937 : 1 :
938 : 1 : // TEST SUITE #5 - Test warn/error conditions of broken pipes
939 : 1 : suiteDesc = 'Test warn/error conditions of broken pipes';
940 : 1 : suites.set(suiteDesc, []);
941 : 1 :
942 : 1 : // TEST ### - tee | noOpCmd << test data
943 : 1 : cmdData = {cmd_aux: null};
944 : 1 :
945 : 1 : cmdData.cmd_act = `node ${cmdNode} | ${noOpCmd}`;
946 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} | ${noOpCmd}`;
947 : 1 : cmdData.cmd_inp = 'test data';
948 : 1 :
949 : 1 : cmdData.cmd_out = ``;
950 : 1 : cmdData.cmd_err = ``;
951 : 1 :
952 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
953 : 1 : cmdData.cmd_ext = 0;
954 : 1 : cmdData.cmd_desc = `${CMD_NODE} | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
955 : 1 :
956 : 1 : cmdData.cmd_skip = false;
957 : 1 : suites.get(suiteDesc).push(cmdData);
958 : 1 :
959 : 1 : // TEST ### - tee --output-error=warn | noOpCmd << test data
960 : 1 : cmdData = {cmd_aux: null};
961 : 1 :
962 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=warn | ${noOpCmd}`;
963 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=warn | ${noOpCmd}`;
964 : 1 : cmdData.cmd_inp = 'test data';
965 : 1 :
966 : 1 : cmdData.cmd_out = '';
967 : 1 : cmdData.cmd_err = `${CMD_NODE}: 'standard output': Broken pipe\n`;
968 : 1 :
969 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
970 : 1 : cmdData.cmd_ext = 0;
971 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=warn | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
972 : 1 :
973 : 1 : cmdData.cmd_skip = false;
974 : 1 : suites.get(suiteDesc).push(cmdData);
975 : 1 :
976 : 1 : // TEST ### - tee --output-error=warn-nopipe | noOpCmd << test data
977 : 1 : cmdData = {cmd_aux: null};
978 : 1 :
979 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=warn-nopipe | ${noOpCmd}`;
980 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=warn-nopipe | ${noOpCmd}`;
981 : 1 : cmdData.cmd_inp = 'test data';
982 : 1 :
983 : 1 : cmdData.cmd_out = ``;
984 : 1 : cmdData.cmd_err = ``;
985 : 1 :
986 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
987 : 1 : cmdData.cmd_ext = 0;
988 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=warn-nopipe | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
989 : 1 :
990 : 1 : cmdData.cmd_skip = false;
991 : 1 : suites.get(suiteDesc).push(cmdData);
992 : 1 :
993 : 1 : // TEST ### - tee --output-error=exit | noOpCmd << test data
994 : 1 : cmdData = {cmd_aux: null};
995 : 1 :
996 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=exit | ${noOpCmd}`;
997 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=exit | ${noOpCmd}`;
998 : 1 : cmdData.cmd_inp = 'test data';
999 : 1 :
1000 : 1 : cmdData.cmd_out = ``;
1001 : 1 : cmdData.cmd_err = `${CMD_NODE}: 'standard output': Broken pipe\n`;
1002 : 1 :
1003 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
1004 : 1 : cmdData.cmd_ext = 0;
1005 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=exit | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
1006 : 1 :
1007 : 1 : cmdData.cmd_skip = false;
1008 : 1 : suites.get(suiteDesc).push(cmdData);
1009 : 1 :
1010 : 1 : // TEST ### - tee --output-error=exit-nopipe | noOpCmd << test data
1011 : 1 : cmdData = {cmd_aux: null};
1012 : 1 :
1013 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=exit-nopipe | ${noOpCmd}`;
1014 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=exit-nopipe | ${noOpCmd}`;
1015 : 1 : cmdData.cmd_inp = 'test data';
1016 : 1 :
1017 : 1 : cmdData.cmd_out = ``;
1018 : 1 : cmdData.cmd_err = ``;
1019 : 1 :
1020 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
1021 : 1 : cmdData.cmd_ext = 0;
1022 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=exit-nopipe | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
1023 : 1 :
1024 : 1 : cmdData.cmd_skip = false;
1025 : 1 : suites.get(suiteDesc).push(cmdData);
1026 : 1 :
1027 : 1 : // TEST SUITE #6 - Test warn/error conditions of output files and broken pipes
1028 : 1 : suiteDesc = 'Test warn/error conditions of output files and broken pipes';
1029 : 1 : suites.set(suiteDesc, []);
1030 : 1 :
1031 : 1 : // TEST ### - tee /dev/null non-existent/file /dev/null | noOpCmd << test data
1032 : 1 : cmdData = {cmd_aux: null};
1033 : 1 :
1034 : 1 : cmdData.cmd_act = `node ${cmdNode} ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1035 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1036 : 1 : cmdData.cmd_inp = 'test data';
1037 : 1 :
1038 : 1 : cmdData.cmd_out = ``;
1039 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
1040 : 1 :
1041 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
1042 : 1 : cmdData.cmd_ext = 0;
1043 : 1 : cmdData.cmd_desc = `${CMD_NODE} ${devNull} non-existent/file ${devNull} | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
1044 : 1 :
1045 : 1 : cmdData.cmd_skip = false;
1046 : 1 : suites.get(suiteDesc).push(cmdData);
1047 : 1 :
1048 : 1 : // TEST ### - tee --output-error=warn /dev/null non-existent/file /dev/null | noOpCmd << test data
1049 : 1 : cmdData = {cmd_aux: null};
1050 : 1 :
1051 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=warn ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1052 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=warn ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1053 : 1 : cmdData.cmd_inp = 'test data';
1054 : 1 :
1055 : 1 : cmdData.cmd_out = '';
1056 : 1 : cmdData.cmd_err = `\
1057 : 1 : ${CMD_NODE}: non-existent/file: No such file or directory
1058 : 1 : ${CMD_NODE}: 'standard output': Broken pipe\n`;
1059 : 1 :
1060 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
1061 : 1 : cmdData.cmd_ext = 0;
1062 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=warn ${devNull} non-existent/file ${devNull} | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
1063 : 1 :
1064 : 1 : cmdData.cmd_skip = false;
1065 : 1 : suites.get(suiteDesc).push(cmdData);
1066 : 1 :
1067 : 1 : // TEST ### - tee --output-error=warn-nopipe /dev/null non-existent/file /dev/null | noOpCmd << test data
1068 : 1 : cmdData = {cmd_aux: null};
1069 : 1 :
1070 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=warn-nopipe ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1071 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=warn-nopipe ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1072 : 1 : cmdData.cmd_inp = 'test data';
1073 : 1 :
1074 : 1 : cmdData.cmd_out = ``;
1075 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
1076 : 1 :
1077 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
1078 : 1 : cmdData.cmd_ext = 0;
1079 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=warn-nopipe ${devNull} non-existent/file ${devNull} | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
1080 : 1 :
1081 : 1 : cmdData.cmd_skip = false;
1082 : 1 : suites.get(suiteDesc).push(cmdData);
1083 : 1 :
1084 : 1 : // TEST ### - tee --output-error=exit /dev/null non-existent/file /dev/null | noOpCmd << test data
1085 : 1 : cmdData = {cmd_aux: null};
1086 : 1 :
1087 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=exit ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1088 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=exit ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1089 : 1 : cmdData.cmd_inp = 'test data';
1090 : 1 :
1091 : 1 : cmdData.cmd_out = ``;
1092 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
1093 : 1 :
1094 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
1095 : 1 : cmdData.cmd_ext = 0;
1096 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=exit ${devNull} non-existent/file ${devNull} | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
1097 : 1 :
1098 : 1 : cmdData.cmd_skip = false;
1099 : 1 : suites.get(suiteDesc).push(cmdData);
1100 : 1 :
1101 : 1 : // TEST #30 - tee --output-error=exit-nopipe /dev/null non-existent/file /dev/null | noOpCmd << test data
1102 : 1 : cmdData = {cmd_aux: null};
1103 : 1 :
1104 : 1 : cmdData.cmd_act = `node ${cmdNode} --output-error=exit-nopipe ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1105 : 1 : cmdData.cmd_exp = cmdShell && `${cmdShell} --output-error=exit-nopipe ${devNull} non-existent/file ${devNull} | ${noOpCmd}`;
1106 : 1 : cmdData.cmd_inp = 'test data';
1107 : 1 :
1108 : 1 : cmdData.cmd_out = ``;
1109 : 1 : cmdData.cmd_err = `${CMD_NODE}: non-existent/file: No such file or directory\n`;
1110 : 1 :
1111 : 1 : cmdData.cmd_opt = {encoding: 'UTF-8'};
1112 : 1 : cmdData.cmd_ext = 0;
1113 : 1 : cmdData.cmd_desc = `${CMD_NODE} --output-error=exit-nopipe ${devNull} non-existent/file ${devNull} | ${noOpCmd}` + (cmdData.cmd_inp && ` << ${cmdData.cmd_inp}`);
1114 : 1 :
1115 : 1 : cmdData.cmd_skip = false;
1116 : 1 : suites.get(suiteDesc).push(cmdData);
1117 : 1 : }
1118 : 13 :
1119 : 13 : /**
1120 : 13 : * function main()
1121 : 13 : * function verifyShellCmd()
1122 : 13 : * function loadTestData()
1123 : 13 : * function nodeRunner()
1124 : 13 : * function defRunner()
1125 : 13 : * async function makeTest()
1126 : 13 : * function getCmdOutput()
1127 : 13 : * function parseCmdLine()
1128 : 13 : * function getHelp()
1129 : 13 : * function getError()
1130 : 13 : *
1131 : 13 : * @func nodeRunner
1132 : 13 : * @param {object} runner - The node core module 'node:test' object.
1133 : 13 : * @desc Carry out the loaded tests using node test runner.
1134 : 13 : */
1135 [ + ]: 1 : function nodeRunner(runner){
1136 : 1 :
1137 [ + ]: 1 : for(let [suiteDesc, suiteTests] of suites){
1138 [ + ]: 7 : runner.suite(suiteDesc, () => {
1139 [ + ]: 7 : for(let cmdObj of suiteTests){
1140 [ + ]: 48 : runner.test(cmdObj.cmd_desc, {skip: cmdObj.cmd_skip}, async () => {
1141 : 48 : await makeTest(cmdObj);
1142 : 48 : });
1143 : 48 : }
1144 : 7 : });
1145 : 7 : }
1146 : 1 : }
1147 : 13 :
1148 : 13 : /* node:coverage disable */
1149 : : /**
1150 : : * function main()
1151 : : * function verifyShellCmd()
1152 : : * function loadTestData()
1153 : : * function nodeRunner()
1154 : : * function defRunner()
1155 : : * async function makeTest()
1156 : : * function getCmdOutput()
1157 : : * function parseCmdLine()
1158 : : * function getHelp()
1159 : : * function getError()
1160 : : *
1161 : : * @func defRunner
1162 : : * @desc Carry out the loaded tests using this developed test runner.
1163 : : */
1164 : : function defRunner(){
1165 : :
1166 : : cmdOptions.verbose && process.on('exit', () => {
1167 : : console.log();
1168 : : console.log('▶ tests', --testCount);
1169 : : console.log('▶ suites', suites.size);
1170 : : console.log('▶ pass', passCount);
1171 : : console.log('▶ fail', failCount);
1172 : : console.log('▶ cancelled', cancelCount);
1173 : : console.log('▶ skipped', skipCount);
1174 : : console.log('▶ todo', todoCount);
1175 : : console.log('▶ duration_ms', Math.round(Date.now() - startTime));
1176 : : });
1177 : :
1178 : : cmdOptions.verbose && console.error();
1179 : : for(let [suiteDesc, suiteTests] of suites)
1180 : : for(let cmdObj of suiteTests)
1181 : : if(!cmdObj.cmd_skip)
1182 : : makeTest(cmdObj);
1183 : :
1184 : : cmdOptions.verbose && console.log();
1185 : : }
1186 : : /* node:coverage enable */
1187 : 13 :
1188 : 13 : /**
1189 : 13 : * function main()
1190 : 13 : * function verifyShellCmd()
1191 : 13 : * function loadTestData()
1192 : 13 : * function nodeRunner()
1193 : 13 : * function defRunner()
1194 : 13 : * async function makeTest()
1195 : 13 : * function getCmdOutput()
1196 : 13 : * function parseCmdLine()
1197 : 13 : * function getHelp()
1198 : 13 : * function getError()
1199 : 13 : *
1200 : 13 : * @func makeTest
1201 : 13 : * @async
1202 : 13 : * @param {object} obj - The test data object.
1203 : 13 : * @desc Carry out a single test.
1204 : 13 : */
1205 [ + ]: 48 : async function makeTest(obj){
1206 : 48 :
1207 : 48 : const testID = testCount++;
1208 : 48 :
1209 : 48 : let preMsg = `Test#${(testID).toString().padStart(3, '0')} ... `;
1210 : 48 : let postMsg = preMsg;
1211 : 48 :
1212 : 48 : preMsg += `Initiate ... ${obj.cmd_desc}`;
1213 [ - ]: 48 : cmdOptions.verbose && console.error(preMsg);
1214 : 48 :
1215 : 48 : let [out_act, out_exp, prc_act, prc_exp] = await getCmdOutput(obj);
1216 : 48 :
1217 : 48 : if(out_exp !== null)
1218 [ + ][ + ]: 48 : out_exp.stderr = out_exp.stderr.replace(new RegExp(CMD_SHELL, 'g'), CMD_NODE);
1219 : 14 : else{
1220 : 14 : out_exp = {stdout: obj.cmd_out, stderr: obj.cmd_err};
1221 : 14 : prc_exp = {exitCode: obj.cmd_ext};
1222 : 14 : }
1223 : 48 :
1224 : 48 : if(!cmdOptions.verbose){
1225 : 48 :
1226 : 48 : assert.strictEqual(out_act.stdout, out_exp.stdout);
1227 : 48 : assert.strictEqual(out_act.stderr, out_exp.stderr);
1228 : 48 : assert.strictEqual(prc_act.exitCode, prc_exp.exitCode);
1229 [ + ]: 48 : obj.cmd_aux && obj.cmd_aux(obj);
1230 [ - ]: 48 : }
1231 : 0 : /* node:coverage disable */
1232 : : else{
1233 : : try{
1234 : : assert.strictEqual(out_act.stdout, out_exp.stdout);
1235 : : assert.strictEqual(out_act.stderr, out_exp.stderr);
1236 : : assert.strictEqual(prc_act.exitCode, prc_exp.exitCode);
1237 : : obj.cmd_aux && obj.cmd_aux(obj);
1238 : :
1239 : : passCount++;
1240 : :
1241 : : postMsg += `Success ... ${obj.cmd_desc}`;
1242 : : cmdOptions.verbose && console.error(postMsg);
1243 : : }
1244 : : catch(e){
1245 : : failCount++;
1246 : :
1247 : : postMsg += `Failure ... ${obj.cmd_desc}`;
1248 : : cmdOptions.verbose && console.error(postMsg);
1249 : : }
1250 : : }
1251 : : /* node:coverage enable */
1252 : 48 : }
1253 : 13 :
1254 : 13 : /**
1255 : 13 : * function main()
1256 : 13 : * function verifyShellCmd()
1257 : 13 : * function loadTestData()
1258 : 13 : * function nodeRunner()
1259 : 13 : * function defRunner()
1260 : 13 : * async function makeTest()
1261 : 13 : * function getCmdOutput()
1262 : 13 : * function parseCmdLine()
1263 : 13 : * function getHelp()
1264 : 13 : * function getError()
1265 : 13 : *
1266 : 13 : * @func getCmdOutput
1267 : 13 : * @param {object} cmdObj - The test data object.
1268 : 13 : * @desc Carry out a single test.
1269 : 13 : */
1270 [ + ]: 48 : function getCmdOutput(cmdObj){
1271 : 48 :
1272 : 48 : let proc_act, proc_exp;
1273 : 48 :
1274 [ + ]: 48 : let prom_act = new Promise((resolve, reject) => {
1275 [ + ]: 48 : proc_act = exec(cmdObj.cmd_act, cmdObj.cmd_opt, (err, stdout, stderr) => {
1276 : 48 : resolve({stdout, stderr});
1277 : 48 : });
1278 : 48 : proc_act.stdin.write(cmdObj.cmd_inp);
1279 [ - ]: 48 : cmdObj.cmd_signal && proc_act.kill(cmdObj.cmd_signal);
1280 : 48 : proc_act.stdin.end();
1281 : 48 : });
1282 : 48 :
1283 [ + ]: 48 : if(cmdObj.cmd_exp){
1284 [ + ]: 34 : let prom_exp = new Promise((resolve, reject) => {
1285 [ + ]: 34 : proc_exp = exec(cmdObj.cmd_exp, cmdObj.cmd_opt, (err, stdout, stderr) => {
1286 : 34 : resolve({stdout, stderr});
1287 : 34 : });
1288 : 34 : proc_exp.stdin.write(cmdObj.cmd_inp);
1289 [ - ]: 34 : cmdObj.cmd_signal && proc_exp.kill(cmdObj.cmd_signal);
1290 : 34 : proc_exp.stdin.end();
1291 : 34 : });
1292 : 34 :
1293 : 34 : return Promise.all([prom_act, prom_exp, proc_act, proc_exp]);
1294 [ + ]: 34 : }
1295 : 14 :
1296 : 14 : return Promise.all([prom_act, null, proc_act, null]);
1297 : 48 : }
1298 : 13 :
1299 : 13 : /**
1300 : 13 : * function main()
1301 : 13 : * function verifyShellCmd()
1302 : 13 : * function loadTestData()
1303 : 13 : * function nodeRunner()
1304 : 13 : * function defRunner()
1305 : 13 : * async function makeTest()
1306 : 13 : * function getCmdOutput()
1307 : 13 : * function parseCmdLine()
1308 : 13 : * function getHelp()
1309 : 13 : * function getError()
1310 : 13 : *
1311 : 13 : * @func parseCmdLine
1312 : 13 : * @desc Command line parser function.
1313 : 13 : */
1314 [ + ]: 13 : function parseCmdLine(){
1315 : 13 : for(let i = 2; i < process.argv.length; i++){
1316 : 13 : let opt = process.argv[i];
1317 : 13 :
1318 : 13 : if(opt.startsWith('--')){
1319 : 13 : if(opt === '--help'){
1320 : 13 : process.stdout.write(`${getHelp()}`);
1321 : 13 : process.exit(0);
1322 : 13 : }
1323 : 13 : else
1324 : 13 : if(opt === '--verbose'){
1325 : 13 : cmdOptions.verbose = true;
1326 : 13 : }
1327 : 13 : else
1328 : 13 : if(opt === '--node'){
1329 : 13 : cmdOptions.node = true;
1330 : 13 : }
1331 : 13 : else
1332 : 13 : if(opt === '--def'){
1333 : 13 : cmdOptions.node = false;
1334 : 13 : }
1335 : 13 : else{
1336 : 13 : process.stderr.write(`${getError(0).replace('__', opt.substring(2))}\n`);
1337 : 13 : process.exit(1);
1338 : 13 : }
1339 : 13 : }
1340 : 13 : else
1341 : 13 : if(opt.startsWith('-')){
1342 : 13 : if(opt === '-h'){
1343 : 13 : process.stdout.write(`${getHelp()}`);
1344 : 13 : process.exit(0);
1345 : 13 : }
1346 : 13 : else
1347 : 13 : if(opt === '-v'){
1348 : 13 : cmdOptions.verbose = true;
1349 : 13 : }
1350 : 13 : else
1351 : 13 : if(opt === '-n'){
1352 : 13 : cmdOptions.node = true;
1353 : 13 : }
1354 : 13 : else
1355 : 13 : if(opt === '-d'){
1356 : 13 : cmdOptions.node = false;
1357 : 13 : }
1358 : 13 : else{
1359 : 13 : process.stderr.write(`${getError(1).replace('__', opt)}\n`);
1360 : 13 : process.exit(1);
1361 : 13 : }
1362 : 13 : }
1363 : 13 : else{
1364 : 13 : process.stderr.write(`${getError(1).replace('__', opt)}\n`);
1365 : 13 : process.exit(1);
1366 : 13 : }
1367 : 13 : }
1368 : 13 : }
1369 : 13 :
1370 : 13 : /**
1371 : 13 : * function main()
1372 : 13 : * function verifyShellCmd()
1373 : 13 : * function loadTestData()
1374 : 13 : * function nodeRunner()
1375 : 13 : * function defRunner()
1376 : 13 : * async function makeTest()
1377 : 13 : * function getCmdOutput()
1378 : 13 : * function parseCmdLine()
1379 : 13 : * function getHelp()
1380 : 13 : * function getError()
1381 : 13 : *
1382 : 13 : * @func getHelp
1383 : 13 : * @return {string} The help string.
1384 : 13 : * @desc Function to return help info.
1385 : 13 : */
1386 [ + ]: 4 : function getHelp(){
1387 : 4 : return `\
1388 : 4 : Usage: ${CMD_NODE_TEST} [OPTIONS]...
1389 : 4 : Test the developed 'node-tee'.
1390 : 4 :
1391 : 4 : With no options, testing will be done using nodejs test runner API if supported.
1392 : 4 :
1393 : 4 : -n --node use nodejs test runner API if supported
1394 : 4 : -d --def use default test runner
1395 : 4 : -v --verbose make the testing operation more talkative
1396 : 4 : -h --help display this help and exit
1397 : 4 :
1398 : 4 : 'node-tee' was tested againts the GNU 'tee' command version 8.32.
1399 : 4 : `;
1400 : 4 : }
1401 : 13 :
1402 : 13 : /**
1403 : 13 : * function verifyShellCmd()
1404 : 13 : * function loadTestData()
1405 : 13 : * function nodeRunner()
1406 : 13 : * function defRunner()
1407 : 13 : * async function makeTest()
1408 : 13 : * function getCmdOutput()
1409 : 13 : * function parseCmdLine()
1410 : 13 : * function getHelp()
1411 : 13 : * function getError()
1412 : 13 : *
1413 : 13 : * @func getError
1414 : 13 : * @param {number} Error number.
1415 : 13 : * @return {string} Error message.
1416 : 13 : * @desc Function to return error message.
1417 : 13 : */
1418 [ + ]: 3 : function getError(n){
1419 : 3 :
1420 : 3 : const error = [
1421 : 3 : // error[0]
1422 : 3 : `\
1423 : 3 : ${CMD_NODE_TEST}: invalid option -- '__'
1424 : 3 : Try '${CMD_NODE_TEST} --help' for more information.`,
1425 : 3 :
1426 : 3 : // error[1]
1427 : 3 : `\
1428 : 3 : ${CMD_NODE_TEST}: unrecognized option '__'
1429 : 3 : Try '${CMD_NODE_TEST} --help' for more information.`,
1430 : 3 :
1431 : 3 : // error[2]
1432 : 3 : `${CMD_NODE_TEST}: option '__' requires an argument
1433 : 3 : Try '${CMD_NODE_TEST} --help' for more information.`,
1434 : 3 :
1435 : 3 : // error[3]
1436 : 3 : `${CMD_NODE_TEST}: invalid argument ‘__’ for ‘__’
1437 : 3 : Try '${CMD_NODE_TEST} --help' for more information.`,
1438 : 3 : ];
1439 : 3 :
1440 : 3 : return error[n];
1441 : 3 : }
|