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.
367 lines
9.8 KiB
367 lines
9.8 KiB
// Set the umask, so that it works the same everywhere. |
|
process.umask(parseInt('22', 8)) |
|
|
|
var tap = require("tap") |
|
, tar = require("../tar.js") |
|
, fs = require("fs") |
|
, path = require("path") |
|
, file = path.resolve(__dirname, "fixtures/c.tar") |
|
, target = path.resolve(__dirname, "tmp/extract-test") |
|
, index = 0 |
|
, fstream = require("fstream") |
|
|
|
, ee = 0 |
|
, expectEntries = |
|
[ { path: 'c.txt', |
|
mode: '644', |
|
type: '0', |
|
depth: undefined, |
|
size: 513, |
|
linkpath: '', |
|
nlink: undefined, |
|
dev: undefined, |
|
ino: undefined }, |
|
{ path: 'cc.txt', |
|
mode: '644', |
|
type: '0', |
|
depth: undefined, |
|
size: 513, |
|
linkpath: '', |
|
nlink: undefined, |
|
dev: undefined, |
|
ino: undefined }, |
|
{ path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', |
|
mode: '644', |
|
type: '0', |
|
depth: undefined, |
|
size: 100, |
|
linkpath: '', |
|
nlink: undefined, |
|
dev: undefined, |
|
ino: undefined }, |
|
{ path: 'Ω.txt', |
|
mode: '644', |
|
type: '0', |
|
depth: undefined, |
|
size: 2, |
|
linkpath: '', |
|
nlink: undefined, |
|
dev: undefined, |
|
ino: undefined }, |
|
{ path: 'Ω.txt', |
|
mode: '644', |
|
type: '0', |
|
depth: undefined, |
|
size: 2, |
|
linkpath: '', |
|
nlink: 1, |
|
dev: 234881026, |
|
ino: 51693379 }, |
|
{ path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', |
|
mode: '644', |
|
type: '0', |
|
depth: undefined, |
|
size: 200, |
|
linkpath: '', |
|
nlink: 1, |
|
dev: 234881026, |
|
ino: 51681874 }, |
|
{ path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', |
|
mode: '644', |
|
type: '0', |
|
depth: undefined, |
|
size: 201, |
|
linkpath: '', |
|
nlink: undefined, |
|
dev: undefined, |
|
ino: undefined }, |
|
{ path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', |
|
mode: '777', |
|
type: '2', |
|
depth: undefined, |
|
size: 0, |
|
linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', |
|
nlink: undefined, |
|
dev: undefined, |
|
ino: undefined }, |
|
{ path: '200-hard', |
|
mode: '644', |
|
type: '0', |
|
depth: undefined, |
|
size: 200, |
|
linkpath: '', |
|
nlink: 2, |
|
dev: 234881026, |
|
ino: 51681874 }, |
|
{ path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', |
|
mode: '644', |
|
type: '1', |
|
depth: undefined, |
|
size: 0, |
|
linkpath: path.resolve(target, '200-hard'), |
|
nlink: 2, |
|
dev: 234881026, |
|
ino: 51681874 } ] |
|
|
|
, ef = 0 |
|
, expectFiles = |
|
[ { path: '', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 0, |
|
linkpath: undefined }, |
|
{ path: '/200-hard', |
|
mode: '100644', |
|
type: 'File', |
|
depth: 1, |
|
size: 200, |
|
linkpath: undefined, |
|
nlink: 2 }, |
|
{ path: '/200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', |
|
mode: '120777', |
|
type: 'SymbolicLink', |
|
depth: 1, |
|
size: 200, |
|
linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', |
|
nlink: 1 }, |
|
{ path: '/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', |
|
mode: '100644', |
|
type: 'Link', |
|
depth: 1, |
|
size: 200, |
|
linkpath: path.join(target, '200-hard'), |
|
nlink: 2 }, |
|
{ path: '/c.txt', |
|
mode: '100644', |
|
type: 'File', |
|
depth: 1, |
|
size: 513, |
|
linkpath: undefined, |
|
nlink: 1 }, |
|
{ path: '/cc.txt', |
|
mode: '100644', |
|
type: 'File', |
|
depth: 1, |
|
size: 513, |
|
linkpath: undefined, |
|
nlink: 1 }, |
|
{ path: '/r', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 1, |
|
linkpath: undefined }, |
|
{ path: '/r/e', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 2, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 3, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 4, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 5, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 6, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 7, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 8, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 9, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 10, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 11, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 12, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 13, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 14, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 15, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 16, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 17, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 18, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 19, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 20, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 21, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 22, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h', |
|
mode: '40755', |
|
type: 'Directory', |
|
depth: 23, |
|
linkpath: undefined }, |
|
{ path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', |
|
mode: '100644', |
|
type: 'File', |
|
depth: 24, |
|
size: 100, |
|
linkpath: undefined, |
|
nlink: 1 }, |
|
{ path: '/Ω.txt', |
|
mode: '100644', |
|
type: 'File', |
|
depth: 1, |
|
size: 2, |
|
linkpath: undefined, |
|
nlink: 1 } ] |
|
|
|
|
|
|
|
// The extract class basically just pipes the input |
|
// to a Reader, and then to a fstream.DirWriter |
|
|
|
// So, this is as much a test of fstream.Reader and fstream.Writer |
|
// as it is of tar.Extract, but it sort of makes sense. |
|
|
|
tap.test("preclean", function (t) { |
|
require("rimraf").sync(__dirname + "/tmp/extract-test") |
|
t.pass("cleaned!") |
|
t.end() |
|
}) |
|
|
|
tap.test("extract test", function (t) { |
|
var extract = tar.Extract(target) |
|
var inp = fs.createReadStream(file) |
|
|
|
// give it a weird buffer size to try to break in odd places |
|
inp.bufferSize = 1234 |
|
|
|
inp.pipe(extract) |
|
|
|
extract.on("end", function () { |
|
t.equal(ee, expectEntries.length, "should see "+ee+" 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 found = |
|
{ path: entry.path |
|
, mode: entry.props.mode.toString(8) |
|
, type: entry.props.type |
|
, depth: entry.props.depth |
|
, size: entry.props.size |
|
, linkpath: entry.props.linkpath |
|
, nlink: entry.props.nlink |
|
, dev: entry.props.dev |
|
, ino: entry.props.ino |
|
} |
|
|
|
var wanted = expectEntries[ee ++] |
|
|
|
t.equivalent(found, wanted, "tar entry " + ee + " " + wanted.path) |
|
}) |
|
|
|
function next () { |
|
var r = fstream.Reader({ path: target |
|
, type: "Directory" |
|
// this is just to encourage consistency |
|
, sort: "alpha" }) |
|
|
|
r.on("ready", function () { |
|
foundEntry(r) |
|
}) |
|
|
|
r.on("end", finish) |
|
|
|
function foundEntry (entry) { |
|
var p = entry.path.substr(target.length) |
|
var found = |
|
{ path: p |
|
, mode: entry.props.mode.toString(8) |
|
, type: entry.props.type |
|
, depth: entry.props.depth |
|
, size: entry.props.size |
|
, linkpath: entry.props.linkpath |
|
, nlink: entry.props.nlink |
|
} |
|
|
|
var wanted = expectFiles[ef ++] |
|
|
|
t.has(found, wanted, "unpacked file " + ef + " " + wanted.path) |
|
|
|
entry.on("entry", foundEntry) |
|
} |
|
|
|
function finish () { |
|
t.equal(ef, expectFiles.length, "should have "+ef+" items") |
|
t.end() |
|
} |
|
} |
|
})
|
|
|