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