File "mutex.js"

Full Path: /srv/www/www.cadoro.it/app/lib/locks/test/mutex.js
File size: 1.23 KB
MIME-type: text/plain
Charset: utf-8

var locks = require('..');
var test = require('tape');


test('Mutex', function (t) {
	var mutex = locks.createMutex();

	t.equal(mutex.isLocked, false, 'Unlocked');

	var unlockedByNextLock = false;
	var instantTimedLockSuccess = false;

	mutex.timedLock(1, function () {
		instantTimedLockSuccess = true;
		mutex.unlock();
	});

	t.equal(instantTimedLockSuccess, true, 'Timed lock fired instantly');

	t.throws(function () {
		mutex.unlock();
	}, 'Cannot unlock an unlocked mutex');

	mutex.lock(function () {
		setTimeout(function () {
			t.equal(unlockedByNextLock, false, 'Next lock is waiting');
			mutex.unlock();
			t.equal(unlockedByNextLock, true, 'Next lock executed');
		}, 10);
	});

	mutex.lock(function () {
		unlockedByNextLock = true;
		t.equal(mutex.isLocked, true, 'Locked');

		var success = mutex.tryLock();

		t.equal(success, false, 'Try failed');

		mutex.unlock();

		success = mutex.tryLock();

		t.equal(success, true, 'Try succeeded');

		mutex.timedLock(1, function (error) {
			t.ok(error, 'Lock attempt timed out');  // we expect an error

			setTimeout(function () {
				mutex.unlock();
			}, 10);

			mutex.timedLock(1000, function (error) {
				t.error(error, 'Lock attempt did not time out');

				t.end();
			});
		});
	});
});