{-# LANGUAGE ScopedTypeVariables #-}
import Control.Exception (IOException, catch)
import Control.Monad (forM_)
import qualified Data.ByteString.Lazy as BL
import Data.Maybe (isNothing)
import System.Directory (listDirectory, removeFile)
import System.FilePath ((</>))
import System.IO (hClose)
import System.IO.Temp (withSystemTempFile)
import Test.Hspec (describe, hspec, it, shouldSatisfy)
import Test.HUnit.Base ((@?))
import Crypto.QNAP
encryptedDirectory :: FilePath
encryptedDirectory = "test/encrypted"
referenceDirectory :: FilePath
referenceDirectory = "test/reference"
password :: String
password = "qORFZQiilzCz5JIxiOOuVE2TsJ6Xn5Rk"
main :: IO ()
main =
withSystemTempFile "decrypt" $ \tempFile tempFileHandle -> do
hClose tempFileHandle
files <- listDirectory encryptedDirectory
hspec $ describe "Crypto.QNAP.dectypt" $
forM_ files $ \file -> it ("Verify file " ++ file) $ do
removeFile tempFile `catch` (\(_ :: IOException) -> return ())
decrypt password (encryptedDirectory </> file) tempFile >>= (`shouldSatisfy` isNothing)
decrypted <- BL.readFile tempFile
reference <- BL.readFile (referenceDirectory </> file)
decrypted == reference @? "Decrypted file does not match reference"