You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
6.8 KiB

  1. var Dicer = require('..');
  2. var assert = require('assert'),
  3. fs = require('fs'),
  4. path = require('path'),
  5. inspect = require('util').inspect;
  6. var FIXTURES_ROOT = __dirname + '/fixtures/';
  7. var t = 0,
  8. group = path.basename(__filename, '.js') + '/';
  9. var tests = [
  10. { source: 'many',
  11. opts: { boundary: '----WebKitFormBoundaryWLHCs9qmcJJoyjKR' },
  12. chsize: 16,
  13. nparts: 0,
  14. what: 'No preamble or part listeners'
  15. },
  16. ];
  17. function next() {
  18. if (t === tests.length)
  19. return;
  20. var v = tests[t],
  21. fixtureBase = FIXTURES_ROOT + v.source,
  22. fd,
  23. n = 0,
  24. buffer = Buffer.allocUnsafe(v.chsize),
  25. state = { done: false, parts: [], preamble: undefined };
  26. fd = fs.openSync(fixtureBase + '/original', 'r');
  27. var dicer = new Dicer(v.opts),
  28. error,
  29. partErrors = 0,
  30. finishes = 0;
  31. if (v.events && v.events.indexOf('preamble') > -1) {
  32. dicer.on('preamble', function(p) {
  33. var preamble = {
  34. body: undefined,
  35. bodylen: 0,
  36. error: undefined,
  37. header: undefined
  38. };
  39. p.on('header', function(h) {
  40. preamble.header = h;
  41. }).on('data', function(data) {
  42. // make a copy because we are using readSync which re-uses a buffer ...
  43. var copy = Buffer.allocUnsafe(data.length);
  44. data.copy(copy);
  45. data = copy;
  46. if (!preamble.body)
  47. preamble.body = [ data ];
  48. else
  49. preamble.body.push(data);
  50. preamble.bodylen += data.length;
  51. }).on('error', function(err) {
  52. preamble.error = err;
  53. }).on('end', function() {
  54. if (preamble.body)
  55. preamble.body = Buffer.concat(preamble.body, preamble.bodylen);
  56. if (preamble.body || preamble.header)
  57. state.preamble = preamble;
  58. });
  59. });
  60. }
  61. if (v.events && v.events.indexOf('part') > -1) {
  62. dicer.on('part', function(p) {
  63. var part = {
  64. body: undefined,
  65. bodylen: 0,
  66. error: undefined,
  67. header: undefined
  68. };
  69. p.on('header', function(h) {
  70. part.header = h;
  71. }).on('data', function(data) {
  72. // make a copy because we are using readSync which re-uses a buffer ...
  73. var copy = Buffer.allocUnsafe(data.length);
  74. data.copy(copy);
  75. data = copy;
  76. if (!part.body)
  77. part.body = [ data ];
  78. else
  79. part.body.push(data);
  80. part.bodylen += data.length;
  81. }).on('error', function(err) {
  82. part.error = err;
  83. ++partErrors;
  84. }).on('end', function() {
  85. if (part.body)
  86. part.body = Buffer.concat(part.body, part.bodylen);
  87. state.parts.push(part);
  88. });
  89. });
  90. }
  91. dicer.on('error', function(err) {
  92. error = err;
  93. }).on('finish', function() {
  94. assert(finishes++ === 0, makeMsg(v.what, 'finish emitted multiple times'));
  95. if (v.dicerError)
  96. assert(error !== undefined, makeMsg(v.what, 'Expected error'));
  97. else
  98. assert(error === undefined, makeMsg(v.what, 'Unexpected error'));
  99. if (v.events && v.events.indexOf('preamble') > -1) {
  100. var preamble;
  101. if (fs.existsSync(fixtureBase + '/preamble')) {
  102. var prebody = fs.readFileSync(fixtureBase + '/preamble');
  103. if (prebody.length) {
  104. preamble = {
  105. body: prebody,
  106. bodylen: prebody.length,
  107. error: undefined,
  108. header: undefined
  109. };
  110. }
  111. }
  112. if (fs.existsSync(fixtureBase + '/preamble.header')) {
  113. var prehead = JSON.parse(fs.readFileSync(fixtureBase
  114. + '/preamble.header', 'binary'));
  115. if (!preamble) {
  116. preamble = {
  117. body: undefined,
  118. bodylen: 0,
  119. error: undefined,
  120. header: prehead
  121. };
  122. } else
  123. preamble.header = prehead;
  124. }
  125. if (fs.existsSync(fixtureBase + '/preamble.error')) {
  126. var err = new Error(fs.readFileSync(fixtureBase
  127. + '/preamble.error', 'binary'));
  128. if (!preamble) {
  129. preamble = {
  130. body: undefined,
  131. bodylen: 0,
  132. error: err,
  133. header: undefined
  134. };
  135. } else
  136. preamble.error = err;
  137. }
  138. assert.deepEqual(state.preamble,
  139. preamble,
  140. makeMsg(v.what,
  141. 'Preamble mismatch:\nActual:'
  142. + inspect(state.preamble)
  143. + '\nExpected: '
  144. + inspect(preamble)));
  145. }
  146. if (v.events && v.events.indexOf('part') > -1) {
  147. assert.equal(state.parts.length,
  148. v.nparts,
  149. makeMsg(v.what,
  150. 'Part count mismatch:\nActual: '
  151. + state.parts.length
  152. + '\nExpected: '
  153. + v.nparts));
  154. if (!v.npartErrors)
  155. v.npartErrors = 0;
  156. assert.equal(partErrors,
  157. v.npartErrors,
  158. makeMsg(v.what,
  159. 'Part errors mismatch:\nActual: '
  160. + partErrors
  161. + '\nExpected: '
  162. + v.npartErrors));
  163. for (var i = 0, header, body; i < v.nparts; ++i) {
  164. if (fs.existsSync(fixtureBase + '/part' + (i+1))) {
  165. body = fs.readFileSync(fixtureBase + '/part' + (i+1));
  166. if (body.length === 0)
  167. body = undefined;
  168. } else
  169. body = undefined;
  170. assert.deepEqual(state.parts[i].body,
  171. body,
  172. makeMsg(v.what,
  173. 'Part #' + (i+1) + ' body mismatch'));
  174. if (fs.existsSync(fixtureBase + '/part' + (i+1) + '.header')) {
  175. header = fs.readFileSync(fixtureBase
  176. + '/part' + (i+1) + '.header', 'binary');
  177. header = JSON.parse(header);
  178. } else
  179. header = undefined;
  180. assert.deepEqual(state.parts[i].header,
  181. header,
  182. makeMsg(v.what,
  183. 'Part #' + (i+1)
  184. + ' parsed header mismatch:\nActual: '
  185. + inspect(state.parts[i].header)
  186. + '\nExpected: '
  187. + inspect(header)));
  188. }
  189. }
  190. ++t;
  191. next();
  192. });
  193. while (true) {
  194. n = fs.readSync(fd, buffer, 0, buffer.length, null);
  195. if (n === 0) {
  196. dicer.end();
  197. break;
  198. }
  199. dicer.write(n === buffer.length ? buffer : buffer.slice(0, n));
  200. }
  201. fs.closeSync(fd);
  202. }
  203. next();
  204. function makeMsg(what, msg) {
  205. return '[' + group + what + ']: ' + msg;
  206. }
  207. process.on('exit', function() {
  208. assert(t === tests.length,
  209. makeMsg('_exit', 'Only ran ' + t + '/' + tests.length + ' tests'));
  210. });