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.
 
 
 
 

144 lines
3.7 KiB

  1. {-# LANGUAGE OverloadedStrings #-}
  2. module HPath.IO.CopyFileSpec where
  3. import Test.Hspec
  4. import HPath.IO
  5. import HPath.IO.Errors
  6. import System.IO.Error
  7. (
  8. ioeGetErrorType
  9. )
  10. import GHC.IO.Exception
  11. (
  12. IOErrorType(..)
  13. )
  14. import System.Exit
  15. import System.Process
  16. import Utils
  17. import Data.ByteString.UTF8 (toString)
  18. upTmpDir :: IO ()
  19. upTmpDir = do
  20. setTmpDir "CopyFileSpec"
  21. createTmpDir
  22. setupFiles :: IO ()
  23. setupFiles = do
  24. createRegularFile' "inputFile"
  25. createRegularFile' "alreadyExists"
  26. createSymlink' "inputFileSymL" "inputFile"
  27. createDir' "alreadyExistsD"
  28. createDir' "noPerms"
  29. createRegularFile' "noPerms/inputFile"
  30. createDir' "outputDirNoWrite"
  31. createDir' "wrongInput"
  32. noPerms "noPerms"
  33. noWritableDirPerms "outputDirNoWrite"
  34. writeFile' "inputFile" "Blahfaselgagaga"
  35. cleanupFiles :: IO ()
  36. cleanupFiles = do
  37. normalDirPerms "noPerms"
  38. normalDirPerms "outputDirNoWrite"
  39. deleteFile' "noPerms/inputFile"
  40. deleteFile' "inputFile"
  41. deleteFile' "alreadyExists"
  42. deleteFile' "inputFileSymL"
  43. deleteDir' "alreadyExistsD"
  44. deleteDir' "noPerms"
  45. deleteDir' "outputDirNoWrite"
  46. deleteDir' "wrongInput"
  47. spec :: Spec
  48. spec = beforeAll_ (upTmpDir >> setupFiles) $ afterAll_ cleanupFiles $
  49. describe "HPath.IO.copyFile" $ do
  50. -- successes --
  51. it "copyFile (Strict), everything clear" $ do
  52. copyFile' "inputFile"
  53. "outputFile"
  54. Strict
  55. removeFileIfExists "outputFile"
  56. it "copyFile (Strict), and compare" $ do
  57. tmpDir' <- getRawTmpDir
  58. copyFile' "inputFile"
  59. "outputFile"
  60. Strict
  61. (system $ "cmp -s " ++ toString tmpDir' ++ "inputFile" ++ " "
  62. ++ toString tmpDir' ++ "outputFile")
  63. `shouldReturn` ExitSuccess
  64. removeFileIfExists "outputFile"
  65. -- posix failures --
  66. it "copyFile (Strict), input file does not exist" $
  67. copyFile' "noSuchFile"
  68. "outputFile"
  69. Strict
  70. `shouldThrow`
  71. (\e -> ioeGetErrorType e == NoSuchThing)
  72. it "copyFile (Strict), no permission to write to output directory" $
  73. copyFile' "inputFile"
  74. "outputDirNoWrite/outputFile"
  75. Strict
  76. `shouldThrow`
  77. (\e -> ioeGetErrorType e == PermissionDenied)
  78. it "copyFile (Strict), cannot open output directory" $
  79. copyFile' "inputFile"
  80. "noPerms/outputFile"
  81. Strict
  82. `shouldThrow`
  83. (\e -> ioeGetErrorType e == PermissionDenied)
  84. it "copyFile (Strict), cannot open source directory" $
  85. copyFile' "noPerms/inputFile"
  86. "outputFile"
  87. Strict
  88. `shouldThrow`
  89. (\e -> ioeGetErrorType e == PermissionDenied)
  90. it "copyFile (Strict), wrong input type (symlink)" $
  91. copyFile' "inputFileSymL"
  92. "outputFile"
  93. Strict
  94. `shouldThrow`
  95. (\e -> ioeGetErrorType e == InvalidArgument)
  96. it "copyFile (Strict), wrong input type (directory)" $
  97. copyFile' "wrongInput"
  98. "outputFile"
  99. Strict
  100. `shouldThrow`
  101. (\e -> ioeGetErrorType e == InappropriateType)
  102. it "copyFile (Strict), output file already exists" $
  103. copyFile' "inputFile"
  104. "alreadyExists"
  105. Strict
  106. `shouldThrow`
  107. (\e -> ioeGetErrorType e == AlreadyExists)
  108. it "copyFile (Strict), output file already exists and is a dir" $
  109. copyFile' "inputFile"
  110. "alreadyExistsD"
  111. Strict
  112. `shouldThrow`
  113. (\e -> ioeGetErrorType e == AlreadyExists)
  114. -- custom failures --
  115. it "copyFile (Strict), output and input are same file" $
  116. copyFile' "inputFile"
  117. "inputFile"
  118. Strict
  119. `shouldThrow`
  120. isSameFile