rmdir should error on non-directories
This commit is contained in:
parent
635dd2e899
commit
656dfd242b
49
src/fs.js
49
src/fs.js
|
@ -332,13 +332,34 @@ define(function(require) {
|
|||
var parentDirectoryNode;
|
||||
var parentDirectoryData;
|
||||
|
||||
function check_if_directory_exists(error, result) {
|
||||
function read_parent_directory_data(error, result) {
|
||||
if(error) {
|
||||
callback(error);
|
||||
} else {
|
||||
parentDirectoryNode = result;
|
||||
read_object(objectStore, parentDirectoryNode.data, check_if_node_exists);
|
||||
}
|
||||
}
|
||||
|
||||
function check_if_node_exists(error, result) {
|
||||
if(error) {
|
||||
callback(error);
|
||||
} else if(ROOT_DIRECTORY_NAME == name) {
|
||||
callback(new EBusy());
|
||||
} else if(!result) {
|
||||
} else if(!_(result).has(name)) {
|
||||
callback(new ENoEntry());
|
||||
} else {
|
||||
parentDirectoryData = result;
|
||||
directoryNode = parentDirectoryData[name].id;
|
||||
read_object(objectStore, directoryNode, check_if_node_is_directory);
|
||||
}
|
||||
}
|
||||
|
||||
function check_if_node_is_directory(error, result) {
|
||||
if(error) {
|
||||
callback(error);
|
||||
} else if(result.mode != MODE_DIRECTORY) {
|
||||
callback(new ENotDirectory());
|
||||
} else {
|
||||
directoryNode = result;
|
||||
read_object(objectStore, directoryNode.data, check_if_directory_is_empty);
|
||||
|
@ -353,28 +374,14 @@ define(function(require) {
|
|||
if(_(directoryData).size() > 0) {
|
||||
callback(new ENotEmpty());
|
||||
} else {
|
||||
find_node(objectStore, parentPath, read_parent_directory_data);
|
||||
remove_directory_entry_from_parent_directory_node();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function read_parent_directory_data(error, result) {
|
||||
if(error) {
|
||||
callback(error);
|
||||
} else {
|
||||
parentDirectoryNode = result;
|
||||
read_object(objectStore, parentDirectoryNode.data, remove_directory_entry_from_parent_directory_node);
|
||||
}
|
||||
}
|
||||
|
||||
function remove_directory_entry_from_parent_directory_node(error, result) {
|
||||
if(error) {
|
||||
callback(error);
|
||||
} else {
|
||||
parentDirectoryData = result;
|
||||
delete parentDirectoryData[name];
|
||||
write_object(objectStore, parentDirectoryData, parentDirectoryNode.data, remove_directory_node);
|
||||
}
|
||||
function remove_directory_entry_from_parent_directory_node() {
|
||||
delete parentDirectoryData[name];
|
||||
write_object(objectStore, parentDirectoryData, parentDirectoryNode.data, remove_directory_node);
|
||||
}
|
||||
|
||||
function remove_directory_node(error) {
|
||||
|
@ -393,7 +400,7 @@ define(function(require) {
|
|||
}
|
||||
}
|
||||
|
||||
find_node(objectStore, path, check_if_directory_exists);
|
||||
find_node(objectStore, parentPath, read_parent_directory_data);
|
||||
}
|
||||
|
||||
function open_file(fs, objectStore, path, flags, callback) {
|
||||
|
|
|
@ -578,6 +578,56 @@ describe('fs.rmdir', function() {
|
|||
});
|
||||
});
|
||||
|
||||
it('should return an error if the path is not a directory', function() {
|
||||
var complete = false;
|
||||
var _error;
|
||||
var that = this;
|
||||
|
||||
that.fs.mkdir('/tmp', function(error) {
|
||||
that.fs.open('/tmp/myfile', 'w', function(error, fd) {
|
||||
that.fs.close(fd, function(error) {
|
||||
that.fs.rmdir('/tmp/myfile', function(error) {
|
||||
_error = error;
|
||||
|
||||
complete = true;
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
waitsFor(function() {
|
||||
return complete;
|
||||
}, 'test to complete', DEFAULT_TIMEOUT);
|
||||
|
||||
runs(function() {
|
||||
expect(_error).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
it('should return an error if the path is a symbolic link', function () {
|
||||
var complete = false;
|
||||
var _error;
|
||||
var that = this;
|
||||
|
||||
that.fs.mkdir('/tmp', function (error) {
|
||||
that.fs.symlink('/tmp', '/tmp/myfile', function (error) {
|
||||
that.fs.rmdir('/tmp/myfile', function (error) {
|
||||
_error = error;
|
||||
|
||||
complete = true;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
waitsFor(function () {
|
||||
return complete;
|
||||
}, 'test to complete', DEFAULT_TIMEOUT);
|
||||
|
||||
runs(function () {
|
||||
expect(_error).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
it('should remove an existing directory', function() {
|
||||
var complete = false;
|
||||
var _error, _stat;
|
||||
|
|
Loading…
Reference in New Issue