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.
		
		
		
		
			
				
					133 lines
				
				3.1 KiB
			
		
		
			
		
	
	
					133 lines
				
				3.1 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								// 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")
							 | 
						||
| 
								 | 
							
								  , gfs = require("graceful-fs")
							 | 
						||
| 
								 | 
							
								  , path = require("path")
							 | 
						||
| 
								 | 
							
								  , file = path.resolve(__dirname, "fixtures/dir.tar")
							 | 
						||
| 
								 | 
							
								  , target = path.resolve(__dirname, "tmp/extract-test")
							 | 
						||
| 
								 | 
							
								  , index = 0
							 | 
						||
| 
								 | 
							
								  , fstream = require("fstream")
							 | 
						||
| 
								 | 
							
								  , rimraf = require("rimraf")
							 | 
						||
| 
								 | 
							
								  , mkdirp = require("mkdirp")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  , ee = 0
							 | 
						||
| 
								 | 
							
								  , expectEntries = [
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        "path" : "dir/",
							 | 
						||
| 
								 | 
							
								        "mode" : "750",
							 | 
						||
| 
								 | 
							
								        "type" : "5",
							 | 
						||
| 
								 | 
							
								        "depth" : undefined,
							 | 
						||
| 
								 | 
							
								        "size" : 0,
							 | 
						||
| 
								 | 
							
								        "linkpath" : "",
							 | 
						||
| 
								 | 
							
								        "nlink" : undefined,
							 | 
						||
| 
								 | 
							
								        "dev" : undefined,
							 | 
						||
| 
								 | 
							
								        "ino" : undefined
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        "path" : "dir/sub/",
							 | 
						||
| 
								 | 
							
								        "mode" : "750",
							 | 
						||
| 
								 | 
							
								        "type" : "5",
							 | 
						||
| 
								 | 
							
								        "depth" : undefined,
							 | 
						||
| 
								 | 
							
								        "size" : 0,
							 | 
						||
| 
								 | 
							
								        "linkpath" : "",
							 | 
						||
| 
								 | 
							
								        "nlink" : undefined,
							 | 
						||
| 
								 | 
							
								        "dev" : undefined,
							 | 
						||
| 
								 | 
							
								        "ino" : undefined
							 | 
						||
| 
								 | 
							
								      } ]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function slow (fs, method, t1, t2) {
							 | 
						||
| 
								 | 
							
								  var orig = fs[method]
							 | 
						||
| 
								 | 
							
								  if (!orig) return null
							 | 
						||
| 
								 | 
							
								  fs[method] = function () {
							 | 
						||
| 
								 | 
							
								    var args = [].slice.call(arguments)
							 | 
						||
| 
								 | 
							
								    console.error("slow", method, args[0])
							 | 
						||
| 
								 | 
							
								    var cb = args.pop()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    setTimeout(function () {
							 | 
						||
| 
								 | 
							
								      orig.apply(fs, args.concat(function(er, data) {
							 | 
						||
| 
								 | 
							
								        setTimeout(function() {
							 | 
						||
| 
								 | 
							
								          cb(er, data)
							 | 
						||
| 
								 | 
							
								        }, t2)
							 | 
						||
| 
								 | 
							
								      }))
							 | 
						||
| 
								 | 
							
								    }, t1)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Make sure we get the graceful-fs that fstream is using.
							 | 
						||
| 
								 | 
							
								var gfs2
							 | 
						||
| 
								 | 
							
								try {
							 | 
						||
| 
								 | 
							
								  gfs2 = require("fstream/node_modules/graceful-fs")
							 | 
						||
| 
								 | 
							
								} catch (er) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var slowMethods = ["chown", "chmod", "utimes", "lutimes"]
							 | 
						||
| 
								 | 
							
								slowMethods.forEach(function (method) {
							 | 
						||
| 
								 | 
							
								  var t1 = 500
							 | 
						||
| 
								 | 
							
								  var t2 = 0
							 | 
						||
| 
								 | 
							
								  slow(fs, method, t1, t2)
							 | 
						||
| 
								 | 
							
								  slow(gfs, method, t1, t2)
							 | 
						||
| 
								 | 
							
								  if (gfs2) {
							 | 
						||
| 
								 | 
							
								    slow(gfs2, method, t1, t2)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 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) {
							 | 
						||
| 
								 | 
							
								  rimraf.sync(target)
							 | 
						||
| 
								 | 
							
								  /mkdirp.sync(target)
							 | 
						||
| 
								 | 
							
								  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 () {
							 | 
						||
| 
								 | 
							
								    rimraf.sync(target)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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!")
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    t.end()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  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)
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 |