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.
177 lines
3.7 KiB
177 lines
3.7 KiB
// Set the umask, so that it works the same everywhere. |
|
process.umask(parseInt('22', 8)) |
|
|
|
var fs = require('fs') |
|
var path = require('path') |
|
|
|
var fstream = require('fstream') |
|
var test = require('tap').test |
|
|
|
var tar = require('../tar.js') |
|
var file = path.resolve(__dirname, 'dir-normalization.tar') |
|
var target = path.resolve(__dirname, 'tmp/dir-normalization-test') |
|
var ee = 0 |
|
|
|
var expectEntries = [ |
|
{ path: 'fixtures/', |
|
mode: '755', |
|
type: '5', |
|
linkpath: '' |
|
}, |
|
{ path: 'fixtures/a/', |
|
mode: '755', |
|
type: '5', |
|
linkpath: '' |
|
}, |
|
{ path: 'fixtures/the-chumbler', |
|
mode: '755', |
|
type: '2', |
|
linkpath: path.resolve(target, 'a/b/c/d/the-chumbler'), |
|
}, |
|
{ path: 'fixtures/a/b/', |
|
mode: '755', |
|
type: '5', |
|
linkpath: '' |
|
}, |
|
{ path: 'fixtures/a/x', |
|
mode: '644', |
|
type: '0', |
|
linkpath: '' |
|
}, |
|
{ path: 'fixtures/a/b/c/', |
|
mode: '755', |
|
type: '5', |
|
linkpath: '' |
|
}, |
|
{ path: 'fixtures/a/b/c/y', |
|
mode: '755', |
|
type: '2', |
|
linkpath: '../../x', |
|
} |
|
] |
|
|
|
var ef = 0 |
|
var expectFiles = [ |
|
{ path: '', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 0, |
|
linkpath: undefined |
|
}, |
|
{ path: '/fixtures', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 1, |
|
linkpath: undefined |
|
}, |
|
{ path: '/fixtures/a', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 2, |
|
linkpath: undefined |
|
}, |
|
{ path: '/fixtures/a/b', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 3, |
|
linkpath: undefined |
|
}, |
|
{ path: '/fixtures/a/b/c', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 4, |
|
linkpath: undefined |
|
}, |
|
{ path: '/fixtures/a/b/c/y', |
|
mode: '120755', |
|
type: 'SymbolicLink', |
|
depth: 5, |
|
linkpath: '../../x' |
|
}, |
|
{ path: '/fixtures/a/x', |
|
mode: '100644', |
|
type: 'File', |
|
depth: 3, |
|
linkpath: undefined |
|
}, |
|
{ path: '/fixtures/the-chumbler', |
|
mode: '120755', |
|
type: 'SymbolicLink', |
|
depth: 2, |
|
linkpath: path.resolve(target, 'a/b/c/d/the-chumbler') |
|
} |
|
] |
|
|
|
test('preclean', function (t) { |
|
require('rimraf').sync(path.join(__dirname, '/tmp/dir-normalization-test')) |
|
t.pass('cleaned!') |
|
t.end() |
|
}) |
|
|
|
test('extract test', function (t) { |
|
var extract = tar.Extract(target) |
|
var inp = fs.createReadStream(file) |
|
|
|
inp.pipe(extract) |
|
|
|
extract.on('end', function () { |
|
t.equal(ee, expectEntries.length, 'should see ' + expectEntries.length + ' entries') |
|
|
|
// should get no more entries after end |
|
extract.removeAllListeners('entry') |
|
extract.on('entry', function (e) { |
|
t.fail('Should not get entries after end!') |
|
}) |
|
|
|
next() |
|
}) |
|
|
|
extract.on('entry', function (entry) { |
|
var mode = entry.props.mode & (~parseInt('22', 8)) |
|
var found = { |
|
path: entry.path, |
|
mode: mode.toString(8), |
|
type: entry.props.type, |
|
linkpath: entry.props.linkpath, |
|
} |
|
|
|
var wanted = expectEntries[ee++] |
|
t.equivalent(found, wanted, 'tar entry ' + ee + ' ' + (wanted && wanted.path)) |
|
}) |
|
|
|
function next () { |
|
var r = fstream.Reader({ |
|
path: target, |
|
type: 'Directory', |
|
sort: 'alpha' |
|
}) |
|
|
|
r.on('ready', function () { |
|
foundEntry(r) |
|
}) |
|
|
|
r.on('end', finish) |
|
|
|
function foundEntry (entry) { |
|
var p = entry.path.substr(target.length) |
|
var mode = entry.props.mode & (~parseInt('22', 8)) |
|
var found = { |
|
path: p, |
|
mode: mode.toString(8), |
|
type: entry.props.type, |
|
depth: entry.props.depth, |
|
linkpath: entry.props.linkpath |
|
} |
|
|
|
var wanted = expectFiles[ef++] |
|
t.equivalent(found, wanted, 'unpacked file ' + ef + ' ' + (wanted && wanted.path)) |
|
|
|
entry.on('entry', foundEntry) |
|
} |
|
|
|
function finish () { |
|
t.equal(ef, expectFiles.length, 'should have ' + ef + ' items') |
|
t.end() |
|
} |
|
} |
|
})
|
|
|