You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

140 lines
3.9 KiB

  1. {-# LANGUAGE OverloadedStrings #-}
  2. module HPath.IO.RecreateSymlinkOverwriteSpec where
  3. -- TODO: exception if destination exists but is not a file + `OverWrite` CopyMode
  4. import Test.Hspec
  5. import HPath.IO
  6. import HPath.IO.Errors
  7. import System.IO.Error
  8. (
  9. ioeGetErrorType
  10. )
  11. import GHC.IO.Exception
  12. (
  13. IOErrorType(..)
  14. )
  15. import Utils
  16. upTmpDir :: IO ()
  17. upTmpDir = do
  18. setTmpDir "RecreateSymlinkOverwriteSpec"
  19. createTmpDir
  20. setupFiles :: IO ()
  21. setupFiles = do
  22. createRegularFile' "myFile"
  23. createSymlink' "myFileL" "myFile"
  24. createRegularFile' "alreadyExists"
  25. createDir' "alreadyExistsD"
  26. createDir' "dir"
  27. createDir' "noPerms"
  28. createDir' "noWritePerm"
  29. createDir' "alreadyExistsD2"
  30. createRegularFile' "alreadyExistsD2/lala"
  31. noPerms "noPerms"
  32. noWritableDirPerms "noWritePerm"
  33. writeFile' "myFile" "Blahfaselgagaga"
  34. cleanupFiles :: IO ()
  35. cleanupFiles = do
  36. normalDirPerms "noPerms"
  37. normalDirPerms "noWritePerm"
  38. deleteFile' "myFile"
  39. deleteFile' "myFileL"
  40. deleteFile' "alreadyExists"
  41. deleteFile' "alreadyExistsD2/lala"
  42. deleteDir' "alreadyExistsD"
  43. deleteDir' "alreadyExistsD2"
  44. deleteDir' "dir"
  45. deleteDir' "noPerms"
  46. deleteDir' "noWritePerm"
  47. spec :: Spec
  48. spec = beforeAll_ (upTmpDir >> setupFiles) $ afterAll_ cleanupFiles $
  49. describe "HPath.IO.recreateSymlink" $ do
  50. -- successes --
  51. it "recreateSymLink (Overwrite), all fine" $ do
  52. recreateSymlink' "myFileL"
  53. "movedFile"
  54. Overwrite
  55. removeFileIfExists "movedFile"
  56. it "recreateSymLink (Overwrite), all fine" $ do
  57. recreateSymlink' "myFileL"
  58. "dir/movedFile"
  59. Overwrite
  60. removeFileIfExists "dir/movedFile"
  61. it "recreateSymLink (Overwrite), destination file already exists" $
  62. recreateSymlink' "myFileL"
  63. "alreadyExists"
  64. Overwrite
  65. it "recreateSymLink (Overwrite), destination already exists and is an empty dir" $ do
  66. recreateSymlink' "myFileL"
  67. "alreadyExistsD"
  68. Overwrite
  69. deleteFile' "alreadyExistsD"
  70. createDir' "alreadyExistsD"
  71. -- posix failures --
  72. it "recreateSymLink (Overwrite), destination already exists and is a non-empty dir" $
  73. recreateSymlink' "myFileL"
  74. "alreadyExistsD2"
  75. Overwrite
  76. `shouldThrow`
  77. (\e -> ioeGetErrorType e == UnsatisfiedConstraints)
  78. it "recreateSymLink (Overwrite), wrong input type (file)" $
  79. recreateSymlink' "myFile"
  80. "movedFile"
  81. Overwrite
  82. `shouldThrow`
  83. (\e -> ioeGetErrorType e == InvalidArgument)
  84. it "recreateSymLink (Overwrite), wrong input type (directory)" $
  85. recreateSymlink' "dir"
  86. "movedFile"
  87. Overwrite
  88. `shouldThrow`
  89. (\e -> ioeGetErrorType e == InvalidArgument)
  90. it "recreateSymLink (Overwrite), can't write to destination directory" $
  91. recreateSymlink' "myFileL"
  92. "noWritePerm/movedFile"
  93. Overwrite
  94. `shouldThrow`
  95. (\e -> ioeGetErrorType e == PermissionDenied)
  96. it "recreateSymLink (Overwrite), can't open destination directory" $
  97. recreateSymlink' "myFileL"
  98. "noPerms/movedFile"
  99. Overwrite
  100. `shouldThrow`
  101. (\e -> ioeGetErrorType e == PermissionDenied)
  102. it "recreateSymLink (Overwrite), can't open source directory" $
  103. recreateSymlink' "noPerms/myFileL"
  104. "movedFile"
  105. Overwrite
  106. `shouldThrow`
  107. (\e -> ioeGetErrorType e == PermissionDenied)
  108. -- custom failures --
  109. it "recreateSymLink (Overwrite), source and destination are the same file" $
  110. recreateSymlink' "myFileL"
  111. "myFileL"
  112. Overwrite
  113. `shouldThrow`
  114. isSameFile