{-# LANGUAGE OverloadedStrings #-} module HPath.IO.DeleteDirRecursiveSpec where import Test.Hspec import System.IO.Error ( ioeGetErrorType ) import System.Posix.Files.ByteString ( getSymbolicLinkStatus ) import GHC.IO.Exception ( IOErrorType(..) ) import Utils upTmpDir :: IO () upTmpDir = do setTmpDir "DeleteDirRecursiveSpec" createTmpDir setupFiles :: IO () setupFiles = do createRegularFile' "file" createDir' "dir" createRegularFile' "dir/.keep" createSymlink' "dirSym" "dir/" createDir' "noPerms" createRegularFile' "noPerms/.keep" createDir' "noWritable" createRegularFile' "noWritable/.keep" cleanupFiles :: IO () cleanupFiles = do deleteFile' "file" deleteFile' "dir/.keep" deleteDir' "dir" deleteFile' "dirSym" deleteFile' "noPerms/.keep" deleteDir' "noPerms" deleteFile' "noWritable/.keep" deleteDir' "noWritable" spec :: Spec spec = beforeAll_ (upTmpDir >> setupFiles) $ afterAll_ cleanupFiles $ describe "HPath.IO.deleteDirRecursive" $ do -- successes -- it "deleteDirRecursive, empty directory, all fine" $ do createDir' "testDir" deleteDirRecursive' "testDir" getSymbolicLinkStatus "testDir" `shouldThrow` (\e -> ioeGetErrorType e == NoSuchThing) it "deleteDirRecursive, empty directory with null permissions, all fine" $ do createDir' "noPerms/testDir" noPerms "noPerms/testDir" deleteDirRecursive' "noPerms/testDir" it "deleteDirRecursive, non-empty directory, all fine" $ do createDir' "nonEmpty" createDir' "nonEmpty/dir1" createDir' "nonEmpty/dir2" createDir' "nonEmpty/dir2/dir3" createRegularFile' "nonEmpty/file1" createRegularFile' "nonEmpty/dir1/file2" deleteDirRecursive' "nonEmpty" getSymbolicLinkStatus "nonEmpty" `shouldThrow` (\e -> ioeGetErrorType e == NoSuchThing) -- posix failures -- it "deleteDirRecursive, can't open parent directory" $ do createDir' "noPerms/foo" noPerms "noPerms" (deleteDirRecursive' "noPerms/foo") `shouldThrow` (\e -> ioeGetErrorType e == PermissionDenied) normalDirPerms "noPerms" deleteDir' "noPerms/foo" it "deleteDirRecursive, can't write to parent directory" $ do createDir' "noWritable/foo" noWritableDirPerms "noWritable" (deleteDirRecursive' "noWritable/foo") `shouldThrow` (\e -> ioeGetErrorType e == PermissionDenied) normalDirPerms "noWritable" deleteDir' "noWritable/foo" it "deleteDirRecursive, wrong file type (symlink to directory)" $ deleteDirRecursive' "dirSym" `shouldThrow` (\e -> ioeGetErrorType e == InappropriateType) it "deleteDirRecursive, wrong file type (regular file)" $ deleteDirRecursive' "file" `shouldThrow` (\e -> ioeGetErrorType e == InappropriateType) it "deleteDirRecursive, directory does not exist" $ deleteDirRecursive' "doesNotExist" `shouldThrow` (\e -> ioeGetErrorType e == NoSuchThing)