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.
		
		
		
		
		
			
		
			
				
					
					
						
							240 lines
						
					
					
						
							6.8 KiB
						
					
					
				
			
		
		
	
	
							240 lines
						
					
					
						
							6.8 KiB
						
					
					
				| var Dicer = require('..');
 | |
| var assert = require('assert'),
 | |
|     fs = require('fs'),
 | |
|     path = require('path'),
 | |
|     inspect = require('util').inspect;
 | |
| 
 | |
| var FIXTURES_ROOT = __dirname + '/fixtures/';
 | |
| 
 | |
| var t = 0,
 | |
|     group = path.basename(__filename, '.js') + '/';
 | |
| 
 | |
| var tests = [
 | |
|   { source: 'nested',
 | |
|     opts: { boundary: 'AaB03x' },
 | |
|     chsize: 32,
 | |
|     nparts: 2,
 | |
|     what: 'One nested multipart'
 | |
|   },
 | |
|   { source: 'many',
 | |
|     opts: { boundary: '----WebKitFormBoundaryWLHCs9qmcJJoyjKR' },
 | |
|     chsize: 16,
 | |
|     nparts: 7,
 | |
|     what: 'Many parts'
 | |
|   },
 | |
|   { source: 'many-wrongboundary',
 | |
|     opts: { boundary: 'LOLOLOL' },
 | |
|     chsize: 8,
 | |
|     nparts: 0,
 | |
|     dicerError: true,
 | |
|     what: 'Many parts, wrong boundary'
 | |
|   },
 | |
|   { source: 'many-noend',
 | |
|     opts: { boundary: '----WebKitFormBoundaryWLHCs9qmcJJoyjKR' },
 | |
|     chsize: 16,
 | |
|     nparts: 7,
 | |
|     npartErrors: 1,
 | |
|     dicerError: true,
 | |
|     what: 'Many parts, end boundary missing, 1 file open'
 | |
|   },
 | |
|   { source: 'nested-full',
 | |
|     opts: { boundary: 'AaB03x', headerFirst: true },
 | |
|     chsize: 32,
 | |
|     nparts: 2,
 | |
|     what: 'One nested multipart with preceding header'
 | |
|   },
 | |
|   { source: 'nested-full',
 | |
|     opts: { headerFirst: true },
 | |
|     chsize: 32,
 | |
|     nparts: 2,
 | |
|     setBoundary: 'AaB03x',
 | |
|     what: 'One nested multipart with preceding header, using setBoundary'
 | |
|   },
 | |
| ];
 | |
| 
 | |
| function next() {
 | |
|   if (t === tests.length)
 | |
|     return;
 | |
|   var v = tests[t],
 | |
|       fixtureBase = FIXTURES_ROOT + v.source,
 | |
|       n = 0,
 | |
|       buffer = new Buffer(v.chsize),
 | |
|       state = { parts: [], preamble: undefined };
 | |
| 
 | |
|   var dicer = new Dicer(v.opts),
 | |
|       error,
 | |
|       partErrors = 0,
 | |
|       finishes = 0;
 | |
| 
 | |
|   dicer.on('preamble', function(p) {
 | |
|     var preamble = {
 | |
|       body: undefined,
 | |
|       bodylen: 0,
 | |
|       error: undefined,
 | |
|       header: undefined
 | |
|     };
 | |
| 
 | |
|     p.on('header', function(h) {
 | |
|       preamble.header = h;
 | |
|       if (v.setBoundary)
 | |
|         dicer.setBoundary(v.setBoundary);
 | |
|     }).on('data', function(data) {
 | |
|       // make a copy because we are using readSync which re-uses a buffer ...
 | |
|       var copy = new Buffer(data.length);
 | |
|       data.copy(copy);
 | |
|       data = copy;
 | |
|       if (!preamble.body)
 | |
|         preamble.body = [ data ];
 | |
|       else
 | |
|         preamble.body.push(data);
 | |
|       preamble.bodylen += data.length;
 | |
|     }).on('error', function(err) {
 | |
|       preamble.error = err;
 | |
|     }).on('end', function() {
 | |
|       if (preamble.body)
 | |
|         preamble.body = Buffer.concat(preamble.body, preamble.bodylen);
 | |
|       if (preamble.body || preamble.header)
 | |
|         state.preamble = preamble;
 | |
|     });
 | |
|   });
 | |
|   dicer.on('part', function(p) {
 | |
|     var part = {
 | |
|       body: undefined,
 | |
|       bodylen: 0,
 | |
|       error: undefined,
 | |
|       header: undefined
 | |
|     };
 | |
| 
 | |
|     p.on('header', function(h) {
 | |
|       part.header = h;
 | |
|     }).on('data', function(data) {
 | |
|       if (!part.body)
 | |
|         part.body = [ data ];
 | |
|       else
 | |
|         part.body.push(data);
 | |
|       part.bodylen += data.length;
 | |
|     }).on('error', function(err) {
 | |
|       part.error = err;
 | |
|       ++partErrors;
 | |
|     }).on('end', function() {
 | |
|       if (part.body)
 | |
|         part.body = Buffer.concat(part.body, part.bodylen);
 | |
|       state.parts.push(part);
 | |
|     });
 | |
|   }).on('error', function(err) {
 | |
|     error = err;
 | |
|   }).on('finish', function() {
 | |
|     assert(finishes++ === 0, makeMsg(v.what, 'finish emitted multiple times'));
 | |
| 
 | |
|     if (v.dicerError)
 | |
|       assert(error !== undefined, makeMsg(v.what, 'Expected error'));
 | |
|     else
 | |
|       assert(error === undefined, makeMsg(v.what, 'Unexpected error: ' + error));
 | |
| 
 | |
|     var preamble;
 | |
|     if (fs.existsSync(fixtureBase + '/preamble')) {
 | |
|       var prebody = fs.readFileSync(fixtureBase + '/preamble');
 | |
|       if (prebody.length) {
 | |
|         preamble = {
 | |
|           body: prebody,
 | |
|           bodylen: prebody.length,
 | |
|           error: undefined,
 | |
|           header: undefined
 | |
|         };
 | |
|       }
 | |
|     }
 | |
|     if (fs.existsSync(fixtureBase + '/preamble.header')) {
 | |
|       var prehead = JSON.parse(fs.readFileSync(fixtureBase
 | |
|                                                + '/preamble.header', 'binary'));
 | |
|       if (!preamble) {
 | |
|         preamble = {
 | |
|           body: undefined,
 | |
|           bodylen: 0,
 | |
|           error: undefined,
 | |
|           header: prehead
 | |
|         };
 | |
|       } else
 | |
|         preamble.header = prehead;
 | |
|     }
 | |
|     if (fs.existsSync(fixtureBase + '/preamble.error')) {
 | |
|       var err = new Error(fs.readFileSync(fixtureBase
 | |
|                                           + '/preamble.error', 'binary'));
 | |
|       if (!preamble) {
 | |
|         preamble = {
 | |
|           body: undefined,
 | |
|           bodylen: 0,
 | |
|           error: err,
 | |
|           header: undefined
 | |
|         };
 | |
|       } else
 | |
|         preamble.error = err;
 | |
|     }
 | |
| 
 | |
|     assert.deepEqual(state.preamble,
 | |
|                      preamble,
 | |
|                      makeMsg(v.what,
 | |
|                              'Preamble mismatch:\nActual:'
 | |
|                              + inspect(state.preamble)
 | |
|                              + '\nExpected: '
 | |
|                              + inspect(preamble)));
 | |
| 
 | |
|     assert.equal(state.parts.length,
 | |
|                  v.nparts,
 | |
|                  makeMsg(v.what,
 | |
|                          'Part count mismatch:\nActual: '
 | |
|                          + state.parts.length
 | |
|                          + '\nExpected: '
 | |
|                          + v.nparts));
 | |
| 
 | |
|     if (!v.npartErrors)
 | |
|       v.npartErrors = 0;
 | |
|     assert.equal(partErrors,
 | |
|                  v.npartErrors,
 | |
|                  makeMsg(v.what,
 | |
|                          'Part errors mismatch:\nActual: '
 | |
|                          + partErrors
 | |
|                          + '\nExpected: '
 | |
|                          + v.npartErrors));
 | |
| 
 | |
|     for (var i = 0, header, body; i < v.nparts; ++i) {
 | |
|       if (fs.existsSync(fixtureBase + '/part' + (i+1))) {
 | |
|         body = fs.readFileSync(fixtureBase + '/part' + (i+1));
 | |
|         if (body.length === 0)
 | |
|           body = undefined;
 | |
|       } else
 | |
|         body = undefined;
 | |
|       assert.deepEqual(state.parts[i].body,
 | |
|                        body,
 | |
|                        makeMsg(v.what,
 | |
|                                'Part #' + (i+1) + ' body mismatch'));
 | |
|       if (fs.existsSync(fixtureBase + '/part' + (i+1) + '.header')) {
 | |
|         header = fs.readFileSync(fixtureBase
 | |
|                                  + '/part' + (i+1) + '.header', 'binary');
 | |
|         header = JSON.parse(header);
 | |
|       } else
 | |
|         header = undefined;
 | |
|       assert.deepEqual(state.parts[i].header,
 | |
|                        header,
 | |
|                        makeMsg(v.what,
 | |
|                                'Part #' + (i+1)
 | |
|                                + ' parsed header mismatch:\nActual: '
 | |
|                                + inspect(state.parts[i].header)
 | |
|                                + '\nExpected: '
 | |
|                                + inspect(header)));
 | |
|     }
 | |
|     ++t;
 | |
|     next();
 | |
|   });
 | |
| 
 | |
|   fs.createReadStream(fixtureBase + '/original').pipe(dicer);
 | |
| }
 | |
| next();
 | |
| 
 | |
| function makeMsg(what, msg) {
 | |
|   return '[' + group + what + ']: ' + msg;
 | |
| }
 | |
| 
 | |
| process.on('exit', function() {
 | |
|   assert(t === tests.length,
 | |
|          makeMsg('_exit', 'Only ran ' + t + '/' + tests.length + ' tests'));
 | |
| }); |