packages feed

cow-0.1.0.0: test/Main.hs

{-# LANGUAGE CPP #-}
import Test.Tasty
import Test.Tasty.HUnit
import System.IO.Copy
#if linux_HOST_OS || darwin_HOST_OS
import Foreign.C.Error (Errno(..))
#endif
import System.Directory (removeFile)

main :: IO ()
main = defaultMain tests

tests :: TestTree
#if linux_HOST_OS || darwin_HOST_OS
tests = testGroup "CoW" [
  testCase "mandatory CoW" testMandatoryCoW,
  testCase "optional CoW" testOptionalCoW
  ]
#else
tests = testGroup "CoW" [
  testCase "optional CoW" testOptionalCoW
  ]
#endif

#if linux_HOST_OS || darwin_HOST_OS
testMandatoryCoW :: Assertion
testMandatoryCoW = do
  -- btrfs/xfs
  let source1 = "test/cow_source.txt"
      dest1 = "test/cow_dest.txt"
      cow_data = "COW DATA"
  writeFile source1 cow_data
  result1 <- copyFileOnlyIfCopyOnWrite source1 dest1
  assertEqual "copyFileOnlyIfCopyOnWrite" (Right ()) result1
  dest1Data <- readFile dest1
  assertEqual "mandatory cow data" cow_data dest1Data
  removeFile source1
  removeFile dest1

  -- ext4
  let source2 = "/tmp/cow_source.txt"
      dest2 = "/tmp/cow_dest.txt"
  writeFile source2 "COW DATA"
  result2 <- copyFileOnlyIfCopyOnWrite source2 dest2
  assertEqual "copyFileOnlyIfCopyOnWrite expected failure" (Left (NotSupportedError (Errno 95))) result2  
#endif

testOptionalCoW :: Assertion
testOptionalCoW = do
  let source1 = "cow_source_opt.txt"
      dest1 = "cow_dest_opt.txt"
      cow_data = "COW_DATA"
  writeFile source1 cow_data
  copyFile source1 dest1
  dest1Data <- readFile dest1
  assertEqual "optional cow data" cow_data dest1Data
  removeFile source1
  removeFile dest1