diff --git a/test/extract.js b/test/extract.js index f144fb1..32dc6ad 100644 --- a/test/extract.js +++ b/test/extract.js @@ -38,4 +38,231 @@ test('one-file', function(t) { }); extract.end(fs.readFileSync(fixtures.ONE_FILE_TAR)); +}); + +test('chunked-one-file', function(t) { + t.plan(3); + + var extract = tar.extract(); + var noEntries = false; + + extract.on('entry', function(header, stream, callback) { + t.deepEqual(header, { + name: 'test.txt', + mode: 0644, + uid: 501, + gid: 20, + size: 12, + mtime: new Date(1387580181000), + type: 'file', + linkname: null, + uname: 'maf', + gname: 'staff', + devmajor: 0, + devminor: 0 + }); + + stream.pipe(concat(function(data) { + noEntries = true; + t.same(data.toString(), 'hello world\n'); + callback(); + })); + }); + + extract.on('finish', function() { + t.ok(noEntries); + }); + + var b = fs.readFileSync(fixtures.ONE_FILE_TAR); + + for (var i = 0; i < b.length; i += 321) { + extract.write(b.slice(i, i+321)); + } + extract.end(); +}); + + +test('multi-file', function(t) { + t.plan(5); + + var extract = tar.extract(); + var noEntries = false; + + var onfile1 = function(header, stream, callback) { + t.deepEqual(header, { + name: 'file-1.txt', + mode: 0644, + uid: 501, + gid: 20, + size: 12, + mtime: new Date(1387580181000), + type: 'file', + linkname: null, + uname: 'maf', + gname: 'staff', + devmajor: 0, + devminor: 0 + }); + + extract.on('entry', onfile2); + stream.pipe(concat(function(data) { + t.same(data.toString(), 'i am file-1\n'); + callback(); + })); + }; + + var onfile2 = function(header, stream, callback) { + t.deepEqual(header, { + name: 'file-2.txt', + mode: 0644, + uid: 501, + gid: 20, + size: 12, + mtime: new Date(1387580181000), + type: 'file', + linkname: null, + uname: 'maf', + gname: 'staff', + devmajor: 0, + devminor: 0 + }); + + stream.pipe(concat(function(data) { + noEntries = true; + t.same(data.toString(), 'i am file-2\n'); + callback(); + })); + }; + + extract.once('entry', onfile1); + + extract.on('finish', function() { + t.ok(noEntries); + }); + + extract.end(fs.readFileSync(fixtures.MULTI_FILE_TAR)); +}); + +test('chunked-multi-file', function(t) { + t.plan(5); + + var extract = tar.extract(); + var noEntries = false; + + var onfile1 = function(header, stream, callback) { + t.deepEqual(header, { + name: 'file-1.txt', + mode: 0644, + uid: 501, + gid: 20, + size: 12, + mtime: new Date(1387580181000), + type: 'file', + linkname: null, + uname: 'maf', + gname: 'staff', + devmajor: 0, + devminor: 0 + }); + + extract.on('entry', onfile2); + stream.pipe(concat(function(data) { + t.same(data.toString(), 'i am file-1\n'); + callback(); + })); + }; + + var onfile2 = function(header, stream, callback) { + t.deepEqual(header, { + name: 'file-2.txt', + mode: 0644, + uid: 501, + gid: 20, + size: 12, + mtime: new Date(1387580181000), + type: 'file', + linkname: null, + uname: 'maf', + gname: 'staff', + devmajor: 0, + devminor: 0 + }); + + stream.pipe(concat(function(data) { + noEntries = true; + t.same(data.toString(), 'i am file-2\n'); + callback(); + })); + }; + + extract.once('entry', onfile1); + + extract.on('finish', function() { + t.ok(noEntries); + }); + + var b = fs.readFileSync(fixtures.MULTI_FILE_TAR); + for (var i = 0; i < b.length; i += 321) { + extract.write(b.slice(i, i+321)); + } + extract.end(); +}); + +test('types', function(t) { + t.plan(3); + + var extract = tar.extract(); + var noEntries = false; + + var ondir = function(header, stream, callback) { + t.deepEqual(header, { + name: 'directory', + mode: 0755, + uid: 501, + gid: 20, + size: 0, + mtime: new Date(1387580181000), + type: 'directory', + linkname: null, + uname: 'maf', + gname: 'staff', + devmajor: 0, + devminor: 0 + }); + stream.on('data', function() { + t.ok(false); + }); + extract.once('entry', onlink); + callback(); + }; + + var onlink = function(header, stream, callback) { + t.deepEqual(header, { + name: 'directory-link', + mode: 0755, + uid: 501, + gid: 20, + size: 0, + mtime: new Date(1387580181000), + type: 'symlink', + linkname: 'directory', + uname: 'maf', + gname: 'staff', + devmajor: 0, + devminor: 0 + }); + stream.on('data', function() { + t.ok(false); + }); + noEntries = true; + callback(); + }; + + extract.once('entry', ondir); + + extract.on('finish', function() { + t.ok(noEntries); + }); + + extract.end(fs.readFileSync(fixtures.TYPES_TAR)); }); \ No newline at end of file diff --git a/test/fixtures/index.js b/test/fixtures/index.js index 5a59c7e..9658a5a 100644 --- a/test/fixtures/index.js +++ b/test/fixtures/index.js @@ -1,3 +1,5 @@ var path = require('path'); -exports.ONE_FILE_TAR = path.join(__dirname, 'one-file.tar'); \ No newline at end of file +exports.ONE_FILE_TAR = path.join(__dirname, 'one-file.tar'); +exports.MULTI_FILE_TAR = path.join(__dirname, 'multi-file.tar'); +exports.TYPES_TAR = path.join(__dirname, 'types.tar'); diff --git a/test/fixtures/multi-file.tar b/test/fixtures/multi-file.tar new file mode 100644 index 0000000..65775c1 Binary files /dev/null and b/test/fixtures/multi-file.tar differ diff --git a/test/fixtures/types.tar b/test/fixtures/types.tar new file mode 100644 index 0000000..e6414b0 Binary files /dev/null and b/test/fixtures/types.tar differ diff --git a/test/pack.js b/test/pack.js index f2ec58d..6346a87 100644 --- a/test/pack.js +++ b/test/pack.js @@ -5,7 +5,7 @@ var concat = require('concat-stream'); var fs = require('fs'); test('one-file', function(t) { - t.plan(1); + t.plan(2); var pack = tar.pack(); @@ -22,6 +22,77 @@ test('one-file', function(t) { pack.finalize(); pack.pipe(concat(function(data) { + t.same(data.length & 511, 0); t.deepEqual(data, fs.readFileSync(fixtures.ONE_FILE_TAR)); })); +}); + +test('multi-file', function(t) { + t.plan(2); + + var pack = tar.pack(); + + pack.entry({ + name:'file-1.txt', + mtime:new Date(1387580181000), + mode:0644, + uname:'maf', + gname:'staff', + uid:501, + gid:20 + }, 'i am file-1\n'); + + pack.entry({ + name:'file-2.txt', + mtime:new Date(1387580181000), + mode:0644, + size:12, + uname:'maf', + gname:'staff', + uid:501, + gid:20 + }).end('i am file-2\n'); + + pack.finalize(); + + pack.pipe(concat(function(data) { + t.same(data.length & 511, 0); + t.deepEqual(data, fs.readFileSync(fixtures.MULTI_FILE_TAR)); + })); +}); + +test('types', function(t) { + t.plan(2); + var pack = tar.pack(); + + pack.entry({ + name:'directory', + mtime:new Date(1387580181000), + type:'directory', + mode:0755, + uname:'maf', + gname:'staff', + uid:501, + gid:20 + }); + + pack.entry({ + name:'directory-link', + mtime:new Date(1387580181000), + type:'symlink', + linkname: 'directory', + mode:0755, + uname:'maf', + gname:'staff', + uid:501, + gid:20 + }); + + pack.finalize(); + + pack.pipe(concat(function(data) { + t.equal(data.length & 511, 0); + t.deepEqual(data, fs.readFileSync(fixtures.TYPES_TAR)); + })); + }); \ No newline at end of file