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.
		
		
		
		
		
			
		
			
				
					
					
						
							132 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
	
	
							132 lines
						
					
					
						
							3.1 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") | 
						|
  , 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) | 
						|
  }) | 
						|
})
 | 
						|
 |