1 var path = require('path')
2 var test = require('tap').test
3 var mkdirp = require('mkdirp')
4 var osenv = require('osenv')
5 var rimraf = require('rimraf')
6 var requireInject = require('require-inject')
8 var pkg = path.join(__dirname, '/local-dir')
9 var cache = path.join(pkg, '/cache')
10 var tmp = path.join(pkg, '/tmp')
11 var prefix = path.join(pkg, '/prefix')
13 var Tacks = require('tacks')
17 test('addLocal directory race on Windows', function (t) {
25 var fixture = new Tacks(
27 'package.json': File(p)
30 var addLocal = requireInject('../../lib/cache/add-local', {
36 '../../lib/cache/get-stat': function (cb) {
39 chownr: function (x, y, z, cb) {
40 cb(new Error('chownr should never have been called'))
42 '../../lib/cache/add-local-tarball.js': function (tgz, data, shasum, cb) {
45 '../../lib/utils/lifecycle.js': function (data, cycle, p, cb) {
48 '../../lib/utils/tar.js': {
49 pack: function (tgz, p, data, fancy, cb) {
54 get: function (tgz, cb) {
61 addLocal(p, null, function (err) {
62 t.ifErr(err, 'addLocal completed without error')
67 test('addLocal temporary cache file race', function (t) {
68 // See https://github.com/npm/npm/issues/12669
76 var fixture = new Tacks(
78 'package.json': File(p)
81 var addLocal = requireInject('../../lib/cache/add-local', {
82 // basic setup/mock stuff
88 '../../lib/cache/add-local-tarball.js': function (tgz, data, shasum, cb) {
91 '../../lib/utils/lifecycle.js': function (data, cycle, p, cb) {
94 '../../lib/utils/tar.js': {
95 pack: function (tgz, p, data, fancy, cb) {
100 get: function (tgz, cb) {
105 // Test-specific mocked values to simulate race.
106 '../../lib/cache/get-stat': function (cb) {
107 cb(null, {uid: 1, gid: 2})
109 chownr: function (x, y, z, cb) {
110 // Simulate a race condition between `tar.pack` and `chownr`
111 // where the latter will return `ENOENT` when an async process
112 // removes a file that its internal `fs.readdir` listed.
118 addLocal(p, null, function (err) {
119 t.ifErr(err, 'addLocal completed without error')
124 test('cleanup', function (t) {
134 function cleanup () {
135 process.chdir(osenv.tmpdir())