diff options
Diffstat (limited to 'deps/npm/test/tap/locker.js')
-rw-r--r-- | deps/npm/test/tap/locker.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/deps/npm/test/tap/locker.js b/deps/npm/test/tap/locker.js new file mode 100644 index 0000000000..bc43c30e95 --- /dev/null +++ b/deps/npm/test/tap/locker.js @@ -0,0 +1,89 @@ +var test = require("tap").test + , path = require("path") + , fs = require("graceful-fs") + , crypto = require("crypto") + , rimraf = require("rimraf") + , osenv = require("osenv") + , mkdirp = require("mkdirp") + , npm = require("../../") + , locker = require("../../lib/utils/locker.js") + , lock = locker.lock + , unlock = locker.unlock + +var pkg = path.join(__dirname, "/locker") + , cache = path.join(pkg, "/cache") + , tmp = path.join(pkg, "/tmp") + , nm = path.join(pkg, "/node_modules") + +function cleanup () { + process.chdir(osenv.tmpdir()) + rimraf.sync(pkg) +} + +test("setup", function (t) { + cleanup() + mkdirp.sync(cache) + mkdirp.sync(tmp) + t.end() +}) + +test("locking file puts lock in correct place", function (t) { + npm.load({cache: cache, tmpdir: tmp}, function (er) { + t.ifError(er, "npm bootstrapped OK") + + var n = "correct" + , c = n.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "") + , p = path.resolve(nm, n) + , h = crypto.createHash("sha1").update(p).digest("hex") + , l = c.substr(0, 24)+"-"+h.substr(0, 16)+".lock" + , v = path.join(cache, "_locks", l) + + lock(nm, n, function (er) { + t.ifError(er, "locked path") + + fs.exists(v, function (found) { + t.ok(found, "lock found OK") + + unlock(nm, n, function (er) { + t.ifError(er, "unlocked path") + + fs.exists(v, function (found) { + t.notOk(found, "lock deleted OK") + t.end() + }) + }) + }) + }) + }) +}) + +test("unlocking out of order errors out", function (t) { + npm.load({cache: cache, tmpdir: tmp}, function (er) { + t.ifError(er, "npm bootstrapped OK") + + var n = "busted" + , c = n.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "") + , p = path.resolve(nm, n) + , h = crypto.createHash("sha1").update(p).digest("hex") + , l = c.substr(0, 24)+"-"+h.substr(0, 16)+".lock" + , v = path.join(cache, "_locks", l) + + fs.exists(v, function (found) { + t.notOk(found, "no lock to unlock") + + t.throws(function () { + unlock(nm, n, function () { + t.fail("shouldn't get here") + t.end() + }) + }, "blew up as expected") + + t.end() + }) + }) +}) + +test("cleanup", function (t) { + cleanup() + t.end() +}) |