pipeline.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. * Tests the "pipeline" primitive.
  3. */
  4. var mod_tap = require('tap');
  5. var mod_vasync = require('..');
  6. var st;
  7. mod_tap.test('empty pipeline', function (test) {
  8. var count = 0;
  9. st = mod_vasync.pipeline({'funcs': [], 'arg': null},
  10. function (err, result) {
  11. test.ok(err === null);
  12. test.ok(result.ndone === 0);
  13. test.ok(result.nerrors === 0);
  14. test.ok(result.operations.length === 0);
  15. test.ok(result.successes.length === 0);
  16. test.equal(count, 1);
  17. test.end();
  18. });
  19. count++;
  20. test.ok(st.ndone === 0);
  21. test.ok(st.nerrors === 0);
  22. test.ok(st.operations.length === 0);
  23. test.ok(st.successes.length === 0);
  24. });
  25. mod_tap.test('normal 4-stage pipeline', function (test) {
  26. var count = 0;
  27. st = mod_vasync.pipeline({'funcs': [
  28. function func1(_, cb) {
  29. test.equal(st.successes[0], undefined,
  30. 'func1: successes');
  31. test.ok(count === 0, 'func1: count === 0');
  32. test.ok(st.ndone === 0);
  33. count++;
  34. setImmediate(cb, null, count);
  35. },
  36. function func2(_, cb) {
  37. test.equal(st.successes[0], 1, 'func2: successes');
  38. test.ok(count == 1, 'func2: count == 1');
  39. test.ok(st.ndone === 1);
  40. test.ok(st.operations[0].status == 'ok');
  41. test.ok(st.operations[1].status == 'pending');
  42. test.ok(st.operations[2].status == 'waiting');
  43. count++;
  44. setImmediate(cb, null, count);
  45. },
  46. function (_, cb) {
  47. test.equal(st.successes[0], 1, 'func3: successes');
  48. test.equal(st.successes[1], 2, 'func3: successes');
  49. test.ok(count == 2, 'func3: count == 2');
  50. test.ok(st.ndone === 2);
  51. count++;
  52. setImmediate(cb, null, count);
  53. },
  54. function func4(_, cb) {
  55. test.equal(st.successes[0], 1, 'func4: successes');
  56. test.equal(st.successes[1], 2, 'func4: successes');
  57. test.equal(st.successes[2], 3, 'func4: successes');
  58. test.ok(count == 3, 'func4: count == 3');
  59. test.ok(st.ndone === 3);
  60. count++;
  61. setImmediate(cb, null, count);
  62. }
  63. ]}, function (err, result) {
  64. test.ok(count == 4, 'final: count == 4');
  65. test.ok(err === null, 'no error');
  66. test.ok(result === st);
  67. test.equal(result, st, 'final-cb: st == result');
  68. test.equal(st.successes[0], 1, 'final-cb: successes');
  69. test.equal(st.successes[1], 2, 'final-cb: successes');
  70. test.equal(st.successes[2], 3, 'final-cb: successes');
  71. test.equal(st.successes[3], 4, 'final-cb: successes');
  72. test.ok(st.ndone === 4);
  73. test.ok(st.nerrors === 0);
  74. test.ok(st.operations.length === 4);
  75. test.ok(st.successes.length === 4);
  76. test.ok(st.operations[0].status == 'ok');
  77. test.ok(st.operations[1].status == 'ok');
  78. test.ok(st.operations[2].status == 'ok');
  79. test.ok(st.operations[3].status == 'ok');
  80. test.end();
  81. });
  82. test.ok(st.ndone === 0);
  83. test.ok(st.nerrors === 0);
  84. test.ok(st.operations.length === 4);
  85. test.ok(st.operations[0].funcname == 'func1', 'func1 name');
  86. test.ok(st.operations[0].status == 'pending');
  87. test.ok(st.operations[1].funcname == 'func2', 'func2 name');
  88. test.ok(st.operations[1].status == 'waiting');
  89. test.ok(st.operations[2].funcname == '(anon)', 'anon name');
  90. test.ok(st.operations[2].status == 'waiting');
  91. test.ok(st.operations[3].funcname == 'func4', 'func4 name');
  92. test.ok(st.operations[3].status == 'waiting');
  93. test.ok(st.successes.length === 0);
  94. });
  95. mod_tap.test('bailing out early', function (test) {
  96. var count = 0;
  97. st = mod_vasync.pipeline({'funcs': [
  98. function func1(_, cb) {
  99. test.ok(count === 0, 'func1: count === 0');
  100. count++;
  101. setImmediate(cb, null, count);
  102. },
  103. function func2(_, cb) {
  104. test.ok(count == 1, 'func2: count == 1');
  105. count++;
  106. setImmediate(cb, new Error('boom!'));
  107. },
  108. function func3(_, cb) {
  109. test.ok(count == 2, 'func3: count == 2');
  110. count++;
  111. setImmediate(cb, null, count);
  112. }
  113. ]}, function (err, result) {
  114. test.ok(count == 2, 'final: count == 3');
  115. test.equal(err.message, 'boom!');
  116. test.ok(result === st);
  117. test.equal(result, st, 'final-cb: st == result');
  118. test.ok(st.ndone == 2);
  119. test.ok(st.nerrors == 1);
  120. test.ok(st.operations[0].status == 'ok');
  121. test.ok(st.operations[1].status == 'fail');
  122. test.ok(st.operations[2].status == 'waiting');
  123. test.ok(st.successes.length == 1);
  124. test.end();
  125. });
  126. });