{-# LANGUAGE OverloadedStrings #-}
module System.IO.Streams.Tests.File (tests) where
import Control.Exception
import Control.Monad hiding (mapM)
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Char8 as S
import qualified Data.ByteString.Lazy.Char8 as L
import Data.List
import Prelude hiding (mapM, read)
import System.Directory
import System.FilePath
import System.IO
import System.IO.Streams hiding (intersperse, mapM_)
import Test.Framework
import Test.Framework.Providers.HUnit
import Test.HUnit hiding (Test)
import System.IO.Streams.Tests.Common
tests :: [Test]
tests = [ testFiles
, testBigFiles
]
copyingListOutputStream :: IO (OutputStream ByteString, IO [ByteString])
copyingListOutputStream = do
(os, grab) <- listOutputStream
os' <- contramap S.copy os >>= lockingOutputStream
return (os', grab)
testFiles :: Test
testFiles = testCase "file/files" $ do
createDirectoryIfMissing False "tmp"
sequence_ [tst1, tst2, tst3, tst4, tst5] `finally` cleanup
where
fn x = ("tmp" </> "data") ++ show (x :: Int)
cleanup = eatException $ do
mapM_ (eatException . removeFile . fn) [1, 2, 3, 4, 5]
removeDirectory "tmp"
tst mode n = do
withFileAsOutputExt (fn n) mode (BlockBuffering $ Just 2048) $ \os -> do
let l = "" : (intersperse " " ["the", "quick", "brown", "fox"])
fromList l >>= connectTo os
l <- liftM S.concat $ withFileAsInput (fn n) toList
assertEqual "testFiles" "the quick brown fox" l
tst1 = tst WriteMode 1
tst2 = tst AppendMode 2
tst3 = tst ReadWriteMode 3
tst4 = expectExceptionH (tst ReadMode 4)
tst5 = do
withFileAsOutput (fn 5) $ \os -> do
let l = "" : (intersperse " " ["the", "quick", "brown", "fox"])
fromList l >>= connectTo os
l <- liftM S.concat $ withFileAsInput (fn 5) toList
assertEqual "testFiles" "the quick brown fox" l
testBigFiles :: Test
testBigFiles = testCase "file/bigFiles" $ do
createDirectoryIfMissing False "tmp2"
tst `finally` eatException (removeFile fn >> removeDirectory "tmp2")
where
fn = "tmp2" </> "data"
testSz = 20 * 1024 * 1024
tst = do
let l = L.take testSz $ L.cycle $
L.fromChunks (intersperse " " ["the", "quick", "brown", "fox"])
withFileAsOutputExt fn WriteMode NoBuffering $ \os -> do
fromList [S.concat $ L.toChunks l] >>= connectTo os
l1 <- liftM L.fromChunks $ withFileAsInput fn toList
assertBool "testFiles2" (l1 == l)
l2 <- liftM L.fromChunks $ withFileAsInputStartingAt 5 fn toList
assertBool "testFiles3" (l2 == (L.drop 5 l))
(os, grab) <- copyingListOutputStream
unsafeWithFileAsInputStartingAt 0 fn (connectTo os)
l3 <- liftM L.fromChunks grab
assertBool "testFiles4" (l3 == l)