{-# LANGUAGE CPP #-} module Main where #if ! MIN_VERSION_base(4,8,0) import Control.Applicative #endif import System.Directory (getTemporaryDirectory) import System.FilePath (()) import Test.HUnit import Distribution.Simple.Utils (withTempDirectory) import Distribution.Verbosity (silent) import Data.Binary data Foo = Bar !Word32 !Word32 !Word32 deriving (Eq, Show) instance Binary Foo where get = Bar <$> get <*> get <*> get put (Bar a b c) = put (a,b,c) exampleData :: [Foo] exampleData = make bytes where make (a:b:c:xs) = Bar a b c : make xs make _ = [] bytes = take (256*1024) (cycle [minBound..maxBound]) readWriteTest :: Test readWriteTest = TestCase $ do tmpDir <- getTemporaryDirectory withTempDirectory silent tmpDir "foo-dir" $ \dir -> do let fn = dir "foo.bin" encodeFile fn exampleData content <- decodeFile fn -- It'd be nice to use lsof to verify that 'fn' isn't still open. exampleData @=? content main :: IO () main = do _ <- runTestTT readWriteTest return ()