334 lines
9.4 KiB
Lua
334 lines
9.4 KiB
Lua
-- hs.fs tests
|
|
require("hs.fs")
|
|
require("hs.socket")
|
|
|
|
testDir = "/private/tmp/hs_fs_test_dir/"
|
|
|
|
function writeFile(filename, contents)
|
|
io.open(filename, "w"):write(contents):close()
|
|
end
|
|
|
|
function setUp()
|
|
os.execute("mkdir "..testDir)
|
|
return success()
|
|
end
|
|
|
|
function tearDown()
|
|
os.execute("rm -r "..testDir)
|
|
return success()
|
|
end
|
|
|
|
function testMkdir()
|
|
local dirname = testDir.."mkdir_test_directory"
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
local status, err = hs.fs.mkdir(dirname)
|
|
assertFalse(status)
|
|
assertIsEqual("File exists", err)
|
|
|
|
return success()
|
|
end
|
|
|
|
function testChdir()
|
|
local dirname = testDir.."chdir_test_directory"
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
assertTrue(hs.fs.chdir(dirname))
|
|
assertIsEqual(dirname, hs.fs.currentDir())
|
|
|
|
local status, err = hs.fs.chdir("some_non_existent_dir")
|
|
assertIsNil(status)
|
|
assertIsEqual("No such file or directory", err:match("No such file or directory"))
|
|
|
|
return success()
|
|
end
|
|
|
|
function testRmdir()
|
|
local dirname = testDir.."some_unique_directory/"
|
|
local dirnameWithContents = testDir.."some_unique_directory_with_contents/"
|
|
local filename = "test.txt"
|
|
local result, errorMsg
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
assertTrue(hs.fs.rmdir(dirname))
|
|
|
|
assertTrue(hs.fs.mkdir(dirnameWithContents))
|
|
writeFile(dirnameWithContents..filename, "some text\n")
|
|
result, errorMsg = hs.fs.rmdir(dirnameWithContents)
|
|
assertIsNil(result)
|
|
assertIsEqual(errorMsg, "Directory not empty")
|
|
|
|
os.execute("rm "..dirnameWithContents..filename)
|
|
assertTrue(hs.fs.rmdir(dirnameWithContents))
|
|
|
|
result, errorMsg = hs.fs.rmdir("~/some_non_existent_dir")
|
|
assertIsNil(result)
|
|
assertIsEqual(errorMsg, "No such file or directory")
|
|
|
|
return success()
|
|
end
|
|
|
|
function testAttributes()
|
|
local dirname = testDir.."attributes_test_directory/"
|
|
local filename = "test.txt"
|
|
local pipename = "pipe"
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
writeFile(dirname..filename, "some text\n")
|
|
os.execute("mkfifo "..dirname..pipename)
|
|
|
|
local noFileInfo = hs.fs.attributes("~/non_existent_file")
|
|
local dirMode = hs.fs.attributes(dirname, "mode")
|
|
local fileInfo = hs.fs.attributes(dirname..filename)
|
|
local fifoInfo = hs.fs.attributes(dirname..pipename)
|
|
local charDeviceInfo = hs.fs.attributes("/dev/urandom")
|
|
local blockDeviceInfo = hs.fs.attributes("/dev/disk0")
|
|
|
|
assertIsNil(noFileInfo)
|
|
assertIsEqual("directory", dirMode)
|
|
assertIsEqual("file", fileInfo.mode)
|
|
assertIsEqual("named pipe", fifoInfo.mode)
|
|
assertIsEqual("char device", charDeviceInfo.mode)
|
|
assertIsEqual("block device", blockDeviceInfo.mode)
|
|
|
|
local status, err = hs.fs.attributes(dirname, "bad_attribute_name")
|
|
assertIsNil(status)
|
|
assertIsEqual("invalid attribute name 'bad_attribute_name'", err)
|
|
|
|
if hs.socket then
|
|
local sockname, socket = "sock", nil
|
|
socket = hs.socket.server(dirname..sockname)
|
|
assertIsEqual("socket", hs.fs.attributes(dirname..sockname).mode)
|
|
socket:disconnect()
|
|
end
|
|
|
|
return success()
|
|
end
|
|
|
|
function testTags()
|
|
local dirname = testDir.."tag_test_directory/"
|
|
local filename = "test.txt"
|
|
local filename2 = "test2.txt"
|
|
local tags = {"really cool tag", "another cool tag"}
|
|
local tag = {"some tag"}
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
writeFile(dirname..filename, "some text\n")
|
|
writeFile(dirname..filename2, "some more text\n")
|
|
|
|
hs.fs.chdir(dirname)
|
|
|
|
assertFalse(pcall(hs.fs.tagsGet, "non_existent_file"))
|
|
assertFalse(pcall(hs.fs.tagsSet, "non_existent_file", tags))
|
|
|
|
assertIsNil(hs.fs.tagsGet(filename))
|
|
assertIsNil(hs.fs.tagsGet(filename2))
|
|
|
|
hs.fs.tagsAdd(filename, tags)
|
|
hs.fs.tagsAdd(filename2, hs.fs.tagsGet(filename))
|
|
assertListsEqual(tags, hs.fs.tagsGet(filename))
|
|
assertListsEqual(tags, hs.fs.tagsGet(filename2))
|
|
|
|
hs.fs.tagsAdd(filename, tag)
|
|
assertListsEqual(table.pack(tag[1], table.unpack(tags)), hs.fs.tagsGet(filename))
|
|
|
|
hs.fs.tagsRemove(filename, tag)
|
|
assertListsEqual(tags, hs.fs.tagsGet(filename))
|
|
|
|
hs.fs.tagsSet(filename, tag)
|
|
assertListsEqual(tag, hs.fs.tagsGet(filename))
|
|
|
|
hs.fs.tagsSet(filename, tags)
|
|
assertListsEqual(tags, hs.fs.tagsGet(filename))
|
|
|
|
hs.fs.tagsSet(filename2, {})
|
|
assertIsNil(hs.fs.tagsGet(filename2))
|
|
|
|
return success()
|
|
end
|
|
|
|
function testLinks()
|
|
local dirname = testDir.."link_test_directory/"
|
|
local filename = "test.txt"
|
|
local symlinkname = "test.symlink"
|
|
local hardlinkname = "test.hardlink"
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
writeFile(dirname..filename, "some text\n")
|
|
|
|
assertTrue(hs.fs.link(dirname..filename, dirname..symlinkname, true))
|
|
status, err = hs.fs.link(dirname..filename, dirname..symlinkname, true)
|
|
assertIsNil(status)
|
|
assertTrue(hs.fs.link(dirname..filename, dirname..hardlinkname))
|
|
status, err2 = hs.fs.link(dirname..filename, dirname..hardlinkname)
|
|
assertIsNil(status)
|
|
|
|
assertIsEqual("file", hs.fs.attributes(dirname..symlinkname).mode)
|
|
assertIsEqual("file", hs.fs.attributes(dirname..hardlinkname).mode)
|
|
assertIsEqual("link", hs.fs.symlinkAttributes(dirname..symlinkname).mode)
|
|
assertIsEqual("file", hs.fs.symlinkAttributes(dirname..hardlinkname).mode)
|
|
|
|
return success()
|
|
end
|
|
|
|
function testTouch()
|
|
local dirname = hs.fs.temporaryDirectory()
|
|
local filename = "test.txt"
|
|
local aTime, mTime = 300, 200
|
|
|
|
local status, err = hs.fs.touch("non_existent_file")
|
|
assertIsNil(status)
|
|
assertIsEqual("No such file or directory", err)
|
|
|
|
writeFile(dirname..filename, "some contents\n")
|
|
assertTrue(hs.fs.touch(dirname..filename, aTime))
|
|
assertIsEqual(aTime, hs.fs.attributes(dirname..filename).access)
|
|
assertIsEqual(aTime, hs.fs.attributes(dirname..filename).modification)
|
|
|
|
assertTrue(hs.fs.touch(dirname..filename, aTime, mTime))
|
|
assertIsEqual(aTime, hs.fs.attributes(dirname..filename).access)
|
|
assertIsEqual(mTime, hs.fs.attributes(dirname..filename).modification)
|
|
|
|
return success()
|
|
end
|
|
|
|
function testFileUTI()
|
|
local dirname = testDir.."file_uti_test_directory/"
|
|
local filename = "test.txt"
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
writeFile(dirname..filename, "some text\n")
|
|
|
|
assertIsEqual("public.plain-text", hs.fs.fileUTI(dirname..filename))
|
|
assertIsNil(hs.fs.fileUTI("non_existent_file"))
|
|
|
|
return success()
|
|
end
|
|
|
|
function testDirWalker()
|
|
local dirname = testDir.."dirwalker_test_directory/"
|
|
local filenames = {"test1.txt", "test2.txt", "test3.txt"}
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
hs.fnutils.each(filenames, function(filename)
|
|
writeFile(dirname..filename, "some text\n")
|
|
end)
|
|
|
|
local iterfn, dirobj = hs.fs.dir(dirname)
|
|
local dirContents = {}
|
|
|
|
repeat
|
|
local filename = dirobj:next()
|
|
table.insert(dirContents, filename)
|
|
until filename == nil
|
|
dirobj:close()
|
|
|
|
table.insert(filenames, "."); table.insert(filenames, "..")
|
|
assertListsEqual(filenames, dirContents)
|
|
|
|
iterfn, dirobj = hs.fs.dir(dirname)
|
|
dirobj:close()
|
|
|
|
local status, err = pcall(hs.fs.dir, "some_non_existent_dir")
|
|
assertFalse(status)
|
|
assertIsEqual("cannot open", err:match("cannot open"))
|
|
|
|
return success()
|
|
end
|
|
|
|
function testLockDir()
|
|
local dirname = testDir.."lockdir_test_directory/"
|
|
local lock, lock2, err
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
|
|
lock, err = hs.fs.lockDir(dirname)
|
|
assertIsUserdata(lock)
|
|
assertIsNil(err)
|
|
assertIsEqual("link", hs.fs.symlinkAttributes(dirname.."lockfile.lfs").mode)
|
|
|
|
lock2, err = hs.fs.lockDir(dirname)
|
|
assertIsEqual("File exists", err)
|
|
|
|
lock:free()
|
|
|
|
lock2, err = hs.fs.lockDir(dirname)
|
|
assertIsUserdata(lock2)
|
|
assertIsNil(err)
|
|
assertIsEqual("link", hs.fs.symlinkAttributes(dirname.."lockfile.lfs").mode)
|
|
|
|
lock2:free()
|
|
|
|
return success()
|
|
end
|
|
|
|
function testLock()
|
|
local dirname = testDir.."lock_test_directory/"
|
|
local filename = "test.txt"
|
|
local lock, err, lock2, err2
|
|
|
|
assertTrue(hs.fs.mkdir(dirname))
|
|
writeFile(dirname..filename, "1234567890")
|
|
|
|
f = io.open(dirname..filename, "r")
|
|
lock, err = hs.fs.lock(f, "r")
|
|
assertTrue(lock)
|
|
assertIsNil(err)
|
|
lock2, err2 = hs.fs.lock(f, "w")
|
|
assertIsNil(lock2)
|
|
assertIsEqual("Bad file descriptor", err2)
|
|
assertTrue(hs.fs.unlock(f))
|
|
f:close()
|
|
|
|
f = io.open(dirname..filename, "w")
|
|
lock, err = hs.fs.lock(f, "w")
|
|
assertTrue(lock)
|
|
assertIsNil(err)
|
|
lock2, err2 = hs.fs.lock(f, "r")
|
|
assertIsNil(lock2)
|
|
assertIsEqual("Bad file descriptor", err2)
|
|
assertTrue(hs.fs.unlock(f))
|
|
f:close()
|
|
|
|
return success()
|
|
end
|
|
|
|
function testVolumesValues()
|
|
print(path, newPath)
|
|
if (type(path) == "string" and path == "/Volumes/"..ramdiskName and
|
|
type(newPath) == "string" and newPath == "/Volumes/"..ramdiskRename) then
|
|
return success()
|
|
else
|
|
return string.format("Waiting for success...")
|
|
end
|
|
end
|
|
|
|
function testVolumes()
|
|
local volumes = hs.fs.volume.allVolumes()
|
|
assertIsEqual(false, volumes["/"].NSURLVolumeIsEjectableKey)
|
|
|
|
ramdiskName = "ramDisk"
|
|
ramdiskRename = "renamedDisk"
|
|
|
|
local volumeWatcherCallback = function(event, info)
|
|
if event == hs.fs.volume.didMount then
|
|
path = info.path:match("(/Volumes/"..ramdiskName..")/?$")
|
|
if not path then return end
|
|
os.execute("diskutil rename "..ramdiskName.." "..ramdiskRename)
|
|
end
|
|
if event == hs.fs.volume.didRename then
|
|
-- NOTE: in this case, `info` is returned as a NSURL object:
|
|
newPath = info.path and info.path.filePath:match("(/Volumes/"..ramdiskRename..")/?$")
|
|
if not newPath then return end
|
|
hs.fs.volume.eject(newPath)
|
|
volumeWatcher:stop()
|
|
end
|
|
end
|
|
|
|
volumeWatcher = hs.fs.volume.new(volumeWatcherCallback):start()
|
|
assertIsString(tostring(volumeWatcher))
|
|
os.execute("diskutil erasevolume HFS+ '"..ramdiskName.."' `hdiutil attach -nomount ram://2048`")
|
|
|
|
return success()
|
|
end
|