packages feed

uniform-fileio-0.1.3: tests/Uniform/FileStrings_test.hs

------------------------------------------------------------------------------
--
-- Module      :  FileIO.Strings
--
-- | the instance for strings (was in 0.1.1)
-- filenames are Path
-- should only export the instances
-- removed -- file content can be lazy bytestring
-----------------------------------------------------------------------------
{-# OPTIONS_GHC -F -pgmF htfpp #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE TypeSynonymInstances  #-}
-- {-# OPTIONS_GHC -fno-warn-missing-methods #-}
{-# OPTIONS -w #-}

module Uniform.FileStrings_test  where

import Uniform.Strings 
import Uniform.Error
import Uniform.FileStrings
import           Uniform.FileIOalgebra
--import           Uniform.FilenamesAlgebra
import           Uniform.Filenames
import           Uniform.FileStatus
-- import           Uniform.Strings hiding ((<.>), (</>))

import           Test.Framework
import           Test.Invariant
import Data.List
--import           Path                   as P
--import           Path.IO                as P
--
--import           Path
--import           Path.IO
--
---- what is further required?
--import qualified System.IO              as SIO
--import           System.Posix           (FileMode)
--
--
--import qualified Data.ByteString        as BS (readFile, writeFile)
import qualified Data.ByteString.Lazy   as L
--import           Data.Digest.Pure.MD5   (md5)
----import Data.Hash.MD5 (md5s)
--import           Data.Maybe             (catMaybes)
--import qualified Data.Text.IO           as T (readFile, writeFile, appendFile)
--import qualified Data.Text.IO           as TIO (hGetLine, hPutStr)
--
--import qualified System.Directory       as D
----import qualified System.Directory      as D
--import qualified System.FilePath        as OS
----       (addExtension, makeRelative, FilePath, combine, splitPath,
----        takeDirectory, replaceExtension, takeExtension)
--import qualified System.Posix           as P
---- for fileAccess
--import           Control.Arrow          (second)
--import           Control.DeepSeq        (force, ($!!))
--import           Control.Exception      (SomeException, catch)
--import           Control.Monad.Catch
--import           Control.Monad.IO.Class
import           Data.Either            (isLeft)
--import           Data.List              (isPrefixOf)

----for testing:
--readFile5 :: Path ar File -> IO Text
--readFile5 = fmap s2t .readFile . toFilePath


--------------------------test with path

notexisting = makeRelFile "xxxxabcd"

test_catch_error2p = do
    res <- runErr $ do
                            f :: Text <-  readFile2 notexisting
                            return False
                `catchError `
                            \(e::Text) ->  return True
    assertEqual (Right True) res

test_call_IOp = do
    res <- runErr $ do
        f :: String <-   readFile2 notexisting  -- not existing fileAccess
        return False   -- expect that read fials
    assertEqual ( Left "xxxxabcd: openFile: does not exist (No such file or directory)") res

test_call_IO_Lp = do
    res <- runErr $ do
        f :: L.ByteString <-  readFile2 notexisting  -- not existing fileAccess
        return False   -- expect that read fials
    assertEqual ( Left "xxxxabcd: openBinaryFile: does not exist (No such file or directory)") res

test_call_NotExist = do
    res <- runErr $ do
        f :: Bool <-  doesFileExist' notexisting  -- not existing fileAccess
        return f
    assertEqual  (Right False) res

--test_call_IO_Corrupt= do
--    res <- runErr $ callIO $ do
--        f :: L.ByteString <-    L.readFile corruptJPG  -- not existing fileAccess
--        putIOwords ["call_IO_Corrupt", showT . L.length $ f]  -- just to enforce strictness
--        return False   -- expect that read fials
--    assertEqual ( Left "/home/frank/additionalSpace/Photos_2016/sizilien2016/DSC04129.JPG: \
--        \hGetBufSome: hardware fault (Input/output error)") res

procFile = makeAbsFile "/proc/1/task/1/maps"
test_call_procp = do
    res <- runErr $ do
        f :: Text   <-    readFile2  procFile -- not allowed fileAccess
        return False   -- expect that read fials
    assertBool (isLeft res)
--    assertEqual ( Left "/proc/1/task/1/maps: openBinaryFile: permission denied (Permission denied)") res

test_createNewDirFile = do
    let fn = makeAbsFile "/home/frank/test/1.test"
    r <- runErr $ writeFileOrCreate2 fn ("testtext"::Text)
    assertEqual (Right () ) r

dir31 = "dir4test" :: FilePath
abs31 = "/home/frank/Workspace8/uniform/uniform-fileio" :: FilePath 
abs3131 = abs31 </> dir31

res3131 = sort 
    ["/home/frank/Workspace8/uniform/uniform-fileio/dir4test/testghci",
    "/home/frank/Workspace8/uniform/uniform-fileio/dir4test/testfile.txt",
    "/home/frank/Workspace8/uniform/uniform-fileio/dir4test/Setup.lhs",
    "/home/frank/Workspace8/uniform/uniform-fileio/dir4test/testgitignore"]

res3131wh = sort $ "/home/frank/Workspace8/uniform/uniform-fileio/dir4test/.ghci" : 
                res3131

test_getDirCont1 = do
    res :: ErrOrVal [FilePath] <- runErr $ getDirContentFiles (abs3131) 
    assertEqual (Right res3131wh) (fmap sort res ) 

test_getDirCont2 = do 
    res :: ErrOrVal [Path Abs File]  <- 
                    runErr $ getDirContentFiles (makeAbsDir abs3131)
    assertEqual (Right (map makeAbsFile res3131wh)) (fmap sort res ) 
                -- (fmap makeAbsFile res3131) res 

res3132 ::   [FilePath]
res3132 = sort $ "dir4test/.ghci" :
  ["dir4test/testghci", "dir4test/testfile.txt",
   "dir4test/Setup.lhs", "dir4test/testgitignore"]

test_getDirCont3 = do
    res :: ErrOrVal [FilePath] <- runErr $ getDirContentFiles (dir31) 
    assertEqual (Right res3132) (fmap sort res ) 
    -- gives hidden and 

test_getDirCont4 = do 
    res :: ErrOrVal [Path Rel File]  <- 
                    runErr $ getDirContentFiles (makeRelDir dir31)
    assertEqual (Right (map makeRelFile res3132)) (fmap sort res ) 
                -- (fmap makeAbsFile res3131) res 

res3134 =  sort -- no hidden
        ["dir4test/testghci", "dir4test/testfile.txt",
        "dir4test/f1", "dir4test/Setup.lhs", "dir4test/f2",
        "dir4test/testgitignore"]

res3135 =    -- with hidden 
        "dir4test/.ghci" : res3134


test_hidden1 = do  -- no hidden files
    res :: ErrOrVal [FilePath]  <- 
                    runErr $ getDirContNonHidden  dir31
    assertEqual (Right ( res3134)) (fmap sort res )

test_hidden2 = do   -- with hidden files
    res :: ErrOrVal [FilePath]  <- 
                    runErr $ getDirCont dir31
    assertEqual (Right ( res3135)) (fmap sort res )
                                -- (fmap makeAbsFile res3131) res 

--test_md5_nonReadablep = do
--    res :: ErrOrVal (Maybe Text)  <- runErr $ getMD5 procFile
--    putIOwords ["test_md5_nonReadable res", showT res]
--    assertEqual (Left "getMD5 error for \"/proc/1/task/1/maps\"") res
--
--
--test_before = do
--    let fna = makeAbsFile "/home/frank/test/a.test"
--    let fnb = makeAbsFile "/home/frank/test/b.test"
--    r <- runErr $ isFileAbeforeB fna fnb
--    assertEqual (Right True ) r


--------------old test with filepath
--
--
--test_catch_error2 = do
--    res <- runErr $ do
--                            f :: Text <-  readFile2 ("xxxabcd" :: FilePath)
--                            return False
--                `catchError `
--                            \(e::Text) ->  return True
--    assertEqual (Right True) res
--
--test_call_IO = do
--    res <- runErr $ do
--        f :: String <-   callIO $ readFile "xxxabcd17"  -- not existing fileAccess
--        return False   -- expect that read fials
--    assertEqual ( Left "xxxabcd17: openFile: does not exist (No such file or directory)") res
--
--test_call_IO_L = do
--    res <- runErr $ do
--        f :: L.ByteString <-   callIO $ L.readFile "xxxabcd17"  -- not existing fileAccess
--        return False   -- expect that read fials
--    assertEqual ( Left "xxxabcd17: openBinaryFile: does not exist (No such file or directory)") res
--
----test_call_IO_Corrupt= do
----    res <- runErr $ callIO $ do
----        f :: L.ByteString <-    L.readFile corruptJPG  -- not existing fileAccess
----        putIOwords ["call_IO_Corrupt", showT . L.length $ f]  -- just to enforce strictness
----        return False   -- expect that read fials
----    assertEqual ( Left "/home/frank/additionalSpace/Photos_2016/sizilien2016/DSC04129.JPG: \
----        \hGetBufSome: hardware fault (Input/output error)") res
--
--test_call_proc = do
--    res <- runErr $ do
--        f   <-   callIO $ L.readFile "/proc/1/task/1/maps"  -- not existing fileAccess
--        return False   -- expect that read fials
--    assertEqual ( Left "/proc/1/task/1/maps: openBinaryFile: permission denied (Permission denied)") res
--
--test_md5_nonReadable = do
--    res :: ErrOrVal (Maybe Text)  <- runErr $ getMD5 ("/proc/1/task/1/maps" ::FilePath)
--    putIOwords ["test_md5_nonReadable res", showT res]
--    assertEqual (Left "getMD5 error for \"/proc/1/task/1/maps\"") res
--
--corruptJPG = "/home/frank/additionalSpace/Photos_2016/sizilien2016/DSC04129.JPG" ::FilePath
--
----test_fail = assertEqual "Fail intentionally just to insure that tests are run"(""::Text)
---- readable on santafe but not oporto
----test_md5_nonReadable2 :: IO ()
----test_md5_nonReadable2 = do
----        res :: ErrOrVal (Maybe Text)  <- runErr $ getMD5  corruptJPG
----        putIOwords ["test_md5_nonReadable corrupt jpg file", showT res]
----        -- does not catch the error?
----        assertEqual (Left "getMD5 error for \"/home/frank/additionalSpace/Photos_2016/sizilien2016/DSC04129.JPG\"") res
------   `catch` \(e::SomeException) -> do
------                putIOwords ["caught with catch in test_md5_nonReadable2 ", showT e]
------                return ()
--
---- not corrupt on santa fe, but on oporto
----test_md5_catch :: IO ()
----test_md5_catch = do
----        res3 :: ErrOrVal ByteString <- runErr $ callIO $ do
----                        res1 :: L.ByteString <-    L.readFile  corruptJPG
----                        let res2 = L.toStrict  res1
----                        return $!! res2
----        assertEqual (Left "/home/frank/additionalSpace/Photos_2016/sizilien2016/DSC04129.JPG: hGetBufSome: hardware fault (Input/output error)") res3
------   `catch` \(e::SomeException) -> do
------                putIOwords ["caught with catch in test_md5_catch ", showT e]
------                return ()
--
--test_symlink :: IO ()
--test_symlink = do
--    let t =   makeAbsFile "/bin/X11/X11"
--    isSymlink1 <- D.pathIsSymbolicLink   (OS.dropTrailingPathSeparator $ toFilePath t)
--    isSymlink2 <- D.pathIsSymbolicLink "/bin/X11/X11" -- (toFilePath t)
--    isSymlink3 <- D.pathIsSymbolicLink "/bin/X11/X11/" -- (toFilePath t)
--    assertEqual  (True, True, False) (isSymlink1, isSymlink2, isSymlink3)
--
--