Тестирование взаимодействия с файловой системой: настройка прав доступа к файлам
Я наткнулся на Jimfs и хотел использовать его для тестирования методов взаимодействия с файловой системой. Например, я написал довольно длинный метод, который выясняет, удастся ли выполнить запись в список файлов:
static boolean exportable(List<Path> paths, boolean force) {
List<Path> created = new LinkedList<>();
boolean success = true;
for (Path p : paths) {
if (Files.exists(p)) {
if (Files.isDirectory(p)) {
success = false;
log.error("Can't export results to file '{}': It's a directory!", p);
} else if (force) {
if (!Files.isWritable(p)) {
success = false;
log.error("Can't export to file '{}': No write access!", p);
}
} else {
success = false;
log.error("Can't export to file '{}': File does already exist and overwrite (-f) is not enabled!",
p);
}
} else { // does not exist
Path parent = p.toAbsolutePath().normalize().getParent();
if (Files.exists(parent)) {
try {
Files.createFile(p);
created.add(p);
log.debug("Created file '{}'", p);
} catch (AccessDeniedException e) {
success = false;
log.error("Can't export to file '{}': File could not be created. Access denied!", p);
} catch (IOException e) {
success = false;
log.error("Can't export to file '{}': File could not be created!", p, e);
}
} else if (force) {
List<Path> createdDirs = new ArrayList<>();
try {
createParentDirectories(parent, createdDirs);
} catch (IOException e) {
success = false;
log.error("Can't export to file '{}': Failed to create all parent directories!", p, e);
}
created.addAll(createdDirs);
try {
Files.createFile(p);
created.add(p);
log.debug("Created file '{}'.", p);
} catch (IOException e) {
success = false;
log.error("Can't export to file '{}': File could not be created!", p, e);
}
} else {
success = false;
log.error("Can't export to file '{}': File could not be created, because the parent directory '{}'"
+ " does not exist and automatic parent directory creation (-f) is not enabled!", p, parent);
}
}
}
if (!success && created.size() > 0) {
log.debug("Beginning to delete files and directories created while checking exportability.");
Collections.reverse(created); // delete created folders in reverse order
for (Path p : created) {
try {
Files.delete(p);
log.debug("Successfully deleted '{}'.", p);
} catch (IOException e) {
log.warn("Deleting file '{}' failed, which was created during exportability check!", p, e);
}
}
log.debug("Finished cleaning up created files and directories.");
}
}
Теперь я хочу написать такие тесты:
public void testExportToExistingFile_forceButNotWritable() throws Exception {
FileSystem fs = Jimfs.newFileSystem();
Path file = fs.getPath("file");
Files.createFile(file);
// How to deny writing to 'file' here???
assertFalse(exportable(ImmutableList.of(file), true));
}
Могу ли я использовать Jimfs для этого? Если нет, то как бы вы протестировали этот метод?
1 ответ
Решение
К сожалению, Jimfs в настоящее время не поддерживает какую-либо проверку разрешений. Это определенно что-то, что может быть приятно иметь в будущем, это просто несколько сложно (из-за различий в том, как устанавливаются разрешения между файловыми системами POSIX и Windows, например) и не кажется необходимым для большинства случаев использования.