0
0
mirror of https://github.com/nodejs/node.git synced 2024-11-25 08:19:38 +01:00
nodejs/test/parallel/test-fs-chmod.js
isaacs 3e1b1dd4a9 Remove excessive copyright/license boilerplate
The copyright and license notice is already in the LICENSE file.  There
is no justifiable reason to also require that it be included in every
file, since the individual files are not individually distributed except
as part of the entire package.
2015-01-12 15:30:28 -08:00

141 lines
3.0 KiB
JavaScript

var common = require('../common');
var assert = require('assert');
var path = require('path');
var fs = require('fs');
var got_error = false;
var success_count = 0;
var mode_async;
var mode_sync;
var is_windows = process.platform === 'win32';
// Need to hijack fs.open/close to make sure that things
// get closed once they're opened.
fs._open = fs.open;
fs._openSync = fs.openSync;
fs.open = open;
fs.openSync = openSync;
fs._close = fs.close;
fs._closeSync = fs.closeSync;
fs.close = close;
fs.closeSync = closeSync;
var openCount = 0;
function open() {
openCount++;
return fs._open.apply(fs, arguments);
}
function openSync() {
openCount++;
return fs._openSync.apply(fs, arguments);
}
function close() {
openCount--;
return fs._close.apply(fs, arguments);
}
function closeSync() {
openCount--;
return fs._closeSync.apply(fs, arguments);
}
// On Windows chmod is only able to manipulate read-only bit
if (is_windows) {
mode_async = 0400; // read-only
mode_sync = 0600; // read-write
} else {
mode_async = 0777;
mode_sync = 0644;
}
var file1 = path.join(common.fixturesDir, 'a.js'),
file2 = path.join(common.fixturesDir, 'a1.js');
fs.chmod(file1, mode_async.toString(8), function(err) {
if (err) {
got_error = true;
} else {
console.log(fs.statSync(file1).mode);
if (is_windows) {
assert.ok((fs.statSync(file1).mode & 0777) & mode_async);
} else {
assert.equal(mode_async, fs.statSync(file1).mode & 0777);
}
fs.chmodSync(file1, mode_sync);
if (is_windows) {
assert.ok((fs.statSync(file1).mode & 0777) & mode_sync);
} else {
assert.equal(mode_sync, fs.statSync(file1).mode & 0777);
}
success_count++;
}
});
fs.open(file2, 'a', function(err, fd) {
if (err) {
got_error = true;
console.error(err.stack);
return;
}
fs.fchmod(fd, mode_async.toString(8), function(err) {
if (err) {
got_error = true;
} else {
console.log(fs.fstatSync(fd).mode);
if (is_windows) {
assert.ok((fs.fstatSync(fd).mode & 0777) & mode_async);
} else {
assert.equal(mode_async, fs.fstatSync(fd).mode & 0777);
}
fs.fchmodSync(fd, mode_sync);
if (is_windows) {
assert.ok((fs.fstatSync(fd).mode & 0777) & mode_sync);
} else {
assert.equal(mode_sync, fs.fstatSync(fd).mode & 0777);
}
success_count++;
fs.close(fd);
}
});
});
// lchmod
if (fs.lchmod) {
var link = path.join(common.tmpDir, 'symbolic-link');
try {
fs.unlinkSync(link);
} catch (er) {}
fs.symlinkSync(file2, link);
fs.lchmod(link, mode_async, function(err) {
if (err) {
got_error = true;
} else {
console.log(fs.lstatSync(link).mode);
assert.equal(mode_async, fs.lstatSync(link).mode & 0777);
fs.lchmodSync(link, mode_sync);
assert.equal(mode_sync, fs.lstatSync(link).mode & 0777);
success_count++;
}
});
} else {
success_count++;
}
process.on('exit', function() {
assert.equal(3, success_count);
assert.equal(0, openCount);
assert.equal(false, got_error);
});